From e4d866fd6e1b063576d57743953cf7cd1b21e397 Mon Sep 17 00:00:00 2001 From: zhangcheng870518 Date: Mon, 30 Jan 2023 11:30:49 +0800 Subject: [PATCH] 1. Fix add cluster issue 2. Update the mesh version synchronously(osm 1.3 & fsm 0.2.0) --- packages/gui/public/meshconfig.yaml | 91 +- packages/server/api/mesh/services/mesh.js | 7 +- packages/server/charts/osm/Chart.lock | 6 +- packages/server/charts/osm/Chart.yaml | 6 +- packages/server/charts/osm/README.md | 73 +- .../server/charts/osm/charts/fsm-0.1.7.tgz | Bin 127887 -> 0 bytes .../server/charts/osm/charts/fsm-0.2.0.tgz | Bin 0 -> 150297 bytes .../envoy/dashboards/osm-control-plane.json | 1280 +++---- .../osm-data-plane-performance.json | 1024 +++--- .../dashboards/osm-mesh-sidecar-details.json | 26 +- .../envoy/dashboards/osm-pod-to-service.json | 1638 ++++----- .../dashboards/osm-service-to-service.json | 1320 +++---- .../dashboards/osm-workload-to-service.json | 1492 ++++---- .../dashboards/osm-workload-to-workload.json | 862 ++--- .../pipy/dashboards/osm-control-plane.json | 1280 +++---- .../osm-data-plane-performance.json | 1024 +++--- .../dashboards/osm-mesh-sidecar-details.json | 26 +- .../pipy/dashboards/osm-pod-to-service.json | 1638 ++++----- .../dashboards/osm-service-to-service.json | 1320 +++---- .../dashboards/osm-workload-to-service.json | 1492 ++++---- .../dashboards/osm-workload-to-workload.json | 862 ++--- .../charts/osm/templates/osm-deployment.yaml | 6 +- .../templates/osm-injector-deployment.yaml | 2 + .../osm/templates/osm-interceptor-hpa.yaml | 130 + .../server/charts/osm/templates/osm-rbac.yaml | 15 +- .../osm/templates/preset-mesh-config.yaml | 25 +- packages/server/charts/osm/values.schema.json | 3262 ++++++++++------- packages/server/charts/osm/values.yaml | 91 +- 28 files changed, 9942 insertions(+), 9056 deletions(-) delete mode 100644 packages/server/charts/osm/charts/fsm-0.1.7.tgz create mode 100644 packages/server/charts/osm/charts/fsm-0.2.0.tgz create mode 100644 packages/server/charts/osm/templates/osm-interceptor-hpa.yaml diff --git a/packages/gui/public/meshconfig.yaml b/packages/gui/public/meshconfig.yaml index 6c1adca..17a9d05 100644 --- a/packages/gui/public/meshconfig.yaml +++ b/packages/gui/public/meshconfig.yaml @@ -12,7 +12,7 @@ osm: # -- Container image pull policy for control plane containers pullPolicy: IfNotPresent # -- Container image tag for control plane images - tag: "1.2.0" + tag: "1.3.0" # -- Image name defaults name: # -- osm-controller's image name @@ -57,7 +57,7 @@ osm: sidecarDrivers: - sidecarName: pipy # -- Sidecar image for Linux workloads - sidecarImage: flomesh/pipy:0.70.0-2 + sidecarImage: flomesh/pipy:0.90.0-18 # -- Remote destination port on which the Discovery Service listens for new connections from Sidecars. proxyServerPort: 6060 - sidecarName: envoy @@ -69,8 +69,74 @@ osm: proxyServerPort: 15128 # -- Curl image for control plane init container curlImage: curlimages/curl - # -- Pipy repo image for Pipy sidecar's proxy control plane container - pipyRepoImage: flomesh/pipy-repo:0.70.0-2 + + # -- Pipy RepoServer + repoServer: + # -- Image used for Pipy RepoServer + image: flomesh/pipy-repo:0.90.0-18 + # -- if false , Pipy RepoServer is installed within osmController pod. + standalone: false + # -- ipaddr of host/service where Pipy RepoServer is installed + ipaddr: "127.0.0.1" + # -- codebase is the folder used by osmController. + codebase: "" + + pluginChains: + inbound-tcp: + - plugin: modules/inbound-tls-termination + priority: 130 + disable: false + - plugin: modules/inbound-tcp-routing + priority: 120 + disable: false + - plugin: modules/inbound-tcp-load-balancing + priority: 110 + disable: false + - plugin: modules/inbound-tcp-default + priority: 100 + disable: false + inbound-http: + - plugin: modules/inbound-tls-termination + priority: 180 + - plugin: modules/inbound-http-routing + priority: 170 + - plugin: modules/inbound-metrics-http + priority: 160 + - plugin: modules/inbound-tracing-http + priority: 150 + - plugin: modules/inbound-logging-http + priority: 140 + - plugin: modules/inbound-throttle-service + priority: 130 + - plugin: modules/inbound-throttle-route + priority: 120 + - plugin: modules/inbound-http-load-balancing + priority: 110 + - plugin: modules/inbound-http-default + priority: 100 + outbound-tcp: + - plugin: modules/outbound-tcp-routing + priority: 120 + - plugin: modules/outbound-tcp-load-balancing + priority: 110 + - plugin: modules/outbound-tcp-default + priority: 100 + outbound-http: + - plugin: modules/outbound-http-routing + priority: 160 + - plugin: modules/outbound-metrics-http + priority: 150 + - plugin: modules/outbound-tracing-http + priority: 140 + - plugin: modules/outbound-logging-http + priority: 130 + - plugin: modules/outbound-circuit-breaker + priority: 120 + - plugin: modules/outbound-http-load-balancing + priority: 110 + - plugin: modules/outbound-http-default + priority: 100 + # # -- OSM controller parameters osmController: @@ -272,6 +338,9 @@ osm: # -- Enable permissive traffic policy mode enablePermissiveTrafficPolicy: true + # -- Traffic interception mode in the mesh + trafficInterceptionMode: iptables + # -- Enable egress in the mesh enableEgress: true @@ -323,11 +392,15 @@ osm: # -- Proxy mode for the proxy sidecar. Acceptable values are ['Localhost', 'PodIP'] localProxyMode: Localhost + # -- Local DNS Proxy improves the performance of your computer by caching the responses coming from your DNS servers + localDNSProxy: + enable: false + # -- Sets the max data plane connections allowed for an instance of osm-controller, set to 0 to not enforce limits maxDataPlaneConnections: 0 # -- Sets the resync interval for regular proxy broadcast updates, set to 0s to not enforce any resync - configResyncInterval: "0s" + configResyncInterval: "90s" # -- Controller log verbosity controllerLogLevel: info @@ -356,6 +429,8 @@ osm: port: 9411 # -- Tracing collector's API path where the spans will be sent to endpoint: "/api/v2/spans" + # -- Sampled Fraction + sampledFraction: "1.0" # -- Image used for tracing image: jaegertracing/all-in-one @@ -402,6 +477,8 @@ osm: endpoint: "" # -- The authorization for remote logging service authorization: "" + # -- Sampled Fraction + sampledFraction: "1.0" # -- Specifies a global list of IP ranges to exclude from outbound traffic interception by the sidecar proxy. # If specified, must be a list of IP ranges of the form a.b.c.d/x. @@ -499,7 +576,7 @@ osm: # -- Feature flags for experimental features featureFlags: # -- Enable extra Envoy statistics generated by a custom WASM extension - enableWASMStats: true + enableWASMStats: false # -- Enable OSM's Egress policy API. # When enabled, fine grained control over Egress (external) traffic is enforced enableEgressPolicy: true @@ -519,6 +596,8 @@ osm: enableSnapshotCacheMode: false # -- Enable Retry Policy for automatic request retries enableRetryPolicy: false + # -- Enable Plugin Policy for extend + enablePluginPolicy: false # -- Enable the MeshRootCertificate to configure the OSM certificate provider enableMeshRootCertificate: false diff --git a/packages/server/api/mesh/services/mesh.js b/packages/server/api/mesh/services/mesh.js index 1cfd7de..b2ec59e 100644 --- a/packages/server/api/mesh/services/mesh.js +++ b/packages/server/api/mesh/services/mesh.js @@ -129,7 +129,7 @@ module.exports = { }); if (result.mcsEnable) { - let helmFsmCmd = `helm repo add fsm https://charts.flomesh.io && helm install --namespace ${result.namespace.name} --kubeconfig ${kubeconfigPath} --set fsm.logLevel=5 --version=0.2.0-beta.3 fsm fsm/fsm --create-namespace`; + let helmFsmCmd = `helm repo add fsm https://charts.flomesh.io && helm install --namespace ${result.namespace.name} --kubeconfig ${kubeconfigPath} --set fsm.logLevel=5 --version=0.2.0 fsm fsm/fsm --create-namespace`; if (result.timeout) { helmFsmCmd += ' --timeout ${result.timeout}'; @@ -160,9 +160,6 @@ module.exports = { result.namespace.name ); const name = "cluster" + registry.id; - const ca = registry.content.certificate; - const token = registry.content.credit; - const server = registry.address; const cluster = { apiVersion: 'flomesh.io/v1alpha1', kind: 'Cluster', @@ -172,7 +169,7 @@ module.exports = { spec: { gatewayHost: res.body.status.loadBalancer.ingress[0].ip, gatewayPort: res.body.spec.ports[0].port, - kubeconfig: `apiVersion: v1\nclusters:\n- cluster:\n certificate-authority-data: ${ca}\n server: ${server}\n name: fsm-${name}\ncontexts:\n- context:\n cluster: fsm-${name}\n user: admin@fsm-${name}\n name: fsm-${name}\ncurrent-context: fsm-${name}\nkind: Config\npreferences: {}\nusers:\n- name: admin@fsm-${name}\n user:\n token: ${token}`, + kubeconfig: registry.config, }, }; diff --git a/packages/server/charts/osm/Chart.lock b/packages/server/charts/osm/Chart.lock index ffef339..95a1cd8 100644 --- a/packages/server/charts/osm/Chart.lock +++ b/packages/server/charts/osm/Chart.lock @@ -4,6 +4,6 @@ dependencies: version: 8.0.4 - name: fsm repository: https://charts.flomesh.io - version: 0.1.7 -digest: sha256:e799592467e9b95fbd540922c1d388061da59be79fc7865244a864f72adfbf6b -generated: "2022-09-17T10:20:22.129884+08:00" + version: 0.2.0 +digest: sha256:be8ced3d604a29b0ba0238a3e5ce023e0481f3a4dbedb72addaa49eed1d9c665 +generated: "2023-01-26T22:30:29.607702+08:00" diff --git a/packages/server/charts/osm/Chart.yaml b/packages/server/charts/osm/Chart.yaml index bfb2b78..454d10d 100644 --- a/packages/server/charts/osm/Chart.yaml +++ b/packages/server/charts/osm/Chart.yaml @@ -14,11 +14,11 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. -version: 1.2.0 +version: 1.3.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. -appVersion: v1.2.0 +appVersion: v1.3.0 # This specifies the minimum Kubernetes version OSM is compatible with. kubeVersion: ">= 1.19.0-0" @@ -29,6 +29,6 @@ dependencies: repository: https://charts.bitnami.com/bitnami condition: contour.enabled - name: fsm - version: 0.1.7 + version: 0.2.0 repository: https://charts.flomesh.io condition: fsm.enabled diff --git a/packages/server/charts/osm/README.md b/packages/server/charts/osm/README.md index db44935..362f2d7 100644 --- a/packages/server/charts/osm/README.md +++ b/packages/server/charts/osm/README.md @@ -1,6 +1,6 @@ # Open Service Mesh Edge Helm Chart -![Version: 1.2.0](https://img.shields.io/badge/Version-1.2.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v1.2.0](https://img.shields.io/badge/AppVersion-v1.2.0-informational?style=flat-square) +![Version: 1.3.0](https://img.shields.io/badge/Version-1.3.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v1.3.0](https://img.shields.io/badge/AppVersion-v1.3.0-informational?style=flat-square) A Helm chart to install the [osm-edge](https://github.com/flomesh-io/osm-edge) control plane on Kubernetes. @@ -79,7 +79,7 @@ The following table lists the configurable parameters of the osm chart and their | osm.cleanup.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[1].values[1] | string | `"arm64"` | | | osm.cleanup.nodeSelector | object | `{}` | | | osm.cleanup.tolerations | list | `[]` | Node tolerations applied to control plane pods. The specified tolerations allow pods to schedule onto nodes with matching taints. | -| osm.configResyncInterval | string | `"0s"` | Sets the resync interval for regular proxy broadcast updates, set to 0s to not enforce any resync | +| osm.configResyncInterval | string | `"90s"` | Sets the resync interval for regular proxy broadcast updates, set to 0s to not enforce any resync | | osm.controlPlaneTolerations | list | `[]` | Node tolerations applied to control plane pods. The specified tolerations allow pods to schedule onto nodes with matching taints. | | osm.controllerLogLevel | string | `"info"` | Controller log verbosity | | osm.curlImage | string | `"curlimages/curl"` | Curl image for control plane init container | @@ -99,10 +99,11 @@ The following table lists the configurable parameters of the osm chart and their | osm.featureFlags.enableEgressPolicy | bool | `true` | Enable OSM's Egress policy API. When enabled, fine grained control over Egress (external) traffic is enforced | | osm.featureFlags.enableIngressBackendPolicy | bool | `true` | Enables OSM's IngressBackend policy API. When enabled, OSM will use the IngressBackend API allow ingress traffic to mesh backends | | osm.featureFlags.enableMeshRootCertificate | bool | `false` | Enable the MeshRootCertificate to configure the OSM certificate provider | +| osm.featureFlags.enablePluginPolicy | bool | `false` | Enable Plugin Policy for extend | | osm.featureFlags.enableRetryPolicy | bool | `false` | Enable Retry Policy for automatic request retries | | osm.featureFlags.enableSidecarActiveHealthChecks | bool | `false` | Enable Sidecar active health checks | | osm.featureFlags.enableSnapshotCacheMode | bool | `false` | Enables SnapshotCache feature for Sidecar xDS server. | -| osm.featureFlags.enableWASMStats | bool | `true` | Enable extra Envoy statistics generated by a custom WASM extension | +| osm.featureFlags.enableWASMStats | bool | `false` | Enable extra Envoy statistics generated by a custom WASM extension | | osm.fluentBit.enableProxySupport | bool | `false` | Enable proxy support toggle for Fluent Bit | | osm.fluentBit.httpProxy | string | `""` | Optional HTTP proxy endpoint for Fluent Bit | | osm.fluentBit.httpsProxy | string | `""` | Optional HTTPS proxy endpoint for Fluent Bit | @@ -147,7 +148,7 @@ The following table lists the configurable parameters of the osm chart and their | osm.image.name.osmSidecarInit | string | `"osm-edge-sidecar-init"` | Sidecar init container's image name | | osm.image.pullPolicy | string | `"IfNotPresent"` | Container image pull policy for control plane containers | | osm.image.registry | string | `"flomesh"` | Container image registry for control plane images | -| osm.image.tag | string | `"1.2.0"` | Container image tag for control plane images | +| osm.image.tag | string | `"1.3.0"` | Container image tag for control plane images | | osm.imagePullSecrets | list | `[]` | `osm-controller` image pull secret | | osm.inboundPortExclusionList | list | `[]` | Specifies a global list of ports to exclude from inbound traffic interception by the sidecar proxy. If specified, must be a list of positive integers. | | osm.injector.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].key | string | `"kubernetes.io/os"` | | @@ -175,6 +176,7 @@ The following table lists the configurable parameters of the osm chart and their | osm.injector.resource | object | `{"limits":{"cpu":"0.5","memory":"64M"},"requests":{"cpu":"0.3","memory":"64M"}}` | Sidecar injector's container resource parameters | | osm.injector.tolerations | list | `[]` | Node tolerations applied to control plane pods. The specified tolerations allow pods to schedule onto nodes with matching taints. | | osm.injector.webhookTimeoutSeconds | int | `20` | Mutating webhook timeout | +| osm.localDNSProxy | object | `{"enable":false}` | Local DNS Proxy improves the performance of your computer by caching the responses coming from your DNS servers | | osm.localProxyMode | string | `"Localhost"` | Proxy mode for the proxy sidecar. Acceptable values are ['Localhost', 'PodIP'] | | osm.maxDataPlaneConnections | int | `0` | Sets the max data plane connections allowed for an instance of osm-controller, set to 0 to not enforce limits | | osm.meshName | string | `"osm"` | Identifier for the instance of a service mesh within a cluster | @@ -223,7 +225,56 @@ The following table lists the configurable parameters of the osm chart and their | osm.outboundIPRangeExclusionList | list | `[]` | Specifies a global list of IP ranges to exclude from outbound traffic interception by the sidecar proxy. If specified, must be a list of IP ranges of the form a.b.c.d/x. | | osm.outboundIPRangeInclusionList | list | `[]` | Specifies a global list of IP ranges to include for outbound traffic interception by the sidecar proxy. If specified, must be a list of IP ranges of the form a.b.c.d/x. | | osm.outboundPortExclusionList | list | `[]` | Specifies a global list of ports to exclude from outbound traffic interception by the sidecar proxy. If specified, must be a list of positive integers. | -| osm.pipyRepoImage | string | `"flomesh/pipy-repo-nightly:latest"` | Pipy repo image for Pipy sidecar's proxy control plane container | +| osm.pluginChains.inbound-http[0].plugin | string | `"modules/inbound-tls-termination"` | | +| osm.pluginChains.inbound-http[0].priority | int | `180` | | +| osm.pluginChains.inbound-http[1].plugin | string | `"modules/inbound-http-routing"` | | +| osm.pluginChains.inbound-http[1].priority | int | `170` | | +| osm.pluginChains.inbound-http[2].plugin | string | `"modules/inbound-metrics-http"` | | +| osm.pluginChains.inbound-http[2].priority | int | `160` | | +| osm.pluginChains.inbound-http[3].plugin | string | `"modules/inbound-tracing-http"` | | +| osm.pluginChains.inbound-http[3].priority | int | `150` | | +| osm.pluginChains.inbound-http[4].plugin | string | `"modules/inbound-logging-http"` | | +| osm.pluginChains.inbound-http[4].priority | int | `140` | | +| osm.pluginChains.inbound-http[5].plugin | string | `"modules/inbound-throttle-service"` | | +| osm.pluginChains.inbound-http[5].priority | int | `130` | | +| osm.pluginChains.inbound-http[6].plugin | string | `"modules/inbound-throttle-route"` | | +| osm.pluginChains.inbound-http[6].priority | int | `120` | | +| osm.pluginChains.inbound-http[7].plugin | string | `"modules/inbound-http-load-balancing"` | | +| osm.pluginChains.inbound-http[7].priority | int | `110` | | +| osm.pluginChains.inbound-http[8].plugin | string | `"modules/inbound-http-default"` | | +| osm.pluginChains.inbound-http[8].priority | int | `100` | | +| osm.pluginChains.inbound-tcp[0].disable | bool | `false` | | +| osm.pluginChains.inbound-tcp[0].plugin | string | `"modules/inbound-tls-termination"` | | +| osm.pluginChains.inbound-tcp[0].priority | int | `130` | | +| osm.pluginChains.inbound-tcp[1].disable | bool | `false` | | +| osm.pluginChains.inbound-tcp[1].plugin | string | `"modules/inbound-tcp-routing"` | | +| osm.pluginChains.inbound-tcp[1].priority | int | `120` | | +| osm.pluginChains.inbound-tcp[2].disable | bool | `false` | | +| osm.pluginChains.inbound-tcp[2].plugin | string | `"modules/inbound-tcp-load-balancing"` | | +| osm.pluginChains.inbound-tcp[2].priority | int | `110` | | +| osm.pluginChains.inbound-tcp[3].disable | bool | `false` | | +| osm.pluginChains.inbound-tcp[3].plugin | string | `"modules/inbound-tcp-default"` | | +| osm.pluginChains.inbound-tcp[3].priority | int | `100` | | +| osm.pluginChains.outbound-http[0].plugin | string | `"modules/outbound-http-routing"` | | +| osm.pluginChains.outbound-http[0].priority | int | `160` | | +| osm.pluginChains.outbound-http[1].plugin | string | `"modules/outbound-metrics-http"` | | +| osm.pluginChains.outbound-http[1].priority | int | `150` | | +| osm.pluginChains.outbound-http[2].plugin | string | `"modules/outbound-tracing-http"` | | +| osm.pluginChains.outbound-http[2].priority | int | `140` | | +| osm.pluginChains.outbound-http[3].plugin | string | `"modules/outbound-logging-http"` | | +| osm.pluginChains.outbound-http[3].priority | int | `130` | | +| osm.pluginChains.outbound-http[4].plugin | string | `"modules/outbound-circuit-breaker"` | | +| osm.pluginChains.outbound-http[4].priority | int | `120` | | +| osm.pluginChains.outbound-http[5].plugin | string | `"modules/outbound-http-load-balancing"` | | +| osm.pluginChains.outbound-http[5].priority | int | `110` | | +| osm.pluginChains.outbound-http[6].plugin | string | `"modules/outbound-http-default"` | | +| osm.pluginChains.outbound-http[6].priority | int | `100` | | +| osm.pluginChains.outbound-tcp[0].plugin | string | `"modules/outbound-tcp-routing"` | | +| osm.pluginChains.outbound-tcp[0].priority | int | `120` | | +| osm.pluginChains.outbound-tcp[1].plugin | string | `"modules/outbound-tcp-load-balancing"` | | +| osm.pluginChains.outbound-tcp[1].priority | int | `110` | | +| osm.pluginChains.outbound-tcp[2].plugin | string | `"modules/outbound-tcp-default"` | | +| osm.pluginChains.outbound-tcp[2].priority | int | `100` | | | osm.preinstall.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].key | string | `"kubernetes.io/os"` | | | osm.preinstall.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].operator | string | `"In"` | | | osm.preinstall.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[0].matchExpressions[0].values[0] | string | `"linux"` | | @@ -255,10 +306,16 @@ The following table lists the configurable parameters of the osm chart and their | osm.remoteLogging.enable | bool | `false` | Toggles Sidecar's remote logging functionality on/off for all sidecar proxies in the mesh | | osm.remoteLogging.endpoint | string | `""` | Remote logging's API path where the spans will be sent to | | osm.remoteLogging.port | int | `30514` | Port of the remote logging service | +| osm.remoteLogging.sampledFraction | string | `"1.0"` | Sampled Fraction | +| osm.repoServer | object | `{"codebase":"","image":"flomesh/pipy-repo:0.90.0-18","ipaddr":"127.0.0.1","standalone":false}` | Pipy RepoServer | +| osm.repoServer.codebase | string | `""` | codebase is the folder used by osmController. | +| osm.repoServer.image | string | `"flomesh/pipy-repo:0.90.0-18"` | Image used for Pipy RepoServer | +| osm.repoServer.ipaddr | string | `"127.0.0.1"` | ipaddr of host/service where Pipy RepoServer is installed | +| osm.repoServer.standalone | bool | `false` | if false , Pipy RepoServer is installed within osmController pod. | | osm.sidecarClass | string | `"pipy"` | The class of the OSM Sidecar Driver | -| osm.sidecarDrivers | list | `[{"proxyServerPort":6060,"sidecarImage":"flomesh/pipy-nightly:latest","sidecarName":"pipy"},{"proxyServerPort":15128,"sidecarImage":"envoyproxy/envoy:v1.19.3","sidecarName":"envoy","sidecarWindowsImage":"envoyproxy/envoy-windows:latest"}]` | Sidecar drivers supported by osm-edge | +| osm.sidecarDrivers | list | `[{"proxyServerPort":6060,"sidecarImage":"flomesh/pipy:0.90.0-18","sidecarName":"pipy"},{"proxyServerPort":15128,"sidecarImage":"envoyproxy/envoy:v1.19.3","sidecarName":"envoy","sidecarWindowsImage":"envoyproxy/envoy-windows:latest"}]` | Sidecar drivers supported by osm-edge | | osm.sidecarDrivers[0].proxyServerPort | int | `6060` | Remote destination port on which the Discovery Service listens for new connections from Sidecars. | -| osm.sidecarDrivers[0].sidecarImage | string | `"flomesh/pipy-nightly:latest"` | Sidecar image for Linux workloads | +| osm.sidecarDrivers[0].sidecarImage | string | `"flomesh/pipy:0.90.0-18"` | Sidecar image for Linux workloads | | osm.sidecarDrivers[1].proxyServerPort | int | `15128` | Remote destination port on which the Discovery Service listens for new connections from Sidecars. | | osm.sidecarDrivers[1].sidecarImage | string | `"envoyproxy/envoy:v1.19.3"` | Sidecar image for Linux workloads | | osm.sidecarDrivers[1].sidecarWindowsImage | string | `"envoyproxy/envoy-windows:latest"` | Sidecar image for Windows workloads | @@ -279,7 +336,9 @@ The following table lists the configurable parameters of the osm chart and their | osm.tracing.image | string | `"jaegertracing/all-in-one"` | Image used for tracing | | osm.tracing.nodeSelector | object | `{}` | | | osm.tracing.port | int | `9411` | Port of the tracing collector service | +| osm.tracing.sampledFraction | string | `"1.0"` | Sampled Fraction | | osm.tracing.tolerations | list | `[]` | Node tolerations applied to control plane pods. The specified tolerations allow pods to schedule onto nodes with matching taints. | +| osm.trafficInterceptionMode | string | `"iptables"` | Traffic interception mode in the mesh | | osm.trustDomain | string | `"cluster.local"` | The trust domain to use as part of the common name when requesting new certificates. | | osm.validatorWebhook.webhookConfigurationName | string | `""` | Name of the ValidatingWebhookConfiguration | | osm.vault.host | string | `""` | Hashicorp Vault host/service - where Vault is installed | diff --git a/packages/server/charts/osm/charts/fsm-0.1.7.tgz b/packages/server/charts/osm/charts/fsm-0.1.7.tgz deleted file mode 100644 index c53ae135b62b23790953ffee1e4369bf9944e3f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127887 zcmV*VKw7^aiwG0|00000|0w_~VMtOiV@ORlOnEsqVl!4SWK%V1T2nbTPgYhoO;>Dc zVQyr3R8em|NM&qo0PH<^d=y32;ECe_>wy<5#RQxLGFMI*H(*EtL_(6y1Qa2LPIt{r zo1X5byC)$)1o894`#x6jzSi}=kHr%_R$cE~@j$#5FH~3+zF$?}Jv~=48G<|Y2V}Zl zy?Ryk-m6!yUR8y}sJA9U2$H9Vh%!S4B>8+kUqx9N{@>^GS^qDoEcFlZmzDa;D|}@Y z{>mXfzrV7gatQDZ3_0c$6D2|z;_G)^*2e81iC|eyA|#q)#ef30D>`|=L87^8|&w@7ElKO0L-_C=b->t zA__&GAR%aN2m+F0Lv$E~H~}=O8B{$R7N96)#p41sEwyQp zI*aIpK#D*R<3&k;L=*&r4FFTmg;0Y5Eh<#U1fqk1Ku0TgUjoD}&@DkpFWS@Q|X`}4_OMbBn`!YL#T0g9wnh5%_3ML3>0A@f&VL2o+G%HF3!(e`z7MxW$P3{~JghCfhLNE)8ks`pcU}mfX z3M`bM=!kHLI+X;aJ5kj%iK?*Brsr#*JR5d&!k%tUpm0}q>bTt?0-318jkyaEfC@O= zfR+W?;Razsg55+9Ab8s01{?;K1R@loNg#Jt6ta@T4S1UGL5OGyl7xUh2;8C`2dYdP zTG!+%;P?0^d31W)Jr`)3;=@X8Jfgu&e3IN$~5)AKL0Zu**P$COp5v6S5{IPH~*KH=jZ=iq%7*L zEUBh0MK{r5C`th!Mu?K~ia;6R?iiu?tCzX~Hq~8&SEEEU{QUTyB@s*UgeHHGK@>ZWOP*N5sE%W#) z%l&1OCio@>d_HHo(zD|yB>x7(V?gRiF8}_@N`JXU{!2^v1W*e}h7geDD$vM4!KQWx1Uw;%kODL- zaiE8b2|$8To*^VCdK`|B7!4TZ-RV?jO>CbVem8YNL7*x1Qz*tTHlG`-l!%? zF2+hS?gC_QlXQrNBIu4lDFOvRXqE{fg90(a#TW|p2q{3MdvIC#?*Nd57*vo|n^!9Y zMWO$&C2vM4uY3$^Hn5~u!O%tf?s4ISk0B30zdi zAEF^cwZM?EM*OXrkRkyPg%Uv#65&BO6QU0`SJz~z4y-y*s~AX7P^d$Ltc|@vx1j!Y zi#?(QqX-&V(lQKI8;zJmY+j>p5)nqmO}WqGb5ERz;JXQ0n#KwBQd}XFgA}Bjmh`fI zPl?CpzY>4B}?oImT2Wfte_oGx%NUM4>wN2t&w!4n-cLrb*YMFju=O5k|oZ#SrJ zXwZHOkf54arl*DDq-it*WesMSCNWTqtriPUVQHT23 zs*1D>vyf?M22KkZtH_%A8L)}Tmh8OV$?KiG-oawg0(s7?a?l#xs%_9WhcduuQ9Glx zwHb(H1V)KsKoTrkPeU3nxg(Oq15W;57B3kt0G#NPQ$oW%q_WuN1=y@Y1Wdd} znVBuZiIU>gkQIO+soiMl#H=b@Tl530Y|B&YTED%non=dIUdiT_Y+lJ?iD;(z9-u`z zaI7S73}an$Dx0QO)vJ7VYd#Q?Aw*I3J~+`wrvupg>9qI?d`PpY+El}mb<N#HkFA^32vFeU{p1FYpr#TGn!D5tduMaXMrCdOaF#gZ zW&x*vx-s(IS7DWvzZ9xLGUlzB=Gn{=YS^%t)J(O0(uXi|HMueiS1G;>t=DiX|0 zS`HBo3ouM*&U9mKN=0rRCY?GfD=HJzspfRUjtIwf##g9hWYEHdbK@kGgExtgd_)P} z(69PNLtNj|EG@a^kTO}rSv*R%J|(wYi9;d7xHnDi8si zg`*Gq|AzPvdFkvqUgX&9#uy}x|L~WUmc+$>l$KRih<->EoG0$wj- z1GmBwoDlX>0uhqDB|iTow{MbH0WX$IBOQZ^avjG*QqsQC5`#at$`Pc-_);a<#EeGW z*mnlNJZ-wb@dU;CPlEu+mRy@snin`83dpQ+2EYXOpHf%!* zkmV0YtRcWeASU@%ss%w=n&V3JCY7!n6RRJG$&_48mbU}NYTX$T9jAnHOt`iFjEL8? zV@jfFR)Y2-ZlSs)9ir8GGa^=2*C{DA&EH7~U1C#5Jf*l&mCOVMlFohxC^eEZ0Uivc z$91NHQUW~V`wqk_HN9YR1K zhN&!(cFPDsAd)efrD5|DuvOxQDHJ6aAgwqp!6>G_H*pu(=EQ%sQy>sd-^swx1Trv+L?JP4j_lw#1`>8=uL)f5eC#vGge{dQ@&3q~u~*Y>SyFDY zX;>nzvTv2~sBn71W@NEca%~>%B+{9R#|DYc#c}^BIiMe^#QMng6hl)cWB3%k||P&2oDVN=(P_V^CWOFn~}%)NgC5Kt5WpYz%@!c z2A5IGBqBVZlAwF-b1V*8#d(=X3~gW^!|}*JoM_-Pn}bR$)cvX)3x!f`UL+Dj8`viC zrlJ{tUK~Jw?ImrGHrGazT5;Cw>VY$<2aqGoC(#F&vng(iKF2I#tv`F5l0*S$;bc23 zJH=g9FaTVYRtF9eZ-qwCfC`HmtCC|GQL4?6Xy_*@(i5R%`-*COe+r=L^mdx!PXQ!@ z7Sjh!7&@PHdrS?K-(i(V;?OH|9a&Z#1_n#JeaS;eY#Qj#Fg`$|>3>!)rX|ONq*)q4 z{cTqD;Mjz0I#Vj^4@f>akxddp% zGLi(nvUrI|$^L3e!G^#(>KXSydWMu%ENz2IugJ7=(Mip27Z^A>cU@54r!LS*&1x4Q z>CCw4X{kl6RQl>sugK)v;bZA3NUeBAic+sM!GYS;9Su_JCasnXbyRBVGQk4+&cIr6 zeK;rjGAwFwSKBuzZT41E;#k1UpwiM9@+>vTB}O?po)?qiU{YNA#kmP7x(MC|HBUe-Y;u9svJEvg{}Lm;q5*9*=CRy46Vf#&`_t;ano-+-`!0V7BENl? zMziwUciXLz`R%)mnwa0d%WvOVA@kdJ`R%*>_FaDaE;U8@?Yo32zY~#0&H3%Sv`Xc- z?<}?Cg=WwSO<#RGwmIo-k*N<9<@zxa20c0+N0BC_mny(0G3O#mz1ovSmx7gXBvh_ z+UAC}jq)x4&j}KKUAR8syKx2-XYHkT%~TQad$GT7hC z*!z%?Or|}$$>;lY1}lT6rfY3wWM5fb$Urrir?&v{#dpfo*E3 zuiQ5=v$m>~rPs_PxqaK3lu~YR4X}1@Z3qGpN)pY6#XqEGP5~#1Ofw;hQbgcl;m99J zkEi87j#K2V4M8tb=Hia0&CAM4{}=lav;@tX1XDR#-{1Q%gA}BH#8V* z00zP`*WaM8JA`Qk$i;Y35+D&xWf+5WoO%Ns1lOl+y1s1E#VK0rAf~NpL7MJo(=cS% z8<}`6Gtfbj|PsQrV-c=6ZxZ-?q;EdbHy`Oc*y9%Sk-kZ(%Lgr{1(}cZO@SdVG)Xb#g{BV>0~6^RCM4KR z^i=b7u7iE`nzI`3YYQ>>V>te6~;($w~dnshXoiWlD|*u z?1mi?j_Vv4_DXsql?Ih7_hhP@stjZg*d9X~aA^cTVK{S`Nlw?q+hOwp4WB#pF#vPL zf219Y8u``f`sN&LSES3Oxmyoc_$vBz+f3R)T_D}HaE8HMDpA|312PZy0t2*RWtfi! z$&{c|l%E(9R5|!324zlgr)BP#tItmlf0*f^vLa<@s9M(_b9(4w2MnI+L0yOplDR=4 zCqFSHsB-X649W=R7Y+ZjvqG8y$bZ;LVNxGEAjgwJKOA`^$A;)|l;Csj%F}DknlrDS zrIViTPv^Nq)FUh;Q#k#i1WP36C}$LkkrXKC5EP~4cSHzOg5wL>@GRo~8YJd|O3%RA z3xD+K8aw!CmX_QiDbRdU#xmF5_X&Fd%-Gb=?CON)gfr88epf4;XU)X#%(`W*zhiQy zJ~Ipw&eRCnu8XV?&A|T&F4np`cU+uF_vfxNw2o+(JHpdLM43MIhD!W)m21_Q8zfS# zkdv3`6wq0bX{EFO*Ckr%hChfrqm|cS5oRbx@^)jNr4x#g9ol3(p6eJiXVnlbc~sKN zS*0RDiir{-4Dt25E^FgbD$v792)>#en%(GQUOqd2Y(j9JEBk`C_*9v4uDO*09djFc;*mH42qtR z81?9z@E(nMJlHtw?N!R)d(?43nkAVS1+fw8(XyPtBLg$|l9vFs29_*wo5AHw1iKWl zG)qBN0%fS2N}g7|(FYX(OEEfQGxd9y+(L|%=qU7vbXfFsP82;f=k4+n3?Cu zN(sfhlRF4QL?FRPk$_^%$iJEet^-b`S*n_%1SpCD5SZwjC}WI5NuWtlEzn_v@|RS4 zd>)_2kHF>k^_37R6`bb;NscPP9~ekbP^e=diL|#0WcVuI9>E&fK+pcqHfj87jT zd3>xm0(zf&LJSv$V#Gspj_u9T`IJFQr2i?%Gh9y;vQqyifE4<_(qHbk=>JN8i7&7J zbCHaSk>GjJt4#v68V97F1qN32>(~=c0wNDdR9d;AQA|Ri=@Lg=xd<7&87WsEB_uM^ zV4x={MQYgw8_FtV^s0CTRQ<2@C05p^nlf(vL|rxanNAId+KVXBEG^ZjQHUCSZe{#Y zu2wA_CBinNEO8vu!7cLOY;B|sMVey_)66k6*%JWup+-(>7NCguO@$)4Xp~?ny>r|^ zj2M2nNyCq&2JeDI2*6zfy!gbad-0;K5b!E7O&*C5JmJL#;LcbFBqav1Khp!;A>bti zN=yo%h2D8Jur7{?Md2*ORicsLDEiV&NRdDi5>lB~YHXW9ywoJdI%Mn#keey6v@BJ< z2t2M%Ge$&O97Zuh2#|7{^327w9?XCmt&D{vG9jC4{GWE7`jCdj2WyNUfexOKXSv8rlFmxAWp(tYe+K3OSBbs1p zAw%>8A<40n7y#u)g+NCk7nAJsNIuAsolpvx{F8jTW58RwUVsEe4}LP!QCMjTw~Wdl zeWbd83}i#e^|4?d$*|RVeJIq&>JurszL#_Z80Dp&T3QHzC02CtgUJgthp(|z?e^w(*=Tr%}}86ZJ#m&m--Yqg(Is;60ujK+7y!# zh=(!hVWc#=X(^IG^#&m+KuOf$HLb1Wm~AXoq1oF~2m-QHipo)k1Qo+d2Q_}}cb#;| zR3i}zAtln|QTJLjU^T~FV;spE0z_rC^25YshVO|cfrJV=t_eWC;8vpTQ1Su{K|z32 zZA_rqaFC2ZD#p-kxIWBs+UL4Okc=7K8!}HLyb8`%C`1F6-6m`+$B%-Vu#sQ4h!>!U z);?l9gd23io&eDO8eW3uZ8pI;9tudm20%S)lih{8J{~=)AdN+oF-aWHFK8F975F{nxSK4J~h@Ud?^y}cK@`DB|C`F|8$oCWWH z>ixgU(n_oUzsy&f_y6P~+4}#3^5CcT``Fo;1K|ORzhNS^D@f|$(<2z4vBflKYqbQc zv_9F|yue8u$uR-YTGNcb$hQN^Ydlj8W=B*yy^zeUQgw|9r%8O-J0-}dIxd>W`^(f=;dHXLXDVzG=>;uc8>emYSAA{mViRfG@5~;XF8PRD0Xk6 z0?s0^6c}qT;pPQyQ4cS0A&f2E3gS!I)MDf6(JwJJJA0JxZi1)X%8XQ!oS1|q5)h)f z2yCcQUNF;#kc#UjJxc-3ptBN{O-kwZmZ2Rvne{)u1%hL;v+UPW3jJSEURGk!|7B(6 zdHX*n$*BK@4ubR$F)6|c%6;{^<*UvNvbJpD7(4HP%07Ko=m3xc#5K3lQ7B48ln($l z#xM>c#y~OPa3gzty1>PFF#zT{2`Wls2d)6av?vKiqMdCH<9;TX=ZwZALZaEQ5>qEn zT`|S0=`04$E`p({Bp?W57Zf@$wlI`X8HN_||J{T{M$jL)1rYre<0<7YUd^N+110Ee zbHufT=f!x6DFQ}0R)mr$7gi&3@J}_?MadN z@&iA43oVqXBqFA^ym(2nvuTA1Ny{H4(f}bbqW&XBsW}5UtbJ~(Wvta!TR!U@V9AK< z3roJ%E!OX94_Urzos~JCrQZd>+6OxKY33|IO>e964W!BD zmUWxqT&i&?Y3UvWrQT*@FN;u+=nzd35)|OVn0)gfFn*Tjdr^$V4N7We);QOwbd`n> zEM+?psEx^Vl1Qp@Y?h$gOW)d%l3n#`S3$otYJ3&esdoUoGU56qo+`9Tk>!+QU2{i=YPv9D=YHr|6HWLum7jYJd(r>pm34J8$j^9#~i&R zPdb#lLy4?zfea)>=uyHD)Q$A`g1Se#CPE03r_m5M6%XB|wo@-q&GSm@!BVg=#z|W7 z2xOujG2$f=T)YPxe^$KLsHrV5gj%Pnqa=Ol(6$Z@u9P?jiWtK;QDBdUDJDY+jx@UC z(~Y4_-yy%fnKGYpmdyHJu>#!K?#-GLI92>tS()|xcX?T5WnTa1BBg0z7m6_21%(?cz*MX?GK}$}`mkgP;02nMLbBsD;Ps9Z z1LG*K93Q#Z2?|riJV!VYExn2mq?A@Dc9HoojT^Yt2xqr);?k7sEOA<(1tLd>`);;^Ua2(30O z&55hif}TNc&Z_IvY(^*5(>|vjH*drrRMjl1E-P&EBXkKFE@2fSBxCplFULx7k!i>* zS=l(?x&062rzf_9;8=b-gr+!9U6DUf-M>2X2de*P4phf4|BPwJK2Ghh{WJ6Re-i&s z){X$D@c)#SmRRF|D}Da_{ckx*JAnTu^JB@nAtZC~_VfRwwA5q*36|v~qmD3q(CfF+ z4e_Tok{*Ay)~g?VMi|D5P-^5Thzt@D1gbzGCxAk@Ff|INTFhCLW`PEdpr#TG!IDsL zsw)<4g*jN)mT{}f)Mj4#N5L~T7L{JY9bg{2w3^5&;D!aG`YAavDwL59)0rXb0iwaR zE{Vw6Y`-`IOm?X& z-C|xY3b0$CCFqvt0e48?q5*K67pXVzlne_?TmX3c9pI4U;4Z0N>nFF9HiTO=CbOk2 z9Z*PtOtl35C{vGF|I2rPxS?{mD@$jAQ^kK(`mFcAS5*2- z^7=m)DZ}{RBnN-(cqdNlrvKPP-xQ$DF=4EhoKA;)BP%CRig#U)$2Dyvsn@nf3A{LP z100JiY9|Bmw=k6CJX)0hz^4P`()f4){xhaVEnwZJRNNL_ShzuG)YfBkkw- zr-}FP<$3wfN$P|AClCBj!a}*%27Qanj|<7SRc(Ka5Ph@!n;$dJ z))i2x)_?x8xcfg#^6}rfNm;!ANj*C{$Zr2r$@(MR{WrK@1=D&w|0dX=Pxksho3DSR z)c@r+>%Ve;{{E+&r0fLR52Wf>arZsOUd51&7<(1hz`y&Itli1O)YGBS_RX)v@y80v zRPo2!^%1#wL`j(j(~fG@TzN{t#KD4niet5TuFPxgxIV_ZDk1A3I&6hbZt2*Ewf6Y| zrc6R^b*W1ga+@%MG$Kj-^ti}M*^R867qAJsG>u7u=uUrH(VdAyMw3y7O7#pZVM)Sx z35Main+3XyW?&fBi6kLE?XA4yuR$hy{wZ@SUrmOGqYQ^UyyKAO$(&&gFWdEnP_=IcM{?EhKgf6FT?^YI@!Nm+XT zM>VLo>jE(Oi$5xfNuK*Lt|yYe^`jz7KQK_oog$=80n}u$-%tD`O>y!sKOvdb9e|Yk ze{t_WR8*Ab?|;Zi%C7%E?)}jm?f@uP#kMmXNigbz1Mc`22e>HDv5=Lt*RBjDY@QjQ zV2Fq@lIa#aEf%|IbOvru-voe!GZ1 zs<~aJ#B;oenzGa_qf*ReCoL+wb1Oed0&ypLvo8akY zl!@{Pp7wV6WsrEnR7Z$*KZu!1f}#W)5^XLa!H_9>L9yh_RVcWy4aItX2f;nB> zW+Vx!0>ByLMM;1}6rWtn1f#K_*`c8SZNm`ylTK-lTB0|gEO-r9aGMaPcMrHmhO*E? zY-zj<+-Y_~F(OPBLB(@S#H${WqJUsui7A${FlbP|Lpgb zm*?d_7s(X=ljJouT?Ncic;slAMQV&3Vy7D9Z60@W)*65pD0GQXdy?c4^CbRtW zoG7_zR+I>a$=Uf|{CEER@AgTS@fV<5KA@D%7eG__|H|V0|7Dfs`SH(5GU|W)mZ7fb zkK#HKn0h*!^h0mQov?PQZ*C|~6H_ggY`44#kJfd{?WyK$xttq6zSZLlfDRbq1n8D0 z9%aHPmbckrBncq}DSaC;Y20RlUI6KYbS4euOfL{K#wzMrt0h4wro?ef2e&Aj_xZYk z;pDa(xJkp0r3N2JXRHH~5~Cb-1nv;fHx|9g;qZIVDPz`yVTO<^H_=my6WjTY36^X2^0kOZI$)7;)cE3*q9~I4Xn@4g5Kwgw0KU zNGK(B85*X_B};}GHQCm8pA6Cjr+`c~r+ownw?E*SM)%wI`5;hcm%gWWs3o(z)Khg_Mwh+kn!x-?ki6-f zKMArOPJ(Dg#~+WyH8i78l9oDfU7bT3QaA~4Ip zLN_6=4zi^IQptaLdEEWqmHGF7bCYb=KjtN(N4{_rxKjwedh4OB{Ad6E!+vZ$+nVK; zMrZLs7Q>(0d$4ViS^m2ShNiL}0hmhuOUteHzrVCBfB#obQs(i0b2J{wFaj_YbLC?I zw?jhm?}uH1%QQN zEUBQ7#}7V0N}h|y6nQ`s%k%(_#U&9*fQJHLXcl@Lp4wo0P~rsWC;&BhhXTy02?B~1 zM29C#OJ4l1Ouoa@u~_ipf7K6>uowNK{uH}dua2mLAUk6`2+<4_9pgP>H}4ql=^#2C z<2_Oo{mlt<*fIVDM*)~a2s9THL49qV=yZ2 zNWTzl4-#sTV*%G85j2bR3js)u?{RP;AYtvog`{pmfcQ-!LKHcYCL~A!iX&rD$jU~z zEUlnWia_8DDkYpnxDpByjDuzY%2TtjlHp1(n<}eIPMJ5 zA#ork!eUHkF^F;$9YX&@+$=uU!O&u)7*NP&qB~*|ECwR_hu&E9064?N(3v> z1cO~7c;#eirpMuEolysZP19PBu5PIV^+C|w(ln>OwyqX9tAn6E=qv_D*SF4Sn%xSH zu5M|mZfu)r7jo*O)ZZ4SRan-L2DC06)LFe>w*Z`th$z(8P$!g)l=&m>Raa)JEqmQHX@wUnp!|L zXs&K)t*@EgP~8HWXSXyr1?xa{V=ZWGYOHUZ)>7X%y>3=rW2*<$H-g3{P&cQpu@wYo zR5vuBsvOm`TW2)2Ao@T}Q}f)G`sp)T!HlMc+Pan?m|6!K>Z_+V)X7yf&IL6M)%CNA zL2dP{>gjd3R8#AWx)uillc@to&!|J6P<_>npt`2DzNry4qo%2`wWYeIwHUNEwX|wQ zkFF2a6@%)Q`XK6%X)R5&iXEsso2DU<`bJc)u};QW2Ep z=|NN&HBkljY;V<-PgzK4{%@(PuANoqiBbbpM~eBstfJg{|BFBG|Ibk>0MmlAK;blb zdRLu!U=|c3MGnW9dDCfWMy#W)5I>e0@OtTJ*ds=0$WYiT5T>O_ti!9!bzXI;PjlXo z7@Z$`(4o^mxM1(b(f-pJ<3PwWGphF_U{iUI>S%B`M7Nv)32??gERzd4VUFhb8 zbVkB4FY(Ch)yeohBp0=yERxr4%{1Qw@HI4mkN_=-faI`|0%mG46rhn4q=-An#iR&m z6^KxXCV_Gh1vWc)f$O3vD5?)R8Xn^ii@|jH5)4q?TrV3+q`--yTe(0&jd}t`rxgZM zGbmalxh^R5ctC4}U^}s0h3IyP;FINlt8SSES|CC7e6svXKpGyiEXJZii=Z2=a>W>p ztk4iA0FvQi6s`hNVPr`~`ItnrVUNR6Pyp%?=~N7xn8@IwMQi~}po8NiL?AB$0;ARg ztpOq#%+tF}9)N(?Yl=iEQZG3JF%d}!GOp&$fJ{^$FXa?ek-BQv9^=5YH6sRG7^6j6 zf}+FWHV%^COMv2_$hsr| z7tx}G_z;45Cd6%p1*YFcK$M?b!S@fyNO?jaqELbY`bkKDBv@pWtL4xd2}g6O-6s2Q z9gb?Ws6rejBBLGf93=v@l8Et`ZXw39*hAC9#V}5MHU|j_>>`*LQp(eUvt$OEtsXy% zXAbRT8vZV`fPuqpxj`?JU}WQmQGijd3(76Aj-eLXVO%$AEGl!X%nA%tM@nH_xp`(+ zwxe0*X%RwM)Z{=jAd(RnB>;}BgJ_LxTAJ#zNC*-gB1o)2Y0j(q(Xfnq6?UEy+MWU4XhyvXagu=q| zxUUDU+3t`+pc_qE0!_)0IJlwNxBn1vNw37rLLI66|Nc_z`)}oy`Tf7#B;)>{Ar4o2 z?o0^?l-a^&a}P6$7E?ou^{fIbU$MBoo0m^1l12U#URv9qI#TZc$G!hwS(=ak%}q*A z{+kgyG|TK@qXZPLaT~eDvYRi`6eJ1bn}A+gblVjS04LHMPEDyqISK|q3ygC3rUeC) zDH>1tw!J%Z2TT_ES3;t_%H5Y<+3fUo5DdYRP{6nAW?V-q`S+ESTjPI9D)auooTMcV z{Z3kZk!!DGP{yg{)4-(k40LL1`E9Iz@?)Vn`R1 z`$~(|yOjtE3dW0`ok1vc$+!OUG~eU(c}jgApL`WluLIxo3xKnOqwwwNs&jcZOLP%5 zLv%3E>G*@6tl2SAdh*Y3;c#DP|1{=*>-!HSexEP@{(DXmmVf>Jar{Ok7F~u5&u(cz z!iz7{c2*nj1;(HAhQc2pr6>PUf@b?F{prO2TjzgYS$_V{O~Ufe(4qv9P*3#ve8u{g z)`lSZSXPGZfJARI*r|{B#}&%TN;R{9XJTQRMdrjj8CLn=6}Xs$=NaV!e=S3sfUFsY zm8msLH(HTd(w4V3>{5F2uZ_#V%>N~&ar1xv{@>grEdO|T^Q-^=#gsz+m5IN9b)=C0 zvdRj7{QHl2`#&eiJKh1t1LG+GfWKsT6hJPN)$;&gJjm{m05Be8^;7^D53+YK0E`FO zIU4}RgFYV*kVi4gX9Nr_OZS+7LPz$_3V`t-YsUq^c#zE#17JMJ(xCw`9%T3202mLl zdvpMd*Wl40dmWBK*}w!p^3^>thp!K+ohPm)^gpfX;FeQXtA{+X!@$4lGi*6Mar)t4B%mCwzJSBF`}Cb zg&2;YAmvJ2sI?(zET`1$GPKB53<`@t)np~CE75~>RaI5WLzM~&rFIwoEfc`gJY;AV z7HXMF-4TMN7#PHBu%JW;l1hkNv(gbju0cVF3lby=d8xG_Xl=3Hy@m(p0>IjKaQNZs zHv^oQ;4}V_D6bRtfGLIt;!tJ)u&^7DLJu!-o*EsxCPL8KK*ZHhq`wG<@0>H>Xcp)$ zLV`14k8SBr*rOHh1r{#Um`5K5<1m|sqO~Dd!_bhGW-31#xAkvYokk`cR`U#UvWxmsuEBmK%OB;6O*HXm4DZjV+qd+S**`65zrZ6eX7xxBgwjs$ZdNM6Qaq zTEOr@+)z{rvSr` z0C2T%F_voKI%u|mBdDoLj;pP(%Ol_VCl(c3YCwc7iMz>IMQVixfF#HW41g|=DA8nR z4>F`x$~-kF&)NjtlF;UK`6|J}qBuzFm)>CB zQ6ePKqkJlKMI?z=;ly@)F`KIx%yUJd6yeZv#3hHSxQc-@!ikczSa~GA%~DANAwibx zF;+5z79}n$5K(hA?TieH>hTwYl44L^3@VF(-&YL$<;9@HR}4zZi$STc7?k;nLAkFO zRQQTPrB5B2iN0bm2|@c1DEg<=hk-G)oS^}i_>|AecNyA;k>dXvW6=&Mc$%An^{w@D z>e}lYr`0#sx6U=Ta0VnO`MxXdn`rZGVJjVl0ie{a%9ja9`Bo$Ilp#Y>R^Tp|>4OPS z&Is!vLdsHs=GgjLtzPv7@OC}7nd6v%&b2Md69(wBd7Uz0LVMU_#HuosN-@- zaiKUhv>a{7T=IULE5QoXvRX;u2r#TWjpJ`naq)`8>jj<2#3OXg1iIu8GG`cdZKu3$ zQF@}Y*f3Hi^@p;$Fl?vZe-u>8bs1m{e;PS4O_Jpj8o@e40fnQ?bekE~Lof_S5)v%z zOhCM~05W^c)Z4Agje}IjQVEC1&|DA6Ktd=qc7|~P)$F88V9PR9reYQpMIsE%yb=|| z@$8}uBd7vVG3<#zf|}w{Vg;vo=DAF7iM!h32?bU9L_besa67=m4+n)x;|+ysG>KHd z6vgufF00a~k~hzVW(-#wLMDTGM4q9gLTA8PG|$(T0F5r5isQ_7Fimd15GQmK0;Re9 zrg9tu307^5R*}oztEU!EIYLn}Y#ASAZZM2au_+Tx2%rkzFW_Oh?l@M#6{?;Nl}eqv zt&RyJYvLhM8W_*!>5?xdCEs8^c+g5sz6rTdZMH`?6N)uN9@$zb);dPz1rK5c!)Ihe z6nSWt6d)l&lYp5G3J=$Too|JD7Xr7|waF#V(2sU~W9=4_V?~aE9)=4Sx(wGOC^!PZ z1tzFNP-NZ4|6fv88h8J%FMt0}Zc^U= zm-qkW{eOA?-yrb+Veem&!;xTlqHgw?3?#JPQ$Hw9KWr$fyKEgCg;(lHY#gV}88>H9 zQPK9+%(+Qv&i`8cbzka8G5?pB$G`tokw5>No0QlAuLPk4Kp`i3Alv1sYeZ_Oy`gD3 zS_;Q~^hjI-*A0alyk?TO?9mF@1(q&V#ZkejIxpojMz%G?mr-5Yvs)Te_=cwGvs)Sr zurfjwy~+Kc*V525y&b9CmZth+tFboI5tvRnS-i+re=7QB_Nl5{_V!Q>QvVzQrdNmt?jLIo9lwQht=f@nB#*axJdHy3_-Kj z9D>IW8lz@;@ggos{-P*j&5p(xiRKAG@`gAe>ZS;ZFoDQ!-9#=;f~V_it!_&kizTZW z`%L9}bz`RH?@a2&lB2Z*xKQ)Cw8uqM0ar&4Pl%#gCd3Jyg)W8*yAwxrDDfDUT0}m* zYT`)FtZF-GjUY3)8C43ui$b}9pW|IZTG$JkDbRpnk5DqVh0E_NDeKe*)7CeI>XV&2 zNgXAYruM~+qzR>|X~pp{1`!2S@lHdeg5n*Cq+G}?_3+TuRwM^t*}2l}`_Im-N!@`) z!^hx;#wHGAv58~eMik(}K-|uv$Kz2)!s1|)6EdFy+F)U8$|G?>Nub$qp=Ix~x7bpj zXj@;rFV9$&<{UL?ym@v5)K&zh;L)&91$5<_fV4&J`ju}1umlh^6;QQQF`&cpPfa%! z177~3DI_aGvko_@bZe(5yKqK%i|aQHL}y$x3}h)8#*UeldV=&~XdOC{UL0SW45)Ra z9ZZyyU^PVva<_DFF_xO*(LX~`v@0P$X%|-leKv#RJH+DfYhUBgv@VkGYhS21}91`y$JS{ z8}m&D69P0DT_#XPcHKyLT>%@DM2A)%IPNu#kgV5`?rf2{y0FNR%*Sm*v);CjSSSRA z20BVh0pOY#by)|&Jm&f|p2}BlxGP}?@RX;y{?iVC_N9&#>%Ypl_a94qmHG3Zxk-8d zZ{Gi#_y6Yozk|U4Yj!`$GfqI6lrxY0l+Uy$jr^QvvMM{xMyAcurOUcz5n#7KOE~;e z`4ddBUFba(+ zb<8SS58}5#6QOF0UlyotH_Su2+s|_3P<2=t4jt+ddI_9d3EW$T&#JG?@JU(2DVM0> zkQcjnS*;x|0WMTYX(w69U|7#{Dc@={1&hg96t{lT0L*JKlWz*w zyL72Z_$)e4BOp$c6GyrO(5ZyHxxB8TdA>G_!my&KHpSt1JCa6bMiz_3R`E6rr!MZoI?txdH} z0YF9|*$Fr)0tJOMRJUkL+tQ_0@(>f4iNkNGCZPt0s-=lt37a?Jm%k;eL58ra!$$Xl zDWD4k6rN4%Y(N~NqwzO@wi`o5F@$=mqu2zcDOnv({Y04|buXR(uAqee zA6oK=k?how;{31Q7x(^Od5J%N|9?(W!5D7`&3eU%!%^TUFgbz>@Dte?xq(oTtU7@T zvg`vY$gT^hAd4QLf-E_J3i|Htkg@Xz6OldFPeJxPKLuHJ{1jx%?^BRv zw@*Qqy*>p7r%!>y(Nfpk)Lz|O-`-r^I-_cA;qeQBTfp00Ts2RlnHT&8c#&$s|FkRq z95jg*IpnoB&~Q}O*0xkRmA4Ydti5+oQ&IQ#tD+(zpdz5sq=`ru=_M*40s<=1yMTz4 z&^w8U^b(3RDG>xBH3-s6=)Fkq2|e^cAcTxU2)*>vyA7%SP(^*S5Fg6LMvs zfIyv&U27)`?Lh6tK1^Mk;{rgHEeV=IV@rSU zRxFN>CV8bIMKhvRX{qpwXDLdNHAMdT{H<5EmC=&Lyi(7WIC>-BTuc;_cA$CIefesg z`jX1ka|&q|GG3Ey*=#AxNc8aiC&F`l0iF2q8_#{_p%)tPj<*T8Z^v@l=V0mPTfHJQ z^bzUVue2pcU>YjME0XQ`Z(edZAch! z{GI=1C})XQU0tj1<&2BbW3tR+j%!)k8;U6_N7)LGCv0dWkdcRfd%_KdJ4R-Tc~;%2 zt8eb4&|bW9rGcKeVmbF|wj3`b9uuCBZl7_>dYJaS=T zZ2Pkmk}+3#>qAi6bAp;7cNRAjNSJ3pK5#%_vmTI+#-uFJdRAlBwlM{w#+J!f2d9}(sT?W zrJVy4RoAi2l#cMzaL!kZvjl*_Km*Fc6ED87=CBb&{TID>(sWcRJS}FU>^n&vQ1*g) zV!)dx%WSt)QR&-C)L}guGg+UA{mf?&_PM&1Pz|(*{7JJfya`*$RI}hcqRgB_ILepS zic|?o|I<;@Po-c#+>D1lU(pYffE9-LDqJr zX7C8H0I&d{tLrnx3-|(OfPL+7rhvW5Er5CLczd&=6I8Jr9iRH=eNW?xk$8%-_o<%j zd*l)NS6@wp6=L__ydsKg3u@)Dr~*+|5R)T^ATBGRp_ckyX)%uj_xgG9E#ll1H|LGs zX*NsGcbGIQ%iyz2Hqi4u5Ar_%pr!7(cLceJnRi?a8yJxfUhMz?h?v|fva_)xqQ)qBe*0xm3Sc?fYD38en)0S8xGFJizZf&bEDvQ>xA zrq4oaV*L(Zg4a8n5&m08FyE9^@iS~+6uJf7w5yzC{-{$JJbA<> z3!atSkA`GBpq_Ca9y3Isn&&&4r!2guI!A`fxIEX(<7&&Aw+Iemh?UA>?ZV`rTVL6G zb3LI}L59a;t$(2nG=PQr`CANwPIwOz_A8!I-YX9sBCTg620bE{P@57n4o83sn7tq$ z%-Tkxa3&OVTrZ4h`h(Q}`}y_^v1k6HrC?SgF?*OztAIW_L!at3B@b-z9%A;?oAc`A zY}E62>O;aoo)-gqAZ^?j3%`l57!51$M9%@$gW-ebU_^>-rknBN*q#-EC+L7#| zm62nAd%+;W5f4I-;xV334|vJ#7b^cGKo3(A(}=P+gw(HYAMh!n&X&alF(8a4@s5(O zB_X%D8nHm_zm=?ON<<+dC@PL`iDG5G=I-yh1e>{o{4JLTWYe;a37(Kaf9JCflo;iw zJMP~KV((aUS{VUoYV^A1y9w4^&}rD%tz4Si^GX$oayLmTmRTj|vVCAf5h5Hwpyf*|vl78=|E1sC(JE2)d2=fa2 z0T)5br>i-^H5T>L>qdsVM+6+4v&M1JqNA6(+q_aBl!C}vZ(2_q2&DQPnn9YM0w>|rWPV-5huQ&?A1BOj9l>%3W{&p@5oL^0$c7O8%PS4LC$kD1-0H*hj-=& ze3b**YEZr)L7zD^Ri(a+{IiCsTn=c~Cf7$En!82R=48MJzbCKfBvXhm8r? z8-22>!1gL?a8b`E?CQ;tYSC6Cgp{~SV@t{2z7?M1%#e_y6#UPL&x-W3@Sq%Om?iP~bBWskA9LuSvf|J})oBT40}-(FSDf25L!rTb zyP~mtch+exv^K|YTYvS%h-Do%JH?2b<7m(8eTNYWrGSS@O;4IX^Vk+r@mwew7!eSA5ofcNx?l?;H4OGy}A~E zi^;%DMrx0lURiJrX`y|8a+RBmi~ptTS=T}scW}r)Y^8UhFW;}vXldE)CI@VF!N6X& zlOS!#`RYVXVz>5_ae zgQPsDZ<+pHhEqZ9;yu8uK&Q=<%>5q<_LBfht3Bo8BGvvhiALb3S-0L~t1d<-b4r?% z(Z2789X9B$*PfL|BNzM>*JhCut8Na zj0-Df*Q-Bl(@Yk>M`?Z~4mv2T$zSO3$F%)NrShx{%*X6xCz2#vf36vOeJDN%zVw(7f&WM1%r>~YjGMn zi;qEW=w|NVo59|MR35?eHe17FML4Z1GJ{dihEvl**;>v9^0~Q^TZ-g2x(;j*E-hF} zSEdg#h?)fTKp^6Dei%mfJOVn26V_G=*N49fSdkn%uX^+qX^265 zkX~!pVc{vR`mF5w<=*vUzD6T)G`G8fIG)_KOxnD?oJ-)&(I@QUJGcX=eYQwy&`1R3 zM85Vg0-n?4)E`khRrV8ndWup+$r4mtFPh+@skunca?58NJ}4$}4M@xW5R@xGb`Cds zu)RblSdP`9IKukFQDVW^2?v$Hx|MG3X?Qa_sst`K=S>~%F&rk0=aLdT(@U)6eF!S_ z;Wk!D4rC9aRn>$-?=9316OWogWII|4GNW(8~)jWgA`%?6|4RyEsa zuxTLs$@;d56)3A_8zBlTD4c)~v*tV$bt|#*8&FvKdP(&0f z{@CFw45}Nq)kHkuc4YvNdPgRr(f!bKH_(OTn(^u1N9TBNIJ(Il0v)!}m?9o$$hx-V zlCf7Nouo#*OM&(E%!10%nDviC~`Q?WX=qNUIw7x0Y$bG z>2RQm!;fQkTvLG_xM^#*U0YTq_+Jz)5`^5Sg=SWkZ3+t_4r5orEk{$-tixqO+Kuey zXyu)B9at8j7O%_b+tBSC;0iaaIEyWs=C~YgiNMU(CLj5Ns98EJcmpvMxgWU0ezM?C z<{F8WTgv$puPu(kRIl$K=A0$~i_=8tTrl-sGTW&ufhBf+@8Jqo|I#P`V(zw8P|ba8 zUPDQorFC}A4nE1|W1NxOuaTa%@X53tpa`od9F~}MqkJaQ{WVInu|r~kYDU1N_)XA0 z6miq&ifhnLShAHL89t3tah#QMXa;P@dpniSO35`)epeZh{%-%1<>qkj()BcB6{Fj$ z9hhd4#*jv6dN9OphC#r|Q8s>V7?$HUIDsj*tU8#0h7a?^Ke`p^3oomu^wsnrejL8+ zLChp~5EC($buJz0J%(foRtj30L*Ds5UH-XgJx3TGMEX8d0x3J&Uw1*rA~uD1WX^i* z5tOr+hg0?r3(bC;XyMF}v;87Es-JxvB!F0=QPK!+BH$28mjIuUZyEzLeUFxf9mg{K7ot3J zdQeGgxL^>xb{;Yxyd8S7(r6G&WVb@%QGqqw_oCEiC{rU7=V7m7BgNYXR^hcMjOOqu z0uD_yzC1y$n;8e+b{{Q3+FH&xBv^QMg=fH1;?1X3JP~-YMs(!PNpQ{fI6X$re+ZS6 z8@a;X>;SU#+GsoC&Y_^O!A7p~!?>At2nuvF$MVnox452gL=JK`=zuyDTwGJLk7L^y zVw#Ru`LtG;i$IK@K#jP5c$`?Vamh6;eZ67^%5vAo?FTB?mfMjs#j`xuBJ_r-3Vwv% zW|)hDUzbVScxr0%!3g>zvifMRh1=IVivY1a+el_rsu;I1>w%n-$imaFIVa_m-jR`w zRWvMc4Ea6To5<~JYca=t>k*LP4>|{f#5t6J zUgIb9Ep6W-4$9$0+CO8uzRlnV^;_hrE>1J6GVt#H<`t_U`F*rH`)0PGxlg<2G<9oS zih?PaDbN1Zqa>tEX^Y;PjL05VQ337QmZ3TCENoC+4HqT((8H#_`+^-ypGH(OWvmd# zjkUVyPrB8n|_o*jGmcr%V zmXgh#HG8&vEQ%(p;9}E8KyJO;*d1SR-FD9Q!EQld{N9Yy2vfP=uM;x63S&$227Vwt z5Yga_Ns&S#aq*Jg?C~w1U>&~oZeb1(der=;d}rX=vNRfUig9Ov#c>{ua!v;khf;0f z$F39#+*h}5vn&vg*e+_EQz|F7G)()B?tnVNbE5{kv0@Q%%_f6nV!s-%fjW|$SQD7 zHuBmYx8AI`&K@nvOt0CgpR~$awMF{(F*5npcJ1p#{u?#h? z?F<hzXuu|amfcz8&mhvER zKEZ}{n5?7Eh0u!1mE~;l25ZVUBXqVe$)DM<24p2o{k0{ydyItY-L0A5gU76U7Q>y( z>%1r}wR_U!6&ifq-ui5hyF<&LB=A4*M5zIEABpXQNo4{EMOBYZ0?E7*u1^+Le`^R% zvx#P%4m1Qp7AkF$5oz(?CDM=i~pM}qj-lHJ@L4HcEMjJM<6U?S$06@bs2u%3-~ zF%3dj0h^wR^g5fk1rBY}7&cc~!x{rHJG*{|*lNIWX&HGddt(U_^N=m)U`tkbztKSf zu!q%$_(|5dPNyE~aUf0?&5AQJ#v!1yJD{PS+PEk~%lGnMRjP`;VFM2rWqkLLc+}su zus;_1(XB8<5P8E2!G834?QEz=8ah6Ub+m4$88?zwz*CRTMpf~a3Mw9B2Tm=3)j12s z^wZ(U?y0J!s+JU5F8}T_+Bg>I?CNruEQY%0!VRzA2tP?B-~SqDp=<}QdZ~=6tLd^L z&g?nF%Wsk$e^DBoNw5xGe`l0Fi~|RAfKr^l$q}n;b?*{}%b2(hNU?%*ITSC#a}COR zrmw3Q_aQW5A5Nu6VK@N`iYrk&OpjVNGU$tnFPs+HB3N?R#C{X?_mKNhvdzJ{9qyoI zjos7U-7^S?z)qHD>gD`)n482^D_ zYq%&PP62<|`1oXjs*E{v$U&@8%)*;%c^g~@g88hV4O{>EG$uns-{vWmcA@;K@!pLw%A!03`YJXz%dBihpzd>F>07bscF?=cSQ7uUw}*v zBa{LN21B@-2dv+-j{(i^U2Zw*QXJ;Q5`~WQm|tdBpofW^jg%M#YC`jdvIqEhi0Xi` z`YED0eD*Bpv;)=Xx-{c7(7Ml6y7c*H@yGpUgGptkqWsa{6N^&%$0fgu@0C5B98_D3 z4FtY+_?VA$~<5e{B*qV$_l`i{UjUvd|UNa7|CsCxql()rkUt9!(pj0gBB zoe~i{8lWW&@cuT&f8UHdcnwGB;Ud?gTTaeOu{`(u(f_PMGy5t=cH^JctBd0MwDE5i2f$qd-b;ACx*2>f3_Rqh2F086j48%Bf4W z=471j9(BbQL)aH5P9lz&Ktyo_8p;Sl9n7^QQ#(dfs2bc2SSqQ->TG~pQLgD=0N_g& zmE8c7WI-ed*C?Eviz1~Cq0VSkg4coMazWJnCUiYJH{r+$K`}s4A>dtoFb0Mon2kYH z&Rl?GhfFwSk-OncTMx9(Mot6=#Owy|@qtgAKxkm_&HycSvkV?AaWD969_)^Hs1>LPGIm&I)Dn1VPdw5K!j(YJe$*mK#ZbZ+B%3k>r5XP?K5roN#x|T+n zpGF*>H$&T%sWxpCfflq|OWLCn*u#lH!UzKE2?1>(Oczd}lnHTA*W95vVfw_>K)C7GxVC|3aNqqi`{YwdATk_N}AR7evp z21E{QS;hjXuSx1Lv**)_z@a&$b-)&RY>^Fgs@SpvCdUEJj<~5aRKg;7BNub(Of=>0 zyh@?YXv-Y^-q(J7OYWZdrzL2IVkw0hgDokur&5_AR@-DMP_0qoew^69NW{uP;4jXnc>}*KhOu^}r-4`dQkiruIUmZ%c<^UkWCE2`$z?yT+gzvW&f) zX!(%$we2!dglouHt|d9UA~}}G6%$ei!fj2R_8m@LdGSy(6v}=0ML>vwmuC6SrS@{0 ze_4*={I@cDYuj{svR@>9Jxke+zJK-h7rmgI{OM?@C7O=4JDMa?2%;#QN-Qsn9636x zv^;zDknJ_5mps+P(Q&ePFBQa3iTtOuGb!3mk)$1JoCRRi(3Dt`^VeFY$ zy&*O`U$A(@Oq_b>%6F&m4#OE6fuQ8E`6;`I1EH^Sz*EyMok4wD34ck+m=CF&m(vC8 zSR@6W@?Q$c>*a|NxR*4jz7go5ky9xrAek9y(hIQrB&eX;2@}#D6Zp~E%!BI_!bzq4 zxc%=+)II(*JDU(LrKH$ChFenY9Yr%dM^EFDvWJH5=~dfhL_X+!ks~Ja{MA9S2#b5= z)*t;1;KLx9yhFQTeHqQFbeFM6$j=>~S847`&7y{tk4%Jd)$Nuu)tuBA>s*4;qwm+=+7jv0OzsoEuY+xK} zCwNhBy}?$;E-6~F{>DmbmPC?z617=!mcGyaz6AA&&P=e?g$s4}`=Y$fzOHEgAxR9I zF4K!nvQKI6jdVonXeoBv(m@3DU{Axcs`6T=%RsRHmoT?-(PBCKf?AADE;y(^L-rf~ zWxJWSwV;0nys{+eX`#~VlDpPJm^9HlT=Oow8U^A;OAzMNR;HnA(ZNwtPytgv=~l^? z?d;PadyI%mTcJpNhOa=fFzAzIlPrB0;dI+Vrf)2o!Dp#|n? z6qQxw)6CNCV}B|@r{n*`qV;Qr{|Db(37WNE8R`Op^z@nw%~=FwLYAG-vXJv$pLyiB zTha6vflBL_I)!fW@bT9CyRl|zKyV8ai?iYK_^QMc@@gz-Sd@QqR=_H_dt9C*nGAcZ z{VvHaBxvzo==W}(Wm}o6tTtXxfEl{GTCK)EZf+AB=GEhExd;6QF9}h58(7m=E43;Z zaN@#E?;EXkX7Vckcs)VhO^UjfCz4Xas}WTBK*?UxU`2^__69nPP+aw4`|m+|!uIpZ z%?pC=KbhVTc;odiRTU)MDD%3P5qWn<<$})X&}2|P=IPp0GDB4sYm%o*=8kvad90?% z!$6G#-TJIg_kAjx-ukMxe|==J_B|#mp;FE*{o>cy%dlr(S682}9ntBrK$1i&8DIC0 zS6`NyeWk`e6q?||RvK{u(7wDt_o1AgzvR6hM4vH zveI^Z$ooqJvlg!6)~ye|zd)<;l*=I`cOLxqUh&`Q{8AyN`bVERKHV0g;Sa0+c6uRk zMn-F;lJCCa;*5zkpI~%;Ma#PbE$=w2#M|hTgf|`$qHhFY1KrQ`lZ7=H`qGyr1qwPj zYc9Ogiu28z4r8uZv|;Giu_$?TwZh|{{-(++3u%pEwE`DbLRQF=JyOZl#i^;|_i#BR zjjiU=3%Ed?xd+>j|Ab9b(RUNNP@Vj^zihupl*hZ&a#%PY?T4v)=;vd>Mi{KxN&FrW zujey&kwKS^xa#`rvijydM^&Yp3O9|Vni(f{p8eM_lud^OaQ>bSc?GAb2JAo4a%kTS z+g`gF$bEJ_P1*XV*VawTzR5|2Cq+#h#h$op3r^Ry9~3UfChnbQej2j(=%{o2^U~P= zqRp25QDZNK72?mH7JD6}zGEvlF2htk@T0owS+XxRhgV$-^y9*Fq0=`vwkE=yVs!jZ zZ2kT6`K^U=9sBGDX+E|GKe{b>!6~KzW)=%c4W%tcu)vh#Ix7|KoO_K|^#BX&_*ZA`f+qoiaVIr@k zwu$uZx&(gdqiZ&9IUh)s{(|*I(*upw>J8#T8NFGnFBOGT?##8k=ed(#{s=*PAVn^Xt;*%lnIAY?+%G z?M&e`Cg(+-@!SFLcf5aE(r$Y{m``R3XIy(d6J|%Wiz{XvV8t{PIEgZ;wVQ33YVs=$ zl->4X(d+DGV-BW;7dl1uAVg3i(!>Ny+$&jze-GvwhYvcuJ7Cd;HzZu{V!v`ju^t1bEs8^PJcwEPoSw$N^ ztRG^#v6t3kr%dxtC9GV3#Fi_{Sm}k~9lQREPlEl`0$80rF#!(w3zND$`5#J4_?Oav z34e3SKT2cp47V$UaBu6Q11~v`F?|%Vyy@P*vM}{THp)d&7U&j!`0e$luX#xIqMgqn z@Y~6}1EH1=zp`ajL$5yUG|?~h-kiA1(0KRv-S=KWO}}24H=cQiZhrK5E9;=gHhy#A z#U3M+k-xDnyjN?VXKYekEj3LoUTf=;J@BnyQvRBmX`ii{VRg3QAxGl6qr?E0(ZVZE z!Mshc&pra){H7jC28)`Ugm*Pb)U7z<{BkaV$|kjbcOF@A7h=NwpkB6r+t$>E{(ZBs z06R#=`<6bWc=zlf;XqkVP z?)M;Hi1k=HS(c8(2yHB4?MEbrnSYxr9#JgtQiYLFP3y=z>m^#PpFebmnD|{(+Nl{! zsL2p6$*s-m&CtjBUkNQ~xe^;rckdI^j%kwqy;x7Tc-`e`oDrbOhNLoqr{~nab-PMf z?|j1m6-DpA{6cxoZ7(zF-8z%1WPuv3?GLusL9$Xov#lJ^P)^rU!gcSGsQqV+9b1!cTf7seiy9{V zhlZMrwGeN%tge3}eOte0%Vjd%M_ZF0*%WnGj3e#ZHzDqOkNve?@GHr32`|%pzs>Nv z`-f(Ge@2InYtE2~`F(M{J9g6fMcpQM`(r4O#{bau!>w(nwB%f#W^j#d=?JWPkHUWp7gI_QE zCB(4Uf%^FXdc@9s!lxxYgW-yu;WXv^WCHdiM7B*Q>N0;_|DS>u$WIp5=sCeJbOR(( zr4;=4CB|;)tAgDPN}q!JIIzFR$3`9p6vJc#P`Vk0Y7V6DVT4;PInFaFj0LwEi^L5k zJGB~hUG6Cq(;K$GOmTa|j5LrtLb?=e|9sHOe~*Qy8YXIVhi0IvJm)}HJ`c|a`0MGq z$sVomVHpBrd@kr46Npo68hV~jxs8cVtnZdM??LsD`$CtGyHV@a--5Z8w3}NsORl&f zH`yD|cmB##zr?9lyli#}duBIau{cZvWE@Mc(5C&7dO-*5J-OaTySn`u?bg4Y`#pZg z+v>$5JWr4Z>V@F24fBl%IbtTK>ce3qaWbWr(R`2e2|d_FOs<|0vVA+7QKn{5#d72p zp$b@h!ZKhIS!QQeb*E&R0l#Eq5uPVatVr?F_xWJEVI!<=_HpI9NknrS%nW!?{TI39 z1Z-}bW)J$WkuH-xO*I7`h*l$)0wow)T-{Fh2yOx~BSQ-E=$OxN@KFj-97=z1BveA?0_VtC{43 zMHM<1f0qFs#|X~VgmJ?@BPW4CIKerdV>eZ7J+;F}%>NDJmr$F2BU(-ok02VXwJK_> zXo)MT^8NE-?`Pc3KTrK*HH}TfO|4(hk0xA9Y zj?x+3eY`bF$C)jseB&+(nV*&qDd1B;b^P94Q z4Mf*CAo$$OpMMbeLQrI#MdrnwxvM5}f{M@Xm_Fk5vr$yDv7HwED_j@D>2_VzPWxJT z_W4oG^Kyr-T-a2`=XxByF1!T2z!7Ab-*R}mWb+x1Lj=hY={EXjTK_TSrI<3qd4>COb0-JB^rNk#s z4y*X>CFw4FtFRnD@%M}HKO6n_?Z%={;vKikR_V^VYI5sRgX?d}0=F2P$O6$52?t&b zI-5oLUHgS1j754mfI3DKQ6<(gz(t&suop#-n=D z7&4_q7IKm^+ZgbVU&J)*@-+ikd0F#M^!0-+<3~(q5z|&P%6?lL`*9`gKj|tPZ!suu zB#Qir5|I1)!KYt6^^~5Ev}2-qlwkSgW$~t$S;Dt2SkOB_$R@*2Lc89V>HCg360g<{ z^)ezp*WGK{XJh&$VxS-E2TcNY^ks!hW!^#XJ|R#dxWl7jGSYP35pzP#gyR`9Y3lrh%&Rx{4^o5%V;)*Pa zb~%M_E34}L1r=@Fd*7wT*3TSwUj7?Km;5WPu#-!6+3aOrFrKS@}0d>?S9w4TR*Ht5(CuSn_G>lP!tI#vg(gpOV)z&5fjm)=m+kZO+^H0;`%E-r z&yCj=e={eSpzbUe(p;woy%bwi(LsytpH`*Agy^5+zZ?fha%zD_AWh?YQ-Sc|dH>?Z zDaYRutkSw`=WC}6gF>e+V)ikK`dN*#6Axrm5z`iBRIu(U;HeR*?)3*;`oQGUQM)A zUFR%$_mcP_sSEoJ$7b3hi81%7&KS+imcC$nH}Ayyl>U30{<1^J0Lz77kGv%A9Ia|e z`C8A}RhW_^lkd2j`#}HC%h~Gjz9-RoivFff6PL=L@TjF~Nzud4r!F%@c0P|>Gm`AD z^k^K);23>s?_Q_c0wSM|PQPT=gToPZ(g8ht8q<)T1Bix94$@DDdbru$eRdWz?Wz>` z7mSlZ`R#Q{(C;ru>E^x5?8aZc z&*Ano`vq5Yo@Ye$i(9yjsm!4Th0f|B7tx9W^SV_XN2h9~4?A7g(rY&8BPw26ytaFJ z4(6O>{2YgJx?ulkG?m2-ZmHlw<~>i$$}zNyH)gxxlEX$kMMK+4;FdR? z$?M-E<5zZd{N32;KUGr>?Zlg60aeEyTIBqO7wbDm^0_?A?|cG-K2(ZL$`a&zm=Ag< zOB*Jp-oK&Y$oFV{n8S}xevgcKURb>QcaK4+>z~tf`-ADhP}T3$4WO;mZ(UKfm&1?v z%O+@TtR=8@azBpj7%U(>wp;=HlM4$sxjLRUtUQ%@Kx0QY!2RB`S8QNEX4c!M|FdfF z=b;h_=5^zgJnJNbu2}1@wHq&+1K)oef*UyVy67K3_JaTXnZJ1LuQ z{8D%5%jry}Z1Xw1A2$K%cnl`J-{nXbnSK`ZC6lb>e?4VFLi%hNL?hcu1gCDtPEBXm z%;lCp5?|J`zQ&CllRz+F>+)4-pWYX`m>vD|>(jecCS_Hy%=bzc9^*Acx<#;rZ&MN> zTed0G)PRUP;dWxfuby>;@ig!QN_osV$z%68>H-Kq!!L&}D)DsT-8w+9J>9}*ZcFEVV! z#tja<3};Fn3b1W|-eIpf;smv@RQzW-BjBo9klXLVpd2OKPVd2S!#n5Zt%IiqVwyj+ z|2(Ya*V6_)sTTan%b$8^=exe#+Qw93K~Q}fGU6A9jbj+k_rGbA_w?Z86&mz=<}~!L zo`_XpyTj>N4c|wgX;$8X>ieG+pMAy?4P)1C1=?+fTum#y^Vy*A1tLnoqiSm8()!qg zFYUj>uID)3XnluyB6OrGlU=EK<~q3FmyFJ=Dbq9or%|RGjrwxhYZcaQ%)>O&cI7#^ z-X$_$3O4-rH7@>g6SVmFJxctR=AG+CHa00gjr>pI-a8KV>f}CKnn~CVWfrDh{`x@n zN_(3$uXA<3cFaJ9v&;q_?-tZW47|cRnQ@+?trZsjxfEKf=$we^cvpLs2U;Ni_jMnk%qnacVf}$bX^3&ua~{*J`xC6=bxm``K6QJ+8Z*ENw&+ zQ%fobN&EuIvt0*#&MyI(*H3$N2LoT&vJ73~d3HNQ=~Ayn+#SKEPxA!PmrIMZdGEu5 zk_b;9dO(NO7B&rBEh4gXm}b?!S^g@2$C@*McwBxX(vj8k%Ij`+`o!e*xJpZz^se^< zoK;2hBYn3Y^XXmF$nTB&$}g+v^BURsF9Mfv@DW<3#j9;xTy-5+^H%#ieMnK{tWZo} zgJ7iSTZRiaWV_dBL|FaiLx*n4>bXd{FcrS3V^1R1_9~D{>!HtEm2~wt#AR-dJhK&* zk$lzmI%q{wn0fa24PI@A&Fh_|ifuZqw)6V-qw4;_?#B!rq$$H?%U7Ab6S3-+i6jlp z!H*R^Zuru=^MRi;_|-S*quC)R?8RG^#APYRySG2mrzl#Sur0+fF3YnJ-yCiwpN~NX zY3^5G#HYQAO~%_cO}$(0N4(+Azbo`&?^jt+Bw75f_~XO8Q%#?Dho!&e`QV__7b?MC zypx_A7mu%~_(wz_8ShzlDr2kC&$ji1g5`_H*1G1|4!Q>QL!?Ltxg&=%I$wu0cLg%_ ztuBjXKJ%F3`*amyg=VUL*dU-C>rSr2q3 zU^i+{kbAD7t{OLUqH4Dj6k&?0HN%t2*V~#k=fXxmdF3XUzWVfEsi)#fw=a^h z2D5c?W#MI76+cVJiRq==V!J=-6*!q?Y;qE#%p@Q#u^&Y^v>VU(S6g~MJSevcZjc6f zGzrKSD%I3qgZQ;3eZM-&xPWf@c?q8%|J;+({Gg1F@FDhbQoHPSjq_WHy9pdXCdW2k z6}>Sh9Lj3Ci}kNa(H6t?viivJuMh4gO1wQ3bnNOs`m@pV?uO2{JBfr$@tfJv*YaNq zXx#hBXT=I){kEYF=jZ))tocO7zcNMBz~c_g%eOG)#rF{|16OX+nOEl7XjYyqx96*B z4%S=rzIeQ4otN=h-3I8bNHK6CmJKF(E@mbB38)iz+CI|bO z?=e^S4wXF}#H4gxN`J*-ePZ~@>#3hW& z#)L(Q{ETq_#ob2(*Lyh&+JpSyw3Dx;M(1k(Bf$Jl*fl8I2|Kcs$ifOFFn4zd>0f+M z7al2Vt904EC;c|u5cs;1*-iEbhe45`k*%{|V7tb$U6o^0Y}j`M!7U`ZN2<^*8CpeNUF-VCE0fGp=QD zzT!Os;|s3*OqcV(Xu`$FhFKi;J8{3aJ<8FH_^`ii?Df&ZcF zEKl_}y43wn?Y_vu);|s-wO1y-uZ#`aU1y9%^L^T!9oI#&V`al1zR|Sl6r{goB$pBi zQJ3lPAMN7X^}D96UY&o&Jly+VQN)12t0K(;FeN|8H!Uc<^z%qp)m6FAMnr@k9V9co z^V;@!=({|+Y5UFHM_Q`&?-jzjLOO0(cil+&8oj!Dv3tfV4*DPQ4@IrB1kO4A`?OX$rxn0Rp;&^G zf1~9%PtZ_S&XdrGVt`c@_7UQF6Qjgs^{&Q~X!zkrs< zZ|iQ5pKU(dE;NMG;1u5c*SP#|+B~-NY!A{Hiv>;5fKm0+G~!70AZFIfvj0K&Q0D4Z zvw<(uVQw*Hf%n`DcIRJIRo|#uMMD|t`zBu>7Ri5vw`{W(FrJZ&T6@=~CGB@CS>YL9?0nW!Cm?n;EtQ`pa z4_tRT-;crq+4C@fv-hthZRL6K;5dKIqN)E;IcfyCZ*cZzRM7XG^xZe$Och0XYfqbU zMPj2#+2tu}?NtkppBw!tvY+`EXwf@10r+|GtS!P#2Xt-r%wzoP$o<@Je9L8m>ew^sdBb)LL;R<8C}7-f7TPhWPV;IJ{=^HbKZJEPQ}(tjanwa9WXXz1-(I4~wmZ zz(qt*Xgbf3jwSlF;mPkyXx()5)+!&@)7$m1hwobJNbej zTUqhOQU>#Vj3FBfK1vPL{|KybijPXhvL5WZM?k zCnl#qCrIn8P*1Pxh;qc)GQ%o9x5a8RJvt%X!oU5U!q;~%biWJn0{_q8Jmz9r>i;)z z{^b8ZaPBX_mMpoE=$##8tsUK)8M)l<9`!68o0yvf<5z3W!f<(bfEt6gaZe`%Kd z!rI1cR#(BHhlTu=vG?9(#`+R7iNEi3Mw*q^u>5e6@Tr)^;yj?2L}@M^kQ}SB6*h8;2?H6)&U3&l5Jo`-0(Jv-P&dBKFst`yPm7 zNmZVsa%biEu+R1!^r!cW+Ojt*HjG1Bvcaf}iZx##3%j~Tjz~3iZ?t-F4dOiCi8od1fw|1+3c7IB zEb>r153>V?yxng`TkZq;>$$N)?lax}{^$4ZpkZG5Y_xw}M=sPgBYIt=)3CD4Bzp27 zJn*1IOm*}}@QhZ2km4W7ql%O~Q7QMZ(hlU(_&H29JtyPUwaBG&j{0BoV~RaU`+tbJ za{5&(Svk^4P+d~j|Dx=jq9c#mecd=6+qP|XY}>Z&q+{E*lZxF*I<{@wcG4%S&-%_j zW9+prc3spMbJqOV&Ah0Z&okfOdu*1I{oScMRocpx%T6v;Qx`s)><=KttSe+Wb$v<7 ztz?5^Sh*y~#wi7W=d^hxpQ}BL%h7tmSrHSzez(quxhb{4*9yRlx62D|>1;WSZ|aYA z9I>oAsA^8^TJ~WVhj)`sa~e0~N#mu2?CE7ZtO|lh=jsObtSh*FP;rP8(X1p~26@ih%>%EL);tXwue zgkUp1L_wIK1I1iF;fnamKSut|&#lk@L31HUZ_HqPh~AR#hyO9}mG9^OVexOl^=#Je z8{DP2^g2DU8(%mipv-r&XKaicat6Q9++Ln)dm#+XN^$r?`2--G?HaiKA z5Sk7Zsk08Ru&(|beGP465S}vxy@Bi>B}Xsh3N)n17CN7>0_(5&o-aI9>HMbW=#>z? zb>EEK5!ySuFZI9Zb{(4Mxgm|$N+fH+eoBgObve$9iEhC&V8C>y`&3cZ~PKxh0c5b)8_>qyu zx@;jnVds{oz^JKq*t*THcIhn4f`#2I))Aynt2Zukj$~EA(ZjT-8l5iBrss*R#US!h zTT``_4LMzHZ^3D_o#J{0d`^VgKXu+WbCa7m>KpQQ2u(@neqD_mZk7pr_l z<`AFe#W~fYdti`RiXh??rgrN0flgw511?iHD@{OBwst6~84I>|cQULIH3BmbwkWt3 z9qK%~7s;T)w?_<-wLB^#bcYDKUE{NjHaD6LUsYej4U2aIqgiNjT~2OvsvgL)HEIya zof;!4nWi{*6~VaP7YSD8|1DT#ZR6NeI)(MC+?P@vhcrpjGQ8NPtfWeOp%+0*FjC}D zr~>%d#bo`^#a4YO5=8s<7dJTv*nzFwAbdudW%7lM-PWj_25v(#nK3;(ACn|I1#xyA zr7ZhkMY6_)&ArTky9XzZ2;6)jZ|y6e3NPgGmL+vntJ)aNHyQuZt4F=st0;x6B@rsbwJR6NOdgC|4gbq z6~9S!H9yBYOfvXf22CSe&P1;|C&@A#{K_DwcYN2NHwed|031zY5yCkezHFI z|32G}P)%*(SfytaY@gRGosLXz^j|HpK2&3?dO-3%lhez<)iiy+vJ| z*@_e6;K={nn5+L?q?3nx%ZL}@5v<%PJl8g;TUJ(tlV{C&m!pG=)$S)3eMX*%M-9p; zc@!*bl)CksF4*N^w&j5RFKwpykTUe<`1Fn?Z6Fh{xYGF)u=qUHfiNYvy9N!ZoV{Jw z>I6VoXMJM{M0+fRXDhiyZJeYsG>)D@ZQEKwOZ6fis=ktCT*4%m*eWcaO#EKEhRg}Y|F{3(MNAvq)RI>1p z>t)Z)%ROazWn2Bn2X=xKX+^MnHc}s{TpsQl#gIS+W6>{U)?& zSi12Ffn|@xxtXGR@fxi5+IzX)zkKA=VMUZ?%6`k#)r?s{cy~@_3((h>TN{(x1^X~B zH{7xkCW}D`x$V4Odvhhjy?p_2f7(6W+}Mv;i;a<{*)0=qusouYWJP_z25_uw41ZJg zC7dSZ4vL63Hi8M!G8!z-lV(jsG#4w>rH2z1?i%qT^_taT$~KUq^-3t)U&Z!knEt$^ z;YH3Y(yIp(NofWZbhO1u10&aRJ3QKzUUuL1etb*6c;gq`PA`-gC7MezH(sCRC@YJ{ zzU!57^bdsiMi#sHQEVTOFns=kJ#8^`lbT&V;ld&G!qvDV)uZm!rxT>OpQ@r-k-#`% z8*^f0c}8OiKQjEXK5UtQ1K}e8N{%I+JCA<~oG_Jpj4WtODqqlJ!)dj*gdZ9r(Xvia@ih6zmB>pbyD%ALi z6+){@9`$8&Z`(kiFe5|n*l4;N3U{!#YN@6uk%Kwyiqb_r{w7&9z%|^>Q%)_#W;5q( z4cXqhT|R_+#yPQba@Wn~>2mXt;v3S)$=T`C^pmmIroA_o{(3t}hW_L@#zgDmS559u z@x1Ls(>!nr+EAU2z!-uGUr`E_5x5`P$anSK6tK;Njm-`DTLmeB#C@qDM=cjUC~-gi zPH&lxjxkG!!3J+i`Z4H*=?7NA2UEReIhpzkcb-Gq`gs#YgUN&Ya6LG^7Nv2MLr%JH zmX@F+RLl30-ek z=yn+G9STiPlsO9M0UL z*@U-hO@Z2j+2(g?u^td~o+fYRds(oN2TDKT8TV zk^t!c);l#F1R(g8*Vsea42uV&Yd%G*kFlYu_^BvBFxT4DnfX#()Vm~}Lf!;t$B;DH zrJnrP>9|YZe<(roG?dkxb0kan@FMS!7jW@!Z&K+$ng*VMW5mYPQzP?1_~DzIWHWnl z>T%yoIN;GbHHnsiX~vJ1N1w5C=-yjvTrx7!1EPvc|C*Jla(Pzx(JEmkwsVpI!(oJ$ zqo2!Z%MvJZ|Jm3}eW=W%uidvFxYs}0ex z$q@>C=heP(XqKi*=BzxDy-*KHKi59zsi8(yYup!Pes;PKVBsYB0VfigHsn%Z->)Yt zU2p~I!nQ3%e>LeJ>M|sDWJ=N>Hfq-O-S7oq@E^H@#U{NGnppGy${k`DR1e`C3b9G> zS|j?wOj_yOR44p}Tz~3&R#kqMJbBK8g@cv=M?toXB!|aDNF=>(uq}K`{lYP4zxbz! z!*Q#=g2Ra%^4^hb@2zsGmWE`Ox(^V*2fFO$owBP|6p+0k^?{^~fn3%CU=6Q4>}`lz zF)XFEg+_^uVFB{lFo>efHzMu;Mb0-x9yzXr79QwA%}QaAQUA&sKgryxmUL!@H#&_O zB%#=XZ9I0*qxl>$W~0!#W4yA|6=O_SXhivJ+0G#i)9I5cLhxW1|F_Ct+g3^^z6{da zXUoLmdkvGu(20d5B;-UR|J*)(~ePAm2NI%=7P1Uc(?ik^f5$S}jq zxltX#!F>+egfp?A_rx$M^NHChOiAN%)Mxsj04|exs;uH`vGihGxJJoSM$F{vxxZe| z)Ql=GY7_!lRX3Eo1;Z2&=s00vDhI&=d8&XJvnP-q&lJ> zo7}3(SR09_U3P;nsO&Bd@FjPfWC*}o?%|cGWk=1S{|09_F`;{aC>yKky&Ou%lhtSE zrePGWhGwrnD5FB7pIy4R^{;T(4>{F$888Z|xk~l3kQ94c(n?2JVFYf-O)b~Nb%kDO z7T<9s&`v;0P^99LfiH&P?^-F>xsKaeGa9`h{)mJT3f=ZpzSvZ9 z78WA%Q&3QP{IM3c&5AUA60u}{^@2+>M0PO zmy42*Pj_OP3}wF~DpGmOlv^PyMiZ;VEw6CECGFfU(mUM?LqA~H9GHE`8)f4#%iq6F_y#hsncdV?y!WdTCmfF%)5EO?mwTmw8nooYhf*d(! zGXJWtKLE9Pkrk}+_~+GFf!#%VF`B;PUzr}H>FWczr2x#05LWo^M!g!eKwT{nGW$b5 zqIU$}Wh}k;{hN(@@Y<)54*hY6E9JbCXrz)dN($fkN*_X=lW65b5s|2pR&~SFf2^*h z4~2_0>poEfrEiliiW4Ww#6>-j|BhRjPme4xQzf6@DTrus;K=+o(n6Y zmelL?1=gS7bp<8(>2o4zH&42fJ)qaX^(fkt_?jM-R;aO|D^ma6HIi%}9PY#0dwA*l zg%ZaH@ppS|P3!G1%6eK$3&EP-#oW@qyba&ez*7=}t?kd-gFy-cV(nu#3GMO3SfkP)0^r;=BfuQb87wGlL8#Ch^QcN7>$j)Q@*5jT$Di@KioUg^PoqoeUKh zBxo-y$C6%vyG7R;;%u+|w5`|%Q~JFoLIyF?K8*y{=3+#KzY>uV5%I(_q5|}YaGVfe zVkNH*S=2^^0fmhLD9whd*Z5WShJ0M*gyetAwmljoCHXvZ zVx!%wuPvA~cxeKLvLaLsX&T~}ppOpWgx-;>uiOF^ds~iO&{SiH25V@fIuAmcp(G0C zCn0kr%#@BPGKj;jMJV1-LZYbe6QD?N8Lgb;1i2CV9Rk)`#1o_NYL#gS7$)DhX;Up$ z!~S2UP4}vdoRf3E0$m#g2~2Zjevn*(&@WLk$a>zmY+_sH#YSX*G`q|u(Tr)m7>Ph| zS@_`sY->Gws7|dYStXesktP)_zCl#CPSC+v1!+>m`p-n~Vt*0Ho+_Iq=y8|9!+|s* zMRb^QX`dCMGab1`{_)&#b>ek~2}OLFwf|djtagYfg*Q>V4Cs-5sibe;r6)bm0bT6D zKnI=REvA-VTjfmUe4$}iBoCUCZshuRWz)tLqm|7e>nvbZIP~g;gBTCJ-uB*zaWPvc zKKg((jn}AZUqnB&$}iL6|9WbiB6LTxn%B$~>zUK}6J3lmHlH&|~i zOhiW38A!IJQvZaHYXT+O#m|~azfph}HpP+CP}(%wa2;uh7p<64aRm$p$3)A zxTerBD_)S)S71dI8meV660@~{iaYrI(Z*AQA-ps-Xf7a?+JP)Y z=e;o%Z3$fhwI|u>NEsvbkCmMu z7MWZ)QjQYu(np~JHc~0?X6wTj>9H$WdQ315Mg3C393=Qc?4Rv*D^@EQ-(u5rGHa}t z2|drWms0NL)8kmmECUW%X_lfDbN#I&1Wj-gN6c9b4~_suRl$kz7*fo~hiwKNVZ^pS zJ_HxTl+hV>0&3J1HqVgU0RkHex^2BAYt2V>&5;_d9esz9y_2(O)?|j>F*{;~m(4-C zJ^I@I`kOQ$>SrHX<%y}-J#tV^^savDl^53XzGQOEK2>O5m!v!@*RGk_PtaXcY@TV< zms-QKDj~}yEj1|)#wR5$nReO+c>)f90Dd(9>Y9`$<3XJ;tI$}=u1i(ebpd-@|5m`F zt@fJk|xQF2I+^p1+0VTd{>6fuWIK=Rlk{K=nHFb`qpkW1AUshTC|nw-G^q7_dPWG z#62`$K+oIKzXeatAlH@}-{bFfC6CP@lHZHh@Hth4H{Y}ZzNbs+zgKuWk28mT4S+nCEXCx9N6KrIR!H7?eVnUObxvERQ z@t;~*)4D(E_Sui@Mcp;+Or%6F+c4frZ}RBR%2_~T@YF2P*OrdF>L+t|ZM2^bmg(rI z0{BVn4~0TizoigmoCFtWXL_ast--SITjo8-JG2N#Zk<3*#OS~YvPoX1)-}LjDoJyC z5(oOzn|B`rI$>(COT{CNzpK-NcOSJFhB0N1CR%koYgQQ!&L)e3p0BspetRx-@L`|2 zArPy!h?86%+0J+KVMla`dSbVP+5T2*jhTO{sI_!Je$ z9!rjXl{>h1J^7+A+XXhXHU5H9BnxFb3Lu-j1TnNebcM;T4emr>c( zA<@_|IM78`A7=p{i`I?A9qCsepH^1b`~`)Sscp;PA|a4opW(UX%Pbxyd; zFbvMg6E~IN>Re?x9X8cRUyJb!&MDQhl@aS)WkejZ190WKg}Fgm2(v)>RjbD9k`^0etq}a>kTmCYVKw8?G3n53KZ5x4jQk~Cz=G-<~W_BIs{(-lPHEF4>i7h#S)oq1@LQ!A(|EQ#s@yZEVw6D$lvy+ot_l4DGK+zx1%NGk?A2 z-2G`*h&)0QhC_sM{mJZDc4Y|}XfT^)a( z!_8gB{jyYpLIm23j0Yl7F4RRr!W4nx@&sN?HKY|o3qMGmtES734TF0fHClThs)a?| z`vn7V`-qgkq_^x2A)j5J&nWohRB#kF)#vMH6T<}{wYox`)&Q*{7`F7x`qOMuP2NNI z(U%kxnOr0$L-z`u8zN?;pyRB^MoTPbR>1{p0jYg5jM1TT?X((t$Y} z9;cEJ6m_idept}*#vsr8HLx^Dk#_cn_v>Xa%J(ykqj2+jjv+C}f^-q#C`OuFr^29z zmj_E;L}BJm3@R_B%}F_THOv0jaEovN=3`@od{Qu(@#8Tk15dSBs}5u7Yp>ELrs`Ad z@uME}C+$d+`R)981I~@3o?+>WYDu3=`#Yrp4Vjr)ICn-`I@QgL#LB|l7R6?>kfjb{{dD7rqr7Ph( z=aN8^)H=-MU)j|TrN2^eLXDkprMfT(r6`DhU~b4MNp#*=lKE6NM)e|PG!WjEG>~l< z@sw;FRL&5lMlaMJL2(t_9ha=Zq?^}o7TSxbSXGx}Ck-Q+~fZvYfiLR@*+N?ii(meFQQGEjQ$L=MQ{Z$AoXDEMWSkd@=i z>-;LG2jO8_zXEmD*yB)`GhhN*8nHy1rzJS@0Juzg2v*@$uKTb3B<&L@d9y3}i1ISu zdAC%1C04Ad-XI?j-CX@RTEr$!m;p^o&Y>|G9V9~1crt9AIHJhjvR>@_w>>ajeaeFG%}7FwM-1PYYeI77tnX2z34Kh4f{ZBPZi_~ zP_`n!Y#FX**_{S3j`jyk*My%2JFYXPe8GJ#ovC-R@r5QJ#p=`9lVc zmz1T&_~9`RP&9G03~2({O%?8N{PrmnB^b|f52+kDGbtyMjGzD+6Gk4i8N2RFNSP8G z&=o!2g6G1g{F#?LBldIJ+eatM!WWlbbdwAcLK9jFA^UGA724CAqXaxty9#wWQ&s5; z_`{Ve`cyHt$L+1OD?i<*>taPp7@=Nq5rS>ZmZSIQV8Yun$y-rO+4r6NrE3m+t}P!& z_XpsQ9glktR=-o6?zbxZugvDh7;${O?)!?I^*FU}_dKnXpnPGYGGjZM{i;}FOrPW6 zk>2}yS)c6mhg?6OF@?=Eo$hl|HFJ%%gL(fNgFvhxV|y}~CJ`K1QaR|S-f?ynDkBYL z5DL;TZG^~4zylf@Uqh^L9IBkZB;;;N*9lZ;bXBK~LjYTAkyUtV#}8iJT+nLQqO$Ks zVXO}p7YWuw@HLNc`?PSkdu8oWV5>-rZBdb1G9zHLFFKGFIpC=bfkMCv;JIQ33P!gi zmy;@a1>keZvsL$J(B3}O4GM$Ak>?Gm@%z1cKd^#cMevqQp9{sAo)OW{Qp{~6y?VY+ zAs0{}CrIV4TWM`?ny=aDdpAW={DyQ1=%=DmLT9_nSE_Q0Vf@;Gh^mKWZqQBeqy*Qz zFBE6Pb}3uM#J%p~1PUbEc)mTbdY`|kZq}LKj%@O*YUC%0{HDjZxxwK-?I{V=d45F8 zqly(u_0pLSdS{i4Gr}g< zd53ZzF?h$5w~J|M5!YT9*Vg8_*@m=g5>6#WEb<~aGzbYmv0YWx#O0AakW+|L?_Qp* zK4ubaHdJy~^%yq_P!Y~O<6h)jCxn|{;kiY_4JPVK| zu?sWBQG%mu#KzdnK~i$shhiy6r&4gVLWL-{i8fnUb0J^{)Phw=lt*&k zCNWh9a3_l&m&I(|5FF5|g+Z$PWy0%NoFO%I*5S;*YOEwBW0^c~fJL;>JrLUkt#50W z7=*h^DKDo0FUw@>pO^(*pPKCcsDaW+p3zZLHG_c7fx9#uq>D$wi4Qw^Yw#1Dg%Sj9 zDpvKgbiWskJ*r~3b3eduvq-`10wT)%0$ZDxOkYX<&%+1N5}P(}NXhua_ibXO(J*;% zR%+jHAY!@&7@pg~bzte!(R;!#JBM#X!CnI%s}S~-@d(SV0J{4& zu_Ja1{t{cQPfa~PCP}7-LNF}&(f~@LiUQ*298`a&D4KvD?cR(MhkVmf2~y2f87Dec z=J-*cA<5?Lre^U;Ga>^QLY6-Q{UK@UGOS`n!1qDFBeKX2p|5;J@jsv($bszClLDbz z<(bks6H#$;ttU+v#q-AdD$Hm1nWjM)-zp%x8Se4W>03;nEfZwqMM?uL&G1~CV(EA0 zbj!!O_kc3Vi}JzrJ6;Y@?DbvgUB;FgX-!Vf95PeSrX&5GoP0dXJapwu>H zgbl`eh|`{m;X+}}Be<0q1kpExlNkh5y$ z!$*LD%CnaVVa^da;plw%QN`?fBG1q_C>*QvQp-Y(bhg6jm=S?Qt3Y1N1mMo1*LSn= z$Tk@$-W_J5H7Tl*Mxk^h`m3=R$|3H2)^DkaA8KR5YbmmkzZ-bahu(aAh?h{T^tUug zgVYmQ=H4vSJ5_8_Y}T)j9F;ciCAf?!1_NAK?tS=n%avsHF_;O&L1B@_2$YPUZ~QSBeq6HV`VHBpjpuDDd) z)EstHlT2YW&7XKRU9}XZqcjui4hF^T;-WajRWfP)Hbabh#XP+}`5fH%9~XA~744Z; z+W6=rsC}S(jvpeuWv}?kF4lP^Tf!A;E(u~*LH(nOSWA^FdZsN;UJsLk!sgQpr5U5J zxHRKYVl}~+1%Dej7S`oprCWNx574UD^gLks`G)G}?V4)_PD_R6SsP5+oU}ZY>VD?y z!J;it4#fcVr&>9t#Ip?G`HlsmzcZ_A#ahod?)KSHYtA}5e zU=xQLBi2d}kitxM1$WFyHq&4htH)xNQrD{7HSXFu`?dqINn%D~Wxe7WzY&tW!WL~8 zP;NdtSdCbj$6+6FOS3=d;3J5nl5c2tH#+btSU#LNloxmrH`I0Xq=$h;?23n56zb3< zdie1!^ovc4CZ3@pVdhLqG0{olY)N z9$+Hgk5v)M-0-79xZmJzJJ&Nn#%AGh5yXSJ?k0%kW4PC>H}>zEPuEfx=E*l4*(*5k z;fL9+6p;{!i!*9RY8q2Gyu0JEk}#%^=1ncXPGduI8`}%Hy0>#o@T}}m%97I@OBmS0 z&4n~T9#oO)a>e1Wf;)ZU)oUeuoJ)tssO)3rps9tmnf8KA9bqv!_u4@3Zsh498V(RxG+Ne_mCFffG zcyxWEyBFnDK5fR&t0evUxVmuE2>q-m7k9<&F~46Jpc(HNm#na^Lo*;#Fg{eSxLmOJ zk^n>LW|)%7peP51pxsRH-Na9-!j%A4{XD~tto&ixjVlQ?^5Jo_F+0nDq+z+0eD=r} zZ@R)%lDG#09|xIucDr-Z@nJqr-^MuvuxOjRW4CI_IP}U`%VYZtP5Hx0{(A={L8U^T zoYk;DvBx48xY7%C2HYSG&5bX!QiDJ?QKa3JsDeZ<9upOMkk$atk{WtF6QUD&{o;M^*54GRV^2R4k= zjkt!WOoz?l&}73wX7~j-VHN7wzG?)wMeuNC+sMLFkJR5LFw2oqh+aX(TN8n zWfwO>Z?W0A zV^R4Ry{>H}oG*d>?>5gg2aQ4oHc)&CmHH$74GAaps8p&-P9MWTQQ8=-V%pc3wp}?k zw%0bg8><~Iyz!;;(Ro@*wlK;Ja=RC_ZiA=3F-@vJ@slDiNR$kMil{@#%>6)etu1?U zmGVMP8S_rXB3UCbLp&yuhoO?U;)O^v=TTAvS%qUYIB=k>Xl=?J)JZl`Lg!V|;dKZT z8D>?&Cs9NII({t)^fFXmH^NptZE8qcdcwOnz5J8es5B42(?j?uO7!@lt^UcsvwseT6dY(sidLQkpM(pH7$Y3?z zFD#axxXhUI!VoKjNGM)Iu#dE68xK$;1I~iMjxpj(!r zGm*TiQIG=C2+DtobaD{Af5W_qsAg?s)MusA3!>D`*U>!7ptkSlT?M5X?F&fKmu6gN zn1jH!u_J{~>#tqZoup;wJaLl$jr-_CFbR7oRi0ApM9M@(?mH5NUT|s{kdu}?omwe6 zv<5DV!{IylZlr*W`mRM4$vMqI8I;nC1mn=d$Tv42xc(x5_RMcE?`7fNiKf&5Znkyg zH<(yZEkUCg;q2E_N_W7tIW4L@tu3A6+t4{VW@8dqCE5nuwO%cf;@nhCo~w>!38NKsgI?y^qEAfIl7qtuijBIbvXC)&v^yDnv zY6mWMaM2JKlVu3BCg{v8nLl(i{al$Em_p`pGzq<{;bgV0*_di)hZO|dV7u(hGH{$Q z7QXQSvP`9h0`DivS=lvn#G(9!$>@LTbgZjwSilUO$No@8URF&uF2r&3K9Z3bbXE8_ zF?LYKkho?m2IxE=eWQ47EUh-}hXHl%^epc4DU|iTosF0ZB_B}_>=w!4;6k2%LW}o( z5F=KHIkeuyEaDLP zt8>(SLbYsz68u{b4>%R5vzxC@1Y^8@_VFPU&$DoiN%=HW>Mi25%{dAq%D#j^Lt7D7 z8>>OTiV|c;%aTw$swFo?SADeVd3Jh^o7PFgX{d$0hLmtey0gp!dq7F9^e zSX*#igThfe*py*10H-)WMx?qi-^mE1qvkQd|p z1FOzdJv%|Xzx!6O7W2vtnW&fLqxseHwTGy4B_#7v4Q{Di@`uvvj$CWZP zB3U&}_Tsf*!qUuH*I~eKSe#*cN)lrNz?&|CeK>#ytH;qb1wGGu7GvXb#leMguJ=>@ zY>|D(9J7`2%dj5r4+>NWaai5-v=GU={VkF5xv9WVbvNDn3Q>bN27zSn&y;^&2TL9I zKagdS6}``Pg4S6R>x|cDPbx4e)xt5#;LxNsSdd1M(HD;BA7H5rCDLqs-e7o2rPLAB zd6EZVrO27K`Gu#D$dc~28&#^4h|1W+SNV82+soh+P2=HRu2UZVu_&g>qi`03p~56@ z2GyTgSQbkRo8I*LdPB#pRo6iU`A_~A^B zk~!(62}hEp5OCq!^ZMrXDIcp7|C$NT%JF{F?YyQV6G)jT1lgnd@m9EP+t8c;~)=})xI4WC*Q0P@Z zxb1(dyRbgiP%EhkhHi1IZZNB=>oilUQ1~tO)u^K-vQ5B|Sm9Vd#$5s2tIiQTcFJ-G z8dit|>XAj$MfGhS=CL^WP3F0flPeuLn#eXstMqW`zt!F@YakE&GZ zFED)6cLk%R+J!VO-_Mk4=P*NGvD7*;5GEE(P+CbU!fI{F zxjU(zw*wEVhTrYEdj1A=ab2)hibg{Fc~tT(vOfpy(9Q1SWsO3^p@u<6>4rgb6gb>k z#3MRf5sfy1WkuU60_TzCer?jbm4EFco z4G6J4rcwr?r%rEo`aRy%89X1@uVL`#(Kh|1ExD~m7bLTPU1y?E#y&Yyk`;W|4H3&3 zHX`68Y@>A_St+;y$-%A2wR|pMppZgOB$|}fi#A9@ApwYd9u8oU>*Ps1VWze9m0W*uPK*dtW ztOMsFX6UkdLR55|tDMuQ>%j1P=-K*a7)L8}J7nL*_SUzz)E*4@av!iWN*-DxK{#i; z^sWWi+p9-rOKsxs-kF`TzX~*zg`|P^I_HV%o~k9WLSYqT>CIT$n~hs!=DlD*wKbWk zdLch?)I~eykhLTNJ!TucE5_frOFQU<7AdtT`!MyX$bO|fFDPs}jdeBAp~5`U5-#9j z+aQerUyJWvtTq~6=_fws)4`Q_6Y-p1W^`tFf5!+0KIfl(P@E%1$LeeAuVg8 zcY}9@hyswDyJwEY8n-Tx(YA!j+z%0lP`EgSg~-jWOTj96f{-`G$8E?q^?3R!7mqRe z+bC&~t9j^(?z`vLx<(h;Q_(sK&T?D+krR$~6omPsBOT7Ee1d|>M%7(-xrW#x99ol7 zsj3{FWH4DX`XJ$Psjyqb6xwSQ>XJ>F7rXqvjK-#;6*zUK@ye zlJznj#-Gc#;So!Y)TIVhnWk_qmwpY~f-5SY!v#-e{atXl44XM9)GIr^zyeXXV?#Jy zC8*j`EHL3ZMYuLyfg<*Pj!{Gx5vTA>7*X`nWqr&UQtObHIiHMK)D9L>m7-q%HPAA> z-S?+}ENgnFo)Q5#7-f8x#2bXeo?K7Gs1_(7SmWR2)VODHwp~RP>@i;KKj*TbQw^PY zL&nXg0hGfT;|wVqhEcKy6cQ^Ul+bH#S^~R>ah`C%5)$azpWY zLhJh?C;*A#q6`6gm~_A5j{54%=5NFg5G0`+F=51J@YnF}(qMAF|0+1t_vzs##eCW|vZ*zqXDYb+x?US{Z%w(Ls;yDFG|)Y#W<#^IFXt}$^JHDX|MPgPbsO~*I4j(t?-M&? zUv1!1VfRm-JlgYp4NJoQ`a7>;h*FfRIW%UNOQPArGsZ#iBE$qDUK{LJjqw#1AEgOY z{cw&J0J0lzxw6Z2=TRY5PUA2p+Ok9O*X6 z=(EIK9*@M`q>IBB9sW}C9_I7G%Y22eA7ss1$qM`8tDj4R}RDsrER z-X0+{7IF@TMfA~%^qHiIGDqPEES4ZI2Z!jONMG3+wUSPj{G1-q?EL`E`ZbX$aYBqR zuc-aZ`0Dk9lv>wZ&9d=cP&eU`AA=n`9ba`N^d1G|obo*l zfvvg2vgkkyqjWk>YFpwi8ltQ@%cz97Nysmj`&5#-NJ6JNEA{HTRgwC=Y#5ipN~EM`5(*$=o#{m{^Ip;&b}_HbyB z&}81gAEL#UBHOR{01OActxF6S;4_)Q0&kNY^tD^FO-A!6Vazcu125K98Ht5?Bs zri;Z8g-NEo%TfPvimF21cM!&asPGBmdaGb#k?ZD$;X{9qQpy2i&X{)?>SXFY{{otW z=VEtI5HxAZu!0YP+7Bu(b35AEQa>QNM(&GnN@A@jdD{vT|4yzt|IXjSSX3l9pob~@ zypPA?o(35?D8euH$+||A7(c>aAkN4Qr&YDs^1@qGvh-<0M1s|-yugTZ(D%8EAkS}G zY8R*&=``0InJGJArCZEH6BIglx$~-JxsML{yO0p?yoEJ*LFGbdp5SDaDFqO=);i}-0_4;e;!A4QxLwQDUTS1QqsM(($lz@@UofP@)FF#O)LfdV?kKzE}XE`{jya{k9>LVF3!{cCbG3qEl3Asw;Ui z-Zf2ndt+M}U=4H8SKIBW4|txxO--RvwC*ZFWW@f?Ogm6l5SZ9S`o%sR$wQV7Vn)5C z@v)OU!Hhl6XgV>!ONy5^2F^P<-qtb_t7O%TTS*NSHA3|tf5NSU)gPtP3bXjBkA1b_ zSA0`OCR?c5wAfC4uV$p`>SG0`=?t0*KvH%>HMa>ry%Dx80UYsRNhryheT2jA;7x9G zXonA+E@dqORMO*BJfoxrC7ixMxM*Du9hrV4rXkt=&&~wZs+rB+EN|OzpnR2bO@1Xf z@DM5QhPBjjlvWkLlh$y)nydL2pJ8;g@NWGXR($|+UgbEzfJ#n<2tzv;1c4Yy8b(cc zU~)yb?>>{`JFrhL-Ns(O(tAJJFfe+5I;3_b#-5U7T(}D ztCZ`XpZ!S$FxbM;E8ZPO`hdGK{2{^p)tDqqzu^;AO;&UGUw=0TM~+m*{#b1awSb2-2;&;D%sPN%GK=q z>>*MrH5M?LQ~&X13T~DmWa3Cd1EC2RPJT-fsVjCO9F+6lbOY?mHnPqh@6^rOm8NhO zwR+-D(@%EIVhP1xFSYCKOT_hCmrIvM)<~*exy`h5C&c#566zI@$y{Xoc1^_lh)P^I~4Z%~_h_YAwly2keo zsoL9mgX{)3>_xB#`Ubt|-g<}W_5;Ag+VL6c@#=x_eS?%}Z_$=wZ}Ccgz?!GlNF5=a zYJItNg=obC|J@6d=RoUkQET3;ve78a>8|aCUaXZ*!ukvD?cF_ZrMd5Y)73akL|U1Y z?X$#QbF+R!kvey0s)y^mpNj|Mq%gow=2PW22MWV5f-ot-{K9-n=@#g)3gN5by>?vWii^?}CN+IHKnr0p?#;vL{;#2`z2tWZ0m6l?hkuZOa_ z&uZi>)T`kxHMZ|%q|m5Fpgb{~1{`L)j_9n{t=*Gp8*gs?x);24&bm;s5Fe1MMNFc3RS%++_Kr;*g&W0;2>ZjS6;9V!*1BySXLfXGNOE&`k#?im zZ*W1(kXgWDUhl(P3$m_X!9G)DJl>ys?%;1GXgqyMn0gad^WxXVm)UN@QM%}ZHGJjc zuG>6ZMIJcYm#Wh!UXW;TUxu9?vP`atYjI%EQDq$twjL#1-n0B7;!1BuTd}!@Iyq6? z*FKTsCHE{Ia)kIYy_vHE}5ddDbDf^JK=Y<1Z-yKLLGZQHhO+qThV+qSC< zPjzwXd+)vLn>8~(G9x16AY$c@%ynY#a|XE*j|uo=Yw87;aDXI``JkD#js{8{6Bjf- zFLHL1eonFu!ZlwproqOtlP63>mLzt#$ys6vMe*_!tX#iO9YXXuLwhWIm;Y^=XvMee zp-oyC0yTuN#F7VexDO9i+P+zi#7{8IDLeM`_ecCSWel$ET;e3witsJHrC^DDSt5=D z@P7+cMG_jT+_{O!sb4Tk!VofoPvMY)GKXfcF<>^GnGiYtv((i@-a2-g(7B(cwIrug zPg}S^4Gx0<980`A|LbEpllnA+jXffkLKl@`K7-td1x^>91~QfWbS~z01zXw`oCC6p zRmR7t9zg}z2T`1myxU;*MNhUb<+Pla|o=0wY7Ii2b#qH0rhqK6~ zqY9&oG?>s-QGm&7Iyw2hq@SgiZl$74EtXagq6<=XmLe^OijWCV6(<(5=0NUyrm>KE zTv%L=gb?|)45s91)+O_Dr0pq({0=yIGahVWm9!L7zvcR;ih4%tY`lteq?=g29+&(F z@g6rjBB#_y>MNqd99w^SC3gJHCSgVv%T|JFc_)y)ntcjaRY57Vlzca}w_u-id)tB) zLbHNvc0@cwS7FByrl^q;Q`U(p)zl0oPE(I_LSq0!^2wb<`+UIK0Kc}5;r9=HFeq7W zFnqBU1d>ejaC|8y`i@0iMv}@B4fB4bN}|Z87f~~4p=R8Z{6*Mp_|W$k9XShZn&NCw z&-i-ZvWLPG7zvizLEOS!H>>q@7+#ZQS*o|dmZ?f_mCsvQ;WPfrA^cBOpsHK5@z|lP zW=O9#Sd(C2+B~kbdCdb_Xl49LIyxg2)sQHowkW5Af%-=(&QMoi2w!RnUnri*RmAss zJRoyclyz@U*TC))Rf63RC50;qVgEt7tz2p%lz=PqI6%ziUvT8#)ZHW%_SX#F^RExlm+EXo{Yp>=`ool$aJv5S$Rdb+TxY{#Shp!QdQmTI$W2GMMz zXd9oOT~q4phGbvsicKTC?A`2*rOKidRd0ftRTCaj!jyTzdmeG*c>}C`! z7Iof&guv7KZKRj?T3EzoXvKq!1U0EchCWV@F>M24T?s|f;M%NF zsDQm=5BaH!`axsn5q*{Cl9jGOllkqENJn*|0*zAW+fH-l{F1`&nYy-g^&=KzK~jz3 z!tom>n6!>~2XB$Ioe>sl2L(T z-9J`JwkEG0qRG6q0JZdno=QThspA1I9*-~N<$w>s!NMc2&;)bB7o4|9sL%4`u`_YF zY}i2N{+vV<+Eh^hm~_?x5DyR!Nq4fYv@H>ZQyTkeNt4JLmn9M>*UONt^qV$ zU8M3)AVvQp4gXH+_cJ2;ODf90OucD@P^Z>0Sk8t!J%1XqPUJWG59Vq*YS zjkYn0ygCD_M&p!>Q-krY?mL5KfBqB3Gf}g51em^6Ie4yMG$Zz_tD8t$%S^2<(4J6T z4xc?!!d=Dxx>&?&SwP=0!q$=XsXw))7^|{N$I%8vuEx$jj&HplPWu3bQHVWc~IfStbhBfv%&UiO~aBs)kJZFO|gPB^wE0RW?p9c zRV_C0Q=i-R_59AhUq7|;t)=xt$85vN^Q#Lez(R890*7n4h3HdS`$j2}Ak zHpWfi-=sv5vt5hX=)FoZgeMRpX`b%9#k8C&rr$#g? zIBkLclTpGVkFn{vJ+;g!8*J1r6{b#8b4`{oAeuh>i5dcRE8dm|?{8?!xYCA)PhC!% z_x^O_`>8}nTO&A-hwhK@;AR%31W;YE3mFoU<6_1|xUxF@+wIWsj4bumfq`LlL2kgc>|D*GZhw z&LK7k&y6x0B3M9(-5X6n zE=x46SjgrM?gzv~63;?=5I;;S|7J2qlATEMk^e)Lm<~DTYUVaDY~~DQbKWzKY$-dQ z-lAaGL!EG1YIsHTvL9y3VyD+@ui2tOou?ky0sIXi?PcU8>DqA`WJ(OFZcr@2vGnz^ z57-w}S#ZBp>2kt|rh`|czFIQUjLKPXSo#RJH2-%o9dN!|b1;iBd!Ou@`ftwCRSf<4LLafden7Bf*S~U*J#OiC5K6VQB6)%&^C|8k2@a=`pLdH(R zIs{O=6lsXBksuKyMod4FZ`DFi$sBQ^SwfW$#dPSV-KAiSG^M$RDG!yo1pDI$?Gchg zg*$;y-Ifia!_qOpC7Kd>hW;aM@h_9D%fS8$gf2TmSsRc;K9Vquke|~_ zUCyHHG@&kYr!Irpzl4;FJagD^NYvCE^tkQ=WfLW2HLvrzPNhV+s6`66`>UVKp#?kz z_tx?lGkc~eFp^Z(aG9Hv?>foCLH`ac4|G5wIG1RM>N3H}y?=eLw2PO+r~4bz?-G`Q zS%!YS=l!CJ&-RF?;~n=eJN2V5=h{nEE3{<4T4sraUP|E?YG1VzGIgps?q-?G>NyS~KhOS`zcL4` ze#-KVXys!bN2F#v&j5VY`YLwlF3DSH^sbKtsU`9;&LEQV)PzP&xG^VAJen)F9#INc6MpWy*Hgi*D}3gno0aap%{cF>bc`p- zJ*=LUl=Y%c?=~6tuZ~{w3Z$Mqn;A}b0vkg+7lwEiS8uAVOKXV_Pe?J8sW*m43|FIV zR5FRjNA2MOqClF=CVIuZ4VG#avV}_!R|b1GU*Bh4fJH}c8BTskp^qk=_X51M%1K^C z`7tzUu@?=u!wc`qX~IKXBWGAL<4H$$QuD2$A$3|At)gS#L{@+o=3bx01GWg-EJ(AU!`=tlmd+Xo^bY0~%G!HcqWz$?fpej>-2>IJpHHSXONnRH7= z1-Y38ELA0xqjtMW{RnGDt1yd(3FWVBqPmr)zL$Nbl2GL)bJoAKach8eeXQ^ASvL&6 zwi#V*e_va1;Ee8!e^R=3u1*gtmWYx0c)a}g?P%|_EqLZr3=UoqqKdI%ZpUe>pwDb1AC!g?uQ3BNOYJv1>Lw29lC3lFX+Lhedv;KCU2?<^sDXzM1xt&G_GvHUUw_CmN zb;I}cutU8)kZaw)Rj;*y)UTT4wbi!(2ddS74HT?Ys}DbeBh>0)X+LD&ysRC;dbGRM z&nJ{9`(w?Ar^yBdq65+<&qUCWn!cqH!EO()_>HF~lm)U76Ti+Ad***{iPTcK!(%*gTxZBGlREXUqE}xU` zac1WUACI>EtsmXvAILi!?}x^>i*F9C@&hBI(3k@D`Bw$ed5YBTkS*Fd;WR?Emm#aG zy&pBISODYF?i;P!;LNS&ff+fGy)k9`K zNT71*H+qy|N|`}cq!3p{-5t@c6W-3{m{cEfKnnSVELZ0%aj-2t*i5vmV<(}DRJjK6 z-F}v=#t_cd2IFny#cw@BUaOY^RJ}1`MwwnfXd#q$;rwO(HOoI8xp0w>u#IidrXdsQ zj4wX8$zMg}U!dr)!h&$i1N5RJlnu+~KlkXIR$IgaIeCe|Rd;#9nw6t?$Zu~grd;GG zidDl&9=N7`&Mn$qP269%Gu!DlkI;KgeRE<^O@r$JCMmS|LsDa(d8IY0*2CY76)h#g z7}Yjo{Z+)rKI&d!cXV)$7A~#B5$l*gvl1+Nk9r4K>sh)D-kFqN z`H5k}jbNDqCZmI-@vi0yMWp9OpvRezaf2x%!=~TgH=)3&>Biyw%F{Oi$k-`;qurF< zW=E@*ki|8f;kRtPWPz4eCSEoc>gP0=r>cRqlvWGa@uu`;EiDFJv@1-fVZ@6y7>kqY z8@&P_<@=OPb(^&=+Rz2D$YHidCqv!MAlgIQ=a_nTc~MNnkTEDW?u)sOO3j`yW0Xv zPWZE1mp)E%`oYVgq56E;yAIGirvaL?A_5oB_+ZCxsd`wRI@;vBeS2%T8pA_ZT1b0@&rh;f`j6WMHZHvRk*Bn!8fMl1gDFS;Vaj0 zClI8iQu~6KWSaB+jCpOS|Fx}svd=k2h3FlFc~a`_x6iFg9X#!$gvg@tfO8RlSufD1 zzvwgzwBbf|xfVT#=wtp+B5wSg`_OwW=F!pK_-dHTl+GzYvZOIjzBd4zRrcT|C8xrH zdpjXFJLk|(@*+Ts>+CK0lgko}>$wR z9+@j)Iy{bOr{TlB0(-T-IT3~8D6NkUvX+(q1`qaU_;v&7ai%%bEE;3Osz9nCu;3qL z!Memv&p~AQIr9|E6mlUV{J}6ddv*ojCC_9HB!Q8TAVoIWo6h>s2RSR32^H69LFG*$ z#PLO7?Fc(*B`39HAq!Ft4EjlV7LK^_*5!>g1ltZ6n*`&{)C(*&;0~2bi7l+E(usy0 zm4Sn*Q1x*XMNOc$oNL~>$bsuf`lgiSVgt>Z-~EvV=iXDlm`~IORev2-f3%e^T=y$51G;$EWj__S7Wjo z(f-a?Jh8TsmAKhlJ(E@0^WB|~W2|@gl3T#FZ}JPbxXx25ue{C*4l@Cqq;g(!T2 z=e__1IS0p3hsVE2=%ka-LCjx23Jvjy+q!Lt*9*k|ygzU;cYl6X8^rxOi{HJS@P=Es zzs|Fx0PsTSJz1Vd|_YuRuO zVOa^Ga*^4A{oa;W5NZ!UAEfw78wAf&F6{p06#~~`2&Buqib^`~bH8VanAs5U&V32s z-e#BypEY{np9Sy-pF95D_xwp)>#Rcf1XWWYwA3mUWe*`jt2%v`7ik2^Yv5384{>DJ0K*1`qRhQma;hNb$^6JQ z)fuF|t;|6PtwIQCqeWAsZPj)Ufo{)R@n}#mDuiNiugn=GljK)?}{% zXW+*^F_A2V8I*U6&@qXrLJAMTy`BjA(AxsV2E)hdnwfvp#G7&8$>v5So>X*h5J$ch znD!=>6%b0N4^r$(AVu7x%p}o6Q+LMF`5nGQT^hb(a~viV$8E6Yj)jw!nd&>KT84u= z&{{vJeLgk}+VR0+@^0*h-Q?Z9`zzB)wEK5HO5Vgu`=7c4gyj&o6DpSq;^b(T9=GtG#W&k)x4|TGShd11 zHXk_WQ6WxK-690+a%rg$71x*O1TZ@9R zgOLu1AlRalqPD^5#*3%NuCq+orFMCaGFcwb)byufiTh(R99(KF`C;?n(5%PAN{&QO zl3M{qc3T^bsp2%`2AvhZ9V!>O#KCHf2d+fA7{HSdiDc7*+ZoVeg;|$~SMo#5f=$Y7 zX^uqsn;Aj0NZo$Tu^>&gNZ1tSToj~O{?Za>JCY>-5iHDnC{28Tt$8Ys^K@9ucrTCk zG${IMB0Bkm%a#40^AHaQD73jB zB=1CuerR!k9OsQ<_K%{qJI?B+GlkoglwDT)TP}ixk^MDA6V)?-PATVP0$#uUZAelsJPQ;+zPl zy&2-v`Ts=J#ZLmaz7+AF{6|C$9FUyaOcB7%$FT zZ_7651v~?FtR5+LUh`r!-*Dldd!&obnQEKE4>2(ua|oWLY|!R0KKu0+S6`3y7WnKo z!zDJG%`n-mQC6ExEh%oBO|Gf~Z@nYo%lY)#!JGk?<%RTd!{CxaVLQlBVLD#n@Nw=0 z_SbAtUnrb6MOFiYs((su6+$%x(ONBvy z_T-xOmx^Qu{yjgz__5BRo?Y}J)9?V54t*w5JryX4e%pI<@-l#{MU#T4jQWSjTzA_5EgUtjOO7eN-_oNx4geKkT7VyqkW zJ=q=7Z5BgD3e4$v%sp($;VR5T0#G+4uoTj9?x>pSg8RtDciT&HGoNre|K=riGhf~T zz1^j2?t$t)ETGNf0l$08vHD-{_I1AG;jMyC_a{2vQMDr^^>YGt-OtsSp1PgydBN>X zF883d`uXYa(JKac83W%Bg5SFFd3|kmXGQi3Y~&L@{P?)|4L-gSUVA@W@C;tF1ps(L z?-#n?zA5}qz6A5$`XlFj8Vl$Kv%(H2^S&rS9eaXqbE$Vkk0kiN=6|Xdowp;s1lG47 z4Uf5=atCcc9CY@n6JGfiob!^t3&#Sq;b**lTRab^+rkVv;%3}N#Mba%kLVmLa^+Hk=R=uqw8_Qs&S1+yp^!2 zt+38r(q`1Mc2w_9XMuNq-8z1ydjLzN;I%ow+6|$M6}>}X-rEe%0v66b zTP)bVYgt~D-uEKqmY zVibLywIvA0FK_(wtEo2o;r)z7KhN9--`C1hCG`G|9sN)1{jOnW?BDrD=pm5BjQhJb zT}`!-n0fG6C91zHs(!AA)~mu*!gzV^8baq!TwBTNhxvWA{T7WXw(p}P9|nT+|J ztC!go4+79U*ND!5o*1!2F8!l0Qzt9cW>&knx>5N2PR=0))~Ga5Ra=1>eD<@dVwe0Z zzV&8#)+iAa)GQC#-5lT7x0%qv<(`vSO69gLT6Rf8gZ6dQ1|;37O`YUqKt0j1B>JqR zEXi6`VBEyaf~%%eu?`=_T2*EN+0()1DPtyQX}G1Z*6IpbKe)7#DL!T~49-fXS%b#9 zK*5i?wie+TEIB~li&wS-D+?(@gU?r03Uby3ThwUFfV)6Y51;-GbaKtnvt$qgoWa zOlaRIi|$xNS=`$PLHPiSQ+F{2q82Gqv4~m3WCJ-*#;%wH&H^2q|Fwm*@H*?JOiPq%oSgBGN%G4EckrK_@XO1fE1~XR$r76dh zX5C2?S||>A*CsKA)o<&!0`Ifo1XTPm8*c<-vKbfzmh!gvLR4f<-C|`@FybPMDe62H z(L{wS(8xv7tOhyX!p2Jv@8{JGq)`oKgd*TFePVx$CHX#zljea~I;!$&Pb=gtN3xtRTvQcR-mFD8!(RQ??OIE4!b=K z9N`;G`JJBWmY+AIB`mwk+k-tN&!%ncC*Ixl`>Ri9d2J|Coa*_{qUzbsM_{U9wP77o z8zYx`3^`QbCXrG)*s3b4-eE`1MbQ;}8CrC=bKd^C*zC~@jOPh1`!S9+JduA6qaiJS z{^2iXGKWG9ZC}kL?%du*ik?mOoWF)jvAs(%(ig*eMFhY9taJBvASU)p1%R7+$p8C; zn5ex?Qoqh%80m3}x}|f#H?xr|e|-x5{_>^I_@zSd8#bviWl&Ef%S6(0@lBCatbzB+ zsF4&^Ww$9g6S`hUu>g}4Y-8L%$X6M+9#E3^3I@7179WeDHJU-BC_?0MCCjt>N4Qm)iNj*6~Z>K>taoGkASWCReUsU{PAIT*4U5Yp| z;29!zt!y~3JnT{@3k(I}GvV3(PM-IAUMD}VhcE+}^mGZHW<(NfYmj)j>H@*f#K;34 zv%UdBtYVKz75baH3XYw94Qbn>UhzO)9aYgj^GU5eN4|~gi}$?ZT?d5E0^E;7D+zhb z@Gm3;Ue}Z0ggY-0x%WZV4;|Frtzl*l6+do`Ftn-ko@9wO7ddcy7592d@jETX>m@*i z{>kpqY_(Tii7txVx_-FM4OzRlD(yBKCN!UUpTE~q+#WNLem|$@&cpaWc05V}6sIrS zHI(|j9^c0U*)iery&nJX(-!Gv_A`RnK2QIRhvo3- z#xycyuB~3l{^i{LH0!$ zrX268pM3E|O!5n-#APkb8Y4un4jxhOD?0*WoZhxRiiZ|4KRT^;{!)zFKQZZ*@BWwC zOQ+9bUTBjYPqk5un>*XvBnzJfzg;s*`}8^0wNXbY{+g`~wtL~OJR0BU$M-yK-8nwq z(n;vEd9-il263w@o`U*f!Cgo-`F|?j?|JcM`Lg-mp7{iub5Ge$@Tw5*do}dgYo)%D zdDV68Q&dtQYDW}RGM|V$4^1AdugRM}qIyp3pOSff#QYcg@_(Pv{^fCF`7iF%SataL ziq6t*9?sY2&pt8*K!h*UFBvY=guFk7QEXoAzD2IS*d}ceDi)rm;?v1;OncFW;!@38 zd#uUyN6Wr9Z9qs@qADzTr|Q`H)J($!-f0OS{w+ZQk3DJ)%RqI#$~r-;Ki~t+c9y3| zy@-*^HKXybNrbXDm)QiBpp*$NrOuIhb;I>ynWGx{BQ%Z1r`pb2A@IW|KM0|BX~9s# zw-Lq;Gr%2M;K@;6BS#nP#xg+@=g7N;E!%)-D3Gie_K#*MX=M#R*M6l&3n^>LX5J`5 z@Pi#c#L~1#GAXS5vSPJ`R-JHZ2$Txl%C2MsQpj{EM|V8oAG$8&AeTab7sk8AfVL>N z46RfvdWpS9SZxMxu^(R{(|RMgcn1U;MTaGQ&-S>wJ4D$H9esh2vEU-o*98&2RxQZ21GlC(ydp7TNk zgUUj~1H=0EGc-F+YFLxfQjM_@NYTwDh5LD zp6j_ZpV*Df8%v#gyL9VPEd|$=5zEeJ3w%{)A!p)tiO%fzl5T=zg6(zU!OZ2qbfAjKWM;BMmH(tl?XRqO1sec%?3)o63)?P$^Wqm!o0opTE>|s8^Gs|0SR! zu0Q_1xl4wf5+;ovHV-moU!5#8ne9}GwL@vWiE7>Er*P`6pyEhLF+*ze3xZXit{b)0 zd#HZ!9L2yIUDAyOsPr6Lw~bR0GgZWYSyQ*)+-bBK_?ulZa5J^mOWEt5V$EzAeV$15 z*^y4NUJrAb>epFR*|kN4jO{I`_~Y4eO?|oV)oaMvBb2*6>3z%IAHQ1JWLw17AInHQ zy3)XSRW6UI8&d*SGEz48U#)1Ti0sXI&YF$EHSjXy%esI zO+Eu&#~C{jmjfuKgEm39JcL$f!G-UTtw`b zM7WM6uGp&>p`mOI7@G-lAV}w^> zH$tP)_$1PbCYaSRlcENR3oB8liUxsQU2>~8DXPGBglgRKGWFLmrDr!RH%LBt4-HTy z6EkNcf6f$lVlHBx(r9|1U#M*N1P@B(Kav&l4`8E%;HWk3YNz{Vl#MvaLXt!UiD*(o zm3q5ty85Pmk(ImrIaH?3Sk*FwP3K~psD@&P5)eQs>!S zjmW@Zir~Q%Uo3Fu{yNOi6xEgj{`qmuc{2nu&F!n8jwPg8(B*&3%zzwhe{f}Fj)-QcPR;F!(r z^%kBQxScc#2Vh&zf?%v0zF#$2*L$id=giZ!2oe)&V?(v9SKg>LpGJ4uAmeO4nzP&; ziGx@z^@Na2EWrcm5x0A%aaE&vs`3c-%sga3=IC6fh8OJ_nKMl@2Ns=KlQ#R2FSB{0 zDh0#e@Rw)kxK)j62hdZ1m4*G0N%a9j0-%2)*n@QC_8yrL_iKAS+??L=0)odM$HQyh zlQcDc39A`B@Nf99a5$!1HYoeBWb!Uxxp??X5qIG{NIz(VV+5`1N1U`Bk!v@7MH^X@ zcUgy|2w$X@e$a2v&2zM85C_2T>Rb4lPpduZ;p)%oiKp;y!29h{EXD)=Y z(vo4<(AwH}eTj+q#c>BTOiyWLKN~n!Wc{d>++DFDV@`>8w)1quW8;gR%cHpG*M&9y z58j6QIWp8jHt)Vv=w9bg~rsl==Z_{{&T3ksP(C8Zq;$$>OAEk@7kLoqE=A=~<-*!dcF zif`EiNZ<>TDOJ_Y)vZV;8+;K~`0#;c^~wgc z%vx2S5S_&>Ja4hgn_qdH=c(q-PLw#$6=gXZrD~0GkSbVbAe_>SapQwx*SKXT=lEOd z51U|bvS>M1Vv$?XQO60{WUH%gtr@)Y@4{hZ)rKj1POTm3rSFOnjXdZn^z6#kls@6& z<+3j&hXfVABQ`Hqe$O#3^+bhMPDm>l>gh#1LDv0!R0c}B%62`W;&EdEwvp^kc?;mq zcc{$G;}(NiO(UHqiDZkRMS}Jk9JK!a zWE`s#O<{<}>bS!b&yGMJdJVF`z9|>Qz4QMH&2hmlcnKaY=Ovf?HAWK4Z-?HSGNy>c z$Y{IEJB5&9`X|@pijBLGj$l5A&cp2G1?3QRw>Deinrb#B@5K?Y|Qa4MG z%!);D+|88TkGrJ7$C^Z_$MzcmP2}pm4jyGSx7T`MR&Iit3NEoy$wgYA-kZfR1wl-> znJK7}PsW8XQcUPaCE8*aDLEN(EkzTZ*n(&mb<^_#xUgaLYAY~Zem-(VCZo}$F3G>2 zJbmzd+a$H-ON2Tg2L}#0$Q`QK8tINBVq+*Wb8_-Ines6aS>8!mi9_V(*hMPSDeUrM zS$OlTSoN%Cr3hL!5T5OL#S_!elNJqjQjf6msmbIjB`LG9E%jW%sxIEU0?;};rI)Rk z!68gU>r_Sx57m-{N%o^j-?|fRD-4XYe$urKmZXzF#tAZN8H%n^hvc9}k|4@Ul^^5H zVMZqXqzk_SC*7}BO%(a(MF1CMp?1uJ@=nxk_|O-Dj* znBfs_{a|}qGo1`tRDsTnFmNvdt*BydC#~K9XW%ZSnYpLga5OFNSBrG}7eEyhEhwBM z33L!~OKp@6_fvUYvwoD|bw%T0&VV>~a=I!pYC;nRc4(u`@TFM@mVLjNQ2+L|6-5)FRR-agt7}?L$A#>%^OiZ;~fR+Bri}DQ{ z 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%0A2et;L7NryU*&NYti^Wqk*5%&t$3fewRhn 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 biP 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 O1|x`)zCg&MLHrLaHkI@M diff --git a/packages/server/charts/osm/charts/fsm-0.2.0.tgz b/packages/server/charts/osm/charts/fsm-0.2.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..40ea71148ef8a66ca6f88006e341b043d65bf232 GIT binary patch literal 150297 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
uHFtUo2 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 F5db-uRJZ^D literal 0 HcmV?d00001 diff --git a/packages/server/charts/osm/grafana/envoy/dashboards/osm-control-plane.json b/packages/server/charts/osm/grafana/envoy/dashboards/osm-control-plane.json index 9743fc7..ddb1707 100755 --- a/packages/server/charts/osm/grafana/envoy/dashboards/osm-control-plane.json +++ b/packages/server/charts/osm/grafana/envoy/dashboards/osm-control-plane.json @@ -47,679 +47,679 @@ "version": "" } ], - "annotations": { - "list": [ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "title": "OSM Control Plane Metrics", + "description": "Compatible with OSM v1.0.0. This dashboard provides traffic metrics from the given service to OSM’s control plane.", + "uid": "OSMControlPlaneMetrics", + "version": 2, + "editable": true, + "gnetId": 11776, + "graphTooltip": 0, + "id": 6, + "iteration": 1591749761183, + "links": [], + "panels": [ { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "title": "OSM Control Plane Metrics", - "description": "Compatible with OSM v1.0.0. This dashboard provides traffic metrics from the given service to OSM’s control plane.", - "uid": "OSMControlPlaneMetrics", - "version": 2, - "editable": true, - "gnetId": 11776, - "graphTooltip": 0, - "id": 6, - "iteration": 1591749761183, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 22, + "panels": [], + "title": "Request Count - HTTP", + "type": "row" }, - "id": 22, - "panels": [], - "title": "Request Count - HTTP", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m])", + "interval": "1m", + "legendFormat": "Time (per minute)", + "refId": "A" } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Success Count", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 24, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m])", - "interval": "1m", - "legendFormat": "Time (per minute)", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Success Count", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "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 } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 + }, + "hiddenSeries": false, + "id": 25, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class!=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m])", + "interval": "1m", + "legendFormat": "Time (per minute)", + "refId": "A" } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Failure Count", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "hiddenSeries": false, - "id": 25, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class!=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m])", - "interval": "1m", - "legendFormat": "Time (per minute)", - "refId": "A" + "type": "timeseries", + "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 } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Failure Count", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "collapsed": false, + "datasource": "${DS_PROMETHEUS}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 18 }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "${DS_PROMETHEUS}", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 18 + "id": 10, + "panels": [], + "title": "Traffic", + "type": "row" }, - "id": 10, - "panels": [], - "title": "Traffic", - "type": "row" - }, - { - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } + "overrides": [] }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 0, - "y": 19 - }, - "id": 4, - "interval": "", - "options": { - "dataLinks": [] - }, - "pluginVersion": "8.2.2", - "targets": [ - { - "expr": "sum(envoy_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"})", - "legendFormat": "Connections", - "refId": "A" - } - ], - "title": "Active Connections to Control Plane", - "type": "timeseries", - "timeFrom": null, - "timeShift": null, - "renderer": "flot", - "yaxes": [ - { - "label": null, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 19 + }, + "id": 4, + "interval": "", + "options": { + "dataLinks": [] + }, + "pluginVersion": "8.2.2", + "targets": [ + { + "expr": "sum(envoy_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"})", + "legendFormat": "Connections", + "refId": "A" + } + ], + "title": "Active Connections to Control Plane", + "type": "timeseries", + "timeFrom": null, + "timeShift": null, + "renderer": "flot", + "yaxes": [ + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + }, + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + } + ], + "xaxis": { "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" + "mode": "time", + "name": null, + "values": [], + "buckets": null }, - { - "label": null, + "yaxis": { + "align": false, + "alignLevel": null + }, + "lines": true, + "fill": 1, + "fillGradient": 0, + "linewidth": 1, + "dashes": false, + "hiddenSeries": false, + "dashLength": 10, + "spaceLength": 10, + "points": false, + "pointradius": 2, + "bars": false, + "stack": false, + "percentage": false, + "legend": { "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" - } - ], - "xaxis": { - "show": true, - "mode": "time", - "name": null, - "values": [], - "buckets": null - }, - "yaxis": { - "align": false, - "alignLevel": null - }, - "lines": true, - "fill": 1, - "fillGradient": 0, - "linewidth": 1, - "dashes": false, - "hiddenSeries": false, - "dashLength": 10, - "spaceLength": 10, - "points": false, - "pointradius": 2, - "bars": false, - "stack": false, - "percentage": false, - "legend": { - "show": true, - "values": false, - "min": false, - "max": false, - "current": false, - "total": false, - "avg": false - }, - "nullPointMode": "null", - "steppedLine": false, - "tooltip": { - "value_type": "individual", - "shared": true, - "sort": 0 - }, - "aliasColors": {}, - "seriesOverrides": [], - "thresholds": [], - "timeRegions": [] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} + "values": false, + "min": false, + "max": false, + "current": false, + "total": false, + "avg": false }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 19 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(envoy_cluster_upstream_cx_tx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Bytes sent", - "refId": "A" + "nullPointMode": "null", + "steppedLine": false, + "tooltip": { + "value_type": "individual", + "shared": true, + "sort": 0 }, - { - "expr": "sum(irate(envoy_cluster_upstream_cx_rx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Bytes received", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Traffic to Control Plane", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] + "aliasColors": {}, + "seriesOverrides": [], + "thresholds": [], + "timeRegions": [] }, - "yaxes": [ - { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 19 + }, + "hiddenSeries": false, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(envoy_cluster_upstream_cx_tx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Bytes sent", + "refId": "A" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_cx_rx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Bytes received", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Traffic to Control Plane", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 19 - }, - "hiddenSeries": false, - "id": 26, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(envoy_cluster_upstream_cx_destroy_remote_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Connection destroyed by the client", - "refId": "A" - }, - { - "expr": "sum(irate(envoy_cluster_upstream_cx_connect_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Connection timeout", - "refId": "B" + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "expr": "sum(irate(envoy_cluster_upstream_cx_destroy_local_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Connection destroyed by local Sidecar", - "refId": "C" + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 19 }, - { - "expr": "sum(irate(envoy_cluster_upstream_rq_pending_failure_eject{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Pending failure ejection", - "refId": "D" + "hiddenSeries": false, + "id": 26, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false }, - { - "expr": "sum(irate(envoy_cluster_upstream_rq_pending_overflow{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Pending overflow", - "refId": "E" + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] }, - { - "expr": "sum(irate(envoy_cluster_upstream_rq_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Request timeout", - "refId": "F" + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(envoy_cluster_upstream_cx_destroy_remote_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Connection destroyed by the client", + "refId": "A" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_cx_connect_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Connection timeout", + "refId": "B" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_cx_destroy_local_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Connection destroyed by local Sidecar", + "refId": "C" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_rq_pending_failure_eject{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Pending failure ejection", + "refId": "D" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_rq_pending_overflow{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Pending overflow", + "refId": "E" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_rq_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Request timeout", + "refId": "F" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_rq_rx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Response reset", + "refId": "G" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_rq_tx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Request reset", + "refId": "H" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Connection/Requests errors to Control Plane", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - { - "expr": "sum(irate(envoy_cluster_upstream_rq_rx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Response reset", - "refId": "G" + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] }, - { - "expr": "sum(irate(envoy_cluster_upstream_rq_tx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Request reset", - "refId": "H" + "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 } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Connection/Requests errors to Control Plane", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ + } + ], + "refresh": false, + "schemaVersion": 25, + "style": "dark", + "tags": [], + "templating": { + "list": [ { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(envoy_server_live{}, source_namespace)", + "hide": 0, + "includeAll": false, + "label": "Source Namespace", + "multi": false, + "name": "source_namespace", + "options": [], + "query": "label_values(envoy_server_live{}, source_namespace)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false }, { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_service)", + "hide": 0, + "includeAll": false, + "label": "Source service", + "multi": false, + "name": "source_service", + "options": [], + "query": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_service)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 25, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(envoy_server_live{}, source_namespace)", - "hide": 0, - "includeAll": false, - "label": "Source Namespace", - "multi": false, - "name": "source_namespace", - "options": [], - "query": "label_values(envoy_server_live{}, source_namespace)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_service)", - "hide": 0, - "includeAll": false, - "label": "Source service", - "multi": false, - "name": "source_service", - "options": [], - "query": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_service)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "" -} + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "" + } diff --git a/packages/server/charts/osm/grafana/envoy/dashboards/osm-data-plane-performance.json b/packages/server/charts/osm/grafana/envoy/dashboards/osm-data-plane-performance.json index 4e68e0b..d45360c 100644 --- a/packages/server/charts/osm/grafana/envoy/dashboards/osm-data-plane-performance.json +++ b/packages/server/charts/osm/grafana/envoy/dashboards/osm-data-plane-performance.json @@ -47,537 +47,537 @@ "version": "" } ], - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "title": "OSM Data Plane Performance Metrics", - "description": "Compatible with OSM v1.0.0. This dashboard lets you view the performance of OSM’s data plane.", - "uid": "OSMDataPlanePerformanceMetrics", - "version": 3, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "id": 8, - "iteration": 1632179652682, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 5, - "panels": [], - "title": "Sidecar", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ + "annotations": { + "list": [ { - "expr": "irate(container_cpu_usage_seconds_total{namespace=~\"$namespace\", pod=~\"$pod\", container=\"envoy\"}[1m])", - "interval": "", - "legendFormat": "{{pod}}:{{container}}", - "refId": "A" + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Sidecar CPU usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } + ] }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} + "title": "OSM Data Plane Performance Metrics", + "description": "Compatible with OSM v1.0.0. This dashboard lets you view the performance of OSM’s data plane.", + "uid": "OSMDataPlanePerformanceMetrics", + "version": 3, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": 8, + "iteration": 1632179652682, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 1 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "container_memory_rss{namespace=~\"$namespace\", pod=~\"$pod\", container=\"envoy\"}", - "interval": "", - "legendFormat": "{{pod}}:{{container}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Sidecar RSS usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] + "id": 5, + "panels": [], + "title": "Sidecar", + "type": "row" }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 7, - "panels": [], - "title": "Other containers", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 1 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 11 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(container_cpu_usage_seconds_total{namespace=~\"$namespace\", pod=~\"$pod\", container=~\"$container\"}[1m])", - "interval": "", - "legendFormat": "{{pod}}:{{container}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Container CPU usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "hiddenSeries": false, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false }, - { - "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": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 11 - }, - "hiddenSeries": false, - "id": 9, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "container_memory_rss{namespace=~\"$namespace\", pod=~\"$pod\", container=~\"$container\"}", - "interval": "", - "legendFormat": "{{pod}}:{{container}}", - "refId": "A" + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(container_cpu_usage_seconds_total{namespace=~\"$namespace\", pod=~\"$pod\", container=\"envoy\"}[1m])", + "interval": "", + "legendFormat": "{{pod}}:{{container}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Sidecar CPU usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "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 } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Container RSS usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 1 + }, + "hiddenSeries": false, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "container_memory_rss{namespace=~\"$namespace\", pod=~\"$pod\", container=\"envoy\"}", + "interval": "", + "legendFormat": "{{pod}}:{{container}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Sidecar RSS usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "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 } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 25, - "style": "dark", - "tags": [], - "templating": { - "list": [ + }, { - "allValue": null, - "current": { - "selected": false, - "text": "redis-c9e6-client", - "value": "redis-c9e6-client" + "collapsed": true, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 10 }, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(source_namespace)", - "hide": 0, - "includeAll": true, - "label": "Namespace", - "multi": false, - "name": "namespace", - "options": [], - "query": "label_values(source_namespace)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false + "id": 7, + "panels": [], + "title": "Other containers", + "type": "row" }, { - "allValue": null, - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(envoy_server_live{source_namespace=~\"$namespace\"}, source_pod_name)", - "hide": 0, - "includeAll": true, - "label": "Pod", - "multi": false, - "name": "pod", - "options": [], - "query": "label_values(envoy_server_live{source_namespace=~\"$namespace\"}, source_pod_name)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 11 + }, + "hiddenSeries": false, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(container_cpu_usage_seconds_total{namespace=~\"$namespace\", pod=~\"$pod\", container=~\"$container\"}[1m])", + "interval": "", + "legendFormat": "{{pod}}:{{container}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Container CPU usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "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 + } }, { - "allValue": null, - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(envoy_server_live{source_namespace=~\"$namespace\", source_pod_name=~\"$pod\"}, source_workload_name)", - "hide": 0, - "includeAll": true, - "label": "Container", - "multi": false, - "name": "container", - "options": [], - "query": "label_values(envoy_server_live{source_namespace=~\"$namespace\", source_pod_name=~\"$pod\"}, source_workload_name)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 11 + }, + "hiddenSeries": false, + "id": 9, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "container_memory_rss{namespace=~\"$namespace\", pod=~\"$pod\", container=~\"$container\"}", + "interval": "", + "legendFormat": "{{pod}}:{{container}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Container RSS usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "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 + } } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "" -} + ], + "refresh": false, + "schemaVersion": 25, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": { + "selected": false, + "text": "redis-c9e6-client", + "value": "redis-c9e6-client" + }, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(source_namespace)", + "hide": 0, + "includeAll": true, + "label": "Namespace", + "multi": false, + "name": "namespace", + "options": [], + "query": "label_values(source_namespace)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(envoy_server_live{source_namespace=~\"$namespace\"}, source_pod_name)", + "hide": 0, + "includeAll": true, + "label": "Pod", + "multi": false, + "name": "pod", + "options": [], + "query": "label_values(envoy_server_live{source_namespace=~\"$namespace\"}, source_pod_name)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(envoy_server_live{source_namespace=~\"$namespace\", source_pod_name=~\"$pod\"}, source_workload_name)", + "hide": 0, + "includeAll": true, + "label": "Container", + "multi": false, + "name": "container", + "options": [], + "query": "label_values(envoy_server_live{source_namespace=~\"$namespace\", source_pod_name=~\"$pod\"}, source_workload_name)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "" + } \ No newline at end of file diff --git a/packages/server/charts/osm/grafana/envoy/dashboards/osm-mesh-sidecar-details.json b/packages/server/charts/osm/grafana/envoy/dashboards/osm-mesh-sidecar-details.json index b103d90..22891b6 100644 --- a/packages/server/charts/osm/grafana/envoy/dashboards/osm-mesh-sidecar-details.json +++ b/packages/server/charts/osm/grafana/envoy/dashboards/osm-mesh-sidecar-details.json @@ -122,7 +122,9 @@ "justifyMode": "center", "orientation": "auto", "reduceOptions": { - "calcs": ["last"], + "calcs": [ + "last" + ], "values": false } }, @@ -685,7 +687,9 @@ "options": { "reduceOptions": { "values": false, - "calcs": ["lastNotNull"], + "calcs": [ + "lastNotNull" + ], "fields": "" }, "orientation": "auto", @@ -744,7 +748,9 @@ "options": { "reduceOptions": { "values": false, - "calcs": ["lastNotNull"], + "calcs": [ + "lastNotNull" + ], "fields": "" }, "orientation": "auto", @@ -1421,7 +1427,9 @@ "current": { "selected": true, "text": "All", - "value": ["$__all"] + "value": [ + "$__all" + ] }, "datasource": "${DS_PROMETHEUS}", "definition": "label_values(osm_proxy_connect_count, source_pod_name)", @@ -1447,7 +1455,9 @@ "current": { "selected": true, "text": "All", - "value": ["$__all"] + "value": [ + "$__all" + ] }, "datasource": "${DS_PROMETHEUS}", "definition": "label_values(osm_cert_issued_count, source_pod_name)", @@ -1499,7 +1509,9 @@ "current": { "selected": true, "text": "All", - "value": ["$__all"] + "value": [ + "$__all" + ] }, "datasource": "${DS_PROMETHEUS}", "definition": "label_values(osm_error_err_code_count, err_code)", @@ -1540,4 +1552,4 @@ ] }, "timezone": "" -} +} \ No newline at end of file diff --git a/packages/server/charts/osm/grafana/envoy/dashboards/osm-pod-to-service.json b/packages/server/charts/osm/grafana/envoy/dashboards/osm-pod-to-service.json index 523ce11..0eb47b2 100644 --- a/packages/server/charts/osm/grafana/envoy/dashboards/osm-pod-to-service.json +++ b/packages/server/charts/osm/grafana/envoy/dashboards/osm-pod-to-service.json @@ -47,864 +47,864 @@ "version": "" } ], - "annotations": { - "list": [ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "title": "OSM Pod to Service Metrics", + "description": "Compatible with OSM v1.0.0. This dashboard lets you investigate the traffic metrics from a pod to all the services it connects/talks to.", + "uid": "OSMPodToServiceMetrics", + "version": 2, + "editable": true, + "gnetId": 11776, + "graphTooltip": 0, + "id": 5, + "iteration": 1591749611164, + "links": [], + "panels": [ { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "title": "OSM Pod to Service Metrics", - "description": "Compatible with OSM v1.0.0. This dashboard lets you investigate the traffic metrics from a pod to all the services it connects/talks to.", - "uid": "OSMPodToServiceMetrics", - "version": 2, - "editable": true, - "gnetId": 11776, - "graphTooltip": 0, - "id": 5, - "iteration": 1591749611164, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 22, + "panels": [], + "title": "Request Count - HTTP", + "type": "row" }, - "id": 22, - "panels": [], - "title": "Request Count - HTTP", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class=\"2\",source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "{{envoy_cluster_name}}", + "refId": "A" } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Success Count to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 24, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class=\"2\",source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "{{envoy_cluster_name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Success Count to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] }, - { - "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": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true } - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "hiddenSeries": false, - "id": 25, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class!=\"2\",source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "interval": "", - "legendFormat": "{{envoy_cluster_name}}", - "refId": "A" + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Failure Count to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "dashLength": 10, - "datasource": "Prometheus", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 9 - }, - "id": 28, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "pointradius": 2, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "targets": [ - { - "expr": "irate(envoy_cluster_upstream_rq_total{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "{{envoy_cluster_name}}", - "interval": "", - "refId": "A", - "format": "time_series" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "All types of requests count to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 }, - { - "format": "Misc", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "hiddenSeries": false, + "id": 25, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class!=\"2\",source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "interval": "", + "legendFormat": "{{envoy_cluster_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Failure Count to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "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 } - ], - "yaxis": { - "align": false, - "alignLevel": null - }, - "bars": false, - "dashes": false, - "description": "", - "fillGradient": 0, - "hiddenSeries": false, - "percentage": false, - "points": false, - "stack": false, - "steppedLine": false, - "timeFrom": null, - "timeShift": null - }, - { - "collapsed": false, - "datasource": "${DS_PROMETHEUS}", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 26 }, - "id": 10, - "panels": [], - "title": "Traffic", - "type": "row" - }, - { - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "aliasColors": {}, + "dashLength": 10, + "datasource": "Prometheus", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 28, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "pointradius": 2, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "targets": [ + { + "expr": "irate(envoy_cluster_upstream_rq_total{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "{{envoy_cluster_name}}", + "interval": "", + "refId": "A", + "format": "time_series" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "All types of requests count to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + { + "format": "Misc", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true } + ], + "yaxis": { + "align": false, + "alignLevel": null }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 27 + "bars": false, + "dashes": false, + "description": "", + "fillGradient": 0, + "hiddenSeries": false, + "percentage": false, + "points": false, + "stack": false, + "steppedLine": false, + "timeFrom": null, + "timeShift": null }, - "id": 4, - "interval": "", - "options": { - "dataLinks": [] + { + "collapsed": false, + "datasource": "${DS_PROMETHEUS}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 26 + }, + "id": 10, + "panels": [], + "title": "Traffic", + "type": "row" }, - "pluginVersion": "8.2.2", - "targets": [ - { - "expr": "envoy_cluster_upstream_cx_active{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}", - "legendFormat": "{{envoy_cluster_name}}", - "refId": "A" - } - ], - "title": "Active Connections to other services", - "type": "timeseries", - "timeFrom": null, - "timeShift": null, - "renderer": "flot", - "yaxes": [ - { - "label": null, + { + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 27 + }, + "id": 4, + "interval": "", + "options": { + "dataLinks": [] + }, + "pluginVersion": "8.2.2", + "targets": [ + { + "expr": "envoy_cluster_upstream_cx_active{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}", + "legendFormat": "{{envoy_cluster_name}}", + "refId": "A" + } + ], + "title": "Active Connections to other services", + "type": "timeseries", + "timeFrom": null, + "timeShift": null, + "renderer": "flot", + "yaxes": [ + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + }, + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + } + ], + "xaxis": { "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" + "mode": "time", + "name": null, + "values": [], + "buckets": null }, - { - "label": null, + "yaxis": { + "align": false, + "alignLevel": null + }, + "lines": true, + "fill": 1, + "fillGradient": 0, + "linewidth": 1, + "dashes": false, + "hiddenSeries": false, + "dashLength": 10, + "spaceLength": 10, + "points": false, + "pointradius": 2, + "bars": false, + "stack": false, + "percentage": false, + "legend": { "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" - } - ], - "xaxis": { - "show": true, - "mode": "time", - "name": null, - "values": [], - "buckets": null - }, - "yaxis": { - "align": false, - "alignLevel": null - }, - "lines": true, - "fill": 1, - "fillGradient": 0, - "linewidth": 1, - "dashes": false, - "hiddenSeries": false, - "dashLength": 10, - "spaceLength": 10, - "points": false, - "pointradius": 2, - "bars": false, - "stack": false, - "percentage": false, - "legend": { - "show": true, - "values": false, - "min": false, - "max": false, - "current": false, - "total": false, - "avg": false - }, - "nullPointMode": "null", - "steppedLine": false, - "tooltip": { - "value_type": "individual", - "shared": true, - "sort": 0 - }, - "aliasColors": {}, - "seriesOverrides": [], - "thresholds": [], - "timeRegions": [] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 27 - }, - "hiddenSeries": false, - "id": 26, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(envoy_cluster_upstream_cx_destroy_remote_with_active_rq{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Connection destroyed by the client - {{envoy_cluster_name}}", - "refId": "A" + "values": false, + "min": false, + "max": false, + "current": false, + "total": false, + "avg": false }, - { - "expr": "irate(envoy_cluster_upstream_cx_connect_timeout{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Connection timeout - {{envoy_cluster_name}}", - "refId": "B" + "nullPointMode": "null", + "steppedLine": false, + "tooltip": { + "value_type": "individual", + "shared": true, + "sort": 0 }, - { - "expr": "irate(envoy_cluster_upstream_cx_destroy_local_with_active_rq{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Connection destroyed by local Sidecar - {{envoy_cluster_name}}", - "refId": "C" + "aliasColors": {}, + "seriesOverrides": [], + "thresholds": [], + "timeRegions": [] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "expr": "irate(envoy_cluster_upstream_rq_pending_failure_eject{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Pending failure ejection - {{envoy_cluster_name}}", - "refId": "D" + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 27 }, - { - "expr": "irate(envoy_cluster_upstream_rq_pending_overflow{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Pending overflow - {{envoy_cluster_name}}", - "refId": "E" + "hiddenSeries": false, + "id": 26, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false }, - { - "expr": "irate(envoy_cluster_upstream_rq_timeout{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Request timeout - {{envoy_cluster_name}}", - "refId": "F" + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] }, - { - "expr": "irate(envoy_cluster_upstream_rq_rx_reset{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Response reset - {{envoy_cluster_name}}", - "refId": "G" + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(envoy_cluster_upstream_cx_destroy_remote_with_active_rq{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Connection destroyed by the client - {{envoy_cluster_name}}", + "refId": "A" + }, + { + "expr": "irate(envoy_cluster_upstream_cx_connect_timeout{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Connection timeout - {{envoy_cluster_name}}", + "refId": "B" + }, + { + "expr": "irate(envoy_cluster_upstream_cx_destroy_local_with_active_rq{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Connection destroyed by local Sidecar - {{envoy_cluster_name}}", + "refId": "C" + }, + { + "expr": "irate(envoy_cluster_upstream_rq_pending_failure_eject{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Pending failure ejection - {{envoy_cluster_name}}", + "refId": "D" + }, + { + "expr": "irate(envoy_cluster_upstream_rq_pending_overflow{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Pending overflow - {{envoy_cluster_name}}", + "refId": "E" + }, + { + "expr": "irate(envoy_cluster_upstream_rq_timeout{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Request timeout - {{envoy_cluster_name}}", + "refId": "F" + }, + { + "expr": "irate(envoy_cluster_upstream_rq_rx_reset{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Response reset - {{envoy_cluster_name}}", + "refId": "G" + }, + { + "expr": "irate(envoy_cluster_upstream_rq_tx_reset{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Request reset - {{envoy_cluster_name}}", + "refId": "H" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Connection/Requests errors", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - { - "expr": "irate(envoy_cluster_upstream_rq_tx_reset{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Request reset - {{envoy_cluster_name}}", - "refId": "H" + "type": "timeseries", + "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 } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Connection/Requests errors", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "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": "${DS_PROMETHEUS}", - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 35 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 35 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(envoy_cluster_upstream_cx_rx_bytes_total{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "{{envoy_cluster_name}}", - "refId": "B" + "hiddenSeries": false, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(envoy_cluster_upstream_cx_rx_bytes_total{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "{{envoy_cluster_name}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Bytes sent to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Bytes sent to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "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": "${DS_PROMETHEUS}", - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 35 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 35 - }, - "hiddenSeries": false, - "id": 27, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(envoy_cluster_upstream_cx_tx_bytes_total{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "interval": "", - "legendFormat": "{{envoy_cluster_name}}", - "refId": "A" + "hiddenSeries": false, + "id": 27, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(envoy_cluster_upstream_cx_tx_bytes_total{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "interval": "", + "legendFormat": "{{envoy_cluster_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Bytes received to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Bytes received to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ + } + ], + "refresh": false, + "schemaVersion": 25, + "style": "dark", + "tags": [], + "templating": { + "list": [ { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(envoy_server_live{}, source_namespace)", + "hide": 0, + "includeAll": false, + "label": "Source Namespace", + "multi": false, + "name": "source_namespace", + "options": [], + "query": "label_values(envoy_server_live{}, source_namespace)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false }, { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_pod_name)", + "hide": 0, + "includeAll": false, + "label": "Source Pod", + "multi": false, + "name": "source_pod", + "options": [], + "query": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_pod_name)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 25, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(envoy_server_live{}, source_namespace)", - "hide": 0, - "includeAll": false, - "label": "Source Namespace", - "multi": false, - "name": "source_namespace", - "options": [], - "query": "label_values(envoy_server_live{}, source_namespace)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_pod_name)", - "hide": 0, - "includeAll": false, - "label": "Source Pod", - "multi": false, - "name": "source_pod", - "options": [], - "query": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_pod_name)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "" -} + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "" + } diff --git a/packages/server/charts/osm/grafana/envoy/dashboards/osm-service-to-service.json b/packages/server/charts/osm/grafana/envoy/dashboards/osm-service-to-service.json index 6822df2..a94421d 100644 --- a/packages/server/charts/osm/grafana/envoy/dashboards/osm-service-to-service.json +++ b/packages/server/charts/osm/grafana/envoy/dashboards/osm-service-to-service.json @@ -47,700 +47,700 @@ "version": "" } ], - "annotations": { - "list": [ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "title": "OSM Service to Service Metrics", + "description": "Compatible with OSM v1.0.0. This dashboard lets you view the traffic metrics from a given source service to a given destination service.", + "uid": "OSMServiceToServiceMetrics", + "version": 2, + "editable": true, + "gnetId": 11776, + "graphTooltip": 0, + "id": 6, + "iteration": 1591749761183, + "links": [], + "panels": [ { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "title": "OSM Service to Service Metrics", - "description": "Compatible with OSM v1.0.0. This dashboard lets you view the traffic metrics from a given source service to a given destination service.", - "uid": "OSMServiceToServiceMetrics", - "version": 2, - "editable": true, - "gnetId": 11776, - "graphTooltip": 0, - "id": 6, - "iteration": 1591749761183, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 22, + "panels": [], + "title": "Request Count - HTTP", + "type": "row" }, - "id": 22, - "panels": [], - "title": "Request Count - HTTP", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m])", + "legendFormat": "Time (per minute)", + "refId": "A" } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Success Count", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 24, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m])", - "legendFormat": "Time (per minute)", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Success Count", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "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 } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 + }, + "hiddenSeries": false, + "id": 25, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class!=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m])", + "interval": "", + "legendFormat": "Time (per minute)", + "refId": "A" } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Failure Count", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "hiddenSeries": false, - "id": 25, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class!=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m])", - "interval": "", - "legendFormat": "Time (per minute)", - "refId": "A" + "type": "timeseries", + "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 } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Failure Count", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "collapsed": false, + "datasource": "${DS_PROMETHEUS}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 18 }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "${DS_PROMETHEUS}", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 18 + "id": 10, + "panels": [], + "title": "Traffic", + "type": "row" }, - "id": 10, - "panels": [], - "title": "Traffic", - "type": "row" - }, - { - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } + "overrides": [] }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 0, - "y": 19 - }, - "id": 4, - "interval": "", - "options": { - "dataLinks": [] - }, - "pluginVersion": "8.2.2", - "targets": [ - { - "expr": "sum(envoy_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"})", - "legendFormat": "Connections", - "refId": "A" - } - ], - "title": "Active Connections between services", - "type": "timeseries", - "timeFrom": null, - "timeShift": null, - "renderer": "flot", - "yaxes": [ - { - "label": null, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 19 + }, + "id": 4, + "interval": "", + "options": { + "dataLinks": [] + }, + "pluginVersion": "8.2.2", + "targets": [ + { + "expr": "sum(envoy_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"})", + "legendFormat": "Connections", + "refId": "A" + } + ], + "title": "Active Connections between services", + "type": "timeseries", + "timeFrom": null, + "timeShift": null, + "renderer": "flot", + "yaxes": [ + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + }, + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + } + ], + "xaxis": { "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" + "mode": "time", + "name": null, + "values": [], + "buckets": null }, - { - "label": null, + "yaxis": { + "align": false, + "alignLevel": null + }, + "lines": true, + "fill": 1, + "fillGradient": 0, + "linewidth": 1, + "dashes": false, + "hiddenSeries": false, + "dashLength": 10, + "spaceLength": 10, + "points": false, + "pointradius": 2, + "bars": false, + "stack": false, + "percentage": false, + "legend": { "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" - } - ], - "xaxis": { - "show": true, - "mode": "time", - "name": null, - "values": [], - "buckets": null - }, - "yaxis": { - "align": false, - "alignLevel": null - }, - "lines": true, - "fill": 1, - "fillGradient": 0, - "linewidth": 1, - "dashes": false, - "hiddenSeries": false, - "dashLength": 10, - "spaceLength": 10, - "points": false, - "pointradius": 2, - "bars": false, - "stack": false, - "percentage": false, - "legend": { - "show": true, - "values": false, - "min": false, - "max": false, - "current": false, - "total": false, - "avg": false - }, - "nullPointMode": "null", - "steppedLine": false, - "tooltip": { - "value_type": "individual", - "shared": true, - "sort": 0 - }, - "aliasColors": {}, - "seriesOverrides": [], - "thresholds": [], - "timeRegions": [] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} + "values": false, + "min": false, + "max": false, + "current": false, + "total": false, + "avg": false }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 19 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(envoy_cluster_upstream_cx_tx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Bytes sent", - "refId": "A" + "nullPointMode": "null", + "steppedLine": false, + "tooltip": { + "value_type": "individual", + "shared": true, + "sort": 0 }, - { - "expr": "sum(irate(envoy_cluster_upstream_cx_rx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Bytes received", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Traffic from source service perspective", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] + "aliasColors": {}, + "seriesOverrides": [], + "thresholds": [], + "timeRegions": [] }, - "yaxes": [ - { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 19 + }, + "hiddenSeries": false, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(envoy_cluster_upstream_cx_tx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Bytes sent", + "refId": "A" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_cx_rx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Bytes received", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Traffic from source service perspective", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 19 - }, - "hiddenSeries": false, - "id": 26, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(envoy_cluster_upstream_cx_destroy_remote_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Connection destroyed by the client", - "refId": "A" + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "expr": "sum(irate(envoy_cluster_upstream_cx_connect_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Connection timeout", - "refId": "B" + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 19 }, - { - "expr": "sum(irate(envoy_cluster_upstream_cx_destroy_local_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Connection destroyed by local Sidecar", - "refId": "C" + "hiddenSeries": false, + "id": 26, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false }, - { - "expr": "sum(irate(envoy_cluster_upstream_rq_pending_failure_eject{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Pending failure ejection", - "refId": "D" + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] }, - { - "expr": "sum(irate(envoy_cluster_upstream_rq_pending_overflow{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Pending overflow", - "refId": "E" + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(envoy_cluster_upstream_cx_destroy_remote_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Connection destroyed by the client", + "refId": "A" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_cx_connect_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Connection timeout", + "refId": "B" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_cx_destroy_local_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Connection destroyed by local Sidecar", + "refId": "C" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_rq_pending_failure_eject{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Pending failure ejection", + "refId": "D" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_rq_pending_overflow{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Pending overflow", + "refId": "E" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_rq_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Request timeout", + "refId": "F" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_rq_rx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Response reset", + "refId": "G" + }, + { + "expr": "sum(irate(envoy_cluster_upstream_rq_tx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Request reset", + "refId": "H" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Connection/Requests errors from source service perspective", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - { - "expr": "sum(irate(envoy_cluster_upstream_rq_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Request timeout", - "refId": "F" + "type": "timeseries", + "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 + } + } + ], + "refresh": false, + "schemaVersion": 25, + "style": "dark", + "tags": [], + "templating": { + "list": [ { - "expr": "sum(irate(envoy_cluster_upstream_rq_rx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Response reset", - "refId": "G" + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(envoy_server_live{}, source_namespace)", + "hide": 0, + "includeAll": false, + "label": "Source Namespace", + "multi": false, + "name": "source_namespace", + "options": [], + "query": "label_values(envoy_server_live{}, source_namespace)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false }, { - "expr": "sum(irate(envoy_cluster_upstream_rq_tx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Request reset", - "refId": "H" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Connection/Requests errors from source service perspective", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_service)", + "hide": 0, + "includeAll": false, + "label": "Source service", + "multi": false, + "name": "source_service", + "options": [], + "query": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_service)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false }, { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(envoy_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|.*-local|envoy-tracing-cluster|passthrough-outbound\"}, envoy_cluster_name)", + "hide": 0, + "includeAll": false, + "label": "Destination Service", + "multi": false, + "name": "destination_service", + "options": [], + "query": "label_values(envoy_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|.*-local|envoy-tracing-cluster|passthrough-outbound\"}, envoy_cluster_name)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 25, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(envoy_server_live{}, source_namespace)", - "hide": 0, - "includeAll": false, - "label": "Source Namespace", - "multi": false, - "name": "source_namespace", - "options": [], - "query": "label_values(envoy_server_live{}, source_namespace)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_service)", - "hide": 0, - "includeAll": false, - "label": "Source service", - "multi": false, - "name": "source_service", - "options": [], - "query": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_service)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(envoy_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|.*-local|envoy-tracing-cluster|passthrough-outbound\"}, envoy_cluster_name)", - "hide": 0, - "includeAll": false, - "label": "Destination Service", - "multi": false, - "name": "destination_service", - "options": [], - "query": "label_values(envoy_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|.*-local|envoy-tracing-cluster|passthrough-outbound\"}, envoy_cluster_name)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "" -} + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "" + } diff --git a/packages/server/charts/osm/grafana/envoy/dashboards/osm-workload-to-service.json b/packages/server/charts/osm/grafana/envoy/dashboards/osm-workload-to-service.json index 9cb7ffe..d6bb1f8 100644 --- a/packages/server/charts/osm/grafana/envoy/dashboards/osm-workload-to-service.json +++ b/packages/server/charts/osm/grafana/envoy/dashboards/osm-workload-to-service.json @@ -47,790 +47,790 @@ "version": "" } ], - "annotations": { - "list": [ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "title": "OSM Workload to Service Metrics", + "description": "Compatible with OSM v1.0.0. This dashboard provides the traffic metrics from a workload (deployment, replicaSet) to all the services it connects/talks to.", + "uid": "OSMWorkloadToServiceMetrics", + "version": 2, + "editable": true, + "gnetId": 11776, + "graphTooltip": 0, + "id": 5, + "iteration": 1591749611164, + "links": [], + "panels": [ { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "title": "OSM Workload to Service Metrics", - "description": "Compatible with OSM v1.0.0. This dashboard provides the traffic metrics from a workload (deployment, replicaSet) to all the services it connects/talks to.", - "uid": "OSMWorkloadToServiceMetrics", - "version": 2, - "editable": true, - "gnetId": 11776, - "graphTooltip": 0, - "id": 5, - "iteration": 1591749611164, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 22, + "panels": [], + "title": "Request Count - HTTP", + "type": "row" }, - "id": 22, - "panels": [], - "title": "Request Count - HTTP", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class=\"2\",source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "{{envoy_cluster_name}}", + "refId": "A" } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Success Count to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 24, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class=\"2\",source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "{{envoy_cluster_name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Success Count to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "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 } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 + }, + "hiddenSeries": false, + "id": 25, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class!=\"2\",source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "interval": "", + "legendFormat": "{{envoy_cluster_name}}", + "refId": "A" } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Failure Count to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "hiddenSeries": false, - "id": 25, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(envoy_cluster_upstream_rq_xx{envoy_response_code_class!=\"2\",source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "interval": "", - "legendFormat": "{{envoy_cluster_name}}", - "refId": "A" + "type": "timeseries", + "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 } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Failure Count to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "collapsed": false, + "datasource": "${DS_PROMETHEUS}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 18 }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "${DS_PROMETHEUS}", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 18 + "id": 10, + "panels": [], + "title": "Traffic", + "type": "row" }, - "id": 10, - "panels": [], - "title": "Traffic", - "type": "row" - }, - { - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 19 + }, + "id": 4, + "interval": "", + "options": { + "dataLinks": [] + }, + "pluginVersion": "8.2.2", + "targets": [ + { + "expr": "envoy_cluster_upstream_cx_active{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}", + "legendFormat": "{{envoy_cluster_name}}", + "refId": "A" } + ], + "title": "Active Connections to other services", + "type": "timeseries", + "timeFrom": null, + "timeShift": null, + "renderer": "flot", + "yaxes": [ + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + }, + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + } + ], + "xaxis": { + "show": true, + "mode": "time", + "name": null, + "values": [], + "buckets": null }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 19 - }, - "id": 4, - "interval": "", - "options": { - "dataLinks": [] + "yaxis": { + "align": false, + "alignLevel": null + }, + "lines": true, + "fill": 1, + "fillGradient": 0, + "linewidth": 1, + "dashes": false, + "hiddenSeries": false, + "dashLength": 10, + "spaceLength": 10, + "points": false, + "pointradius": 2, + "bars": false, + "stack": false, + "percentage": false, + "legend": { + "show": true, + "values": false, + "min": false, + "max": false, + "current": false, + "total": false, + "avg": false + }, + "nullPointMode": "null", + "steppedLine": false, + "tooltip": { + "value_type": "individual", + "shared": true, + "sort": 0 + }, + "aliasColors": {}, + "seriesOverrides": [], + "thresholds": [], + "timeRegions": [] }, - "pluginVersion": "8.2.2", - "targets": [ - { - "expr": "envoy_cluster_upstream_cx_active{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}", - "legendFormat": "{{envoy_cluster_name}}", - "refId": "A" - } - ], - "title": "Active Connections to other services", - "type": "timeseries", - "timeFrom": null, - "timeShift": null, - "renderer": "flot", - "yaxes": [ - { - "label": null, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 19 + }, + "hiddenSeries": false, + "id": 26, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": false, "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" + "total": false, + "values": false }, - { - "label": null, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(envoy_cluster_upstream_cx_destroy_remote_with_active_rq{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Connection destroyed by the client - {{envoy_cluster_name}}", + "refId": "A" + }, + { + "expr": "irate(envoy_cluster_upstream_cx_connect_timeout{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Connection timeout - {{envoy_cluster_name}}", + "refId": "B" + }, + { + "expr": "irate(envoy_cluster_upstream_cx_destroy_local_with_active_rq{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Connection destroyed by local Sidecar - {{envoy_cluster_name}}", + "refId": "C" + }, + { + "expr": "irate(envoy_cluster_upstream_rq_pending_failure_eject{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Pending failure ejection - {{envoy_cluster_name}}", + "refId": "D" + }, + { + "expr": "irate(envoy_cluster_upstream_rq_pending_overflow{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Pending overflow - {{envoy_cluster_name}}", + "refId": "E" + }, + { + "expr": "irate(envoy_cluster_upstream_rq_timeout{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Request timeout - {{envoy_cluster_name}}", + "refId": "F" + }, + { + "expr": "irate(envoy_cluster_upstream_rq_rx_reset{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Response reset - {{envoy_cluster_name}}", + "refId": "G" + }, + { + "expr": "irate(envoy_cluster_upstream_rq_tx_reset{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Request reset - {{envoy_cluster_name}}", + "refId": "H" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Connection/Requests errors", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" + "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 } - ], - "xaxis": { - "show": true, - "mode": "time", - "name": null, - "values": [], - "buckets": null - }, - "yaxis": { - "align": false, - "alignLevel": null - }, - "lines": true, - "fill": 1, - "fillGradient": 0, - "linewidth": 1, - "dashes": false, - "hiddenSeries": false, - "dashLength": 10, - "spaceLength": 10, - "points": false, - "pointradius": 2, - "bars": false, - "stack": false, - "percentage": false, - "legend": { - "show": true, - "values": false, - "min": false, - "max": false, - "current": false, - "total": false, - "avg": false - }, - "nullPointMode": "null", - "steppedLine": false, - "tooltip": { - "value_type": "individual", - "shared": true, - "sort": 0 - }, - "aliasColors": {}, - "seriesOverrides": [], - "thresholds": [], - "timeRegions": [] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 19 - }, - "hiddenSeries": false, - "id": 26, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(envoy_cluster_upstream_cx_destroy_remote_with_active_rq{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Connection destroyed by the client - {{envoy_cluster_name}}", - "refId": "A" - }, - { - "expr": "irate(envoy_cluster_upstream_cx_connect_timeout{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Connection timeout - {{envoy_cluster_name}}", - "refId": "B" + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "expr": "irate(envoy_cluster_upstream_cx_destroy_local_with_active_rq{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Connection destroyed by local Sidecar - {{envoy_cluster_name}}", - "refId": "C" + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 27 }, - { - "expr": "irate(envoy_cluster_upstream_rq_pending_failure_eject{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Pending failure ejection - {{envoy_cluster_name}}", - "refId": "D" + "hiddenSeries": false, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false }, - { - "expr": "irate(envoy_cluster_upstream_rq_pending_overflow{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Pending overflow - {{envoy_cluster_name}}", - "refId": "E" + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] }, - { - "expr": "irate(envoy_cluster_upstream_rq_timeout{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Request timeout - {{envoy_cluster_name}}", - "refId": "F" + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(envoy_cluster_upstream_cx_rx_bytes_total{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "{{envoy_cluster_name}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Bytes sent to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - { - "expr": "irate(envoy_cluster_upstream_rq_rx_reset{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Response reset - {{envoy_cluster_name}}", - "refId": "G" + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] }, - { - "expr": "irate(envoy_cluster_upstream_rq_tx_reset{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Request reset - {{envoy_cluster_name}}", - "refId": "H" + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Connection/Requests errors", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "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": "${DS_PROMETHEUS}", - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 27 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 27 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(envoy_cluster_upstream_cx_rx_bytes_total{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "{{envoy_cluster_name}}", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Bytes sent to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "hiddenSeries": false, + "id": 27, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(envoy_cluster_upstream_cx_tx_bytes_total{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "interval": "", + "legendFormat": "{{envoy_cluster_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Bytes received to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "yaxis": { - "align": false, - "alignLevel": null } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 27 - }, - "hiddenSeries": false, - "id": 27, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ + ], + "refresh": false, + "schemaVersion": 25, + "style": "dark", + "tags": [], + "templating": { + "list": [ { - "expr": "irate(envoy_cluster_upstream_cx_tx_bytes_total{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",envoy_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "interval": "", - "legendFormat": "{{envoy_cluster_name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Bytes received to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(envoy_server_live{}, source_namespace)", + "hide": 0, + "includeAll": false, + "label": "Source Namespace", + "multi": false, + "name": "source_namespace", + "options": [], + "query": "label_values(envoy_server_live{}, source_namespace)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_workload_kind)", + "hide": 0, + "includeAll": false, + "label": "Source Workload Kind", + "multi": false, + "name": "source_workload_kind", + "options": [], + "query": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_workload_kind)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false }, { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(envoy_server_live{source_namespace=\"$source_namespace\",source_namespace=\"$source_namespace\"}, source_workload_name)", + "hide": 0, + "includeAll": false, + "label": "Source Workload Name", + "multi": false, + "name": "source_workload_name", + "options": [], + "query": "label_values(envoy_server_live{source_namespace=\"$source_namespace\", source_workload_kind=\"$source_workload_kind\"}, source_workload_name)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 25, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(envoy_server_live{}, source_namespace)", - "hide": 0, - "includeAll": false, - "label": "Source Namespace", - "multi": false, - "name": "source_namespace", - "options": [], - "query": "label_values(envoy_server_live{}, source_namespace)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_workload_kind)", - "hide": 0, - "includeAll": false, - "label": "Source Workload Kind", - "multi": false, - "name": "source_workload_kind", - "options": [], - "query": "label_values(envoy_server_live{source_namespace=\"$source_namespace\"}, source_workload_kind)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(envoy_server_live{source_namespace=\"$source_namespace\",source_namespace=\"$source_namespace\"}, source_workload_name)", - "hide": 0, - "includeAll": false, - "label": "Source Workload Name", - "multi": false, - "name": "source_workload_name", - "options": [], - "query": "label_values(envoy_server_live{source_namespace=\"$source_namespace\", source_workload_kind=\"$source_workload_kind\"}, source_workload_name)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "" -} + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "" + } diff --git a/packages/server/charts/osm/grafana/envoy/dashboards/osm-workload-to-workload.json b/packages/server/charts/osm/grafana/envoy/dashboards/osm-workload-to-workload.json index fae39d7..7c3e371 100644 --- a/packages/server/charts/osm/grafana/envoy/dashboards/osm-workload-to-workload.json +++ b/packages/server/charts/osm/grafana/envoy/dashboards/osm-workload-to-workload.json @@ -47,452 +47,452 @@ "version": "" } ], - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "title": "OSM Workload to Workload Metrics", - "description": "Compatible with OSM v1.0.0. This dashboard displays the latencies of requests in the mesh from workload to workload.", - "uid": "OSMWorkloadToWorkloadMetrics", - "version": 2, - "editable": true, - "gnetId": 11776, - "graphTooltip": 0, - "id": 5, - "iteration": 1591749611164, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 20, - "panels": [], - "title": "Request Latency", - "type": "row" + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} + "title": "OSM Workload to Workload Metrics", + "description": "Compatible with OSM v1.0.0. This dashboard displays the latencies of requests in the mesh from workload to workload.", + "uid": "OSMWorkloadToWorkloadMetrics", + "version": 2, + "editable": true, + "gnetId": 11776, + "graphTooltip": 0, + "id": 5, + "iteration": 1591749611164, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 8, - "x": 0, - "y": 1 + "id": 20, + "panels": [], + "title": "Request Latency", + "type": "row" }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "hideEmpty": true, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "exemplar": true, - "expr": "histogram_quantile(0.99,sum(irate(osm_request_duration_ms_bucket{source_namespace=\"$source_namespace\",source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\",source_pod=\"$source_pod\"}[1m])) by (le, destination_namespace, destination_name))", - "interval": "", - "legendFormat": "{{destination_namespace}}/{{destination_name}}", - "refId": "A" + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 6, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(0.99,sum(irate(osm_request_duration_ms_bucket{source_namespace=\"$source_namespace\",source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\",source_pod=\"$source_pod\"}[1m])) by (le, destination_namespace, destination_name))", + "interval": "", + "legendFormat": "{{destination_namespace}}/{{destination_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Request Latency (P99)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": "", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Request Latency (P99)", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] }, - "yaxes": [ - { - "format": "ms", - "label": "", - "logBase": 1, - "max": null, - "min": "0", - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "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": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 1 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 1 - }, - "hiddenSeries": false, - "id": 16, - "legend": { - "avg": false, - "current": false, - "hideEmpty": true, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "exemplar": true, - "expr": "histogram_quantile(0.90,sum(irate(osm_request_duration_ms_bucket{source_namespace=\"$source_namespace\",source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\",source_pod=\"$source_pod\"}[1m])) by (le, destination_namespace, destination_name))", - "interval": "", - "legendFormat": "{{destination_namespace}}/{{destination_name}}", - "refId": "A" + "hiddenSeries": false, + "id": 16, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(0.90,sum(irate(osm_request_duration_ms_bucket{source_namespace=\"$source_namespace\",source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\",source_pod=\"$source_pod\"}[1m])) by (le, destination_namespace, destination_name))", + "interval": "", + "legendFormat": "{{destination_namespace}}/{{destination_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Request Latency (P90)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Request Latency (P90)", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "ms", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 1 + }, + "hiddenSeries": false, + "id": 18, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(0.50,sum(irate(osm_request_duration_ms_bucket{source_namespace=\"$source_namespace\",source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\",source_pod=\"$source_pod\"}[1m])) by (le, destination_namespace, destination_name))", + "interval": "", + "legendFormat": "{{destination_namespace}}/{{destination_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Request Latency (P50)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "yaxis": { - "align": false, - "alignLevel": null } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} + ], + "refresh": false, + "schemaVersion": 25, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": {}, + "datasource": "Prometheus", + "definition": "label_values(osm_request_duration_ms_sum{}, source_namespace)", + "hide": 0, + "includeAll": false, + "label": "Source Namespace", + "multi": false, + "name": "source_namespace", + "options": [], + "query": "label_values(osm_request_duration_ms_sum{}, source_namespace)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 1 - }, - "hiddenSeries": false, - "id": 18, - "legend": { - "avg": false, - "current": false, - "hideEmpty": true, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ { - "exemplar": true, - "expr": "histogram_quantile(0.50,sum(irate(osm_request_duration_ms_bucket{source_namespace=\"$source_namespace\",source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\",source_pod=\"$source_pod\"}[1m])) by (le, destination_namespace, destination_name))", - "interval": "", - "legendFormat": "{{destination_namespace}}/{{destination_name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Request Latency (P50)", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ + "allValue": null, + "current": { + "selected": false, + "text": "Deployment", + "value": "Deployment" + }, + "datasource": "Prometheus", + "definition": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\"},source_kind)", + "hide": 0, + "includeAll": false, + "label": "Source Workload Kind", + "multi": false, + "name": "source_workload_kind", + "options": [], + "query": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\"},source_kind)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, { - "format": "ms", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true + "allValue": null, + "current": {}, + "datasource": "Prometheus", + "definition": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\"}, source_name)", + "hide": 0, + "includeAll": false, + "label": "Source Workload Name", + "multi": false, + "name": "source_workload_name", + "options": [], + "query": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\"}, source_name)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false }, { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "Prometheus", + "definition": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\"}, source_pod) ", + "description": null, + "error": null, + "hide": 0, + "includeAll": true, + "label": "Source Pod", + "multi": false, + "name": "source_pod", + "options": [], + "query": { + "query": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\"}, source_pod) ", + "refId": "StandardVariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 25, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "allValue": null, - "current": {}, - "datasource": "Prometheus", - "definition": "label_values(osm_request_duration_ms_sum{}, source_namespace)", - "hide": 0, - "includeAll": false, - "label": "Source Namespace", - "multi": false, - "name": "source_namespace", - "options": [], - "query": "label_values(osm_request_duration_ms_sum{}, source_namespace)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "selected": false, - "text": "Deployment", - "value": "Deployment" - }, - "datasource": "Prometheus", - "definition": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\"},source_kind)", - "hide": 0, - "includeAll": false, - "label": "Source Workload Kind", - "multi": false, - "name": "source_workload_kind", - "options": [], - "query": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\"},source_kind)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "Prometheus", - "definition": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\"}, source_name)", - "hide": 0, - "includeAll": false, - "label": "Source Workload Name", - "multi": false, - "name": "source_workload_name", - "options": [], - "query": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\"}, source_name)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "Prometheus", - "definition": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\"}, source_pod) ", - "description": null, - "error": null, - "hide": 0, - "includeAll": true, - "label": "Source Pod", - "multi": false, - "name": "source_pod", - "options": [], - "query": { - "query": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\"}, source_pod) ", - "refId": "StandardVariableQuery" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "type": "query" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "" -} + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "" +} \ No newline at end of file diff --git a/packages/server/charts/osm/grafana/pipy/dashboards/osm-control-plane.json b/packages/server/charts/osm/grafana/pipy/dashboards/osm-control-plane.json index 83af56f..db60430 100755 --- a/packages/server/charts/osm/grafana/pipy/dashboards/osm-control-plane.json +++ b/packages/server/charts/osm/grafana/pipy/dashboards/osm-control-plane.json @@ -47,679 +47,679 @@ "version": "" } ], - "annotations": { - "list": [ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "title": "OSM Control Plane Metrics", + "description": "Compatible with OSM v1.0.0. This dashboard provides traffic metrics from the given service to OSM’s control plane.", + "uid": "OSMControlPlaneMetrics", + "version": 2, + "editable": true, + "gnetId": 11776, + "graphTooltip": 0, + "id": 6, + "iteration": 1591749761183, + "links": [], + "panels": [ { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "title": "OSM Control Plane Metrics", - "description": "Compatible with OSM v1.0.0. This dashboard provides traffic metrics from the given service to OSM’s control plane.", - "uid": "OSMControlPlaneMetrics", - "version": 2, - "editable": true, - "gnetId": 11776, - "graphTooltip": 0, - "id": 6, - "iteration": 1591749761183, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 22, + "panels": [], + "title": "Request Count - HTTP", + "type": "row" }, - "id": 22, - "panels": [], - "title": "Request Count - HTTP", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m])", + "interval": "1m", + "legendFormat": "Time (per minute)", + "refId": "A" } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Success Count", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 24, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m])", - "interval": "1m", - "legendFormat": "Time (per minute)", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Success Count", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "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 } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 + }, + "hiddenSeries": false, + "id": 25, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class!=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m])", + "interval": "1m", + "legendFormat": "Time (per minute)", + "refId": "A" } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Failure Count", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "hiddenSeries": false, - "id": 25, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class!=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m])", - "interval": "1m", - "legendFormat": "Time (per minute)", - "refId": "A" + "type": "timeseries", + "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 } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Failure Count", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "collapsed": false, + "datasource": "${DS_PROMETHEUS}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 18 }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "${DS_PROMETHEUS}", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 18 + "id": 10, + "panels": [], + "title": "Traffic", + "type": "row" }, - "id": 10, - "panels": [], - "title": "Traffic", - "type": "row" - }, - { - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } + "overrides": [] }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 0, - "y": 19 - }, - "id": 4, - "interval": "", - "options": { - "dataLinks": [] - }, - "pluginVersion": "8.2.2", - "targets": [ - { - "expr": "sum(sidecar_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"})", - "legendFormat": "Connections", - "refId": "A" - } - ], - "title": "Active Connections to Control Plane", - "type": "timeseries", - "timeFrom": null, - "timeShift": null, - "renderer": "flot", - "yaxes": [ - { - "label": null, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 19 + }, + "id": 4, + "interval": "", + "options": { + "dataLinks": [] + }, + "pluginVersion": "8.2.2", + "targets": [ + { + "expr": "sum(sidecar_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"})", + "legendFormat": "Connections", + "refId": "A" + } + ], + "title": "Active Connections to Control Plane", + "type": "timeseries", + "timeFrom": null, + "timeShift": null, + "renderer": "flot", + "yaxes": [ + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + }, + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + } + ], + "xaxis": { "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" + "mode": "time", + "name": null, + "values": [], + "buckets": null }, - { - "label": null, + "yaxis": { + "align": false, + "alignLevel": null + }, + "lines": true, + "fill": 1, + "fillGradient": 0, + "linewidth": 1, + "dashes": false, + "hiddenSeries": false, + "dashLength": 10, + "spaceLength": 10, + "points": false, + "pointradius": 2, + "bars": false, + "stack": false, + "percentage": false, + "legend": { "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" - } - ], - "xaxis": { - "show": true, - "mode": "time", - "name": null, - "values": [], - "buckets": null - }, - "yaxis": { - "align": false, - "alignLevel": null - }, - "lines": true, - "fill": 1, - "fillGradient": 0, - "linewidth": 1, - "dashes": false, - "hiddenSeries": false, - "dashLength": 10, - "spaceLength": 10, - "points": false, - "pointradius": 2, - "bars": false, - "stack": false, - "percentage": false, - "legend": { - "show": true, - "values": false, - "min": false, - "max": false, - "current": false, - "total": false, - "avg": false - }, - "nullPointMode": "null", - "steppedLine": false, - "tooltip": { - "value_type": "individual", - "shared": true, - "sort": 0 - }, - "aliasColors": {}, - "seriesOverrides": [], - "thresholds": [], - "timeRegions": [] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} + "values": false, + "min": false, + "max": false, + "current": false, + "total": false, + "avg": false }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 19 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(sidecar_cluster_upstream_cx_tx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Bytes sent", - "refId": "A" + "nullPointMode": "null", + "steppedLine": false, + "tooltip": { + "value_type": "individual", + "shared": true, + "sort": 0 }, - { - "expr": "sum(irate(sidecar_cluster_upstream_cx_rx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Bytes received", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Traffic to Control Plane", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] + "aliasColors": {}, + "seriesOverrides": [], + "thresholds": [], + "timeRegions": [] }, - "yaxes": [ - { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 19 + }, + "hiddenSeries": false, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(sidecar_cluster_upstream_cx_tx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Bytes sent", + "refId": "A" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_cx_rx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Bytes received", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Traffic to Control Plane", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 19 - }, - "hiddenSeries": false, - "id": 26, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(sidecar_cluster_upstream_cx_destroy_remote_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Connection destroyed by the client", - "refId": "A" - }, - { - "expr": "sum(irate(sidecar_cluster_upstream_cx_connect_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Connection timeout", - "refId": "B" + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "expr": "sum(irate(sidecar_cluster_upstream_cx_destroy_local_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Connection destroyed by local Sidecar", - "refId": "C" + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 19 }, - { - "expr": "sum(irate(sidecar_cluster_upstream_rq_pending_failure_eject{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Pending failure ejection", - "refId": "D" + "hiddenSeries": false, + "id": 26, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false }, - { - "expr": "sum(irate(sidecar_cluster_upstream_rq_pending_overflow{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Pending overflow", - "refId": "E" + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] }, - { - "expr": "sum(irate(sidecar_cluster_upstream_rq_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Request timeout", - "refId": "F" + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(sidecar_cluster_upstream_cx_destroy_remote_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Connection destroyed by the client", + "refId": "A" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_cx_connect_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Connection timeout", + "refId": "B" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_cx_destroy_local_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Connection destroyed by local Sidecar", + "refId": "C" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_rq_pending_failure_eject{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Pending failure ejection", + "refId": "D" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_rq_pending_overflow{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Pending overflow", + "refId": "E" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_rq_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Request timeout", + "refId": "F" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_rq_rx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Response reset", + "refId": "G" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_rq_tx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", + "legendFormat": "Request reset", + "refId": "H" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Connection/Requests errors to Control Plane", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - { - "expr": "sum(irate(sidecar_cluster_upstream_rq_rx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Response reset", - "refId": "G" + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] }, - { - "expr": "sum(irate(sidecar_cluster_upstream_rq_tx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"osm-controller\"}[1m]))", - "legendFormat": "Request reset", - "refId": "H" + "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 } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Connection/Requests errors to Control Plane", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ + } + ], + "refresh": false, + "schemaVersion": 25, + "style": "dark", + "tags": [], + "templating": { + "list": [ { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(sidecar_server_live{}, source_namespace)", + "hide": 0, + "includeAll": false, + "label": "Source Namespace", + "multi": false, + "name": "source_namespace", + "options": [], + "query": "label_values(sidecar_server_live{}, source_namespace)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false }, { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_service)", + "hide": 0, + "includeAll": false, + "label": "Source service", + "multi": false, + "name": "source_service", + "options": [], + "query": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_service)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 25, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(sidecar_server_live{}, source_namespace)", - "hide": 0, - "includeAll": false, - "label": "Source Namespace", - "multi": false, - "name": "source_namespace", - "options": [], - "query": "label_values(sidecar_server_live{}, source_namespace)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_service)", - "hide": 0, - "includeAll": false, - "label": "Source service", - "multi": false, - "name": "source_service", - "options": [], - "query": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_service)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "" -} + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "" + } diff --git a/packages/server/charts/osm/grafana/pipy/dashboards/osm-data-plane-performance.json b/packages/server/charts/osm/grafana/pipy/dashboards/osm-data-plane-performance.json index ae47a3f..0502beb 100644 --- a/packages/server/charts/osm/grafana/pipy/dashboards/osm-data-plane-performance.json +++ b/packages/server/charts/osm/grafana/pipy/dashboards/osm-data-plane-performance.json @@ -47,537 +47,537 @@ "version": "" } ], - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "title": "OSM Data Plane Performance Metrics", - "description": "Compatible with OSM v1.0.0. This dashboard lets you view the performance of OSM’s data plane.", - "uid": "OSMDataPlanePerformanceMetrics", - "version": 3, - "editable": true, - "gnetId": null, - "graphTooltip": 0, - "id": 8, - "iteration": 1632179652682, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 5, - "panels": [], - "title": "Sidecar", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 3, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ + "annotations": { + "list": [ { - "expr": "irate(container_cpu_usage_seconds_total{namespace=~\"$namespace\", pod=~\"$pod\", container=\"sidecar\"}[1m])", - "interval": "", - "legendFormat": "{{pod}}:{{container}}", - "refId": "A" + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Sidecar CPU usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } + ] }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} + "title": "OSM Data Plane Performance Metrics", + "description": "Compatible with OSM v1.0.0. This dashboard lets you view the performance of OSM’s data plane.", + "uid": "OSMDataPlanePerformanceMetrics", + "version": 3, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": 8, + "iteration": 1632179652682, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 1 - }, - "hiddenSeries": false, - "id": 8, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "container_memory_rss{namespace=~\"$namespace\", pod=~\"$pod\", container=\"sidecar\"}", - "interval": "", - "legendFormat": "{{pod}}:{{container}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Sidecar RSS usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] + "id": 5, + "panels": [], + "title": "Sidecar", + "type": "row" }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": true, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 7, - "panels": [], - "title": "Other containers", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 1 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 0, - "y": 11 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(container_cpu_usage_seconds_total{namespace=~\"$namespace\", pod=~\"$pod\", container=~\"$container\"}[1m])", - "interval": "", - "legendFormat": "{{pod}}:{{container}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Container CPU usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "hiddenSeries": false, + "id": 3, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false }, - { - "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": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 9, - "w": 12, - "x": 12, - "y": 11 - }, - "hiddenSeries": false, - "id": 9, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "container_memory_rss{namespace=~\"$namespace\", pod=~\"$pod\", container=~\"$container\"}", - "interval": "", - "legendFormat": "{{pod}}:{{container}}", - "refId": "A" + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(container_cpu_usage_seconds_total{namespace=~\"$namespace\", pod=~\"$pod\", container=\"sidecar\"}[1m])", + "interval": "", + "legendFormat": "{{pod}}:{{container}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Sidecar CPU usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "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 } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Container RSS usage", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 1 + }, + "hiddenSeries": false, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "container_memory_rss{namespace=~\"$namespace\", pod=~\"$pod\", container=\"sidecar\"}", + "interval": "", + "legendFormat": "{{pod}}:{{container}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Sidecar RSS usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "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 } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 25, - "style": "dark", - "tags": [], - "templating": { - "list": [ + }, { - "allValue": null, - "current": { - "selected": false, - "text": "redis-c9e6-client", - "value": "redis-c9e6-client" + "collapsed": true, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 10 }, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(source_namespace)", - "hide": 0, - "includeAll": true, - "label": "Namespace", - "multi": false, - "name": "namespace", - "options": [], - "query": "label_values(source_namespace)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false + "id": 7, + "panels": [], + "title": "Other containers", + "type": "row" }, { - "allValue": null, - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(sidecar_server_live{source_namespace=~\"$namespace\"}, source_pod_name)", - "hide": 0, - "includeAll": true, - "label": "Pod", - "multi": false, - "name": "pod", - "options": [], - "query": "label_values(sidecar_server_live{source_namespace=~\"$namespace\"}, source_pod_name)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 11 + }, + "hiddenSeries": false, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(container_cpu_usage_seconds_total{namespace=~\"$namespace\", pod=~\"$pod\", container=~\"$container\"}[1m])", + "interval": "", + "legendFormat": "{{pod}}:{{container}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Container CPU usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "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 + } }, { - "allValue": null, - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(sidecar_server_live{source_namespace=~\"$namespace\", source_pod_name=~\"$pod\"}, source_workload_name)", - "hide": 0, - "includeAll": true, - "label": "Container", - "multi": false, - "name": "container", - "options": [], - "query": "label_values(sidecar_server_live{source_namespace=~\"$namespace\", source_pod_name=~\"$pod\"}, source_workload_name)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 11 + }, + "hiddenSeries": false, + "id": 9, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "container_memory_rss{namespace=~\"$namespace\", pod=~\"$pod\", container=~\"$container\"}", + "interval": "", + "legendFormat": "{{pod}}:{{container}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Container RSS usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "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 + } } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "" -} + ], + "refresh": false, + "schemaVersion": 25, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": { + "selected": false, + "text": "redis-c9e6-client", + "value": "redis-c9e6-client" + }, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(source_namespace)", + "hide": 0, + "includeAll": true, + "label": "Namespace", + "multi": false, + "name": "namespace", + "options": [], + "query": "label_values(source_namespace)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(sidecar_server_live{source_namespace=~\"$namespace\"}, source_pod_name)", + "hide": 0, + "includeAll": true, + "label": "Pod", + "multi": false, + "name": "pod", + "options": [], + "query": "label_values(sidecar_server_live{source_namespace=~\"$namespace\"}, source_pod_name)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(sidecar_server_live{source_namespace=~\"$namespace\", source_pod_name=~\"$pod\"}, source_workload_name)", + "hide": 0, + "includeAll": true, + "label": "Container", + "multi": false, + "name": "container", + "options": [], + "query": "label_values(sidecar_server_live{source_namespace=~\"$namespace\", source_pod_name=~\"$pod\"}, source_workload_name)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "" + } \ No newline at end of file diff --git a/packages/server/charts/osm/grafana/pipy/dashboards/osm-mesh-sidecar-details.json b/packages/server/charts/osm/grafana/pipy/dashboards/osm-mesh-sidecar-details.json index 14b36f9..0dab281 100644 --- a/packages/server/charts/osm/grafana/pipy/dashboards/osm-mesh-sidecar-details.json +++ b/packages/server/charts/osm/grafana/pipy/dashboards/osm-mesh-sidecar-details.json @@ -122,7 +122,9 @@ "justifyMode": "center", "orientation": "auto", "reduceOptions": { - "calcs": ["last"], + "calcs": [ + "last" + ], "values": false } }, @@ -685,7 +687,9 @@ "options": { "reduceOptions": { "values": false, - "calcs": ["lastNotNull"], + "calcs": [ + "lastNotNull" + ], "fields": "" }, "orientation": "auto", @@ -744,7 +748,9 @@ "options": { "reduceOptions": { "values": false, - "calcs": ["lastNotNull"], + "calcs": [ + "lastNotNull" + ], "fields": "" }, "orientation": "auto", @@ -1421,7 +1427,9 @@ "current": { "selected": true, "text": "All", - "value": ["$__all"] + "value": [ + "$__all" + ] }, "datasource": "${DS_PROMETHEUS}", "definition": "label_values(osm_proxy_connect_count, source_pod_name)", @@ -1447,7 +1455,9 @@ "current": { "selected": true, "text": "All", - "value": ["$__all"] + "value": [ + "$__all" + ] }, "datasource": "${DS_PROMETHEUS}", "definition": "label_values(osm_cert_issued_count, source_pod_name)", @@ -1499,7 +1509,9 @@ "current": { "selected": true, "text": "All", - "value": ["$__all"] + "value": [ + "$__all" + ] }, "datasource": "${DS_PROMETHEUS}", "definition": "label_values(osm_error_err_code_count, err_code)", @@ -1540,4 +1552,4 @@ ] }, "timezone": "" -} +} \ No newline at end of file diff --git a/packages/server/charts/osm/grafana/pipy/dashboards/osm-pod-to-service.json b/packages/server/charts/osm/grafana/pipy/dashboards/osm-pod-to-service.json index a0930a8..bd60348 100644 --- a/packages/server/charts/osm/grafana/pipy/dashboards/osm-pod-to-service.json +++ b/packages/server/charts/osm/grafana/pipy/dashboards/osm-pod-to-service.json @@ -47,864 +47,864 @@ "version": "" } ], - "annotations": { - "list": [ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "title": "OSM Pod to Service Metrics", + "description": "Compatible with OSM v1.0.0. This dashboard lets you investigate the traffic metrics from a pod to all the services it connects/talks to.", + "uid": "OSMPodToServiceMetrics", + "version": 2, + "editable": true, + "gnetId": 11776, + "graphTooltip": 0, + "id": 5, + "iteration": 1591749611164, + "links": [], + "panels": [ { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "title": "OSM Pod to Service Metrics", - "description": "Compatible with OSM v1.0.0. This dashboard lets you investigate the traffic metrics from a pod to all the services it connects/talks to.", - "uid": "OSMPodToServiceMetrics", - "version": 2, - "editable": true, - "gnetId": 11776, - "graphTooltip": 0, - "id": 5, - "iteration": 1591749611164, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 22, + "panels": [], + "title": "Request Count - HTTP", + "type": "row" }, - "id": 22, - "panels": [], - "title": "Request Count - HTTP", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class=\"2\",source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "{{sidecar_cluster_name}}", + "refId": "A" } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Success Count to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 24, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class=\"2\",source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "{{sidecar_cluster_name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Success Count to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] }, - { - "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": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true } - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "hiddenSeries": false, - "id": 25, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class!=\"2\",source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "interval": "", - "legendFormat": "{{sidecar_cluster_name}}", - "refId": "A" + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Failure Count to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "dashLength": 10, - "datasource": "Prometheus", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 9 - }, - "id": 28, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "pointradius": 2, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "targets": [ - { - "expr": "irate(sidecar_cluster_upstream_rq_total{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "{{sidecar_cluster_name}}", - "interval": "", - "refId": "A", - "format": "time_series" - } - ], - "thresholds": [], - "timeRegions": [], - "title": "All types of requests count to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 }, - { - "format": "Misc", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "hiddenSeries": false, + "id": 25, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class!=\"2\",source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "interval": "", + "legendFormat": "{{sidecar_cluster_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Failure Count to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "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 } - ], - "yaxis": { - "align": false, - "alignLevel": null - }, - "bars": false, - "dashes": false, - "description": "", - "fillGradient": 0, - "hiddenSeries": false, - "percentage": false, - "points": false, - "stack": false, - "steppedLine": false, - "timeFrom": null, - "timeShift": null - }, - { - "collapsed": false, - "datasource": "${DS_PROMETHEUS}", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 26 }, - "id": 10, - "panels": [], - "title": "Traffic", - "type": "row" - }, - { - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "aliasColors": {}, + "dashLength": 10, + "datasource": "Prometheus", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 28, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "pointradius": 2, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "targets": [ + { + "expr": "irate(sidecar_cluster_upstream_rq_total{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "{{sidecar_cluster_name}}", + "interval": "", + "refId": "A", + "format": "time_series" + } + ], + "thresholds": [], + "timeRegions": [], + "title": "All types of requests count to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + { + "format": "Misc", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true } + ], + "yaxis": { + "align": false, + "alignLevel": null }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 27 + "bars": false, + "dashes": false, + "description": "", + "fillGradient": 0, + "hiddenSeries": false, + "percentage": false, + "points": false, + "stack": false, + "steppedLine": false, + "timeFrom": null, + "timeShift": null }, - "id": 4, - "interval": "", - "options": { - "dataLinks": [] + { + "collapsed": false, + "datasource": "${DS_PROMETHEUS}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 26 + }, + "id": 10, + "panels": [], + "title": "Traffic", + "type": "row" }, - "pluginVersion": "8.2.2", - "targets": [ - { - "expr": "sidecar_cluster_upstream_cx_active{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}", - "legendFormat": "{{sidecar_cluster_name}}", - "refId": "A" - } - ], - "title": "Active Connections to other services", - "type": "timeseries", - "timeFrom": null, - "timeShift": null, - "renderer": "flot", - "yaxes": [ - { - "label": null, + { + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 27 + }, + "id": 4, + "interval": "", + "options": { + "dataLinks": [] + }, + "pluginVersion": "8.2.2", + "targets": [ + { + "expr": "sidecar_cluster_upstream_cx_active{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}", + "legendFormat": "{{sidecar_cluster_name}}", + "refId": "A" + } + ], + "title": "Active Connections to other services", + "type": "timeseries", + "timeFrom": null, + "timeShift": null, + "renderer": "flot", + "yaxes": [ + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + }, + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + } + ], + "xaxis": { "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" + "mode": "time", + "name": null, + "values": [], + "buckets": null }, - { - "label": null, + "yaxis": { + "align": false, + "alignLevel": null + }, + "lines": true, + "fill": 1, + "fillGradient": 0, + "linewidth": 1, + "dashes": false, + "hiddenSeries": false, + "dashLength": 10, + "spaceLength": 10, + "points": false, + "pointradius": 2, + "bars": false, + "stack": false, + "percentage": false, + "legend": { "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" - } - ], - "xaxis": { - "show": true, - "mode": "time", - "name": null, - "values": [], - "buckets": null - }, - "yaxis": { - "align": false, - "alignLevel": null - }, - "lines": true, - "fill": 1, - "fillGradient": 0, - "linewidth": 1, - "dashes": false, - "hiddenSeries": false, - "dashLength": 10, - "spaceLength": 10, - "points": false, - "pointradius": 2, - "bars": false, - "stack": false, - "percentage": false, - "legend": { - "show": true, - "values": false, - "min": false, - "max": false, - "current": false, - "total": false, - "avg": false - }, - "nullPointMode": "null", - "steppedLine": false, - "tooltip": { - "value_type": "individual", - "shared": true, - "sort": 0 - }, - "aliasColors": {}, - "seriesOverrides": [], - "thresholds": [], - "timeRegions": [] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 27 - }, - "hiddenSeries": false, - "id": 26, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(sidecar_cluster_upstream_cx_destroy_remote_with_active_rq{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Connection destroyed by the client - {{sidecar_cluster_name}}", - "refId": "A" + "values": false, + "min": false, + "max": false, + "current": false, + "total": false, + "avg": false }, - { - "expr": "irate(sidecar_cluster_upstream_cx_connect_timeout{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Connection timeout - {{sidecar_cluster_name}}", - "refId": "B" + "nullPointMode": "null", + "steppedLine": false, + "tooltip": { + "value_type": "individual", + "shared": true, + "sort": 0 }, - { - "expr": "irate(sidecar_cluster_upstream_cx_destroy_local_with_active_rq{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Connection destroyed by local Sidecar - {{sidecar_cluster_name}}", - "refId": "C" + "aliasColors": {}, + "seriesOverrides": [], + "thresholds": [], + "timeRegions": [] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "expr": "irate(sidecar_cluster_upstream_rq_pending_failure_eject{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Pending failure ejection - {{sidecar_cluster_name}}", - "refId": "D" + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 27 }, - { - "expr": "irate(sidecar_cluster_upstream_rq_pending_overflow{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Pending overflow - {{sidecar_cluster_name}}", - "refId": "E" + "hiddenSeries": false, + "id": 26, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false }, - { - "expr": "irate(sidecar_cluster_upstream_rq_timeout{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Request timeout - {{sidecar_cluster_name}}", - "refId": "F" + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] }, - { - "expr": "irate(sidecar_cluster_upstream_rq_rx_reset{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Response reset - {{sidecar_cluster_name}}", - "refId": "G" + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(sidecar_cluster_upstream_cx_destroy_remote_with_active_rq{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Connection destroyed by the client - {{sidecar_cluster_name}}", + "refId": "A" + }, + { + "expr": "irate(sidecar_cluster_upstream_cx_connect_timeout{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Connection timeout - {{sidecar_cluster_name}}", + "refId": "B" + }, + { + "expr": "irate(sidecar_cluster_upstream_cx_destroy_local_with_active_rq{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Connection destroyed by local Sidecar - {{sidecar_cluster_name}}", + "refId": "C" + }, + { + "expr": "irate(sidecar_cluster_upstream_rq_pending_failure_eject{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Pending failure ejection - {{sidecar_cluster_name}}", + "refId": "D" + }, + { + "expr": "irate(sidecar_cluster_upstream_rq_pending_overflow{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Pending overflow - {{sidecar_cluster_name}}", + "refId": "E" + }, + { + "expr": "irate(sidecar_cluster_upstream_rq_timeout{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Request timeout - {{sidecar_cluster_name}}", + "refId": "F" + }, + { + "expr": "irate(sidecar_cluster_upstream_rq_rx_reset{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Response reset - {{sidecar_cluster_name}}", + "refId": "G" + }, + { + "expr": "irate(sidecar_cluster_upstream_rq_tx_reset{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Request reset - {{sidecar_cluster_name}}", + "refId": "H" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Connection/Requests errors", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - { - "expr": "irate(sidecar_cluster_upstream_rq_tx_reset{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Request reset - {{sidecar_cluster_name}}", - "refId": "H" + "type": "timeseries", + "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 } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Connection/Requests errors", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "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": "${DS_PROMETHEUS}", - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 35 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 35 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(sidecar_cluster_upstream_cx_rx_bytes_total{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "{{sidecar_cluster_name}}", - "refId": "B" + "hiddenSeries": false, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(sidecar_cluster_upstream_cx_rx_bytes_total{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "{{sidecar_cluster_name}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Bytes sent to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Bytes sent to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "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": "${DS_PROMETHEUS}", - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 35 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 35 - }, - "hiddenSeries": false, - "id": 27, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(sidecar_cluster_upstream_cx_tx_bytes_total{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "interval": "", - "legendFormat": "{{sidecar_cluster_name}}", - "refId": "A" + "hiddenSeries": false, + "id": 27, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(sidecar_cluster_upstream_cx_tx_bytes_total{source_pod_name=\"$source_pod\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "interval": "", + "legendFormat": "{{sidecar_cluster_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Bytes received to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Bytes received to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ + } + ], + "refresh": false, + "schemaVersion": 25, + "style": "dark", + "tags": [], + "templating": { + "list": [ { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(sidecar_server_live{}, source_namespace)", + "hide": 0, + "includeAll": false, + "label": "Source Namespace", + "multi": false, + "name": "source_namespace", + "options": [], + "query": "label_values(sidecar_server_live{}, source_namespace)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false }, { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_pod_name)", + "hide": 0, + "includeAll": false, + "label": "Source Pod", + "multi": false, + "name": "source_pod", + "options": [], + "query": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_pod_name)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 25, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(sidecar_server_live{}, source_namespace)", - "hide": 0, - "includeAll": false, - "label": "Source Namespace", - "multi": false, - "name": "source_namespace", - "options": [], - "query": "label_values(sidecar_server_live{}, source_namespace)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_pod_name)", - "hide": 0, - "includeAll": false, - "label": "Source Pod", - "multi": false, - "name": "source_pod", - "options": [], - "query": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_pod_name)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "" -} + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "" + } diff --git a/packages/server/charts/osm/grafana/pipy/dashboards/osm-service-to-service.json b/packages/server/charts/osm/grafana/pipy/dashboards/osm-service-to-service.json index 21f6ffe..ad61b03 100644 --- a/packages/server/charts/osm/grafana/pipy/dashboards/osm-service-to-service.json +++ b/packages/server/charts/osm/grafana/pipy/dashboards/osm-service-to-service.json @@ -47,700 +47,700 @@ "version": "" } ], - "annotations": { - "list": [ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "title": "OSM Service to Service Metrics", + "description": "Compatible with OSM v1.0.0. This dashboard lets you view the traffic metrics from a given source service to a given destination service.", + "uid": "OSMServiceToServiceMetrics", + "version": 2, + "editable": true, + "gnetId": 11776, + "graphTooltip": 0, + "id": 6, + "iteration": 1591749761183, + "links": [], + "panels": [ { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "title": "OSM Service to Service Metrics", - "description": "Compatible with OSM v1.0.0. This dashboard lets you view the traffic metrics from a given source service to a given destination service.", - "uid": "OSMServiceToServiceMetrics", - "version": 2, - "editable": true, - "gnetId": 11776, - "graphTooltip": 0, - "id": 6, - "iteration": 1591749761183, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 22, + "panels": [], + "title": "Request Count - HTTP", + "type": "row" }, - "id": 22, - "panels": [], - "title": "Request Count - HTTP", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m])", + "legendFormat": "Time (per minute)", + "refId": "A" } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Success Count", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 24, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m])", - "legendFormat": "Time (per minute)", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Success Count", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "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 } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 + }, + "hiddenSeries": false, + "id": 25, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class!=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m])", + "interval": "", + "legendFormat": "Time (per minute)", + "refId": "A" } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Failure Count", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "hiddenSeries": false, - "id": 25, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class!=\"2\",source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m])", - "interval": "", - "legendFormat": "Time (per minute)", - "refId": "A" + "type": "timeseries", + "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 } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Failure Count", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "collapsed": false, + "datasource": "${DS_PROMETHEUS}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 18 }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "${DS_PROMETHEUS}", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 18 + "id": 10, + "panels": [], + "title": "Traffic", + "type": "row" }, - "id": 10, - "panels": [], - "title": "Traffic", - "type": "row" - }, - { - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - } + "overrides": [] }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 8, - "x": 0, - "y": 19 - }, - "id": 4, - "interval": "", - "options": { - "dataLinks": [] - }, - "pluginVersion": "8.2.2", - "targets": [ - { - "expr": "sum(sidecar_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"})", - "legendFormat": "Connections", - "refId": "A" - } - ], - "title": "Active Connections between services", - "type": "timeseries", - "timeFrom": null, - "timeShift": null, - "renderer": "flot", - "yaxes": [ - { - "label": null, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 19 + }, + "id": 4, + "interval": "", + "options": { + "dataLinks": [] + }, + "pluginVersion": "8.2.2", + "targets": [ + { + "expr": "sum(sidecar_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"})", + "legendFormat": "Connections", + "refId": "A" + } + ], + "title": "Active Connections between services", + "type": "timeseries", + "timeFrom": null, + "timeShift": null, + "renderer": "flot", + "yaxes": [ + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + }, + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + } + ], + "xaxis": { "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" + "mode": "time", + "name": null, + "values": [], + "buckets": null }, - { - "label": null, + "yaxis": { + "align": false, + "alignLevel": null + }, + "lines": true, + "fill": 1, + "fillGradient": 0, + "linewidth": 1, + "dashes": false, + "hiddenSeries": false, + "dashLength": 10, + "spaceLength": 10, + "points": false, + "pointradius": 2, + "bars": false, + "stack": false, + "percentage": false, + "legend": { "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" - } - ], - "xaxis": { - "show": true, - "mode": "time", - "name": null, - "values": [], - "buckets": null - }, - "yaxis": { - "align": false, - "alignLevel": null - }, - "lines": true, - "fill": 1, - "fillGradient": 0, - "linewidth": 1, - "dashes": false, - "hiddenSeries": false, - "dashLength": 10, - "spaceLength": 10, - "points": false, - "pointradius": 2, - "bars": false, - "stack": false, - "percentage": false, - "legend": { - "show": true, - "values": false, - "min": false, - "max": false, - "current": false, - "total": false, - "avg": false - }, - "nullPointMode": "null", - "steppedLine": false, - "tooltip": { - "value_type": "individual", - "shared": true, - "sort": 0 - }, - "aliasColors": {}, - "seriesOverrides": [], - "thresholds": [], - "timeRegions": [] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} + "values": false, + "min": false, + "max": false, + "current": false, + "total": false, + "avg": false }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 19 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(sidecar_cluster_upstream_cx_tx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Bytes sent", - "refId": "A" + "nullPointMode": "null", + "steppedLine": false, + "tooltip": { + "value_type": "individual", + "shared": true, + "sort": 0 }, - { - "expr": "sum(irate(sidecar_cluster_upstream_cx_rx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Bytes received", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Traffic from source service perspective", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] + "aliasColors": {}, + "seriesOverrides": [], + "thresholds": [], + "timeRegions": [] }, - "yaxes": [ - { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 19 + }, + "hiddenSeries": false, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(sidecar_cluster_upstream_cx_tx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Bytes sent", + "refId": "A" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_cx_rx_bytes_total{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Bytes received", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Traffic from source service perspective", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 19 - }, - "hiddenSeries": false, - "id": 26, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "sum(irate(sidecar_cluster_upstream_cx_destroy_remote_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Connection destroyed by the client", - "refId": "A" + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "expr": "sum(irate(sidecar_cluster_upstream_cx_connect_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Connection timeout", - "refId": "B" + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 19 }, - { - "expr": "sum(irate(sidecar_cluster_upstream_cx_destroy_local_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Connection destroyed by local Sidecar", - "refId": "C" + "hiddenSeries": false, + "id": 26, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false }, - { - "expr": "sum(irate(sidecar_cluster_upstream_rq_pending_failure_eject{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Pending failure ejection", - "refId": "D" + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] }, - { - "expr": "sum(irate(sidecar_cluster_upstream_rq_pending_overflow{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Pending overflow", - "refId": "E" + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(irate(sidecar_cluster_upstream_cx_destroy_remote_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Connection destroyed by the client", + "refId": "A" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_cx_connect_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Connection timeout", + "refId": "B" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_cx_destroy_local_with_active_rq{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Connection destroyed by local Sidecar", + "refId": "C" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_rq_pending_failure_eject{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Pending failure ejection", + "refId": "D" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_rq_pending_overflow{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Pending overflow", + "refId": "E" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_rq_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Request timeout", + "refId": "F" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_rq_rx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Response reset", + "refId": "G" + }, + { + "expr": "sum(irate(sidecar_cluster_upstream_rq_tx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", + "legendFormat": "Request reset", + "refId": "H" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Connection/Requests errors from source service perspective", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - { - "expr": "sum(irate(sidecar_cluster_upstream_rq_timeout{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Request timeout", - "refId": "F" + "type": "timeseries", + "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 + } + } + ], + "refresh": false, + "schemaVersion": 25, + "style": "dark", + "tags": [], + "templating": { + "list": [ { - "expr": "sum(irate(sidecar_cluster_upstream_rq_rx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Response reset", - "refId": "G" + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(sidecar_server_live{}, source_namespace)", + "hide": 0, + "includeAll": false, + "label": "Source Namespace", + "multi": false, + "name": "source_namespace", + "options": [], + "query": "label_values(sidecar_server_live{}, source_namespace)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false }, { - "expr": "sum(irate(sidecar_cluster_upstream_rq_tx_reset{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name=\"$destination_service\"}[1m]))", - "legendFormat": "Request reset", - "refId": "H" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Connection/Requests errors from source service perspective", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_service)", + "hide": 0, + "includeAll": false, + "label": "Source service", + "multi": false, + "name": "source_service", + "options": [], + "query": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_service)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false }, { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(sidecar_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|.*-local|envoy-tracing-cluster|passthrough-outbound\"}, sidecar_cluster_name)", + "hide": 0, + "includeAll": false, + "label": "Destination Service", + "multi": false, + "name": "destination_service", + "options": [], + "query": "label_values(sidecar_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|.*-local|envoy-tracing-cluster|passthrough-outbound\"}, sidecar_cluster_name)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 25, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(sidecar_server_live{}, source_namespace)", - "hide": 0, - "includeAll": false, - "label": "Source Namespace", - "multi": false, - "name": "source_namespace", - "options": [], - "query": "label_values(sidecar_server_live{}, source_namespace)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_service)", - "hide": 0, - "includeAll": false, - "label": "Source service", - "multi": false, - "name": "source_service", - "options": [], - "query": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_service)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(sidecar_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|.*-local|envoy-tracing-cluster|passthrough-outbound\"}, sidecar_cluster_name)", - "hide": 0, - "includeAll": false, - "label": "Destination Service", - "multi": false, - "name": "destination_service", - "options": [], - "query": "label_values(sidecar_cluster_upstream_cx_active{source_service=\"$source_service\",source_namespace=\"$source_namespace\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|.*-local|envoy-tracing-cluster|passthrough-outbound\"}, sidecar_cluster_name)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "" -} + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "" + } diff --git a/packages/server/charts/osm/grafana/pipy/dashboards/osm-workload-to-service.json b/packages/server/charts/osm/grafana/pipy/dashboards/osm-workload-to-service.json index 17f356b..990348b 100644 --- a/packages/server/charts/osm/grafana/pipy/dashboards/osm-workload-to-service.json +++ b/packages/server/charts/osm/grafana/pipy/dashboards/osm-workload-to-service.json @@ -47,790 +47,790 @@ "version": "" } ], - "annotations": { - "list": [ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "title": "OSM Workload to Service Metrics", + "description": "Compatible with OSM v1.0.0. This dashboard provides the traffic metrics from a workload (deployment, replicaSet) to all the services it connects/talks to.", + "uid": "OSMWorkloadToServiceMetrics", + "version": 2, + "editable": true, + "gnetId": 11776, + "graphTooltip": 0, + "id": 5, + "iteration": 1591749611164, + "links": [], + "panels": [ { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "title": "OSM Workload to Service Metrics", - "description": "Compatible with OSM v1.0.0. This dashboard provides the traffic metrics from a workload (deployment, replicaSet) to all the services it connects/talks to.", - "uid": "OSMWorkloadToServiceMetrics", - "version": 2, - "editable": true, - "gnetId": 11776, - "graphTooltip": 0, - "id": 5, - "iteration": 1591749611164, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 22, + "panels": [], + "title": "Request Count - HTTP", + "type": "row" }, - "id": 22, - "panels": [], - "title": "Request Count - HTTP", - "type": "row" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class=\"2\",source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "{{sidecar_cluster_name}}", + "refId": "A" } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Success Count to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 1 - }, - "hiddenSeries": false, - "id": 24, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class=\"2\",source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "{{sidecar_cluster_name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Success Count to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "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 } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 1 + }, + "hiddenSeries": false, + "id": 25, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class!=\"2\",source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "interval": "", + "legendFormat": "{{sidecar_cluster_name}}", + "refId": "A" } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Failure Count to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 1 - }, - "hiddenSeries": false, - "id": 25, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(sidecar_cluster_upstream_rq_xx{sidecar_response_code_class!=\"2\",source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "interval": "", - "legendFormat": "{{sidecar_cluster_name}}", - "refId": "A" + "type": "timeseries", + "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 } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Failure Count to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "collapsed": false, + "datasource": "${DS_PROMETHEUS}", + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 18 }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "collapsed": false, - "datasource": "${DS_PROMETHEUS}", - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 18 + "id": 10, + "panels": [], + "title": "Traffic", + "type": "row" }, - "id": 10, - "panels": [], - "title": "Traffic", - "type": "row" - }, - { - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": { - "align": null + { + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": { + "align": null + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 19 + }, + "id": 4, + "interval": "", + "options": { + "dataLinks": [] + }, + "pluginVersion": "8.2.2", + "targets": [ + { + "expr": "sidecar_cluster_upstream_cx_active{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}", + "legendFormat": "{{sidecar_cluster_name}}", + "refId": "A" } + ], + "title": "Active Connections to other services", + "type": "timeseries", + "timeFrom": null, + "timeShift": null, + "renderer": "flot", + "yaxes": [ + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + }, + { + "label": null, + "show": true, + "logBase": 1, + "min": null, + "max": null, + "format": "short" + } + ], + "xaxis": { + "show": true, + "mode": "time", + "name": null, + "values": [], + "buckets": null }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 19 - }, - "id": 4, - "interval": "", - "options": { - "dataLinks": [] + "yaxis": { + "align": false, + "alignLevel": null + }, + "lines": true, + "fill": 1, + "fillGradient": 0, + "linewidth": 1, + "dashes": false, + "hiddenSeries": false, + "dashLength": 10, + "spaceLength": 10, + "points": false, + "pointradius": 2, + "bars": false, + "stack": false, + "percentage": false, + "legend": { + "show": true, + "values": false, + "min": false, + "max": false, + "current": false, + "total": false, + "avg": false + }, + "nullPointMode": "null", + "steppedLine": false, + "tooltip": { + "value_type": "individual", + "shared": true, + "sort": 0 + }, + "aliasColors": {}, + "seriesOverrides": [], + "thresholds": [], + "timeRegions": [] }, - "pluginVersion": "8.2.2", - "targets": [ - { - "expr": "sidecar_cluster_upstream_cx_active{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}", - "legendFormat": "{{sidecar_cluster_name}}", - "refId": "A" - } - ], - "title": "Active Connections to other services", - "type": "timeseries", - "timeFrom": null, - "timeShift": null, - "renderer": "flot", - "yaxes": [ - { - "label": null, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 19 + }, + "hiddenSeries": false, + "id": 26, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": false, "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" + "total": false, + "values": false }, - { - "label": null, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(sidecar_cluster_upstream_cx_destroy_remote_with_active_rq{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Connection destroyed by the client - {{sidecar_cluster_name}}", + "refId": "A" + }, + { + "expr": "irate(sidecar_cluster_upstream_cx_connect_timeout{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Connection timeout - {{sidecar_cluster_name}}", + "refId": "B" + }, + { + "expr": "irate(sidecar_cluster_upstream_cx_destroy_local_with_active_rq{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Connection destroyed by local Sidecar - {{sidecar_cluster_name}}", + "refId": "C" + }, + { + "expr": "irate(sidecar_cluster_upstream_rq_pending_failure_eject{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Pending failure ejection - {{sidecar_cluster_name}}", + "refId": "D" + }, + { + "expr": "irate(sidecar_cluster_upstream_rq_pending_overflow{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Pending overflow - {{sidecar_cluster_name}}", + "refId": "E" + }, + { + "expr": "irate(sidecar_cluster_upstream_rq_timeout{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Request timeout - {{sidecar_cluster_name}}", + "refId": "F" + }, + { + "expr": "irate(sidecar_cluster_upstream_rq_rx_reset{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Response reset - {{sidecar_cluster_name}}", + "refId": "G" + }, + { + "expr": "irate(sidecar_cluster_upstream_rq_tx_reset{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "Request reset - {{sidecar_cluster_name}}", + "refId": "H" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Connection/Requests errors", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, "show": true, - "logBase": 1, - "min": null, - "max": null, - "format": "short" + "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 } - ], - "xaxis": { - "show": true, - "mode": "time", - "name": null, - "values": [], - "buckets": null - }, - "yaxis": { - "align": false, - "alignLevel": null - }, - "lines": true, - "fill": 1, - "fillGradient": 0, - "linewidth": 1, - "dashes": false, - "hiddenSeries": false, - "dashLength": 10, - "spaceLength": 10, - "points": false, - "pointradius": 2, - "bars": false, - "stack": false, - "percentage": false, - "legend": { - "show": true, - "values": false, - "min": false, - "max": false, - "current": false, - "total": false, - "avg": false - }, - "nullPointMode": "null", - "steppedLine": false, - "tooltip": { - "value_type": "individual", - "shared": true, - "sort": 0 - }, - "aliasColors": {}, - "seriesOverrides": [], - "thresholds": [], - "timeRegions": [] - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 19 - }, - "hiddenSeries": false, - "id": 26, - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "hideEmpty": false, - "hideZero": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(sidecar_cluster_upstream_cx_destroy_remote_with_active_rq{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Connection destroyed by the client - {{sidecar_cluster_name}}", - "refId": "A" - }, - { - "expr": "irate(sidecar_cluster_upstream_cx_connect_timeout{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Connection timeout - {{sidecar_cluster_name}}", - "refId": "B" + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "expr": "irate(sidecar_cluster_upstream_cx_destroy_local_with_active_rq{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Connection destroyed by local Sidecar - {{sidecar_cluster_name}}", - "refId": "C" + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 27 }, - { - "expr": "irate(sidecar_cluster_upstream_rq_pending_failure_eject{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Pending failure ejection - {{sidecar_cluster_name}}", - "refId": "D" + "hiddenSeries": false, + "id": 2, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false }, - { - "expr": "irate(sidecar_cluster_upstream_rq_pending_overflow{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Pending overflow - {{sidecar_cluster_name}}", - "refId": "E" + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] }, - { - "expr": "irate(sidecar_cluster_upstream_rq_timeout{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Request timeout - {{sidecar_cluster_name}}", - "refId": "F" + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(sidecar_cluster_upstream_cx_rx_bytes_total{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "legendFormat": "{{sidecar_cluster_name}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Bytes sent to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" }, - { - "expr": "irate(sidecar_cluster_upstream_rq_rx_reset{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Response reset - {{sidecar_cluster_name}}", - "refId": "G" + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] }, - { - "expr": "irate(sidecar_cluster_upstream_rq_tx_reset{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "Request reset - {{sidecar_cluster_name}}", - "refId": "H" + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Connection/Requests errors", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "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": "${DS_PROMETHEUS}", - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 27 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 27 - }, - "hiddenSeries": false, - "id": 2, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "irate(sidecar_cluster_upstream_cx_rx_bytes_total{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "legendFormat": "{{sidecar_cluster_name}}", - "refId": "B" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Bytes sent to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "hiddenSeries": false, + "id": 27, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(sidecar_cluster_upstream_cx_tx_bytes_total{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", + "interval": "", + "legendFormat": "{{sidecar_cluster_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Bytes received to other services", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "timeseries", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "yaxis": { - "align": false, - "alignLevel": null } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 12, - "y": 27 - }, - "hiddenSeries": false, - "id": 27, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ + ], + "refresh": false, + "schemaVersion": 25, + "style": "dark", + "tags": [], + "templating": { + "list": [ { - "expr": "irate(sidecar_cluster_upstream_cx_tx_bytes_total{source_namespace=\"$source_namespace\",source_workload_kind=\"$source_workload_kind\",source_workload_name=\"$source_workload_name\",sidecar_cluster_name!~\"osm-controller|envoy-metrics-cluster|envoy-tracing-cluster|passthrough-outbound\"}[1m])", - "interval": "", - "legendFormat": "{{sidecar_cluster_name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Bytes received to other services", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "timeseries", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(sidecar_server_live{}, source_namespace)", + "hide": 0, + "includeAll": false, + "label": "Source Namespace", + "multi": false, + "name": "source_namespace", + "options": [], + "query": "label_values(sidecar_server_live{}, source_namespace)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, { - "format": "decbytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_workload_kind)", + "hide": 0, + "includeAll": false, + "label": "Source Workload Kind", + "multi": false, + "name": "source_workload_kind", + "options": [], + "query": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_workload_kind)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false }, { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "${DS_PROMETHEUS}", + "definition": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\",source_namespace=\"$source_namespace\"}, source_workload_name)", + "hide": 0, + "includeAll": false, + "label": "Source Workload Name", + "multi": false, + "name": "source_workload_name", + "options": [], + "query": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\", source_workload_kind=\"$source_workload_kind\"}, source_workload_name)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 25, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(sidecar_server_live{}, source_namespace)", - "hide": 0, - "includeAll": false, - "label": "Source Namespace", - "multi": false, - "name": "source_namespace", - "options": [], - "query": "label_values(sidecar_server_live{}, source_namespace)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_workload_kind)", - "hide": 0, - "includeAll": false, - "label": "Source Workload Kind", - "multi": false, - "name": "source_workload_kind", - "options": [], - "query": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\"}, source_workload_kind)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "${DS_PROMETHEUS}", - "definition": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\",source_namespace=\"$source_namespace\"}, source_workload_name)", - "hide": 0, - "includeAll": false, - "label": "Source Workload Name", - "multi": false, - "name": "source_workload_name", - "options": [], - "query": "label_values(sidecar_server_live{source_namespace=\"$source_namespace\", source_workload_kind=\"$source_workload_kind\"}, source_workload_name)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "" -} + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "" + } diff --git a/packages/server/charts/osm/grafana/pipy/dashboards/osm-workload-to-workload.json b/packages/server/charts/osm/grafana/pipy/dashboards/osm-workload-to-workload.json index fae39d7..7c3e371 100644 --- a/packages/server/charts/osm/grafana/pipy/dashboards/osm-workload-to-workload.json +++ b/packages/server/charts/osm/grafana/pipy/dashboards/osm-workload-to-workload.json @@ -47,452 +47,452 @@ "version": "" } ], - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "title": "OSM Workload to Workload Metrics", - "description": "Compatible with OSM v1.0.0. This dashboard displays the latencies of requests in the mesh from workload to workload.", - "uid": "OSMWorkloadToWorkloadMetrics", - "version": 2, - "editable": true, - "gnetId": 11776, - "graphTooltip": 0, - "id": 5, - "iteration": 1591749611164, - "links": [], - "panels": [ - { - "collapsed": false, - "datasource": null, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 20, - "panels": [], - "title": "Request Latency", - "type": "row" + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} + "title": "OSM Workload to Workload Metrics", + "description": "Compatible with OSM v1.0.0. This dashboard displays the latencies of requests in the mesh from workload to workload.", + "uid": "OSMWorkloadToWorkloadMetrics", + "version": 2, + "editable": true, + "gnetId": 11776, + "graphTooltip": 0, + "id": 5, + "iteration": 1591749611164, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": null, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 8, - "x": 0, - "y": 1 + "id": 20, + "panels": [], + "title": "Request Latency", + "type": "row" }, - "hiddenSeries": false, - "id": 6, - "legend": { - "avg": false, - "current": false, - "hideEmpty": true, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "exemplar": true, - "expr": "histogram_quantile(0.99,sum(irate(osm_request_duration_ms_bucket{source_namespace=\"$source_namespace\",source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\",source_pod=\"$source_pod\"}[1m])) by (le, destination_namespace, destination_name))", - "interval": "", - "legendFormat": "{{destination_namespace}}/{{destination_name}}", - "refId": "A" + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 6, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(0.99,sum(irate(osm_request_duration_ms_bucket{source_namespace=\"$source_namespace\",source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\",source_pod=\"$source_pod\"}[1m])) by (le, destination_namespace, destination_name))", + "interval": "", + "legendFormat": "{{destination_namespace}}/{{destination_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Request Latency (P99)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": "", + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Request Latency (P99)", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] }, - "yaxes": [ - { - "format": "ms", - "label": "", - "logBase": 1, - "max": null, - "min": "0", - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "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": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 1 }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 8, - "x": 8, - "y": 1 - }, - "hiddenSeries": false, - "id": 16, - "legend": { - "avg": false, - "current": false, - "hideEmpty": true, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "exemplar": true, - "expr": "histogram_quantile(0.90,sum(irate(osm_request_duration_ms_bucket{source_namespace=\"$source_namespace\",source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\",source_pod=\"$source_pod\"}[1m])) by (le, destination_namespace, destination_name))", - "interval": "", - "legendFormat": "{{destination_namespace}}/{{destination_name}}", - "refId": "A" + "hiddenSeries": false, + "id": 16, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(0.90,sum(irate(osm_request_duration_ms_bucket{source_namespace=\"$source_namespace\",source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\",source_pod=\"$source_pod\"}[1m])) by (le, destination_namespace, destination_name))", + "interval": "", + "legendFormat": "{{destination_namespace}}/{{destination_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Request Latency (P90)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": 0, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Request Latency (P90)", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "ms", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_PROMETHEUS}", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": 0, - "show": true + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 1 + }, + "hiddenSeries": false, + "id": 18, + "legend": { + "avg": false, + "current": false, + "hideEmpty": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "dataLinks": [] + }, + "percentage": false, + "pluginVersion": "8.2.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "histogram_quantile(0.50,sum(irate(osm_request_duration_ms_bucket{source_namespace=\"$source_namespace\",source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\",source_pod=\"$source_pod\"}[1m])) by (le, destination_namespace, destination_name))", + "interval": "", + "legendFormat": "{{destination_namespace}}/{{destination_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Request Latency (P50)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "ms", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null } - ], - "yaxis": { - "align": false, - "alignLevel": null } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_PROMETHEUS}", - "fieldConfig": { - "defaults": { - "custom": {} + ], + "refresh": false, + "schemaVersion": 25, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": {}, + "datasource": "Prometheus", + "definition": "label_values(osm_request_duration_ms_sum{}, source_namespace)", + "hide": 0, + "includeAll": false, + "label": "Source Namespace", + "multi": false, + "name": "source_namespace", + "options": [], + "query": "label_values(osm_request_duration_ms_sum{}, source_namespace)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 8, - "x": 16, - "y": 1 - }, - "hiddenSeries": false, - "id": 18, - "legend": { - "avg": false, - "current": false, - "hideEmpty": true, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "options": { - "dataLinks": [] - }, - "percentage": false, - "pluginVersion": "8.2.2", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ { - "exemplar": true, - "expr": "histogram_quantile(0.50,sum(irate(osm_request_duration_ms_bucket{source_namespace=\"$source_namespace\",source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\",source_pod=\"$source_pod\"}[1m])) by (le, destination_namespace, destination_name))", - "interval": "", - "legendFormat": "{{destination_namespace}}/{{destination_name}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Request Latency (P50)", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ + "allValue": null, + "current": { + "selected": false, + "text": "Deployment", + "value": "Deployment" + }, + "datasource": "Prometheus", + "definition": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\"},source_kind)", + "hide": 0, + "includeAll": false, + "label": "Source Workload Kind", + "multi": false, + "name": "source_workload_kind", + "options": [], + "query": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\"},source_kind)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + }, { - "format": "ms", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true + "allValue": null, + "current": {}, + "datasource": "Prometheus", + "definition": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\"}, source_name)", + "hide": 0, + "includeAll": false, + "label": "Source Workload Name", + "multi": false, + "name": "source_workload_name", + "options": [], + "query": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\"}, source_name)", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false }, { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true + "allValue": null, + "current": {}, + "datasource": "Prometheus", + "definition": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\"}, source_pod) ", + "description": null, + "error": null, + "hide": 0, + "includeAll": true, + "label": "Source Pod", + "multi": false, + "name": "source_pod", + "options": [], + "query": { + "query": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\"}, source_pod) ", + "refId": "StandardVariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - } - ], - "refresh": false, - "schemaVersion": 25, - "style": "dark", - "tags": [], - "templating": { - "list": [ - { - "allValue": null, - "current": {}, - "datasource": "Prometheus", - "definition": "label_values(osm_request_duration_ms_sum{}, source_namespace)", - "hide": 0, - "includeAll": false, - "label": "Source Namespace", - "multi": false, - "name": "source_namespace", - "options": [], - "query": "label_values(osm_request_duration_ms_sum{}, source_namespace)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": { - "selected": false, - "text": "Deployment", - "value": "Deployment" - }, - "datasource": "Prometheus", - "definition": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\"},source_kind)", - "hide": 0, - "includeAll": false, - "label": "Source Workload Kind", - "multi": false, - "name": "source_workload_kind", - "options": [], - "query": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\"},source_kind)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "Prometheus", - "definition": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\"}, source_name)", - "hide": 0, - "includeAll": false, - "label": "Source Workload Name", - "multi": false, - "name": "source_workload_name", - "options": [], - "query": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\"}, source_name)", - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "tagValuesQuery": "", - "tags": [], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": null, - "current": {}, - "datasource": "Prometheus", - "definition": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\"}, source_pod) ", - "description": null, - "error": null, - "hide": 0, - "includeAll": true, - "label": "Source Pod", - "multi": false, - "name": "source_pod", - "options": [], - "query": { - "query": "label_values(osm_request_duration_ms_sum{source_namespace=\"$source_namespace\", source_kind=\"$source_workload_kind\",source_name=\"$source_workload_name\"}, source_pod) ", - "refId": "StandardVariableQuery" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 0, - "type": "query" - } - ] - }, - "time": { - "from": "now-1h", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] - }, - "timezone": "" -} + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "" +} \ No newline at end of file diff --git a/packages/server/charts/osm/templates/osm-deployment.yaml b/packages/server/charts/osm/templates/osm-deployment.yaml index d1dafb3..78841cc 100644 --- a/packages/server/charts/osm/templates/osm-deployment.yaml +++ b/packages/server/charts/osm/templates/osm-deployment.yaml @@ -15,11 +15,13 @@ spec: selector: matchLabels: app: osm-controller + codebase: "{{ .Values.osm.repoServer.codebase }}" template: metadata: labels: {{- include "osm.labels" . | nindent 8 }} app: osm-controller + codebase: "{{ .Values.osm.repoServer.codebase }}" {{- if .Values.osm.osmController.podLabels }} {{- toYaml .Values.osm.osmController.podLabels | nindent 8 }} {{- end }} @@ -44,8 +46,9 @@ spec: {{- range .Values.osm.sidecarDrivers }} {{- if eq .sidecarName $.Values.osm.sidecarClass }} {{- if eq .sidecarName "pipy" }} + {{- if not $.Values.osm.repoServer.standalone }} - name: osm-pipy-repo - image: {{ $.Values.osm.pipyRepoImage }} + image: {{ $.Values.osm.repoServer.image }} imagePullPolicy: {{ $.Values.osm.image.pullPolicy }} ports: - name: "pipy-admin-port" @@ -57,6 +60,7 @@ spec: {{- end }} {{- end }} {{- end }} + {{- end }} - name: osm-controller image: "{{ include "osmController.image" . }}" imagePullPolicy: {{ .Values.osm.image.pullPolicy }} diff --git a/packages/server/charts/osm/templates/osm-injector-deployment.yaml b/packages/server/charts/osm/templates/osm-injector-deployment.yaml index 09e09e3..8dffdd5 100644 --- a/packages/server/charts/osm/templates/osm-injector-deployment.yaml +++ b/packages/server/charts/osm/templates/osm-injector-deployment.yaml @@ -96,6 +96,8 @@ spec: path: /healthz port: 9091 env: + - name: CONTROLLER_SVC_NAME + value: osm-controller # The INJECTOR_POD_NAME env variable sets pod name dynamically, used by osm-injector to register events - name: INJECTOR_POD_NAME valueFrom: diff --git a/packages/server/charts/osm/templates/osm-interceptor-hpa.yaml b/packages/server/charts/osm/templates/osm-interceptor-hpa.yaml new file mode 100644 index 0000000..7406143 --- /dev/null +++ b/packages/server/charts/osm/templates/osm-interceptor-hpa.yaml @@ -0,0 +1,130 @@ +{{- if eq .Values.osm.trafficInterceptionMode "ebpf" }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: osm-interceptor + namespace: {{ include "osm.namespace" . }} + labels: + {{- include "osm.labels" . | nindent 4 }} + app: osm-interceptor +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: osm-interceptor + labels: + {{- include "osm.labels" . | nindent 4 }} + app: osm-interceptor +rules: +- apiGroups: + - "" + resources: + - pods + verbs: + - list + - get + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: osm-interceptor + labels: + {{- include "osm.labels" . | nindent 4 }} + app: osm-interceptor +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: osm-interceptor +subjects: +- kind: ServiceAccount + name: osm-interceptor + namespace: osm-system +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: osm-interceptor + namespace: {{ include "osm.namespace" . }} + labels: + {{- include "osm.labels" . | nindent 4 }} + app: osm-interceptor +spec: + revisionHistoryLimit: 10 + selector: + matchLabels: + app: osm-interceptor + template: + metadata: + labels: + app: osm-interceptor + spec: + hostNetwork: true + containers: + - image: "cybwan/osm-edge-interceptor:latest" + imagePullPolicy: Always + name: osm-interceptor + args: + - /app/mbctl + - -m + - osm + - --use-reconnect=true + - --cni-mode=true + - --kind=true + - --debug=true + lifecycle: + preStop: + exec: + command: + - make + - -k + - clean + resources: + requests: + cpu: 100m + memory: 200Mi + limits: + cpu: 300m + memory: 200Mi + securityContext: + privileged: true + volumeMounts: + - mountPath: /sys/fs/cgroup + name: sys-fs-cgroup + - mountPath: /host/opt/cni/bin + name: cni-bin-dir + - mountPath: /host/etc/cni/net.d + name: cni-config-dir + - mountPath: /host/proc + name: host-proc + - mountPath: /host/var/run + name: host-var-run + mountPropagation: Bidirectional + dnsPolicy: ClusterFirst + nodeSelector: + kubernetes.io/os: linux + priorityClassName: system-node-critical + restartPolicy: Always + serviceAccount: osm-interceptor + serviceAccountName: osm-interceptor + tolerations: + - key: CriticalAddonsOnly + operator: Exists + - operator: Exists + volumes: + - hostPath: + path: /sys/fs/cgroup + name: sys-fs-cgroup + - hostPath: + path: /proc + name: host-proc + - hostPath: + path: /opt/cni/bin + name: cni-bin-dir + - hostPath: + path: /etc/cni/net.d + name: cni-config-dir + - hostPath: + path: /var/run + name: host-var-run +{{- end }} \ No newline at end of file diff --git a/packages/server/charts/osm/templates/osm-rbac.yaml b/packages/server/charts/osm/templates/osm-rbac.yaml index f242b5b..597403f 100644 --- a/packages/server/charts/osm/templates/osm-rbac.yaml +++ b/packages/server/charts/osm/templates/osm-rbac.yaml @@ -9,7 +9,7 @@ rules: resources: ["daemonsets", "deployments", "replicasets", "statefulsets"] verbs: ["list", "get", "watch"] - apiGroups: ["networking.k8s.io"] - resources: ["ingresses"] + resources: ["ingresses", "ingressclasses"] verbs: ["list", "get", "watch"] - apiGroups: ["batch"] resources: ["jobs"] @@ -64,6 +64,19 @@ rules: resources: ["ingressbackends/status", "accesscontrols/status", "accesscerts/status", "upstreamtrafficsettings/status"] verbs: ["update"] + # FSM's custom resource API + - apiGroups: ["flomesh.io"] + resources: ["serviceexports", "serviceimports", "globaltrafficpolicies"] + verbs: ["list", "get", "watch"] + + # OSM Edge's custom plugin API + - apiGroups: ["plugin.flomesh.io"] + resources: ["plugins", "pluginchains", "pluginconfigs"] + verbs: ["list", "get", "watch"] + - apiGroups: ["plugin.flomesh.io"] + resources: ["plugins/status", "pluginchains/status", "pluginconfigs/status"] + verbs: ["update"] + # Used for interacting with cert-manager CertificateRequest resources. - apiGroups: ["cert-manager.io"] resources: ["certificaterequests"] diff --git a/packages/server/charts/osm/templates/preset-mesh-config.yaml b/packages/server/charts/osm/templates/preset-mesh-config.yaml index 13eb670..aa19da8 100644 --- a/packages/server/charts/osm/templates/preset-mesh-config.yaml +++ b/packages/server/charts/osm/templates/preset-mesh-config.yaml @@ -6,6 +6,9 @@ metadata: data: preset-mesh-config.json: | { + "clusterSet": { + "properties": [] + }, "sidecar": { "enablePrivilegedInitContainer": {{.Values.osm.enablePrivilegedInitContainer | mustToJson}}, "logLevel": {{.Values.osm.sidecarLogLevel | mustToJson}}, @@ -14,9 +17,11 @@ data: "sidecarClass": {{.Values.osm.sidecarClass | mustToJson }}, "sidecarImage": {{.Values.osm.sidecarImage | mustToJson }}, "sidecarDrivers": {{.Values.osm.sidecarDrivers | mustToJson }}, - "localProxyMode": {{.Values.osm.localProxyMode | mustToJson}} + "localProxyMode": {{.Values.osm.localProxyMode | mustToJson}}, + "localDNSProxy": {{.Values.osm.localDNSProxy | mustToJson}} }, "traffic": { + "interceptionMode": {{.Values.osm.trafficInterceptionMode | mustToJson}}, "enableEgress": {{.Values.osm.enableEgress | mustToJson}}, "enablePermissiveTrafficPolicyMode": {{.Values.osm.enablePermissiveTrafficPolicy | mustToJson}}, "outboundPortExclusionList": {{.Values.osm.outboundPortExclusionList | mustToJson}}, @@ -32,8 +37,9 @@ data: "enable": {{.Values.osm.tracing.enable | mustToJson}}{{- if .Values.osm.tracing.enable }},{{- end }} {{- if .Values.osm.tracing.enable }} "port": {{.Values.osm.tracing.port | mustToJson}}, - "address": {{include "osm.tracingAddress" . | mustToJson}}, - "endpoint": {{.Values.osm.tracing.endpoint | mustToJson}} + "address": {{.Values.osm.tracing.address | mustToJson}}, + "endpoint": {{.Values.osm.tracing.endpoint | mustToJson}}, + "sampledFraction": {{.Values.osm.tracing.sampledFraction | mustToJson}} {{- end }} }, "remoteLogging": { @@ -42,7 +48,8 @@ data: "port": {{.Values.osm.remoteLogging.port | mustToJson}}, "address": {{.Values.osm.remoteLogging.address | mustToJson}}, "endpoint": {{.Values.osm.remoteLogging.endpoint | mustToJson}}, - "authorization": {{.Values.osm.remoteLogging.authorization | mustToJson}} + "authorization": {{.Values.osm.remoteLogging.authorization | mustToJson}}, + "sampledFraction": {{.Values.osm.remoteLogging.sampledFraction | mustToJson}} {{- end }} } }, @@ -60,6 +67,10 @@ data: {{- end }} "certKeyBitSize": {{.Values.osm.certificateProvider.certKeyBitSize | mustToJson}} }, + "repoServer": { + "ipaddr": {{.Values.osm.repoServer.ipaddr | mustToJson}}, + "codebase": {{.Values.osm.repoServer.codebase | mustToJson}} + }, "featureFlags": { "enableWASMStats": {{.Values.osm.featureFlags.enableWASMStats | mustToJson}}, "enableEgressPolicy": {{.Values.osm.featureFlags.enableEgressPolicy | mustToJson}}, @@ -69,6 +80,8 @@ data: "enableAccessControlPolicy": {{.Values.osm.featureFlags.enableAccessControlPolicy | mustToJson}}, "enableAccessCertPolicy": {{.Values.osm.featureFlags.enableAccessCertPolicy | mustToJson}}, "enableSidecarActiveHealthChecks": {{.Values.osm.featureFlags.enableSidecarActiveHealthChecks | mustToJson}}, - "enableRetryPolicy": {{.Values.osm.featureFlags.enableRetryPolicy | mustToJson}} - } + "enableRetryPolicy": {{.Values.osm.featureFlags.enableRetryPolicy | mustToJson}}, + "enablePluginPolicy": {{.Values.osm.featureFlags.enablePluginPolicy | mustToJson}} + }, + "pluginChains": {{.Values.osm.pluginChains | mustToJson }} } diff --git a/packages/server/charts/osm/values.schema.json b/packages/server/charts/osm/values.schema.json index 85b1231..d1c9c33 100644 --- a/packages/server/charts/osm/values.schema.json +++ b/packages/server/charts/osm/values.schema.json @@ -1,1422 +1,1908 @@ { - "$schema": "http://json-schema.org/draft-07/schema", - "type": "object", - "title": "The OSM Helm chart values schema", - "required": ["osm", "contour", "smi", "fsm"], - "definitions": { - "containerResources": { - "$id": "#/properties/definitions/properties/containerResources", - "type": "object", - "title": "The containerResources schema definition", - "description": "The container's resource configuration", - "required": ["limits", "requests"], - "properties": { - "limits": { - "$id": "#/properties/definitions/properties/containerResources/properties/limits", - "type": "object", - "title": "The containerResources' limits schema", - "description": "The container's resource limits", - "required": ["cpu", "memory"], - "properties": { - "cpu": { - "$id": "#/properties/definitions/properties/containerResources/properties/limits/properties/cpu", - "type": "string", - "title": "The containerResources' CPU limit schema", - "description": "The container's CPU limit" - }, - "memory": { - "$id": "#/properties/definitions/properties/containerResources/properties/limits/properties/memory", - "type": "string", - "title": "The containerResources' memory limit schema", - "description": "The container's memory limit" + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "title": "The OSM Helm chart values schema", + "required": [ + "osm", + "contour", + "smi", + "fsm" + ], + "definitions": { + "containerResources": { + "$id": "#/properties/definitions/properties/containerResources", + "type": "object", + "title": "The containerResources schema definition", + "description": "The container's resource configuration", + "required": [ + "limits", + "requests" + ], + "properties": { + "limits": { + "$id": "#/properties/definitions/properties/containerResources/properties/limits", + "type": "object", + "title": "The containerResources' limits schema", + "description": "The container's resource limits", + "required": [ + "cpu", + "memory" + ], + "properties": { + "cpu": { + "$id": "#/properties/definitions/properties/containerResources/properties/limits/properties/cpu", + "type": "string", + "title": "The containerResources' CPU limit schema", + "description": "The container's CPU limit" + }, + "memory": { + "$id": "#/properties/definitions/properties/containerResources/properties/limits/properties/memory", + "type": "string", + "title": "The containerResources' memory limit schema", + "description": "The container's memory limit" + } + }, + "additionalProperties": false + }, + "requests": { + "$id": "#/properties/definitions/properties/containerResources/properties/requests", + "type": "object", + "title": "The containerResources' requests schema", + "description": "The container's request limits", + "required": [ + "cpu", + "memory" + ], + "properties": { + "cpu": { + "$id": "#/properties/definitions/properties/containerResources/properties/requests/properties/cpu", + "type": "string", + "title": "The containerResources' CPU request schema", + "description": "The container's CPU request limit" + }, + "memory": { + "$id": "#/properties/definitions/properties/containerResources/properties/requests/properties/memory", + "type": "string", + "title": "The containerResources' memory request schema", + "description": "The container's memory request limit" + } + }, + "additionalProperties": false + } } - }, - "additionalProperties": false }, - "requests": { - "$id": "#/properties/definitions/properties/containerResources/properties/requests", - "type": "object", - "title": "The containerResources' requests schema", - "description": "The container's request limits", - "required": ["cpu", "memory"], - "properties": { - "cpu": { - "$id": "#/properties/definitions/properties/containerResources/properties/requests/properties/cpu", - "type": "string", - "title": "The containerResources' CPU request schema", - "description": "The container's CPU request limit" - }, - "memory": { - "$id": "#/properties/definitions/properties/containerResources/properties/requests/properties/memory", - "type": "string", - "title": "The containerResources' memory request schema", - "description": "The container's memory request limit" + "autoScale": { + "$id": "#/properties/definitions/properties/autoScale", + "type": "object", + "title": "The autoScale schema", + "description": "Autoscale configuration parameters", + "required": [ + "enable" + ], + "properties": { + "enable": { + "$id": "#/properties/definitions/properties/autoScale/properties/enable", + "type": "boolean", + "title": "Autoscale enable", + "description": "Indicates whether autoscale should be enabled or not.", + "examples": [ + false + ] + }, + "minReplicas": { + "$id": "#/properties/definitions/properties/autoScale/properties/minReplicas", + "type": "integer", + "title": "Autoscale minimum replicas", + "description": "Indicates the minimum replicas for autoscale.", + "minimum": 1, + "maximum": 10, + "examples": [ + 1 + ] + }, + "maxReplicas": { + "$id": "#/properties/definitions/properties/autoScale/properties/maxReplicas", + "type": "integer", + "title": "Autoscale maximum replicase", + "description": "Indicates the maximum replicas for autoscale.", + "minimum": 1, + "maximum": 10, + "examples": [ + 5 + ] + }, + "cpu": { + "$id": "#/properties/definitions/properties/autoScale/properties/cpu", + "type": "object", + "title": "Autoscale CPU resource schema", + "description": "Autoscale CPU configuration", + "required": [ + "targetAverageUtilization" + ], + "properties": { + "targetAverageUtilization": { + "$id": "#/properties/definitions/properties/autoScale/properties/cpu/properties/targetAverageUtilization", + "type": "integer", + "title": "Autoscale cpu targetAverageUtilization", + "description": "Indicates average target cpu utilization (percentage) for autoscale.", + "minimum": 0, + "maximum": 100, + "examples": [ + 80 + ] + } + }, + "additionalProperties": false + }, + "memory": { + "$id": "#/properties/definitions/properties/autoScale/properties/memory", + "type": "object", + "title": "Autoscale memory resource schema", + "description": "Autoscale memory configuration", + "required": [ + "targetAverageUtilization" + ], + "properties": { + "targetAverageUtilization": { + "$id": "#/properties/definitions/properties/autoScale/properties/memory/properties/targetAverageUtilization", + "type": "integer", + "title": "Autoscale memory targetAverageUtilization", + "description": "Indicates average target memory utilization (percentage) for autoscale.", + "minimum": 0, + "maximum": 100, + "examples": [ + 80 + ] + } + }, + "additionalProperties": false + } } - }, - "additionalProperties": false } - } }, - "autoScale": { - "$id": "#/properties/definitions/properties/autoScale", - "type": "object", - "title": "The autoScale schema", - "description": "Autoscale configuration parameters", - "required": ["enable"], - "properties": { - "enable": { - "$id": "#/properties/definitions/properties/autoScale/properties/enable", - "type": "boolean", - "title": "Autoscale enable", - "description": "Indicates whether autoscale should be enabled or not.", - "examples": [false] - }, - "minReplicas": { - "$id": "#/properties/definitions/properties/autoScale/properties/minReplicas", - "type": "integer", - "title": "Autoscale minimum replicas", - "description": "Indicates the minimum replicas for autoscale.", - "minimum": 1, - "maximum": 10, - "examples": [1] - }, - "maxReplicas": { - "$id": "#/properties/definitions/properties/autoScale/properties/maxReplicas", - "type": "integer", - "title": "Autoscale maximum replicase", - "description": "Indicates the maximum replicas for autoscale.", - "minimum": 1, - "maximum": 10, - "examples": [5] - }, - "cpu": { - "$id": "#/properties/definitions/properties/autoScale/properties/cpu", - "type": "object", - "title": "Autoscale CPU resource schema", - "description": "Autoscale CPU configuration", - "required": ["targetAverageUtilization"], - "properties": { - "targetAverageUtilization": { - "$id": "#/properties/definitions/properties/autoScale/properties/cpu/properties/targetAverageUtilization", - "type": "integer", - "title": "Autoscale cpu targetAverageUtilization", - "description": "Indicates average target cpu utilization (percentage) for autoscale.", - "minimum": 0, - "maximum": 100, - "examples": [80] - } - }, - "additionalProperties": false - }, - "memory": { - "$id": "#/properties/definitions/properties/autoScale/properties/memory", - "type": "object", - "title": "Autoscale memory resource schema", - "description": "Autoscale memory configuration", - "required": ["targetAverageUtilization"], - "properties": { - "targetAverageUtilization": { - "$id": "#/properties/definitions/properties/autoScale/properties/memory/properties/targetAverageUtilization", - "type": "integer", - "title": "Autoscale memory targetAverageUtilization", - "description": "Indicates average target memory utilization (percentage) for autoscale.", - "minimum": 0, - "maximum": 100, - "examples": [80] - } - }, - "additionalProperties": false - } - } - } - }, - "properties": { - "osm": { - "$id": "#/properties/osm", - "type": "object", - "title": "The OpenServiceMesh schema", - "description": "The top level required key in the values file.", - "required": [ - "image", - "sidecarClass", - "curlImage", - "caBundleSecretName", - "enableDebugServer", - "enablePermissiveTrafficPolicy", - "enableEgress", - "enableReconciler", - "deployPrometheus", - "deployGrafana", - "enableFluentbit", - "fluentBit", - "meshName", - "maxDataPlaneConnections", - "sidecarLogLevel", - "controllerLogLevel", - "enforceSingleMesh", - "deployJaeger", - "tracing", - "remoteLogging", - "webhookConfigNamePrefix", - "osmController", - "enablePrivilegedInitContainer", - "injector", - "osmBootstrap", - "featureFlags" - ], - "properties": { - "osmController": { - "$id": "#/properties/osm/properties/osmController", - "type": "object", - "title": "The osmController schema", - "description": "The details of the osmController.", - "required": ["resource"], - "properties": { - "replicaCount": { - "$id": "#/properties/osm/properties/osmController/properties/replicaCount", - "type": "integer", - "title": "The replicaCount schema", - "description": "The number of replicas of the osm-controller pod", - "examples": [1] - }, - "resource": { - "$ref": "#/definitions/containerResources" - }, - "podLabels": { - "$id": "#/properties/osm/properties/osmController/properties/podLabels", - "type": "object", - "title": "The podLabels schema", - "description": "Labels for the osmController pod.", - "default": {} - }, - "enablePodDisruptionBudget": { - "$id": "#/properties/osm/properties/osmController/properties/enablePodDisruptionBudget", - "type": "boolean", - "title": "The enablePodDisruptionBudget schema", - "description": "Indicates whether Pod Disruption Budget should be enabled or not.", - "examples": [false] - }, - "autoScale": { - "$ref": "#/definitions/autoScale" - }, - "affinity": { - "type": "object" - }, - "tolerations": { - "type": "array" - } - }, - "additionalProperties": false - }, - "image": { - "$id": "#/properties/osm/properties/image", - "type": "object", - "title": "The image schema", - "description": "The details of the images to run.", - "examples": [ - { - "registry": "openservicemesh", - "pullPolicy": "IfNotPresent", - "tag": "v0.4.2" - } - ], - "required": ["registry", "name", "pullPolicy", "tag", "digest"], - "properties": { - "registry": { - "$id": "#/properties/osm/properties/image/properties/registry", - "type": "string", - "title": "The registry schema", - "description": "The registry of the images to run.", - "examples": ["openservicemesh"] - }, - "name": { - "$id": "#/properties/osm/properties/image/properties/name", - "type": "object", - "title": "Default image names", - "description": "Default image names for control plane.", - "required": [ + "properties": { + "osm": { + "$id": "#/properties/osm", + "type": "object", + "title": "The OpenServiceMesh schema", + "description": "The top level required key in the values file.", + "required": [ + "image", + "sidecarClass", + "sidecarDrivers", + "pluginChains", + "curlImage", + "caBundleSecretName", + "enableDebugServer", + "enablePermissiveTrafficPolicy", + "trafficInterceptionMode", + "enableEgress", + "enableReconciler", + "deployPrometheus", + "deployGrafana", + "enableFluentbit", + "fluentBit", + "meshName", + "maxDataPlaneConnections", + "sidecarLogLevel", + "controllerLogLevel", + "enforceSingleMesh", + "deployJaeger", + "tracing", + "remoteLogging", + "webhookConfigNamePrefix", "osmController", - "osmInjector", - "osmSidecarInit", + "enablePrivilegedInitContainer", + "injector", "osmBootstrap", - "osmCRDs", - "osmPreinstall", - "osmHealthcheck" - ], - "properties": { + "featureFlags" + ], + "properties": { "osmController": { - "$id": "#/properties/osm/properties/image/properties/name/properties/osmController", - "type": "string", - "title": "osm-controller's image names", - "description": "osm-controller container's image names." + "$id": "#/properties/osm/properties/osmController", + "type": "object", + "title": "The osmController schema", + "description": "The details of the osmController.", + "required": [ + "resource" + ], + "properties": { + "replicaCount": { + "$id": "#/properties/osm/properties/osmController/properties/replicaCount", + "type": "integer", + "title": "The replicaCount schema", + "description": "The number of replicas of the osm-controller pod", + "examples": [ + 1 + ] + }, + "resource": { + "$ref": "#/definitions/containerResources" + }, + "podLabels": { + "$id": "#/properties/osm/properties/osmController/properties/podLabels", + "type": "object", + "title": "The podLabels schema", + "description": "Labels for the osmController pod.", + "default": {} + }, + "enablePodDisruptionBudget": { + "$id": "#/properties/osm/properties/osmController/properties/enablePodDisruptionBudget", + "type": "boolean", + "title": "The enablePodDisruptionBudget schema", + "description": "Indicates whether Pod Disruption Budget should be enabled or not.", + "examples": [ + false + ] + }, + "autoScale": { + "$ref": "#/definitions/autoScale" + }, + "affinity": { + "type": "object" + }, + "tolerations": { + "type": "array" + } + }, + "additionalProperties": false }, - "osmInjector": { - "$id": "#/properties/osm/properties/image/properties/name/properties/osmInjector", - "type": "string", - "title": "osm-injector's image name", - "description": "osm-injector container's image name." + "image": { + "$id": "#/properties/osm/properties/image", + "type": "object", + "title": "The image schema", + "description": "The details of the images to run.", + "examples": [ + { + "registry": "openservicemesh", + "pullPolicy": "IfNotPresent", + "tag": "v0.4.2" + } + ], + "required": [ + "registry", + "name", + "pullPolicy", + "tag", + "digest" + ], + "properties": { + "registry": { + "$id": "#/properties/osm/properties/image/properties/registry", + "type": "string", + "title": "The registry schema", + "description": "The registry of the images to run.", + "examples": [ + "openservicemesh" + ] + }, + "name": { + "$id": "#/properties/osm/properties/image/properties/name", + "type": "object", + "title": "Default image names", + "description": "Default image names for control plane.", + "required": [ + "osmController", + "osmInjector", + "osmSidecarInit", + "osmBootstrap", + "osmCRDs", + "osmPreinstall", + "osmHealthcheck" + ], + "properties": { + "osmController": { + "$id": "#/properties/osm/properties/image/properties/name/properties/osmController", + "type": "string", + "title": "osm-controller's image names", + "description": "osm-controller container's image names." + }, + "osmInjector": { + "$id": "#/properties/osm/properties/image/properties/name/properties/osmInjector", + "type": "string", + "title": "osm-injector's image name", + "description": "osm-injector container's image name." + }, + "osmSidecarInit": { + "$id": "#/properties/osm/properties/image/properties/name/properties/osmSidecarInit", + "type": "string", + "title": "osm-osmSidecarInit's image name", + "description": "osm-osmSidecarInit container's image name." + }, + "osmBootstrap": { + "$id": "#/properties/osm/properties/image/properties/name/properties/osmBootstrap", + "type": "string", + "title": "osm-boostrap's image name", + "description": "osm-bootstrap container's image name." + }, + "osmCRDs": { + "$id": "#/properties/osm/properties/image/properties/name/properties/osmCRDs", + "type": "string", + "title": "osm-crds' image name", + "description": "osm-crds container's image name." + }, + "osmPreinstall": { + "$id": "#/properties/osm/properties/image/properties/name/properties/osmPreinstall", + "type": "string", + "title": "osm-preinstall's image name", + "description": "osm-preinstall container's image name." + }, + "osmHealthcheck": { + "$id": "#/properties/osm/properties/image/properties/name/properties/osmHealthcheck", + "type": "string", + "title": "osm-healthcheck's image name", + "description": "osm-healthcheck container's image name." + } + } + }, + "pullPolicy": { + "$id": "#/properties/osm/properties/image/properties/pullPolicy", + "type": "string", + "title": "The pullPolicy schema", + "description": "The image pull policy.", + "pattern": "^(Always|Never|IfNotPresent)?$", + "examples": [ + "IfNotPresent" + ] + }, + "tag": { + "$id": "#/properties/osm/properties/image/properties/tag", + "type": "string", + "title": "The tag schema", + "description": "The image tag to run.", + "examples": [ + "v0.4.2" + ] + }, + "digest": { + "$id": "#/properties/osm/properties/image/properties/digest", + "type": "object", + "title": "Default image digests", + "description": "Default image digests for control plane.", + "required": [ + "osmController", + "osmInjector", + "osmSidecarInit", + "osmCRDs", + "osmBootstrap", + "osmPreinstall", + "osmHealthcheck" + ], + "properties": { + "osmController": { + "$id": "#/properties/osm/properties/image/properties/digest/properties/osmController", + "type": "string", + "title": "osm-controller's image digest", + "description": "osm-controller container's image digest." + }, + "osmInjector": { + "$id": "#/properties/osm/properties/image/properties/digest/properties/osmInjector", + "type": "string", + "title": "osm-injector's image digest", + "description": "osm-injector container's image digest." + }, + "osmSidecarInit": { + "$id": "#/properties/osm/properties/image/properties/digest/properties/osmSidecarInit", + "type": "string", + "title": "osm-osmSidecarInit's image digest", + "description": "osm-osmSidecarInit container's image digest." + }, + "osmCRDs": { + "$id": "#/properties/osm/properties/image/properties/digest/properties/osmCRDs", + "type": "string", + "title": "osm-crds' image digest", + "description": "osm-crds container's image digest." + }, + "osmBootstrap": { + "$id": "#/properties/osm/properties/image/properties/digest/properties/osmBootstrap", + "type": "string", + "title": "osm-boostrap's image digest", + "description": "osm-bootstrap container's image digest." + }, + "osmPreinstall": { + "$id": "#/properties/osm/properties/image/properties/digest/properties/osmPreinstall", + "type": "string", + "title": "osm-preinstall's image digest", + "description": "osm-preinstall container's image digest." + }, + "osmHealthcheck": { + "$id": "#/properties/osm/properties/image/properties/digest/properties/osmHealthcheck", + "type": "string", + "title": "osm-healthcheck's image digest", + "description": "osm-healthcheck container's image digest." + } + } + } + }, + "additionalProperties": false }, - "osmSidecarInit": { - "$id": "#/properties/osm/properties/image/properties/name/properties/osmSidecarInit", - "type": "string", - "title": "osm-osmSidecarInit's image name", - "description": "osm-osmSidecarInit container's image name." + "sidecarClass": { + "$id": "#/properties/osm/properties/sidecarClass", + "type": "string", + "title": "The sidecarClass schema", + "description": "The class of the OSM Sidecar.", + "examples": [ + "pipy | envoy" + ] }, - "osmBootstrap": { - "$id": "#/properties/osm/properties/image/properties/name/properties/osmBootstrap", - "type": "string", - "title": "osm-boostrap's image name", - "description": "osm-bootstrap container's image name." + "sidecarImage": { + "$id": "#/properties/osm/properties/sidecarImage", + "type": "string", + "title": "The sidecarImage schema", + "description": "The proxy side car image to run.", + "examples": [ + "flomesh/pipy-nightly:latest" + ] }, - "osmCRDs": { - "$id": "#/properties/osm/properties/image/properties/name/properties/osmCRDs", - "type": "string", - "title": "osm-crds' image name", - "description": "osm-crds container's image name." + "sidecarWindowsImage": { + "$id": "#/properties/osm/properties/sidecarWindowsImage", + "type": "string", + "title": "The sidecarWindowsImage schema", + "description": "The proxy side car image to run on Windows payloads.", + "examples": [ + "flomesh/pipy-windows-nightly:latest" + ] }, - "osmPreinstall": { - "$id": "#/properties/osm/properties/image/properties/name/properties/osmPreinstall", - "type": "string", - "title": "osm-preinstall's image name", - "description": "osm-preinstall container's image name." + "sidecarDrivers": { + "$id": "#/properties/osm/properties/sidecarDrivers", + "type": "array", + "title": "The sidecarDriver schema", + "description": "The class of the OSM Sidecar Driver.", + "items": { + "type": "object" + }, + "examples": [ + [ + { + "sidecarName": "pipy", + "sidecarImage": "flomesh/pipy:latest", + "sidecarWindowsImage": "flomesh/pipy-windows-nightly:latest", + "initContainerImage": "curlimages/curl", + "proxyServerPort": 6060, + "sidecarDisabledMTLS": false + } + ] + ] }, - "osmHealthcheck": { - "$id": "#/properties/osm/properties/image/properties/name/properties/osmHealthcheck", - "type": "string", - "title": "osm-healthcheck's image name", - "description": "osm-healthcheck container's image name." - } - } - }, - "pullPolicy": { - "$id": "#/properties/osm/properties/image/properties/pullPolicy", - "type": "string", - "title": "The pullPolicy schema", - "description": "The image pull policy.", - "pattern": "^(Always|Never|IfNotPresent)?$", - "examples": ["IfNotPresent"] - }, - "tag": { - "$id": "#/properties/osm/properties/image/properties/tag", - "type": "string", - "title": "The tag schema", - "description": "The image tag to run.", - "examples": ["v0.4.2"] - }, - "digest": { - "$id": "#/properties/osm/properties/image/properties/digest", - "type": "object", - "title": "Default image digests", - "description": "Default image digests for control plane.", - "required": [ - "osmController", - "osmInjector", - "osmSidecarInit", - "osmCRDs", - "osmBootstrap", - "osmPreinstall", - "osmHealthcheck" - ], - "properties": { - "osmController": { - "$id": "#/properties/osm/properties/image/properties/digest/properties/osmController", - "type": "string", - "title": "osm-controller's image digest", - "description": "osm-controller container's image digest." + "pluginChains": { + "$id": "#/properties/osm/properties/pluginChains", + "type": "object", + "title": "Plugin Chain Scheme", + "description": "Plugin Chain Scheme", + "additionalProperties": false, + "properties": { + "inbound-tcp": { + "$id": "#/properties/osm/properties/pluginChains/inbound-tcp", + "type": "array", + "title": "Inbound TCP Plugin Chain Schema", + "description": "Inbound TCP Plugin Chain Schema", + "items": { + "type": "object", + "required": [ + "plugin", + "priority" + ], + "additionalProperties": false, + "properties": { + "plugin": { + "type": "string" + }, + "priority": { + "type": "number", + "minimum": 0 + }, + "disable": { + "type": "boolean" + } + } + } + }, + "inbound-http": { + "$id": "#/properties/osm/properties/pluginChains/inbound-http", + "type": "array", + "title": "Inbound HTTP Plugin Chain Schema", + "description": "Inbound HTTP Plugin Chain Schema", + "items": { + "type": "object", + "required": [ + "plugin", + "priority" + ], + "additionalProperties": false, + "properties": { + "plugin": { + "type": "string" + }, + "priority": { + "type": "number", + "minimum": 0 + }, + "disable": { + "type": "boolean" + } + } + } + }, + "outbound-tcp": { + "$id": "#/properties/osm/properties/pluginChains/outbound-tcp", + "type": "array", + "title": "Outbound TCP Plugin Chain Schema", + "description": "Outbound TCP Plugin Chain Schema", + "items": { + "type": "object", + "required": [ + "plugin", + "priority" + ], + "additionalProperties": false, + "properties": { + "plugin": { + "type": "string" + }, + "priority": { + "type": "number", + "minimum": 0 + }, + "disable": { + "type": "boolean" + } + } + } + }, + "outbound-http": { + "$id": "#/properties/osm/properties/pluginChains/outbound-http", + "type": "array", + "title": "Outbound HTTP Plugin Chain Schema", + "description": "Outbound HTTP Plugin Chain Schema", + "items": { + "type": "object", + "required": [ + "plugin", + "priority" + ], + "additionalProperties": false, + "properties": { + "plugin": { + "type": "string" + }, + "priority": { + "type": "number", + "minimum": 0 + }, + "disable": { + "type": "boolean" + } + } + } + } + } + }, + "curlImage": { + "$id": "#/properties/osm/properties/curlImage", + "type": "string", + "title": "The curlImage schema", + "description": "The curl image for control plane init containers.", + "examples": [ + "curlimages/curl" + ] + }, + "repoServer": { + "$id": "#/properties/osm/properties/repoServer", + "type": "object", + "title": "Pipy repo server", + "description": "Pipy repo server.", + "required": [ + "image", + "standalone", + "ipaddr", + "codebase" + ], + "additionalProperties": false, + "properties": { + "image": { + "$id": "#/properties/osm/properties/repoServer/image", + "type": "string", + "title": "Pipy repo server's image schema", + "description": "Image used for pipy repo server", + "examples": [ + "flomesh/pipy-repo:latest" + ] + }, + "standalone": { + "$id": "#/properties/osm/properties/repoServer/standalone", + "type": "boolean", + "title": "Install Mode of RepoServer", + "description": "if false , RepoServer is installed within osmController pod.", + "examples": [ + false + ] + }, + "ipaddr": { + "$id": "#/properties/osm/properties/repoServer/ipaddr", + "type": "string", + "title": "The ipaddr schema for pipy repo server", + "description": "Ip address of the pipy repo server", + "examples": [ + "127.0.0.1" + ] + }, + "codebase": { + "$id": "#/properties/osm/properties/repoServer/codebase", + "type": "string", + "title": "The codebase schema for pipy repo server", + "description": "Codebase is the folder used by osmController.", + "examples": [ + "/osm1.3.0" + ] + } + } + }, + "trustDomain": { + "$id": "#/properties/osm/properties/trustDomain", + "type": "string", + "title": "The certificate issuance Trust Domain", + "description": "The trust domain to use as part of the common name when requesting new certificates.", + "examples": [ + "cluster.local", + "example.com" + ] + }, + "certificateProvider": { + "$id": "#/properties/osm/properties/certificateProvider", + "type": "object", + "title": "The certificate provider schema", + "description": "Certificate provider configuration parameters", + "required": [ + "kind", + "serviceCertValidityDuration", + "certKeyBitSize" + ], + "additionalProperties": false, + "properties": { + "kind": { + "$id": "#/properties/osm/properties/certificateProvider/properties/kind", + "type": "string", + "title": "The certificate provider kind schema", + "description": "The certificate manager osm-controller should use.", + "pattern": "^(tresor|vault|cert-manager)$", + "examples": [ + "tresor" + ] + }, + "serviceCertValidityDuration": { + "$id": "#/properties/osm/properties/certificateProvider/properties/serviceCertValidityDuration", + "type": "string", + "title": "The serviceCertValidityDuration schema", + "description": "The service certificate validity duration.", + "examples": [ + "24h" + ] + }, + "certKeyBitSize": { + "$id": "#/properties/osm/properties/certificateProvider/properties/certKeyBitSize", + "type": "integer", + "title": "The certKeyBitSize schema", + "description": "The key size for data plane certificates.", + "examples": [ + 2048 + ] + } + } + }, + "caBundleSecretName": { + "$id": "#/properties/osm/properties/caBundleSecretName", + "type": "string", + "title": "The caBundleSecretName schema", + "description": "An explanation about the purpose of this instance.", + "examples": [ + "osm-ca-bundle" + ] + }, + "enableDebugServer": { + "$id": "#/properties/osm/properties/enableDebugServer", + "type": "boolean", + "title": "The enableDebugServer schema", + "description": "Indicates whether the Debug Server should be enabled or not.", + "examples": [ + false + ] + }, + "enablePermissiveTrafficPolicy": { + "$id": "#/properties/osm/properties/enablePermissiveTrafficPolicy", + "type": "boolean", + "title": "The enablePermissiveTrafficPolicy schema", + "description": "Indicates whether permissive traffic policy should be enabled or not.", + "examples": [ + false + ] + }, + "trafficInterceptionMode": { + "$id": "#/properties/osm/properties/trafficInterceptionMode", + "type": "string", + "title": "The trafficInterceptionMode schema", + "description": "Traffic interception mode in the mesh.", + "enum": [ + "iptables", + "ebpf" + ], + "examples": [ + "iptables" + ] + }, + "enableEgress": { + "$id": "#/properties/osm/properties/enableEgress", + "type": "boolean", + "title": "The enableEgress schema", + "description": "Indicates whether egress should be enabled or not.", + "examples": [ + false + ] + }, + "enableReconciler": { + "$id": "#/properties/osm/properties/enableReconciler", + "type": "boolean", + "title": "The enableReconciler schema", + "description": "Indicates whether OSM's reconciler should be enabled or not.", + "examples": [ + false + ] + }, + "deployPrometheus": { + "$id": "#/properties/osm/properties/deployPrometheus", + "type": "boolean", + "title": "The deployPrometheus schema", + "description": "Indicates whether Prometheus should be installed and configured as part of the osm control plane.", + "examples": [ + false + ] + }, + "deployGrafana": { + "$id": "#/properties/osm/properties/deployGrafana", + "type": "boolean", + "title": "The deployGrafana schema", + "description": "Indicates whether Grafana should be installed and configured as part of the osm control plane.", + "examples": [ + false + ] + }, + "enableFluentbit": { + "$id": "#/properties/osm/properties/enableFluentbit", + "type": "boolean", + "title": "The enableFluentbit schema", + "description": "Indicates whether Fluent Bit log forwarding should be enabled", + "examples": [ + false + ] + }, + "fluentBit": { + "$id": "#/properties/osm/properties/fluentBit", + "type": "object", + "title": "The Fluent Bit schema", + "description": "The default details of the Fluent Bit sidecar if enabled.", + "examples": [ + { + "name": "fluentbit-logger", + "registry": "fluent", + "tag": "1.6.4", + "pullPolicy": "IfNotPresent", + "outputPlugin": "stdout", + "enableProxySupport": "false", + "httpProxy": "", + "httpsProxy": "" + } + ], + "required": [ + "name", + "registry", + "tag", + "pullPolicy", + "outputPlugin", + "workspaceId", + "primaryKey", + "enableProxySupport", + "httpProxy", + "httpsProxy" + ], + "properties": { + "name": { + "$id": "#/properties/osm/properties/fluentBit/properties/name", + "type": "string", + "title": "The name schema", + "description": "The name of the Fluent Bit container", + "examples": [ + "fluentbit-logger" + ] + }, + "registry": { + "$id": "#/properties/osm/properties/fluentBit/properties/registry", + "type": "string", + "title": "The registry schema", + "description": "The registry of the image to run.", + "examples": [ + "fluent" + ] + }, + "tag": { + "$id": "#/properties/osm/properties/fluentBit/properties/tag", + "type": "string", + "title": "The tag schema", + "description": "The image tag to run.", + "examples": [ + "1.6.4" + ] + }, + "pullPolicy": { + "$id": "#/properties/osm/properties/fluentBit/properties/pullPolicy", + "type": "string", + "title": "The pullPolicy schema", + "description": "The image pull policy.", + "pattern": "^(Always|Never|IfNotPresent)$", + "examples": [ + "IfNotPresent" + ] + }, + "outputPlugin": { + "$id": "#/properties/osm/properties/fluentBit/properties/outputPlugin", + "type": "string", + "title": "The output plugin for Fluent Bit", + "description": "The log forwarding destination plugin for Fluent Bit", + "examples": [ + "stdout" + ] + }, + "workspaceId": { + "$id": "#/properties/osm/properties/fluentBit/properties/workspaceId", + "type": "string", + "title": "The Fluent Bit workspaceId schema", + "description": "The workspace ID for Fluent Bit output plugin to Log Analytics" + }, + "primaryKey": { + "$id": "#/properties/osm/properties/fluentBit/properties/primaryKey", + "type": "string", + "title": "The Fluent Bit primaryKey schema", + "description": "The primary key for Fluent Bit output plugin to Log Analytics" + }, + "enableProxySupport": { + "$id": "#/properties/osm/properties/fluentBit/properties/enableProxySupport", + "type": "boolean", + "title": "The enableProxySupport output schema", + "description": "Indicates whether outbound proxy support should be configured for Fluent Bit", + "examples": [ + false + ] + }, + "httpProxy": { + "$id": "#/properties/osm/properties/fluentBit/properties/httpProxy", + "type": "string", + "title": "The httpProxy schema", + "description": "http proxy endpoint", + "examples": [ + "http://:" + ] + }, + "httpsProxy": { + "$id": "#/properties/osm/properties/fluentBit/properties/httpsProxy", + "type": "string", + "title": "The httpsProxy schema", + "description": "https proxy endpoint", + "examples": [ + "http://:" + ] + } + }, + "additionalProperties": false + }, + "meshName": { + "$id": "#/properties/osm/properties/meshName", + "type": "string", + "title": "The meshName schema", + "description": "The name associated with the control plane being installed.", + "examples": [ + "osm" + ] + }, + "maxDataPlaneConnections": { + "$id": "#/properties/osm/properties/maxDataPlaneConnections", + "type": "integer", + "title": "The maxDataPlaneConnections schema", + "description": "Sets the Max Data Plane Connections", + "examples": [ + "1000" + ] + }, + "configResyncInterval": { + "$id": "#/properties/osm/properties/configResyncInterval", + "type": "string", + "title": "The configResyncInterval schema", + "description": "Sets the resync interval for regular proxy broadcast updates", + "examples": [ + "30s" + ] + }, + "sidecarLogLevel": { + "$id": "#/properties/osm/properties/sidecarLogLevel", + "type": "string", + "title": "The sidecarLogLevel schema", + "description": "Sidecar log level.", + "pattern": "^(trace|debug|info|warning|warn|error|critical|off)$", + "examples": [ + "error" + ] + }, + "localProxyMode": { + "$id": "#/properties/osm/properties/localProxyMode", + "type": "string", + "title": "The localProxyMode schema", + "description": "Proxy mode for the Sidecar proxy sidecar. Acceptable values are ['Localhost', 'PodIP'].", + "enum": [ + "Localhost", + "PodIP" + ], + "examples": [ + "Localhost" + ] }, - "osmInjector": { - "$id": "#/properties/osm/properties/image/properties/digest/properties/osmInjector", - "type": "string", - "title": "osm-injector's image digest", - "description": "osm-injector container's image digest." + "localDNSProxy": { + "$id": "#/properties/osm/properties/localDNSProxy", + "type": "object", + "title": "The local DNS Proxy schema", + "description": "Local DNS Proxy improves the performance of your computer by caching the responses coming from your DNS servers.", + "examples": [ + { + "enable": true + } + ], + "required": [ + "enable" + ], + "properties": { + "enable": { + "$id": "#/properties/osm/properties/localDNSProxy/properties/enable", + "type": "boolean", + "title": "The enable schema for local DNS Proxy", + "description": "Indicates whether local DNS Proxy is enabled or not", + "examples": [ + true + ] + }, + "primaryUpstreamDNSServerIPAddr": { + "$id": "#/properties/osm/properties/localDNSProxy/properties/primaryUpstreamDNSServerIPAddr", + "type": "string", + "title": "Primary upstream DNS server for local DNS Proxy", + "description": "Primary upstream DNS server for local DNS Proxy" + }, + "secondaryUpstreamDNSServerIPAddr": { + "$id": "#/properties/osm/properties/localDNSProxy/properties/secondaryUpstreamDNSServerIPAddr", + "type": "string", + "title": "Secondary upstream DNS server for local DNS Proxy", + "description": "Secondary upstream DNS server for local DNS Proxy" + } + }, + "additionalProperties": false }, - "osmSidecarInit": { - "$id": "#/properties/osm/properties/image/properties/digest/properties/osmSidecarInit", - "type": "string", - "title": "osm-osmSidecarInit's image digest", - "description": "osm-osmSidecarInit container's image digest." + "controllerLogLevel": { + "$id": "#/properties/osm/properties/controllerLogLevel", + "type": "string", + "title": "The controllerLogLevel schema", + "description": "OSM Controller log level.", + "pattern": "^(debug|info|warn|error|fatal|panic|disabled|trace)$", + "examples": [ + "error" + ] }, - "osmCRDs": { - "$id": "#/properties/osm/properties/image/properties/digest/properties/osmCRDs", - "type": "string", - "title": "osm-crds' image digest", - "description": "osm-crds container's image digest." + "enforceSingleMesh": { + "$id": "#/properties/osm/properties/enforceSingleMesh", + "type": "boolean", + "title": "The enforceSingleMesh schema", + "description": "Enforce only running a single control plane within a cluster.", + "examples": [ + false + ] + }, + "deployJaeger": { + "$id": "#/properties/osm/properties/deployJaeger", + "type": "boolean", + "title": "The deployJaeger schema", + "description": "Indicates whether Jaeger should be installed and configured as part of the control plane.", + "examples": [ + true + ] + }, + "tracing": { + "$id": "#/properties/osm/properties/tracing", + "type": "object", + "title": "The tracing schema", + "description": "An explanation about the purpose of this instance.", + "examples": [ + { + "enable": true + } + ], + "required": [ + "enable", + "address", + "port", + "endpoint", + "image" + ], + "properties": { + "enable": { + "$id": "#/properties/osm/properties/tracing/properties/enable", + "type": "boolean", + "title": "The enable schema for tracing", + "description": "Indicates whether tracing is enabled or not", + "examples": [ + true + ] + }, + "address": { + "$id": "#/properties/osm/properties/tracing/properties/address", + "type": "string", + "title": "The address schema for tracing", + "description": "Address of the tracing collector", + "examples": [ + "jaeger..svc.cluster.local" + ] + }, + "port": { + "$id": "#/properties/osm/properties/tracing/properties/port", + "type": "integer", + "title": "The port schema for tracing", + "description": "Port of the tracing collector", + "minimum": 1, + "maximum": 65535, + "examples": [ + 9411 + ] + }, + "endpoint": { + "$id": "#/properties/osm/properties/tracing/properties/endpoint", + "type": "string", + "title": "The endpoint schema for tracing", + "description": "API path of the collector", + "examples": [ + "/api/v2/spans" + ] + }, + "sampledFraction": { + "$id": "#/properties/osm/properties/tracing/properties/sampledFraction", + "type": "string", + "title": "Sampled Fraction", + "description": "Sampled Fraction", + "examples": [ + "0.2" + ] + }, + "image": { + "$id": "#/properties/osm/properties/tracing/properties/image", + "type": "string", + "title": "Jaeger's image schema", + "description": "Image used for jaeger", + "examples": [ + "jaegertracing/all-in-one" + ] + }, + "affinity": { + "type": "object" + }, + "nodeSelector": { + "type": "object" + }, + "tolerations": { + "type": "array" + } + }, + "additionalProperties": false + }, + "remoteLogging": { + "$id": "#/properties/osm/properties/remoteLogging", + "type": "object", + "title": "The remote logging schema", + "description": "An explanation about the purpose of this instance.", + "examples": [ + { + "enable": true + } + ], + "required": [ + "enable", + "address", + "port", + "endpoint" + ], + "properties": { + "enable": { + "$id": "#/properties/osm/properties/remoteLogging/properties/enable", + "type": "boolean", + "title": "The enable schema for tracing", + "description": "Indicates whether remote logging is enabled or not", + "examples": [ + true + ] + }, + "address": { + "$id": "#/properties/osm/properties/remoteLogging/properties/address", + "type": "string", + "title": "The address schema for remote logging service", + "description": "Address of the remote logging service", + "examples": [ + "remote-logging-service..svc.cluster.local" + ] + }, + "port": { + "$id": "#/properties/osm/properties/remoteLogging/properties/port", + "type": "integer", + "title": "The port schema for remote logging service", + "description": "Port of the remote logging service", + "minimum": 1, + "maximum": 65535, + "examples": [ + 30514 + ] + }, + "endpoint": { + "$id": "#/properties/osm/properties/remoteLogging/properties/endpoint", + "type": "string", + "title": "The endpoint schema for remote logging service", + "description": "API path of the collector", + "examples": [ + "/api/v2/spans" + ] + }, + "authorization": { + "$id": "#/properties/osm/properties/remoteLogging/properties/authorization", + "type": "string", + "title": "The authorization for remote logging service", + "description": "Authorization for remote logging service", + "examples": [ + "Basic XXX" + ] + }, + "sampledFraction": { + "$id": "#/properties/osm/properties/remoteLogging/properties/sampledFraction", + "type": "string", + "title": "Sampled Fraction", + "description": "Sampled Fraction", + "examples": [ + "0.2" + ] + } + }, + "additionalProperties": false + }, + "webhookConfigNamePrefix": { + "$id": "#/properties/osm/properties/webhookConfigNamePrefix", + "type": "string", + "title": "Webhook Config Name Prefix", + "description": "Prefix for the webhook name, which uses the format -", + "examples": [ + "" + ] + }, + "osmNamespace": { + "$id": "#/properties/osm/properties/osmNamespace", + "type": "string", + "title": "The namespace of the OSM control plane components", + "description": "Indicates the namespace in which the OSM control plane components will be installed", + "examples": [ + "osm-system" + ] + }, + "enablePrivilegedInitContainer": { + "$id": "#/properties/osm/properties/enablePrivilegedInitContainer", + "type": "boolean", + "title": "The enablePrivilegedInitContainer schema", + "description": "Indicates whether the init container for pods in the mesh should be privileged", + "examples": [ + false + ] + }, + "injector": { + "$id": "#/properties/osm/properties/injector", + "type": "object", + "title": "The sidecar injector schema", + "description": "Sidecar injector configurations", + "required": [ + "replicaCount", + "resource" + ], + "properties": { + "replicaCount": { + "$id": "#/properties/osm/properties/injector/properties/replicaCount", + "type": "integer", + "title": "The replicaCount schema", + "description": "The number of replicas of the osm-injector pod.", + "examples": [ + 1 + ] + }, + "resource": { + "$ref": "#/definitions/containerResources" + }, + "podLabels": { + "$id": "#/properties/osm/properties/injector/properties/podLabels", + "type": "object", + "title": "The podLabels schema", + "description": "Labels for the osm-injector pod.", + "default": {} + }, + "enablePodDisruptionBudget": { + "$id": "#/properties/osm/properties/injector/properties/enablePodDisruptionBudget", + "type": "boolean", + "title": "The enablePodDisruptionBudget schema", + "description": "Indicates whether Pod Disruption Budget should be enabled or not.", + "examples": [ + false + ] + }, + "autoScale": { + "$ref": "#/definitions/autoScale" + }, + "webhookTimeoutSeconds": { + "$id": "#/properties/osm/properties/webhookTimeout", + "type": "integer", + "title": "Webhook Timeout Seconds", + "description": "Timeout for the mutating webhook in seconds", + "examples": [ + 20 + ] + }, + "affinity": { + "type": "object" + }, + "nodeSelector": { + "type": "object" + }, + "tolerations": { + "type": "array" + } + }, + "additionalProperties": false }, "osmBootstrap": { - "$id": "#/properties/osm/properties/image/properties/digest/properties/osmBootstrap", - "type": "string", - "title": "osm-boostrap's image digest", - "description": "osm-bootstrap container's image digest." + "$id": "#/properties/osm/properties/osmBootstrap", + "type": "object", + "title": "The OSM bootstrap schema", + "description": "OSM bootstrap's configurations", + "required": [ + "replicaCount", + "resource" + ], + "properties": { + "replicaCount": { + "$id": "#/properties/osm/properties/osmBootstrap/properties/replicaCount", + "type": "integer", + "title": "The replicaCount schema", + "description": "The number of replicas of the OSM bootstrap pod.", + "examples": [ + 1 + ] + }, + "resource": { + "$ref": "#/definitions/containerResources" + }, + "podLabels": { + "$id": "#/properties/osm/properties/osmBootstrap/properties/podLabels", + "type": "object", + "title": "The podLabels schema", + "description": "Labels for the OSM bootstrap pod.", + "default": {} + }, + "affinity": { + "type": "object" + }, + "nodeSelector": { + "type": "object" + }, + "tolerations": { + "type": "array" + } + }, + "additionalProperties": false + }, + "featureFlags": { + "$id": "#/properties/osm/properties/featureFlags", + "type": "object", + "title": "Feature flags", + "description": "Feature flags", + "examples": [ + { + "enableWASMStats": true, + "enableEgressPolicy": true + } + ], + "required": [ + "enableWASMStats", + "enableEgressPolicy", + "enableAsyncProxyServiceMapping", + "enableIngressBackendPolicy", + "enableAccessControlPolicy", + "enableAccessCertPolicy", + "enableSidecarActiveHealthChecks", + "enableSnapshotCacheMode", + "enableRetryPolicy", + "enablePluginPolicy", + "enableMeshRootCertificate" + ], + "properties": { + "enableWASMStats": { + "$id": "#/properties/osm/properties/featureFlags/properties/enableWASMStats", + "type": "boolean", + "title": "Enable WASM stats", + "description": "Enable extra Sidecar statistics generated by a custom WASM extension", + "examples": [ + true + ] + }, + "enableEgressPolicy": { + "$id": "#/properties/osm/properties/featureFlags/properties/enableEgressPolicy", + "type": "boolean", + "title": "Enable OSM's Egress policy", + "description": "Enable OSM's Egress policy for fine grained control over egress (external) traffic", + "examples": [ + true + ] + }, + "enableAsyncProxyServiceMapping": { + "$id": "#/properties/osm/properties/featureFlags/properties/enableAsyncProxyServiceMapping", + "type": "boolean", + "title": "Enable async proxy-service mapping", + "description": "Enable async proxy-service mapping", + "examples": [ + true + ] + }, + "enableIngressBackendPolicy": { + "$id": "#/properties/osm/properties/featureFlags/properties/enableIngressBackendPolicy", + "type": "boolean", + "title": "Enable OSM to use the IngressBackend API", + "description": "Enable OSM to use the IngressBackend API for allowing ingress to mesh backends", + "examples": [ + true + ] + }, + "enableAccessControlPolicy": { + "$id": "#/properties/osm/properties/featureFlags/properties/enableAccessControlPolicy", + "type": "boolean", + "title": "Enable OSM to use the AccessControl API", + "description": "Enable OSM to use the AccessControl API for allowing access control traffic to mesh backends", + "examples": [ + true + ] + }, + "enableAccessCertPolicy": { + "$id": "#/properties/osm/properties/featureFlags/properties/enableAccessCertPolicy", + "type": "boolean", + "title": "Enable OSM to issue certificates for external services", + "description": "Enable OSM to issue certificates for external services", + "examples": [ + true + ] + }, + "enableSidecarActiveHealthChecks": { + "$id": "#/properties/osm/properties/featureFlags/properties/enableSidecarActiveHealthChecks", + "type": "boolean", + "title": "Enable Sidecar active health checks", + "description": "EnableSidecarActiveHealthChecks defines if OSM will Sidecar active health checks between services allowed to communicate", + "examples": [ + true + ] + }, + "enableSnapshotCacheMode": { + "$id": "#/properties/osm/properties/featureFlags/properties/enableSnapshotCacheMode", + "type": "boolean", + "title": "Enable SnapshotCache feature for Sidecar xDS server", + "description": "Enable SnapshotCache feature in OSM controller to cache snapshots for Sidecar xDS configurations.", + "examples": [ + true + ] + }, + "enableRetryPolicy": { + "$id": "#/properties/osm/properties/featureFlags/properties/enableRetryPolicy", + "type": "boolean", + "title": "Enable Retry Policy", + "description": "Enable automatic request retries.", + "examples": [ + true + ] + }, + "enablePluginPolicy": { + "$id": "#/properties/osm/properties/featureFlags/properties/enablePluginPolicy", + "type": "boolean", + "title": "Enable Plugin Policy", + "description": "Enable extend by plugin.", + "examples": [ + false + ] + }, + "enableMeshRootCertificate": { + "$id": "#/properties/osm/properties/featureFlags/properties/enableMeshRootCertificate", + "type": "boolean", + "title": "Enable the MeshRootCertificate", + "description": "Enable the MeshRootCertificate to configure the OSM certificate provider.", + "examples": [ + false + ] + } + }, + "additionalProperties": false + }, + "pspEnabled": { + "$id": "#/properties/osm/properties/pspEnabled", + "type": "boolean", + "title": "The pspEnabled schema", + "description": "Indicates whether OSM should run with PodSecurityPolicies", + "examples": [ + false + ] + }, + "controlPlaneTolerations": { + "$id": "#/properties/osm/properties/controlPlaneTolerations", + "type": "array", + "title": "The controlPlaneTolerations schema", + "description": "Node tolerations applied to control plane pods to schedule onto nodes with matching taints", + "items": { + "type": "object" + }, + "examples": [ + [ + { + "key": "key1", + "operator": "Equal", + "value": "value1", + "effect": "NoSchedule" + } + ] + ] + }, + "outboundIPRangeExclusionList": { + "$id": "#/properties/osm/properties/outboundIPRangeExclusionList", + "type": "array", + "title": "The outboundIPRangeExclusionList schema", + "description": "Outbound IP range exluclusion list for sidecar traffic interception", + "items": { + "type": "string", + "pattern": "((?:\\d{1,3}\\.){3}\\d{1,3})\\/(\\d{1,2})$" + }, + "examples": [ + [ + "8.8.8.8/32", + "10.0.0.0/24" + ] + ] + }, + "outboundIPRangeInclusionList": { + "$id": "#/properties/osm/properties/outboundIPRangeInclusionList", + "type": "array", + "title": "The outboundIPRangeInclusionList schema", + "description": "Outbound IP range inclusion list for sidecar traffic interception", + "items": { + "type": "string", + "pattern": "((?:\\d{1,3}\\.){3}\\d{1,3})\\/(\\d{1,2})$" + }, + "examples": [ + [ + "8.8.8.8/32", + "10.0.0.0/24" + ] + ] + }, + "outboundPortExclusionList": { + "$id": "#/properties/osm/properties/outboundPortExclusionList", + "type": "array", + "title": "The outboundPortExclusionList schema", + "description": "Outbound port exluclusion list for sidecar traffic interception", + "items": { + "type": "integer", + "minimum": 1, + "maximum": 65535 + }, + "examples": [ + [ + 6379, + 3315 + ] + ] + }, + "inboundPortExclusionList": { + "$id": "#/properties/osm/properties/inboundPortExclusionList", + "type": "array", + "title": "The inboundPortExclusionList schema", + "description": "Inbound port exluclusion list for sidecar traffic interception", + "items": { + "type": "integer", + "minimum": 1, + "maximum": 65535 + }, + "examples": [ + [ + 6379, + 3315 + ] + ] }, - "osmPreinstall": { - "$id": "#/properties/osm/properties/image/properties/digest/properties/osmPreinstall", - "type": "string", - "title": "osm-preinstall's image digest", - "description": "osm-preinstall container's image digest." + "networkInterfaceExclusionList": { + "$id": "#/properties/osm/properties/networkInterfaceExclusionList", + "type": "array", + "title": "The networkInterfaceExclusionList schema", + "description": "Network interface exluclusion list for sidecar traffic interception", + "items": { + "type": "string" + }, + "examples": [ + [ + "eth0", + "net1" + ] + ] }, - "osmHealthcheck": { - "$id": "#/properties/osm/properties/image/properties/digest/properties/osmHealthcheck", - "type": "string", - "title": "osm-healthcheck's image digest", - "description": "osm-healthcheck container's image digest." + "grafana": { + "$id": "#/properties/osm/properties/grafana", + "type": "object", + "title": "The grafana schema", + "description": "Grafana configuration parameters", + "required": [ + "port", + "enableRemoteRendering", + "image", + "rendererImage" + ], + "properties": { + "port": { + "$id": "#/properties/osm/properties/grafana/properties/port", + "title": "Grafana's port schema", + "description": "Grafana's port number", + "type": "integer", + "minimum": 1, + "maximum": 65535, + "examples": [ + 3000 + ] + }, + "enableRemoteRendering": { + "$id": "#/properties/osm/properties/grafana/properties/enableRemoteRendering", + "type": "boolean", + "title": "Grafana's enableRemoteRendering schema", + "description": "Enable remote rendering of Grafana's dashboards", + "examples": [ + true + ] + }, + "image": { + "$id": "#/properties/osm/properties/grafana/properties/image", + "type": "string", + "title": "Grafana's image schema", + "description": "Image used for Grafana", + "examples": [ + "grafana/grafana:8.2.2" + ] + }, + "rendererImage": { + "$id": "#/properties/osm/properties/grafana/properties/rendererImage", + "type": "string", + "title": "Grafana's rendererImage schema", + "description": "Renderer image used for Grafana", + "examples": [ + "grafana/grafana-image-renderer:3.2.1" + ] + }, + "affinity": { + "type": "object" + }, + "nodeSelector": { + "type": "object" + }, + "tolerations": { + "type": "array" + } + }, + "examples": [ + { + "port": 3000, + "enableRemoteRendering": true, + "image": "grafana/grafana:8.2.2", + "rendererImage": "grafana/grafana-image-renderer:3.2.1" + } + ], + "additionalProperties": false + }, + "certmanager": { + "$id": "#/properties/osm/properties/certmanager", + "type": "object", + "title": "The certmanager schema", + "description": "cert-manager.io configuration parameters", + "required": [ + "issuerName", + "issuerKind", + "issuerGroup" + ], + "properties": { + "issuerName": { + "$id": "#/properties/osm/properties/certmanager/properties/issuerName", + "title": "Cert-manager's issuerName schema", + "description": "Cert-manager's certificate issuer name", + "type": "string", + "examples": [ + "osm-ca" + ] + }, + "issuerKind": { + "$id": "#/properties/osm/properties/certmanager/properties/issuerKind", + "title": "Cert-manager's issuerKind schema", + "description": "Cert-manager's certificate issuer kind", + "type": "string", + "examples": [ + "Issuer" + ] + }, + "issuerGroup": { + "$id": "#/properties/osm/properties/certmanager/properties/issuerGroup", + "title": "Cert-manager's issuerGroup schema", + "description": "Cert-manager's certificate issuer group", + "type": "string", + "examples": [ + "cert-manager" + ] + } + }, + "examples": [ + { + "issuerName": "osm-ca", + "issuerKind": "Issuer", + "issuerGroup": "cert-manager" + } + ], + "additionalProperties": false + }, + "vault": { + "$id": "#/properties/osm/properties/vault", + "type": "object", + "title": "The Hashicorp Vault schema", + "description": "Hashicorp Vault configuration parameters", + "properties": { + "host": { + "$id": "#/properties/osm/properties/vault/properties/host", + "title": "Hashicorp Vault's host schema", + "description": "Hashicorp Vault host/service - where Vault is installed", + "type": "string" + }, + "port": { + "$id": "#/properties/osm/properties/vault/properties/port", + "title": "Hashicorp Vault's port", + "description": "Port to use to connect to vault", + "type": "integer", + "minimum": 1, + "maximum": 65535 + }, + "protocol": { + "$id": "#/properties/osm/properties/vault/properties/protocol", + "title": "Hashicorp Vault's protocol schema", + "description": "Protocol to use to connect to Vault", + "type": "string" + }, + "token": { + "$id": "#/properties/osm/properties/vault/properties/token", + "title": "Hashicorp Vault's token schema", + "description": "Token to use to connect to Vault", + "type": "string" + }, + "role": { + "$id": "#/properties/osm/properties/vault/properties/role", + "title": "Hashicorp Vault's role schema", + "description": "Role to use with Vault", + "type": "string" + }, + "secret": { + "$id": "#/properties/osm/properties/vault/properties/secret", + "type": "object", + "title": "Vault token secret schema", + "description": "Vault token secret reference parameters", + "properties": { + "name": { + "$id": "#/properties/osm/properties/vault/properties/secret/properties/name", + "title": "Vault token secret name schema", + "description": "Name of the Kubernetes Secret to store the vault token", + "type": "string" + }, + "key": { + "$id": "#/properties/osm/properties/vault/properties/secret/properties/key", + "title": "Vault token secret key schema", + "description": "Name of the Kubernetes Secret key with the value of the vault token", + "type": "string" + } + } + } + }, + "examples": [ + { + "host": "vault.default.svc.cluster.local", + "protocol": "http", + "token": "some-token", + "role": "openservicemesh" + } + ], + "additionalProperties": false + }, + "prometheus": { + "$id": "#/properties/osm/properties/prometheus", + "type": "object", + "title": "The prometheus schema", + "description": "Prometheus configurations", + "required": [ + "resources", + "port", + "retention", + "image" + ], + "properties": { + "resources": { + "$ref": "#/definitions/containerResources" + }, + "port": { + "$id": "#/properties/osm/properties/prometheus/properties/port", + "title": "Prometheus' port schema", + "description": "Prometheus' port number", + "type": "integer", + "minimum": 1, + "maximum": 65535, + "examples": [ + 7070 + ] + }, + "retention": { + "$id": "#/properties/osm/properties/prometheus/properties/rentention", + "type": "object", + "title": "The Prometheus retention schema", + "description": "Prometheus data retention configurations", + "required": [ + "time" + ], + "properties": { + "time": { + "$id": "#/properties/osm/properties/prometheus/properties/retention/properties/time", + "title": "Prometheus' data retention time schema", + "description": "Prometheus' data retention time", + "type": "string", + "examples": [ + "15d" + ] + } + } + }, + "image": { + "$id": "#/properties/osm/properties/prometheus/properties/image", + "type": "string", + "title": "Prometheus's image schema", + "description": "Image used for Prometheus", + "examples": [ + "prom/prometheus:v2.18.1" + ] + }, + "affinity": { + "type": "object" + }, + "nodeSelector": { + "type": "object" + }, + "tolerations": { + "type": "array" + } + }, + "additionalProperties": false + }, + "imagePullSecrets": { + "$id": "#/properties/osm/properties/imagePullSecrets", + "type": "array", + "title": "The imagePullSecrets schema", + "description": "ImagePullSecrets for the control plane pod", + "items": { + "type": "object" + }, + "examples": [ + [ + { + "name": "secret-name" + } + ] + ] + }, + "validatorWebhook": { + "$id": "#/properties/osm/properties/validatorWebhook", + "type": "object", + "title": "The validatorWebhook schema", + "description": "Resource validator webhook configuration", + "properties": { + "webhookConfigurationName": { + "$id": "#/properties/osm/properties/validatorWebhook/properties/webhookConfigurationName", + "title": "Validator webhook configuration schema", + "description": "Validator's ValidatingWebhookConfigurationName", + "type": "string" + } + }, + "additionalProperties": false + }, + "preinstall": { + "$id": "#/properties/osm/properties/preinstall", + "type": "object", + "title": "The preinstall schema", + "description": "Preinstall configurations", + "required": [], + "properties": { + "affinity": { + "type": "object" + }, + "nodeSelector": { + "type": "object" + }, + "tolerations": { + "type": "array" + } + }, + "additionalProperties": false + }, + "cleanup": { + "$id": "#/properties/osm/properties/preinstall", + "type": "object", + "title": "The preinstall schema", + "description": "Preinstall configurations", + "required": [], + "properties": { + "affinity": { + "type": "object" + }, + "nodeSelector": { + "type": "object" + }, + "tolerations": { + "type": "array" + } + }, + "additionalProperties": false } - } - } - }, - "additionalProperties": false - }, - "sidecarClass": { - "$id": "#/properties/osm/properties/sidecarClass", - "type": "string", - "title": "The sidecarClass schema", - "description": "The class of the OSM Sidecar.", - "examples": ["pipy | envoy"] - }, - "sidecarImage": { - "$id": "#/properties/osm/properties/sidecarImage", - "type": "string", - "title": "The sidecarImage schema", - "description": "The proxy side car image to run.", - "examples": ["flomesh/pipy-nightly:latest"] - }, - "sidecarWindowsImage": { - "$id": "#/properties/osm/properties/sidecarWindowsImage", - "type": "string", - "title": "The sidecarWindowsImage schema", - "description": "The proxy side car image to run on Windows payloads.", - "examples": ["flomesh/pipy-windows-nightly:latest"] - }, - "sidecarDrivers": { - "$id": "#/properties/osm/properties/sidecarDrivers", - "type": "array", - "title": "The sidecarDriver schema", - "description": "The class of the OSM Sidecar Driver.", - "items": { - "type": "object" - }, - "examples": [ - [ - { - "sidecarName": "pipy", - "sidecarImage": "flomesh/pipy:latest", - "sidecarWindowsImage": "flomesh/pipy-windows-nightly:latest", - "initContainerImage": "curlimages/curl", - "proxyServerPort": 6060, - "sidecarDisabledMTLS": false - } - ] - ] - }, - "curlImage": { - "$id": "#/properties/osm/properties/curlImage", - "type": "string", - "title": "The curlImage schema", - "description": "The curl image for control plane init containers.", - "examples": ["curlimages/curl"] - }, - "pipyRepoImage": { - "$id": "#/properties/osm/properties/pipyRepoImage", - "type": "string", - "title": "The pipyRepoImage schema", - "description": "The Pipy repo image for Pipy sidecar's proxy control plane container.", - "examples": ["flomesh/pipy-repo-nightly"] - }, - "trustDomain": { - "$id": "#/properties/osm/properties/trustDomain", - "type": "string", - "title": "The certificate issuance Trust Domain", - "description": "The trust domain to use as part of the common name when requesting new certificates.", - "examples": ["cluster.local", "example.com"] - }, - "certificateProvider": { - "$id": "#/properties/osm/properties/certificateProvider", - "type": "object", - "title": "The certificate provider schema", - "description": "Certificate provider configuration parameters", - "required": ["kind", "serviceCertValidityDuration", "certKeyBitSize"], - "additionalProperties": false, - "properties": { - "kind": { - "$id": "#/properties/osm/properties/certificateProvider/properties/kind", - "type": "string", - "title": "The certificate provider kind schema", - "description": "The certificate manager osm-controller should use.", - "pattern": "^(tresor|vault|cert-manager)$", - "examples": ["tresor"] - }, - "serviceCertValidityDuration": { - "$id": "#/properties/osm/properties/certificateProvider/properties/serviceCertValidityDuration", - "type": "string", - "title": "The serviceCertValidityDuration schema", - "description": "The service certificate validity duration.", - "examples": ["24h"] - }, - "certKeyBitSize": { - "$id": "#/properties/osm/properties/certificateProvider/properties/certKeyBitSize", - "type": "integer", - "title": "The certKeyBitSize schema", - "description": "The key size for data plane certificates.", - "examples": [2048] - } - } - }, - "caBundleSecretName": { - "$id": "#/properties/osm/properties/caBundleSecretName", - "type": "string", - "title": "The caBundleSecretName schema", - "description": "An explanation about the purpose of this instance.", - "examples": ["osm-ca-bundle"] - }, - "enableDebugServer": { - "$id": "#/properties/osm/properties/enableDebugServer", - "type": "boolean", - "title": "The enableDebugServer schema", - "description": "Indicates whether the Debug Server should be enabled or not.", - "examples": [false] - }, - "enablePermissiveTrafficPolicy": { - "$id": "#/properties/osm/properties/enablePermissiveTrafficPolicy", - "type": "boolean", - "title": "The enablePermissiveTrafficPolicy schema", - "description": "Indicates whether permissive traffic policy should be enabled or not.", - "examples": [false] - }, - "enableEgress": { - "$id": "#/properties/osm/properties/enableEgress", - "type": "boolean", - "title": "The enableEgress schema", - "description": "Indicates whether egress should be enabled or not.", - "examples": [false] - }, - "enableReconciler": { - "$id": "#/properties/osm/properties/enableReconciler", - "type": "boolean", - "title": "The enableReconciler schema", - "description": "Indicates whether OSM's reconciler should be enabled or not.", - "examples": [false] - }, - "deployPrometheus": { - "$id": "#/properties/osm/properties/deployPrometheus", - "type": "boolean", - "title": "The deployPrometheus schema", - "description": "Indicates whether Prometheus should be installed and configured as part of the osm control plane.", - "examples": [false] - }, - "deployGrafana": { - "$id": "#/properties/osm/properties/deployGrafana", - "type": "boolean", - "title": "The deployGrafana schema", - "description": "Indicates whether Grafana should be installed and configured as part of the osm control plane.", - "examples": [false] - }, - "enableFluentbit": { - "$id": "#/properties/osm/properties/enableFluentbit", - "type": "boolean", - "title": "The enableFluentbit schema", - "description": "Indicates whether Fluent Bit log forwarding should be enabled", - "examples": [false] - }, - "fluentBit": { - "$id": "#/properties/osm/properties/fluentBit", - "type": "object", - "title": "The Fluent Bit schema", - "description": "The default details of the Fluent Bit sidecar if enabled.", - "examples": [ - { - "name": "fluentbit-logger", - "registry": "fluent", - "tag": "1.6.4", - "pullPolicy": "IfNotPresent", - "outputPlugin": "stdout", - "enableProxySupport": "false", - "httpProxy": "", - "httpsProxy": "" - } - ], - "required": [ - "name", - "registry", - "tag", - "pullPolicy", - "outputPlugin", - "workspaceId", - "primaryKey", - "enableProxySupport", - "httpProxy", - "httpsProxy" - ], - "properties": { - "name": { - "$id": "#/properties/osm/properties/fluentBit/properties/name", - "type": "string", - "title": "The name schema", - "description": "The name of the Fluent Bit container", - "examples": ["fluentbit-logger"] - }, - "registry": { - "$id": "#/properties/osm/properties/fluentBit/properties/registry", - "type": "string", - "title": "The registry schema", - "description": "The registry of the image to run.", - "examples": ["fluent"] - }, - "tag": { - "$id": "#/properties/osm/properties/fluentBit/properties/tag", - "type": "string", - "title": "The tag schema", - "description": "The image tag to run.", - "examples": ["1.6.4"] - }, - "pullPolicy": { - "$id": "#/properties/osm/properties/fluentBit/properties/pullPolicy", - "type": "string", - "title": "The pullPolicy schema", - "description": "The image pull policy.", - "pattern": "^(Always|Never|IfNotPresent)$", - "examples": ["IfNotPresent"] - }, - "outputPlugin": { - "$id": "#/properties/osm/properties/fluentBit/properties/outputPlugin", - "type": "string", - "title": "The output plugin for Fluent Bit", - "description": "The log forwarding destination plugin for Fluent Bit", - "examples": ["stdout"] }, - "workspaceId": { - "$id": "#/properties/osm/properties/fluentBit/properties/workspaceId", - "type": "string", - "title": "The Fluent Bit workspaceId schema", - "description": "The workspace ID for Fluent Bit output plugin to Log Analytics" - }, - "primaryKey": { - "$id": "#/properties/osm/properties/fluentBit/properties/primaryKey", - "type": "string", - "title": "The Fluent Bit primaryKey schema", - "description": "The primary key for Fluent Bit output plugin to Log Analytics" - }, - "enableProxySupport": { - "$id": "#/properties/osm/properties/fluentBit/properties/enableProxySupport", - "type": "boolean", - "title": "The enableProxySupport output schema", - "description": "Indicates whether outbound proxy support should be configured for Fluent Bit", - "examples": [false] - }, - "httpProxy": { - "$id": "#/properties/osm/properties/fluentBit/properties/httpProxy", - "type": "string", - "title": "The httpProxy schema", - "description": "http proxy endpoint", - "examples": ["http://:"] - }, - "httpsProxy": { - "$id": "#/properties/osm/properties/fluentBit/properties/httpsProxy", - "type": "string", - "title": "The httpsProxy schema", - "description": "https proxy endpoint", - "examples": ["http://:"] - } - }, - "additionalProperties": false - }, - "meshName": { - "$id": "#/properties/osm/properties/meshName", - "type": "string", - "title": "The meshName schema", - "description": "The name associated with the control plane being installed.", - "examples": ["osm"] + "additionalProperties": false }, - "maxDataPlaneConnections": { - "$id": "#/properties/osm/properties/maxDataPlaneConnections", - "type": "integer", - "title": "The maxDataPlaneConnections schema", - "description": "Sets the Max Data Plane Connections", - "examples": ["1000"] - }, - "configResyncInterval": { - "$id": "#/properties/osm/properties/configResyncInterval", - "type": "string", - "title": "The configResyncInterval schema", - "description": "Sets the resync interval for regular proxy broadcast updates", - "examples": ["30s"] - }, - "sidecarLogLevel": { - "$id": "#/properties/osm/properties/sidecarLogLevel", - "type": "string", - "title": "The sidecarLogLevel schema", - "description": "Sidecar log level.", - "pattern": "^(trace|debug|info|warning|warn|error|critical|off)$", - "examples": ["error"] - }, - "localProxyMode": { - "$id": "#/properties/osm/properties/localProxyMode", - "type": "string", - "title": "The localProxyMode schema", - "description": "Proxy mode for the Sidecar proxy sidecar. Acceptable values are ['Localhost', 'PodIP'].", - "enum": ["Localhost", "PodIP"], - "examples": ["Localhost"] - }, - "controllerLogLevel": { - "$id": "#/properties/osm/properties/controllerLogLevel", - "type": "string", - "title": "The controllerLogLevel schema", - "description": "OSM Controller log level.", - "pattern": "^(debug|info|warn|error|fatal|panic|disabled|trace)$", - "examples": ["error"] - }, - "enforceSingleMesh": { - "$id": "#/properties/osm/properties/enforceSingleMesh", - "type": "boolean", - "title": "The enforceSingleMesh schema", - "description": "Enforce only running a single control plane within a cluster.", - "examples": [false] - }, - "deployJaeger": { - "$id": "#/properties/osm/properties/deployJaeger", - "type": "boolean", - "title": "The deployJaeger schema", - "description": "Indicates whether Jaeger should be installed and configured as part of the control plane.", - "examples": [true] - }, - "tracing": { - "$id": "#/properties/osm/properties/tracing", - "type": "object", - "title": "The tracing schema", - "description": "An explanation about the purpose of this instance.", - "examples": [ - { - "enable": true - } - ], - "required": ["enable", "address", "port", "endpoint", "image"], - "properties": { - "enable": { - "$id": "#/properties/osm/properties/tracing/properties/enable", - "type": "boolean", - "title": "The enable schema for tracing", - "description": "Indicates whether tracing is enabled or not", - "examples": [true] - }, - "address": { - "$id": "#/properties/osm/properties/tracing/properties/address", - "type": "string", - "title": "The address schema for tracing", - "description": "Address of the tracing collector", - "examples": ["jaeger..svc.cluster.local"] - }, - "port": { - "$id": "#/properties/osm/properties/tracing/properties/port", - "type": "integer", - "title": "The port schema for tracing", - "description": "Port of the tracing collector", - "minimum": 1, - "maximum": 65535, - "examples": [9411] - }, - "endpoint": { - "$id": "#/properties/osm/properties/tracing/properties/endpoint", - "type": "string", - "title": "The endpoint schema for tracing", - "description": "API path of the collector", - "examples": ["/api/v2/spans"] - }, - "image": { - "$id": "#/properties/osm/properties/tracing/properties/image", - "type": "string", - "title": "Jaeger's image schema", - "description": "Image used for jaeger", - "examples": ["jaegertracing/all-in-one"] - }, - "affinity": { - "type": "object" - }, - "nodeSelector": { - "type": "object" - }, - "tolerations": { - "type": "array" - } - }, - "additionalProperties": false - }, - "remoteLogging": { - "$id": "#/properties/osm/properties/remoteLogging", - "type": "object", - "title": "The remote logging schema", - "description": "An explanation about the purpose of this instance.", - "examples": [ - { - "enable": true - } - ], - "required": ["enable", "address", "port", "endpoint"], - "properties": { - "enable": { - "$id": "#/properties/osm/properties/remoteLogging/properties/enable", - "type": "boolean", - "title": "The enable schema for tracing", - "description": "Indicates whether remote logging is enabled or not", - "examples": [true] - }, - "address": { - "$id": "#/properties/osm/properties/remoteLogging/properties/address", - "type": "string", - "title": "The address schema for remote logging service", - "description": "Address of the remote logging service", - "examples": [ - "remote-logging-service..svc.cluster.local" - ] - }, - "port": { - "$id": "#/properties/osm/properties/remoteLogging/properties/port", - "type": "integer", - "title": "The port schema for remote logging service", - "description": "Port of the remote logging service", - "minimum": 1, - "maximum": 65535, - "examples": [30514] - }, - "endpoint": { - "$id": "#/properties/osm/properties/remoteLogging/properties/endpoint", - "type": "string", - "title": "The endpoint schema for remote logging service", - "description": "API path of the collector", - "examples": ["/api/v2/spans"] - }, - "authorization": { - "$id": "#/properties/osm/properties/remoteLogging/properties/authorization", - "type": "string", - "title": "The authorization for remote logging service", - "description": "Authorization for remote logging service", - "examples": ["Basic XXX"] - } - }, - "additionalProperties": false - }, - "webhookConfigNamePrefix": { - "$id": "#/properties/osm/properties/webhookConfigNamePrefix", - "type": "string", - "title": "Webhook Config Name Prefix", - "description": "Prefix for the webhook name, which uses the format -", - "examples": [""] - }, - "osmNamespace": { - "$id": "#/properties/osm/properties/osmNamespace", - "type": "string", - "title": "The namespace of the OSM control plane components", - "description": "Indicates the namespace in which the OSM control plane components will be installed", - "examples": ["osm-system"] - }, - "enablePrivilegedInitContainer": { - "$id": "#/properties/osm/properties/enablePrivilegedInitContainer", - "type": "boolean", - "title": "The enablePrivilegedInitContainer schema", - "description": "Indicates whether the init container for pods in the mesh should be privileged", - "examples": [false] - }, - "injector": { - "$id": "#/properties/osm/properties/injector", - "type": "object", - "title": "The sidecar injector schema", - "description": "Sidecar injector configurations", - "required": ["replicaCount", "resource"], - "properties": { - "replicaCount": { - "$id": "#/properties/osm/properties/injector/properties/replicaCount", - "type": "integer", - "title": "The replicaCount schema", - "description": "The number of replicas of the osm-injector pod.", - "examples": [1] - }, - "resource": { - "$ref": "#/definitions/containerResources" - }, - "podLabels": { - "$id": "#/properties/osm/properties/injector/properties/podLabels", - "type": "object", - "title": "The podLabels schema", - "description": "Labels for the osm-injector pod.", - "default": {} - }, - "enablePodDisruptionBudget": { - "$id": "#/properties/osm/properties/injector/properties/enablePodDisruptionBudget", - "type": "boolean", - "title": "The enablePodDisruptionBudget schema", - "description": "Indicates whether Pod Disruption Budget should be enabled or not.", - "examples": [false] - }, - "autoScale": { - "$ref": "#/definitions/autoScale" - }, - "webhookTimeoutSeconds": { - "$id": "#/properties/osm/properties/webhookTimeout", - "type": "integer", - "title": "Webhook Timeout Seconds", - "description": "Timeout for the mutating webhook in seconds", - "examples": [20] - }, - "affinity": { - "type": "object" - }, - "nodeSelector": { - "type": "object" - }, - "tolerations": { - "type": "array" - } - }, - "additionalProperties": false - }, - "osmBootstrap": { - "$id": "#/properties/osm/properties/osmBootstrap", - "type": "object", - "title": "The OSM bootstrap schema", - "description": "OSM bootstrap's configurations", - "required": ["replicaCount", "resource"], - "properties": { - "replicaCount": { - "$id": "#/properties/osm/properties/osmBootstrap/properties/replicaCount", - "type": "integer", - "title": "The replicaCount schema", - "description": "The number of replicas of the OSM bootstrap pod.", - "examples": [1] - }, - "resource": { - "$ref": "#/definitions/containerResources" - }, - "podLabels": { - "$id": "#/properties/osm/properties/osmBootstrap/properties/podLabels", - "type": "object", - "title": "The podLabels schema", - "description": "Labels for the OSM bootstrap pod.", - "default": {} - }, - "affinity": { - "type": "object" - }, - "nodeSelector": { - "type": "object" - }, - "tolerations": { - "type": "array" - } - }, - "additionalProperties": false - }, - "featureFlags": { - "$id": "#/properties/osm/properties/featureFlags", - "type": "object", - "title": "Feature flags", - "description": "Feature flags", - "examples": [ - { - "enableWASMStats": true, - "enableEgressPolicy": true - } - ], - "required": [ - "enableWASMStats", - "enableEgressPolicy", - "enableAsyncProxyServiceMapping", - "enableIngressBackendPolicy", - "enableAccessControlPolicy", - "enableAccessCertPolicy", - "enableSidecarActiveHealthChecks", - "enableSnapshotCacheMode", - "enableRetryPolicy", - "enableMeshRootCertificate" - ], - "properties": { - "enableWASMStats": { - "$id": "#/properties/osm/properties/featureFlags/properties/enableWASMStats", - "type": "boolean", - "title": "Enable WASM stats", - "description": "Enable extra Sidecar statistics generated by a custom WASM extension", - "examples": [true] - }, - "enableEgressPolicy": { - "$id": "#/properties/osm/properties/featureFlags/properties/enableEgressPolicy", - "type": "boolean", - "title": "Enable OSM's Egress policy", - "description": "Enable OSM's Egress policy for fine grained control over egress (external) traffic", - "examples": [true] - }, - "enableAsyncProxyServiceMapping": { - "$id": "#/properties/osm/properties/featureFlags/properties/enableAsyncProxyServiceMapping", - "type": "boolean", - "title": "Enable async proxy-service mapping", - "description": "Enable async proxy-service mapping", - "examples": [true] - }, - "enableIngressBackendPolicy": { - "$id": "#/properties/osm/properties/featureFlags/properties/enableIngressBackendPolicy", - "type": "boolean", - "title": "Enable OSM to use the IngressBackend API", - "description": "Enable OSM to use the IngressBackend API for allowing ingress to mesh backends", - "examples": [true] - }, - "enableAccessControlPolicy": { - "$id": "#/properties/osm/properties/featureFlags/properties/enableAccessControlPolicy", - "type": "boolean", - "title": "Enable OSM to use the AccessControl API", - "description": "Enable OSM to use the AccessControl API for allowing access control traffic to mesh backends", - "examples": [true] - }, - "enableAccessCertPolicy": { - "$id": "#/properties/osm/properties/featureFlags/properties/enableAccessCertPolicy", - "type": "boolean", - "title": "Enable OSM to issue certificates for external services", - "description": "Enable OSM to issue certificates for external services", - "examples": [true] - }, - "enableSidecarActiveHealthChecks": { - "$id": "#/properties/osm/properties/featureFlags/properties/enableSidecarActiveHealthChecks", - "type": "boolean", - "title": "Enable Sidecar active health checks", - "description": "EnableSidecarActiveHealthChecks defines if OSM will Sidecar active health checks between services allowed to communicate", - "examples": [true] - }, - "enableSnapshotCacheMode": { - "$id": "#/properties/osm/properties/featureFlags/properties/enableSnapshotCacheMode", - "type": "boolean", - "title": "Enable SnapshotCache feature for Sidecar xDS server", - "description": "Enable SnapshotCache feature in OSM controller to cache snapshots for Sidecar xDS configurations.", - "examples": [true] - }, - "enableRetryPolicy": { - "$id": "#/properties/osm/properties/featureFlags/properties/enableRetryPolicy", - "type": "boolean", - "title": "Enable Retry Policy", - "description": "Enable automatic request retries.", - "examples": [true] - }, - "enableMeshRootCertificate": { - "$id": "#/properties/osm/properties/featureFlags/properties/enableMeshRootCertificate", - "type": "boolean", - "title": "Enable the MeshRootCertificate", - "description": "Enable the MeshRootCertificate to configure the OSM certificate provider.", - "examples": [false] - } - }, - "additionalProperties": false - }, - "pspEnabled": { - "$id": "#/properties/osm/properties/pspEnabled", - "type": "boolean", - "title": "The pspEnabled schema", - "description": "Indicates whether OSM should run with PodSecurityPolicies", - "examples": [false] - }, - "controlPlaneTolerations": { - "$id": "#/properties/osm/properties/controlPlaneTolerations", - "type": "array", - "title": "The controlPlaneTolerations schema", - "description": "Node tolerations applied to control plane pods to schedule onto nodes with matching taints", - "items": { - "type": "object" - }, - "examples": [ - [ - { - "key": "key1", - "operator": "Equal", - "value": "value1", - "effect": "NoSchedule" - } - ] - ] - }, - "outboundIPRangeExclusionList": { - "$id": "#/properties/osm/properties/outboundIPRangeExclusionList", - "type": "array", - "title": "The outboundIPRangeExclusionList schema", - "description": "Outbound IP range exluclusion list for sidecar traffic interception", - "items": { - "type": "string", - "pattern": "((?:\\d{1,3}\\.){3}\\d{1,3})\\/(\\d{1,2})$" - }, - "examples": [["8.8.8.8/32", "10.0.0.0/24"]] - }, - "outboundIPRangeInclusionList": { - "$id": "#/properties/osm/properties/outboundIPRangeInclusionList", - "type": "array", - "title": "The outboundIPRangeInclusionList schema", - "description": "Outbound IP range inclusion list for sidecar traffic interception", - "items": { - "type": "string", - "pattern": "((?:\\d{1,3}\\.){3}\\d{1,3})\\/(\\d{1,2})$" - }, - "examples": [["8.8.8.8/32", "10.0.0.0/24"]] - }, - "outboundPortExclusionList": { - "$id": "#/properties/osm/properties/outboundPortExclusionList", - "type": "array", - "title": "The outboundPortExclusionList schema", - "description": "Outbound port exluclusion list for sidecar traffic interception", - "items": { - "type": "integer", - "minimum": 1, - "maximum": 65535 - }, - "examples": [[6379, 3315]] - }, - "inboundPortExclusionList": { - "$id": "#/properties/osm/properties/inboundPortExclusionList", - "type": "array", - "title": "The inboundPortExclusionList schema", - "description": "Inbound port exluclusion list for sidecar traffic interception", - "items": { - "type": "integer", - "minimum": 1, - "maximum": 65535 - }, - "examples": [[6379, 3315]] - }, - "networkInterfaceExclusionList": { - "$id": "#/properties/osm/properties/networkInterfaceExclusionList", - "type": "array", - "title": "The networkInterfaceExclusionList schema", - "description": "Network interface exluclusion list for sidecar traffic interception", - "items": { - "type": "string" - }, - "examples": [["eth0", "net1"]] - }, - "grafana": { - "$id": "#/properties/osm/properties/grafana", - "type": "object", - "title": "The grafana schema", - "description": "Grafana configuration parameters", - "required": [ - "port", - "enableRemoteRendering", - "image", - "rendererImage" - ], - "properties": { - "port": { - "$id": "#/properties/osm/properties/grafana/properties/port", - "title": "Grafana's port schema", - "description": "Grafana's port number", - "type": "integer", - "minimum": 1, - "maximum": 65535, - "examples": [3000] - }, - "enableRemoteRendering": { - "$id": "#/properties/osm/properties/grafana/properties/enableRemoteRendering", - "type": "boolean", - "title": "Grafana's enableRemoteRendering schema", - "description": "Enable remote rendering of Grafana's dashboards", - "examples": [true] - }, - "image": { - "$id": "#/properties/osm/properties/grafana/properties/image", - "type": "string", - "title": "Grafana's image schema", - "description": "Image used for Grafana", - "examples": ["grafana/grafana:8.2.2"] - }, - "rendererImage": { - "$id": "#/properties/osm/properties/grafana/properties/rendererImage", - "type": "string", - "title": "Grafana's rendererImage schema", - "description": "Renderer image used for Grafana", - "examples": ["grafana/grafana-image-renderer:3.2.1"] - }, - "affinity": { - "type": "object" - }, - "nodeSelector": { - "type": "object" - }, - "tolerations": { - "type": "array" - } - }, - "examples": [ - { - "port": 3000, - "enableRemoteRendering": true, - "image": "grafana/grafana:8.2.2", - "rendererImage": "grafana/grafana-image-renderer:3.2.1" - } - ], - "additionalProperties": false - }, - "certmanager": { - "$id": "#/properties/osm/properties/certmanager", - "type": "object", - "title": "The certmanager schema", - "description": "cert-manager.io configuration parameters", - "required": ["issuerName", "issuerKind", "issuerGroup"], - "properties": { - "issuerName": { - "$id": "#/properties/osm/properties/certmanager/properties/issuerName", - "title": "Cert-manager's issuerName schema", - "description": "Cert-manager's certificate issuer name", - "type": "string", - "examples": ["osm-ca"] - }, - "issuerKind": { - "$id": "#/properties/osm/properties/certmanager/properties/issuerKind", - "title": "Cert-manager's issuerKind schema", - "description": "Cert-manager's certificate issuer kind", - "type": "string", - "examples": ["Issuer"] - }, - "issuerGroup": { - "$id": "#/properties/osm/properties/certmanager/properties/issuerGroup", - "title": "Cert-manager's issuerGroup schema", - "description": "Cert-manager's certificate issuer group", - "type": "string", - "examples": ["cert-manager"] - } - }, - "examples": [ - { - "issuerName": "osm-ca", - "issuerKind": "Issuer", - "issuerGroup": "cert-manager" - } - ], - "additionalProperties": false - }, - "vault": { - "$id": "#/properties/osm/properties/vault", - "type": "object", - "title": "The Hashicorp Vault schema", - "description": "Hashicorp Vault configuration parameters", - "properties": { - "host": { - "$id": "#/properties/osm/properties/vault/properties/host", - "title": "Hashicorp Vault's host schema", - "description": "Hashicorp Vault host/service - where Vault is installed", - "type": "string" - }, - "port": { - "$id": "#/properties/osm/properties/vault/properties/port", - "title": "Hashicorp Vault's port", - "description": "Port to use to connect to vault", - "type": "integer", - "minimum": 1, - "maximum": 65535 - }, - "protocol": { - "$id": "#/properties/osm/properties/vault/properties/protocol", - "title": "Hashicorp Vault's protocol schema", - "description": "Protocol to use to connect to Vault", - "type": "string" - }, - "token": { - "$id": "#/properties/osm/properties/vault/properties/token", - "title": "Hashicorp Vault's token schema", - "description": "Token to use to connect to Vault", - "type": "string" - }, - "role": { - "$id": "#/properties/osm/properties/vault/properties/role", - "title": "Hashicorp Vault's role schema", - "description": "Role to use with Vault", - "type": "string" - }, - "secret": { - "$id": "#/properties/osm/properties/vault/properties/secret", - "type": "object", - "title": "Vault token secret schema", - "description": "Vault token secret reference parameters", - "properties": { - "name": { - "$id": "#/properties/osm/properties/vault/properties/secret/properties/name", - "title": "Vault token secret name schema", - "description": "Name of the Kubernetes Secret to store the vault token", - "type": "string" - }, - "key": { - "$id": "#/properties/osm/properties/vault/properties/secret/properties/key", - "title": "Vault token secret key schema", - "description": "Name of the Kubernetes Secret key with the value of the vault token", - "type": "string" + "contour": { + "$id": "#/properties/contour", + "type": "object", + "title": "Contour Ingress", + "description": "Contour Ingress configuration", + "properties": { + "enabled": { + "$id": "#/properties/contour/enabled", + "title": "Enable Contour", + "description": "Enables Contour control plane and gateway", + "type": "boolean" } - } - } - }, - "examples": [ - { - "host": "vault.default.svc.cluster.local", - "protocol": "http", - "token": "some-token", - "role": "openservicemesh" } - ], - "additionalProperties": false }, - "prometheus": { - "$id": "#/properties/osm/properties/prometheus", - "type": "object", - "title": "The prometheus schema", - "description": "Prometheus configurations", - "required": ["resources", "port", "retention", "image"], - "properties": { - "resources": { - "$ref": "#/definitions/containerResources" - }, - "port": { - "$id": "#/properties/osm/properties/prometheus/properties/port", - "title": "Prometheus' port schema", - "description": "Prometheus' port number", - "type": "integer", - "minimum": 1, - "maximum": 65535, - "examples": [7070] - }, - "retention": { - "$id": "#/properties/osm/properties/prometheus/properties/rentention", - "type": "object", - "title": "The Prometheus retention schema", - "description": "Prometheus data retention configurations", - "required": ["time"], - "properties": { - "time": { - "$id": "#/properties/osm/properties/prometheus/properties/retention/properties/time", - "title": "Prometheus' data retention time schema", - "description": "Prometheus' data retention time", - "type": "string", - "examples": ["15d"] + "smi": { + "$id": "#/properties/smi", + "type": "object", + "title": "SMI Configuration", + "description": "SMI configuration", + "properties": { + "validateTrafficTarget": { + "$id": "#/properties/contour/validateTrafficTarget", + "title": "Validate Traffic Target", + "description": "Enables validation of SMI Traffic Target", + "type": "boolean" } - } - }, - "image": { - "$id": "#/properties/osm/properties/prometheus/properties/image", - "type": "string", - "title": "Prometheus's image schema", - "description": "Image used for Prometheus", - "examples": ["prom/prometheus:v2.18.1"] - }, - "affinity": { - "type": "object" - }, - "nodeSelector": { - "type": "object" - }, - "tolerations": { - "type": "array" - } - }, - "additionalProperties": false - }, - "imagePullSecrets": { - "$id": "#/properties/osm/properties/imagePullSecrets", - "type": "array", - "title": "The imagePullSecrets schema", - "description": "ImagePullSecrets for the control plane pod", - "items": { - "type": "object" - }, - "examples": [ - [ - { - "name": "secret-name" - } - ] - ] - }, - "validatorWebhook": { - "$id": "#/properties/osm/properties/validatorWebhook", - "type": "object", - "title": "The validatorWebhook schema", - "description": "Resource validator webhook configuration", - "properties": { - "webhookConfigurationName": { - "$id": "#/properties/osm/properties/validatorWebhook/properties/webhookConfigurationName", - "title": "Validator webhook configuration schema", - "description": "Validator's ValidatingWebhookConfigurationName", - "type": "string" } - }, - "additionalProperties": false }, - "preinstall": { - "$id": "#/properties/osm/properties/preinstall", - "type": "object", - "title": "The preinstall schema", - "description": "Preinstall configurations", - "required": [], - "properties": { - "affinity": { - "type": "object" - }, - "nodeSelector": { - "type": "object" - }, - "tolerations": { - "type": "array" - } - }, - "additionalProperties": false - }, - "cleanup": { - "$id": "#/properties/osm/properties/preinstall", - "type": "object", - "title": "The preinstall schema", - "description": "Preinstall configurations", - "required": [], - "properties": { - "affinity": { - "type": "object" - }, - "nodeSelector": { - "type": "object" - }, - "tolerations": { - "type": "array" + "fsm": { + "$id": "#/properties/fsm", + "type": "object", + "title": "Flomesh Service Mesh", + "description": "Flomesh Service Mesh configuration", + "properties": { + "enabled": { + "$id": "#/properties/fsm/enabled", + "title": "Enable FSM", + "description": "Enables Flomesh Service Mesh", + "type": "boolean" + } } - }, - "additionalProperties": false - } - }, - "additionalProperties": false - }, - "contour": { - "$id": "#/properties/contour", - "type": "object", - "title": "Contour Ingress", - "description": "Contour Ingress configuration", - "properties": { - "enabled": { - "$id": "#/properties/contour/enabled", - "title": "Enable Contour", - "description": "Enables Contour control plane and gateway", - "type": "boolean" - } - } - }, - "smi": { - "$id": "#/properties/smi", - "type": "object", - "title": "SMI Configuration", - "description": "SMI configuration", - "properties": { - "validateTrafficTarget": { - "$id": "#/properties/contour/validateTrafficTarget", - "title": "Validate Traffic Target", - "description": "Enables validation of SMI Traffic Target", - "type": "boolean" - } - } - }, - "fsm": { - "$id": "#/properties/fsm", - "type": "object", - "title": "Flomesh Service Mesh", - "description": "Flomesh Service Mesh configuration", - "properties": { - "enabled": { - "$id": "#/properties/fsm/enabled", - "title": "Enable FSM", - "description": "Enables Flomesh Service Mesh", - "type": "boolean" } - } } - } -} +} \ No newline at end of file diff --git a/packages/server/charts/osm/values.yaml b/packages/server/charts/osm/values.yaml index 66bae85..17a9d05 100644 --- a/packages/server/charts/osm/values.yaml +++ b/packages/server/charts/osm/values.yaml @@ -12,7 +12,7 @@ osm: # -- Container image pull policy for control plane containers pullPolicy: IfNotPresent # -- Container image tag for control plane images - tag: "1.2.0" + tag: "1.3.0" # -- Image name defaults name: # -- osm-controller's image name @@ -57,7 +57,7 @@ osm: sidecarDrivers: - sidecarName: pipy # -- Sidecar image for Linux workloads - sidecarImage: flomesh/pipy-nightly:latest + sidecarImage: flomesh/pipy:0.90.0-18 # -- Remote destination port on which the Discovery Service listens for new connections from Sidecars. proxyServerPort: 6060 - sidecarName: envoy @@ -69,8 +69,74 @@ osm: proxyServerPort: 15128 # -- Curl image for control plane init container curlImage: curlimages/curl - # -- Pipy repo image for Pipy sidecar's proxy control plane container - pipyRepoImage: flomesh/pipy-repo-nightly:latest + + # -- Pipy RepoServer + repoServer: + # -- Image used for Pipy RepoServer + image: flomesh/pipy-repo:0.90.0-18 + # -- if false , Pipy RepoServer is installed within osmController pod. + standalone: false + # -- ipaddr of host/service where Pipy RepoServer is installed + ipaddr: "127.0.0.1" + # -- codebase is the folder used by osmController. + codebase: "" + + pluginChains: + inbound-tcp: + - plugin: modules/inbound-tls-termination + priority: 130 + disable: false + - plugin: modules/inbound-tcp-routing + priority: 120 + disable: false + - plugin: modules/inbound-tcp-load-balancing + priority: 110 + disable: false + - plugin: modules/inbound-tcp-default + priority: 100 + disable: false + inbound-http: + - plugin: modules/inbound-tls-termination + priority: 180 + - plugin: modules/inbound-http-routing + priority: 170 + - plugin: modules/inbound-metrics-http + priority: 160 + - plugin: modules/inbound-tracing-http + priority: 150 + - plugin: modules/inbound-logging-http + priority: 140 + - plugin: modules/inbound-throttle-service + priority: 130 + - plugin: modules/inbound-throttle-route + priority: 120 + - plugin: modules/inbound-http-load-balancing + priority: 110 + - plugin: modules/inbound-http-default + priority: 100 + outbound-tcp: + - plugin: modules/outbound-tcp-routing + priority: 120 + - plugin: modules/outbound-tcp-load-balancing + priority: 110 + - plugin: modules/outbound-tcp-default + priority: 100 + outbound-http: + - plugin: modules/outbound-http-routing + priority: 160 + - plugin: modules/outbound-metrics-http + priority: 150 + - plugin: modules/outbound-tracing-http + priority: 140 + - plugin: modules/outbound-logging-http + priority: 130 + - plugin: modules/outbound-circuit-breaker + priority: 120 + - plugin: modules/outbound-http-load-balancing + priority: 110 + - plugin: modules/outbound-http-default + priority: 100 + # # -- OSM controller parameters osmController: @@ -272,6 +338,9 @@ osm: # -- Enable permissive traffic policy mode enablePermissiveTrafficPolicy: true + # -- Traffic interception mode in the mesh + trafficInterceptionMode: iptables + # -- Enable egress in the mesh enableEgress: true @@ -323,11 +392,15 @@ osm: # -- Proxy mode for the proxy sidecar. Acceptable values are ['Localhost', 'PodIP'] localProxyMode: Localhost + # -- Local DNS Proxy improves the performance of your computer by caching the responses coming from your DNS servers + localDNSProxy: + enable: false + # -- Sets the max data plane connections allowed for an instance of osm-controller, set to 0 to not enforce limits maxDataPlaneConnections: 0 # -- Sets the resync interval for regular proxy broadcast updates, set to 0s to not enforce any resync - configResyncInterval: "0s" + configResyncInterval: "90s" # -- Controller log verbosity controllerLogLevel: info @@ -356,6 +429,8 @@ osm: port: 9411 # -- Tracing collector's API path where the spans will be sent to endpoint: "/api/v2/spans" + # -- Sampled Fraction + sampledFraction: "1.0" # -- Image used for tracing image: jaegertracing/all-in-one @@ -402,6 +477,8 @@ osm: endpoint: "" # -- The authorization for remote logging service authorization: "" + # -- Sampled Fraction + sampledFraction: "1.0" # -- Specifies a global list of IP ranges to exclude from outbound traffic interception by the sidecar proxy. # If specified, must be a list of IP ranges of the form a.b.c.d/x. @@ -499,7 +576,7 @@ osm: # -- Feature flags for experimental features featureFlags: # -- Enable extra Envoy statistics generated by a custom WASM extension - enableWASMStats: true + enableWASMStats: false # -- Enable OSM's Egress policy API. # When enabled, fine grained control over Egress (external) traffic is enforced enableEgressPolicy: true @@ -519,6 +596,8 @@ osm: enableSnapshotCacheMode: false # -- Enable Retry Policy for automatic request retries enableRetryPolicy: false + # -- Enable Plugin Policy for extend + enablePluginPolicy: false # -- Enable the MeshRootCertificate to configure the OSM certificate provider enableMeshRootCertificate: false