From c74ff8d657e097fef1c020707f686b0cea8571bd Mon Sep 17 00:00:00 2001 From: Andrew McCully Date: Wed, 15 Sep 2021 14:40:32 +0100 Subject: [PATCH 1/5] somewhat working monitoring commit --- examples/monitoring/README.md | 22 + .../monitoring/confluent/control-centre.yaml | 42 + .../monitoring/confluent/kafka-connect.yaml | 27 + examples/monitoring/confluent/kafka.yaml | 81 + examples/monitoring/confluent/ksqldb.yaml | 29 + .../monitoring/confluent/kustomization.yaml | 17 + examples/monitoring/confluent/ldap.yaml | 171 + examples/monitoring/confluent/namespace.yaml | 4 + examples/monitoring/confluent/rest-class.yaml | 10 + .../monitoring/confluent/schema-registry.yaml | 28 + examples/monitoring/confluent/zookeeper.yaml | 11 + examples/monitoring/grafana/configmap.yaml | 24 + .../monitoring/grafana/dashboard-config.yaml | 24 + examples/monitoring/grafana/dashboards.yaml | 4518 +++++++++++++++++ examples/monitoring/grafana/datasources.yaml | 22 + examples/monitoring/grafana/deployment.yaml | 118 + .../monitoring/grafana/kustomization.yaml | 11 + examples/monitoring/grafana/pvc.yaml | 19 + examples/monitoring/grafana/secret.yaml | 16 + examples/monitoring/grafana/service.yaml | 25 + .../monitoring/grafana/serviceaccount.yaml | 14 + examples/monitoring/kustomization.yaml | 8 + examples/monitoring/operator/deployment.yaml | 12 + .../monitoring/operator/kustomization.yaml | 5 + .../monitoring/producer/generate_propery.sh | 5 + .../producer/kafka-client-config.yaml | 7 + examples/monitoring/producer/kafka.properties | 6 + .../monitoring/producer/kustomization.yaml | 5 + .../monitoring/producer/producer-app.yaml | 55 + .../monitoring/producer/source-topic.yaml | 14 + .../prometheus/alertmanager/clusterrole.yaml | 14 + .../alertmanager/clusterrolebinding.yaml | 20 + .../prometheus/alertmanager/cm.yaml | 23 + .../prometheus/alertmanager/deploy.yaml | 86 + .../alertmanager/kustomization.yaml | 9 + .../prometheus/alertmanager/pvc.yaml | 19 + .../prometheus/alertmanager/service.yaml | 25 + .../alertmanager/serviceaccount.yaml | 15 + .../prometheus/kafka-exporter/deployment.yaml | 41 + .../kafka-exporter/kustomization.yaml | 8 + .../kafka-exporter/podsecuritypolicy.yaml | 39 + .../prometheus/kafka-exporter/role.yaml | 16 + .../kafka-exporter/rolebinding.yaml | 18 + .../prometheus/kafka-exporter/service.yaml | 23 + .../kafka-exporter/serviceaccount.yaml | 11 + .../monitoring/prometheus/kustomization.yaml | 6 + .../prometheus/node-exporter/daemonset.yaml | 74 + .../node-exporter/kustomization.yaml | 5 + .../node-exporter/serviceaccount.yaml | 15 + .../prometheus/node-exporter/svc.yaml | 27 + .../prometheus/pushgateway/clusterrole.yaml | 14 + .../pushgateway/clusterrolebinding.yaml | 20 + .../prometheus/pushgateway/deploy.yaml | 54 + .../prometheus/pushgateway/service.yaml | 26 + .../pushgateway/serviceaccount.yaml | 15 + .../prometheus/server/clusterrole.yaml | 42 + .../prometheus/server/clusterrolebinding.yaml | 20 + examples/monitoring/prometheus/server/cm.yaml | 374 ++ .../monitoring/prometheus/server/deploy.yaml | 98 + .../prometheus/server/kustomization.yaml | 9 + .../monitoring/prometheus/server/pvc.yaml | 19 + .../monitoring/prometheus/server/service.yaml | 25 + .../prometheus/server/serviceaccount.yaml | 15 + .../rolebindings/connect/connect-base.yaml | 45 + .../rolebindings/connect/kustomization.yaml | 5 + .../controlcenter-testadmin-rolebindings.yaml | 70 + .../rolebindings/ksqldb/ksqldb-base.yaml | 29 + .../rolebindings/ksqldb/kustomization.yaml | 5 + .../rolebindings/kustomization.yaml | 6 + .../schemaregistry/kustomization.yaml | 6 + .../schemaregistry/schemaregistry-base.yaml | 32 + .../schemaregistry/test-user.yaml | 32 + kustomize/base/operator/clusterrole.yaml | 2 +- .../base/operator/clusterrolebinding.yaml | 2 +- kustomize/base/operator/deployment.yaml | 8 +- kustomize/base/operator/licensing.yaml | 2 +- kustomize/base/operator/service.yaml | 2 +- kustomize/base/operator/serviceaccount.yaml | 2 +- .../crds/platform.confluent.io_connects.yaml | 377 +- .../platform.confluent.io_controlcenters.yaml | 365 +- ...latform.confluent.io_kafkarestclasses.yaml | 66 +- .../crds/platform.confluent.io_kafkas.yaml | 1395 ++++- .../platform.confluent.io_kafkatopics.yaml | 33 +- .../crds/platform.confluent.io_ksqldbs.yaml | 365 +- ...latform.confluent.io_schemaregistries.yaml | 376 +- .../platform.confluent.io_zookeepers.yaml | 112 - 86 files changed, 9042 insertions(+), 870 deletions(-) create mode 100644 examples/monitoring/README.md create mode 100644 examples/monitoring/confluent/control-centre.yaml create mode 100644 examples/monitoring/confluent/kafka-connect.yaml create mode 100644 examples/monitoring/confluent/kafka.yaml create mode 100644 examples/monitoring/confluent/ksqldb.yaml create mode 100644 examples/monitoring/confluent/kustomization.yaml create mode 100644 examples/monitoring/confluent/ldap.yaml create mode 100644 examples/monitoring/confluent/namespace.yaml create mode 100644 examples/monitoring/confluent/rest-class.yaml create mode 100644 examples/monitoring/confluent/schema-registry.yaml create mode 100644 examples/monitoring/confluent/zookeeper.yaml create mode 100644 examples/monitoring/grafana/configmap.yaml create mode 100644 examples/monitoring/grafana/dashboard-config.yaml create mode 100644 examples/monitoring/grafana/dashboards.yaml create mode 100644 examples/monitoring/grafana/datasources.yaml create mode 100644 examples/monitoring/grafana/deployment.yaml create mode 100644 examples/monitoring/grafana/kustomization.yaml create mode 100644 examples/monitoring/grafana/pvc.yaml create mode 100644 examples/monitoring/grafana/secret.yaml create mode 100644 examples/monitoring/grafana/service.yaml create mode 100644 examples/monitoring/grafana/serviceaccount.yaml create mode 100644 examples/monitoring/kustomization.yaml create mode 100644 examples/monitoring/operator/deployment.yaml create mode 100644 examples/monitoring/operator/kustomization.yaml create mode 100755 examples/monitoring/producer/generate_propery.sh create mode 100644 examples/monitoring/producer/kafka-client-config.yaml create mode 100644 examples/monitoring/producer/kafka.properties create mode 100644 examples/monitoring/producer/kustomization.yaml create mode 100644 examples/monitoring/producer/producer-app.yaml create mode 100644 examples/monitoring/producer/source-topic.yaml create mode 100644 examples/monitoring/prometheus/alertmanager/clusterrole.yaml create mode 100644 examples/monitoring/prometheus/alertmanager/clusterrolebinding.yaml create mode 100644 examples/monitoring/prometheus/alertmanager/cm.yaml create mode 100644 examples/monitoring/prometheus/alertmanager/deploy.yaml create mode 100644 examples/monitoring/prometheus/alertmanager/kustomization.yaml create mode 100644 examples/monitoring/prometheus/alertmanager/pvc.yaml create mode 100644 examples/monitoring/prometheus/alertmanager/service.yaml create mode 100644 examples/monitoring/prometheus/alertmanager/serviceaccount.yaml create mode 100644 examples/monitoring/prometheus/kafka-exporter/deployment.yaml create mode 100644 examples/monitoring/prometheus/kafka-exporter/kustomization.yaml create mode 100644 examples/monitoring/prometheus/kafka-exporter/podsecuritypolicy.yaml create mode 100644 examples/monitoring/prometheus/kafka-exporter/role.yaml create mode 100644 examples/monitoring/prometheus/kafka-exporter/rolebinding.yaml create mode 100644 examples/monitoring/prometheus/kafka-exporter/service.yaml create mode 100644 examples/monitoring/prometheus/kafka-exporter/serviceaccount.yaml create mode 100644 examples/monitoring/prometheus/kustomization.yaml create mode 100644 examples/monitoring/prometheus/node-exporter/daemonset.yaml create mode 100644 examples/monitoring/prometheus/node-exporter/kustomization.yaml create mode 100644 examples/monitoring/prometheus/node-exporter/serviceaccount.yaml create mode 100644 examples/monitoring/prometheus/node-exporter/svc.yaml create mode 100644 examples/monitoring/prometheus/pushgateway/clusterrole.yaml create mode 100644 examples/monitoring/prometheus/pushgateway/clusterrolebinding.yaml create mode 100644 examples/monitoring/prometheus/pushgateway/deploy.yaml create mode 100644 examples/monitoring/prometheus/pushgateway/service.yaml create mode 100644 examples/monitoring/prometheus/pushgateway/serviceaccount.yaml create mode 100644 examples/monitoring/prometheus/server/clusterrole.yaml create mode 100644 examples/monitoring/prometheus/server/clusterrolebinding.yaml create mode 100644 examples/monitoring/prometheus/server/cm.yaml create mode 100644 examples/monitoring/prometheus/server/deploy.yaml create mode 100644 examples/monitoring/prometheus/server/kustomization.yaml create mode 100644 examples/monitoring/prometheus/server/pvc.yaml create mode 100644 examples/monitoring/prometheus/server/service.yaml create mode 100644 examples/monitoring/prometheus/server/serviceaccount.yaml create mode 100644 examples/monitoring/rolebindings/connect/connect-base.yaml create mode 100644 examples/monitoring/rolebindings/connect/kustomization.yaml create mode 100644 examples/monitoring/rolebindings/controlcenter-testadmin-rolebindings.yaml create mode 100644 examples/monitoring/rolebindings/ksqldb/ksqldb-base.yaml create mode 100644 examples/monitoring/rolebindings/ksqldb/kustomization.yaml create mode 100644 examples/monitoring/rolebindings/kustomization.yaml create mode 100644 examples/monitoring/rolebindings/schemaregistry/kustomization.yaml create mode 100644 examples/monitoring/rolebindings/schemaregistry/schemaregistry-base.yaml create mode 100644 examples/monitoring/rolebindings/schemaregistry/test-user.yaml diff --git a/examples/monitoring/README.md b/examples/monitoring/README.md new file mode 100644 index 0000000..8346687 --- /dev/null +++ b/examples/monitoring/README.md @@ -0,0 +1,22 @@ +# Basic Deployment +This example deploys a basic deployment. No RBAC/LDAP. Just a single topic 'foobar' is added as part of the pipeline. +### Deploy CRDs +Deploy the CRDS using the standard way: +```shell +kubectl apply -k ../../kustomize/crds +``` +### Deploy Confluent Operator and Confluent Services +Deploy the confluent operator and services: +```shell +kubectl apply -k . +``` + + +Portforward Grafana +Login with admin/password + +opensofttools/kafka_exporter:latest + +kubectl port-forward \ +$(kubectl get pods -n default -l app.kubernetes.io/name=grafana,app.kubernetes.io/instance=grafana -o name) \ +3000 --namespace default \ No newline at end of file diff --git a/examples/monitoring/confluent/control-centre.yaml b/examples/monitoring/confluent/control-centre.yaml new file mode 100644 index 0000000..05ca132 --- /dev/null +++ b/examples/monitoring/confluent/control-centre.yaml @@ -0,0 +1,42 @@ +apiVersion: platform.confluent.io/v1beta1 +kind: ControlCenter +metadata: + name: controlcenter +spec: + authorization: + type: rbac + tls: + secretRef: tls-group1 + dependencies: + kafka: + bootstrapEndpoint: kafka.sandbox.svc.cluster.local:9071 + authentication: + type: plain + jaasConfig: + secretRef: mds-client-connect + tls: + enabled: true + mds: + endpoint: https://kafka.sandbox.svc.cluster.local:8090 + tokenKeyPair: + secretRef: mds-public + authentication: + type: bearer + bearer: + secretRef: mds-client-c3 + tls: + enabled: true + connect: + - name: connect + url: https://connect.sandbox.svc.cluster.local:8083 + tls: + enabled: true + ksqldb: + - name: ksqldb + url: https://ksqldb.sandbox.svc.cluster.local:8088 + tls: + enabled: true + schemaRegistry: + url: https://schemaregistry.sandbox.svc.cluster.local:8081 + tls: + enabled: true \ No newline at end of file diff --git a/examples/monitoring/confluent/kafka-connect.yaml b/examples/monitoring/confluent/kafka-connect.yaml new file mode 100644 index 0000000..23a0939 --- /dev/null +++ b/examples/monitoring/confluent/kafka-connect.yaml @@ -0,0 +1,27 @@ +--- +apiVersion: platform.confluent.io/v1beta1 +kind: Connect +metadata: + name: connect +spec: + tls: + secretRef: tls-group1 + authorization: + type: rbac + dependencies: + kafka: + bootstrapEndpoint: kafka.sandbox.svc.cluster.local:9071 + authentication: + type: plain + jaasConfig: + secretRef: mds-client-connect + tls: + enabled: true + mds: + endpoint: https://kafka.sandbox.svc.cluster.local:8090 + tokenKeyPair: + secretRef: mds-public + authentication: + type: bearer + bearer: + secretRef: mds-client-connect diff --git a/examples/monitoring/confluent/kafka.yaml b/examples/monitoring/confluent/kafka.yaml new file mode 100644 index 0000000..bd56b96 --- /dev/null +++ b/examples/monitoring/confluent/kafka.yaml @@ -0,0 +1,81 @@ +--- +apiVersion: platform.confluent.io/v1beta1 +kind: Kafka +metadata: + name: kafka +spec: + configOverrides: + server: + - confluent.schema.registry.url=https://schemaregistry.sandbox.svc.cluster.local:8081 + - listener.name.internal.plain.sasl.server.callback.handler.class=io.confluent.security.auth.provider.ldap.LdapAuthenticateCallbackHandler + - listener.name.external.plain.sasl.server.callback.handler.class=io.confluent.security.auth.provider.ldap.LdapAuthenticateCallbackHandler + - listener.name.replication.plain.sasl.server.callback.handler.class=io.confluent.security.auth.provider.ldap.LdapAuthenticateCallbackHandler + tls: + secretRef: tls-group1 + metricReporter: + enabled: true + authentication: + type: plain + jaasConfigPassThrough: + secretRef: broker-credential + tls: + enabled: true + listeners: + internal: + authentication: + type: plain + jaasConfigPassThrough: + secretRef: broker-credential + tls: + enabled: true + external: + authentication: + type: plain + jaasConfigPassThrough: + secretRef: broker-credential + tls: + enabled: true + authorization: + type: rbac + superUsers: + - User:kafka + services: + mds: + tls: + enabled: true + tokenKeyPair: + secretRef: broker-credential + provider: + type: ldap + ldap: + address: ldap://ldap.sandbox.svc.cluster.local:389 + authentication: + type: simple + simple: + secretRef: broker-credential + tls: + enabled: true + configurations: + groupNameAttribute: cn + groupObjectClass: groupOfNames + groupMemberAttribute: member + groupMemberAttributePattern: cn=(.*),ou=users,dc=test,dc=com + groupSearchBase: ou=groups,dc=test,dc=com + userNameAttribute: cn + userMemberOfAttributePattern: cn=(.*),ou=users,dc=test,dc=com + userObjectClass: organizationalRole + userSearchBase: ou=users,dc=test,dc=com + dependencies: + kafkaRest: + authentication: + type: bearer + bearer: + secretRef: broker-credential + zookeeper: + endpoint: zookeeper.sandbox.svc.cluster.local:2182 + authentication: + type: digest + jaasConfig: + secretRef: broker-credential + tls: + enabled: true diff --git a/examples/monitoring/confluent/ksqldb.yaml b/examples/monitoring/confluent/ksqldb.yaml new file mode 100644 index 0000000..f8008ae --- /dev/null +++ b/examples/monitoring/confluent/ksqldb.yaml @@ -0,0 +1,29 @@ +--- +apiVersion: platform.confluent.io/v1beta1 +kind: KsqlDB +metadata: + name: ksqldb +spec: + authorization: + type: rbac + tls: + secretRef: tls-group1 + dependencies: + kafka: + bootstrapEndpoint: kafka.sandbox.svc.cluster.local:9071 + authentication: + type: plain + jaasConfig: + secretRef: mds-client-connect + tls: + enabled: true + mds: + endpoint: https://kafka.sandbox.svc.cluster.local:8090 + tokenKeyPair: + secretRef: mds-public + authentication: + type: bearer + bearer: + secretRef: mds-client-ksqldb + tls: + enabled: true \ No newline at end of file diff --git a/examples/monitoring/confluent/kustomization.yaml b/examples/monitoring/confluent/kustomization.yaml new file mode 100644 index 0000000..c54e747 --- /dev/null +++ b/examples/monitoring/confluent/kustomization.yaml @@ -0,0 +1,17 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +namespace: sandbox +resources: +- ldap.yaml +- namespace.yaml +- ../../../kustomize/base/confluent +- ../../../kustomize/base/secrets-tls +- ../../../kustomize/base/secrets-user +patchesStrategicMerge: + - zookeeper.yaml + - kafka.yaml + - rest-class.yaml + - control-centre.yaml + - kafka-connect.yaml + - ksqldb.yaml + - schema-registry.yaml diff --git a/examples/monitoring/confluent/ldap.yaml b/examples/monitoring/confluent/ldap.yaml new file mode 100644 index 0000000..8110e93 --- /dev/null +++ b/examples/monitoring/confluent/ldap.yaml @@ -0,0 +1,171 @@ +apiVersion: v1 +kind: Pod +metadata: + name: ldap + labels: + role: ldap + app: ldap +spec: + containers: + - name: ldap + args: + - --copy-service + - --loglevel=debug + image: osixia/openldap:1.3.0 + ports: + - name: ldap + containerPort: 389 + - name: ldaps + containerPort: 636 + livenessProbe: + tcpSocket: + port: 389 + initialDelaySeconds: 15 + periodSeconds: 20 + env: + - name: LDAP_ORGANISATION + value: "Test Inc." + - name: LDAP_DOMAIN + value: "test.com" + - name: LDAP_ADMIN_PASSWORD + value: "confluentrox" + - name: LDAP_CONFIG_PASSWORD + value: "confluentconfigrox" + - name: LDAP_READONLY_USER + value: "True" + - name: LDAP_READONLY_USER_USERNAME + value: "mds" + - name: LDAP_READONLY_USER_PASSWORD + value: "Developer!" + - name: LDAP_TLS + value: "False" + volumeMounts: + - mountPath: /container/service/slapd/assets/config/bootstrap/ldif/custom + name: customldif + - mountPath: /var/lib/ldap + name: ldap-data + - mountPath: /etc/ldap/slapd.d + name: ldap-config + volumes: + - name: customldif + configMap: + defaultMode: 420 + name: ldap-ldifs + - name: ldap-data + emptyDir: {} + - name: ldap-config + emptyDir: {} + restartPolicy: Always +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: ldap-ldifs +data: + 0_groups.ldif: |- + dn: ou=groups,dc=test,dc=com + objectClass: organizationalUnit + objectClass: top + ou: groups + 0_users.ldif: |- + dn: ou=users,dc=test,dc=com + objectClass: organizationalUnit + objectClass: top + ou: users + 1_emmy.ldif: |- + dn: cn=emmy,ou=users,dc=test,dc=com + userPassword: emmy-secret + objectClass: simpleSecurityObject + objectClass: organizationalRole + description: Interested in action and conservation. If you like it, you should put a Noetherian Ring on it. + cn: emmy + 1_alice.ldif: |- + dn: cn=alice,ou=users,dc=test,dc=com + userPassword: alice-secret + objectClass: simpleSecurityObject + objectClass: organizationalRole + description: Alice is great at changing perspectives, but sometimes chases down rabbit holes + cn: alice + 1_developers.ldif: |- + dn: cn=developers,ou=groups,dc=test,dc=com + objectClass: top + objectClass: groupOfNames + description: A group of software developers and the apps they are responsible for + cn: developers + member: cn=emmy,ou=users,dc=test,dc=com + member: cn=alice,ou=users,dc=test,dc=com + 1_kafka.ldif: |- + dn: cn=kafka,ou=users,dc=test,dc=com + userPassword: kafka-secret + description: kafka user + objectClass: simpleSecurityObject + objectClass: organizationalRole + cn: kafka + 1_erp.ldif: |- + dn: cn=erp,ou=users,dc=test,dc=com + userPassword: erp-secret + description: erp user + objectClass: simpleSecurityObject + objectClass: organizationalRole + cn: erp + 1_sr.ldif: |- + dn: cn=sr,ou=users,dc=test,dc=com + userPassword: sr-secret + description: schema registry user + objectClass: simpleSecurityObject + objectClass: organizationalRole + cn: sr + 1_c3.ldif: |- + dn: cn=c3,ou=users,dc=test,dc=com + userPassword: c3-secret + description: control center user + objectClass: simpleSecurityObject + objectClass: organizationalRole + cn: c3 + 1_ksql.ldif: |- + dn: cn=ksql,ou=users,dc=test,dc=com + userPassword: ksql-secret + description: ksql user + objectClass: simpleSecurityObject + objectClass: organizationalRole + cn: ksql + 1_connect.ldif: |- + dn: cn=connect,ou=users,dc=test,dc=com + userPassword: connect-secret + description: connect user + objectClass: simpleSecurityObject + objectClass: organizationalRole + cn: connect + 1_replicator.ldif: |- + dn: cn=replicator,ou=users,dc=test,dc=com + userPassword: replicator-secret + description: replicator user + objectClass: simpleSecurityObject + objectClass: organizationalRole + cn: replicator + 1_c3-test.ldif: |- + dn: cn=testadmin,ou=users,dc=test,dc=com + userPassword: testadmin + description: testadmin user + objectClass: simpleSecurityObject + objectClass: organizationalRole + cn: testadmin +--- +apiVersion: v1 +kind: Service +metadata: + name: ldap + labels: + app: ldap +spec: + ports: + - port: 389 + name: ldap + - port: 636 + name: ldaps + clusterIP: None + selector: + app: ldap + + + diff --git a/examples/monitoring/confluent/namespace.yaml b/examples/monitoring/confluent/namespace.yaml new file mode 100644 index 0000000..6b30586 --- /dev/null +++ b/examples/monitoring/confluent/namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: sandbox diff --git a/examples/monitoring/confluent/rest-class.yaml b/examples/monitoring/confluent/rest-class.yaml new file mode 100644 index 0000000..56ea65d --- /dev/null +++ b/examples/monitoring/confluent/rest-class.yaml @@ -0,0 +1,10 @@ +apiVersion: platform.confluent.io/v1beta1 +kind: KafkaRestClass +metadata: + name: default +spec: + kafkaRest: + authentication: + type: bearer + bearer: + secretRef: rest-credential \ No newline at end of file diff --git a/examples/monitoring/confluent/schema-registry.yaml b/examples/monitoring/confluent/schema-registry.yaml new file mode 100644 index 0000000..ddb59cf --- /dev/null +++ b/examples/monitoring/confluent/schema-registry.yaml @@ -0,0 +1,28 @@ +apiVersion: platform.confluent.io/v1beta1 +kind: SchemaRegistry +metadata: + name: schemaregistry +spec: + authorization: + type: rbac + tls: + secretRef: tls-group1 + dependencies: + kafka: + bootstrapEndpoint: kafka.sandbox.svc.cluster.local:9071 + authentication: + type: plain + jaasConfig: + secretRef: mds-client-sr + tls: + enabled: true + mds: + endpoint: https://kafka.sandbox.svc.cluster.local:8090 + tokenKeyPair: + secretRef: mds-public + authentication: + type: bearer + bearer: + secretRef: mds-client-sr + tls: + enabled: true \ No newline at end of file diff --git a/examples/monitoring/confluent/zookeeper.yaml b/examples/monitoring/confluent/zookeeper.yaml new file mode 100644 index 0000000..73286c2 --- /dev/null +++ b/examples/monitoring/confluent/zookeeper.yaml @@ -0,0 +1,11 @@ +apiVersion: platform.confluent.io/v1beta1 +kind: Zookeeper +metadata: + name: zookeeper +spec: + authentication: + type: digest + jaasConfig: + secretRef: zk-credential + tls: + secretRef: tls-group1 diff --git a/examples/monitoring/grafana/configmap.yaml b/examples/monitoring/grafana/configmap.yaml new file mode 100644 index 0000000..7752041 --- /dev/null +++ b/examples/monitoring/grafana/configmap.yaml @@ -0,0 +1,24 @@ +--- +# Source: grafana/templates/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: oso-grafana-envvars + namespace: default + labels: + app.kubernetes.io/name: grafana + helm.sh/chart: grafana-6.1.11 + app.kubernetes.io/instance: oso + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: grafana +data: + GF_SECURITY_ADMIN_USER: "admin" + GF_INSTALL_PLUGINS: "" + GF_PATHS_PLUGINS: "/opt/bitnami/grafana/data/plugins" + GF_AUTH_LDAP_ENABLED: "false" + GF_AUTH_LDAP_CONFIG_FILE: "/opt/bitnami/grafana/conf/ldap.toml" + GF_AUTH_LDAP_ALLOW_SIGN_UP: "false" + GF_PATHS_PROVISIONING: "/opt/bitnami/grafana/conf/provisioning" + GF_PATHS_CONFIG: "/opt/bitnami/grafana/conf/grafana.ini" + GF_PATHS_DATA: "/opt/bitnami/grafana/data" + GF_PATHS_LOGS: "/opt/bitnami/grafana/logs" diff --git a/examples/monitoring/grafana/dashboard-config.yaml b/examples/monitoring/grafana/dashboard-config.yaml new file mode 100644 index 0000000..8cc2884 --- /dev/null +++ b/examples/monitoring/grafana/dashboard-config.yaml @@ -0,0 +1,24 @@ +--- +# Source: prometheus/templates/server/cm.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + component: "server" + app: grafna + release: oso + name: oso-grafana-server-dashboard-config +data: + config.yaml: | + apiVersion: 1 + providers: + - name: 'oso-provider' + orgId: 1 + folder: 'confluent-examples' + type: file + disableDeletion: true + updateIntervalSeconds: 10 + allowUiUpdates: true + options: + path: /opt/bitnami/grafana/conf/provisioning/dashboard-source + foldersFromFilesStructure: true diff --git a/examples/monitoring/grafana/dashboards.yaml b/examples/monitoring/grafana/dashboards.yaml new file mode 100644 index 0000000..9234ee0 --- /dev/null +++ b/examples/monitoring/grafana/dashboards.yaml @@ -0,0 +1,4518 @@ +--- +# Source: prometheus/templates/server/cm.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + component: "server" + app: grafna + release: oso + name: oso-grafana-server-dashboards +data: + confluent-platform.json: | + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": null, + "graphTooltip": 0, + "id": 2, + "iteration": 1631707196139, + "links": [], + "panels": [ + { + "collapsed": false, + "datasource": "prometheus", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 137, + "panels": [], + "title": "Disk", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 11, + "w": 24, + "x": 0, + "y": 1 + }, + "hiddenSeries": false, + "id": 132, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "io_confluent_caas_volumemetrics_used{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Used {{kubernetes_pod_name }}", + "refId": "A" + }, + { + "exemplar": true, + "expr": "io_confluent_caas_volumemetrics_total{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "hide": false, + "instant": false, + "interval": "", + "legendFormat": "Total {{kubernetes_pod_name}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Disk Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:1769", + "format": "decbytes", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:1770", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Kafka Broker Pods Disk Usage", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 11, + "x": 0, + "y": 12 + }, + "hiddenSeries": false, + "id": 83, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "io_confluent_caas_volumemetrics_percentused{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{kubernetes_pod_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Disk Usage (Percentage)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:1769", + "format": "percent", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:1770", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Kafka Broker Pods Disk Usage", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 13, + "x": 11, + "y": 12 + }, + "hiddenSeries": false, + "id": 138, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "io_confluent_caas_volumemetrics_percentavailable{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{kubernetes_pod_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Disk Availabe (Percentage)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:1769", + "format": "percent", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:1770", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": "prometheus", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 21 + }, + "id": 127, + "panels": [], + "title": "CPU/Mem", + "type": "row" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Aggregated Kafka Broker Pods CPU Usage", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 22 + }, + "hiddenSeries": false, + "id": 128, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(rate (container_cpu_usage_seconds_total{pod=~\"$component_name-(\\\\d+)\"}[5m])) by (pod)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{pod_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "CPU Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Kafka Broker Pods Memory Usage", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 22 + }, + "hiddenSeries": false, + "id": 82, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(container_memory_usage_bytes{pod=~\"$component_name-(\\\\d+)\"}) by (pod)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{pod_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": "prometheus", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 29 + }, + "id": 28, + "panels": [], + "repeat": null, + "title": "Confluent Server", + "type": "row" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "Number of Brokers Online", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#d44a3a", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 0 + }, + { + "color": "#299c46", + "value": 2 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 0, + "y": 30 + }, + "id": 46, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "repeat": null, + "repeatDirection": "h", + "targets": [ + { + "expr": "count(kafka_server_replicamanager_value{name=\"LeaderCount\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "title": "Brokers Online", + "type": "stat" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "Number of active controllers in the cluster.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#299c46", + "value": null + }, + { + "color": "#e5ac0e", + "value": 2 + }, + { + "color": "#bf1b00" + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 4, + "y": 30 + }, + "id": 36, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "sum(sum(kafka_controller_kafkacontroller_value{name=\"ActiveControllerCount\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"}))", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Active Controllers", + "type": "stat" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "Unclean leader election rate", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#299c46", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 2 + }, + { + "color": "#d44a3a" + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 8, + "y": 30 + }, + "id": 38, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "sum(kafka_controller_controllerstats_oneminuterate{name=~\"UncleanLeaderElectionsPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Unclean Leader Election Rate", + "type": "stat" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "Partitions that are online", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#d44a3a", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 0 + }, + { + "color": "#299c46", + "value": 0 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 12, + "y": 30 + }, + "id": 40, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "sum(kafka_server_replicamanager_value{name=~\"PartitionCount\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Online Partitions", + "type": "stat" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "Number of under-replicated partitions (| ISR | < | all replicas |).", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#508642", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 1 + }, + { + "color": "#bf1b00", + "value": 5 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 16, + "y": 30 + }, + "id": 30, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "sum(kafka_server_replicamanager_value{name=~\"UnderReplicatedPartitions\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "refId": "A" + } + ], + "title": "Under Replicated Partitions", + "type": "stat" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "Number of partitions that don’t have an active leader and are hence not writable or readable.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#508642", + "value": null + }, + { + "color": "#ef843c", + "value": 1 + }, + { + "color": "#bf1b00", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 20, + "y": 30 + }, + "id": 32, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "sum(kafka_server_replicamanager_value{name=~\"OfflineReplicaCount\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Offline Partitions Count", + "type": "stat" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Byte Rate", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 34 + }, + "hiddenSeries": false, + "id": 44, + "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, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"BytesInPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "Incoming Byte Rate", + "refId": "A" + }, + { + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"BytesOutPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Outgoing Byte Rate", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Byte Rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": null, + "format": "bytes", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 34 + }, + "hiddenSeries": false, + "id": 58, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"MessagesInPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{Messages In Per Second}}", + "refId": "D" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Messages In Per Second", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Request Handler Avg Idle Percent", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 41 + }, + "hiddenSeries": false, + "id": 62, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "kafka_server_kafkarequesthandlerpool_oneminuterate{name=~\"RequestHandlerAvgIdlePercent\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"}*100", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{kubernetes_pod_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Request Handler Avg Idle Percent", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Produce Request Rate.", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 42 + }, + "hiddenSeries": false, + "id": 50, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"TotalProduceRequestsPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Total Produce Request Rate", + "refId": "A" + }, + { + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"FailedProduceRequestsPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Failed Produce Request Rate", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Produce Request Rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Fetch Request Rate", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 49 + }, + "hiddenSeries": false, + "id": 56, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=~\"TotalFetchRequestsPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Fetch Request Rate", + "refId": "A" + }, + { + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=~\"FailedFetchRequestsPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Failed Fetch Request Rate", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Fetch Request Rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Network Processor Avg Idle Percent", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 50 + }, + "hiddenSeries": false, + "id": 60, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "kafka_network_socketserver_value{name=~\"NetworkProcessorAvgIdlePercent\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"}*100", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{kubernetes_pod_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Network Processor Avg Idle Percent", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": "prometheus", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 58 + }, + "id": 26, + "panels": [], + "repeat": null, + "title": "Confluent Zookeeper", + "type": "row" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "Quorum Size of Zookeeper ensemble", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#d44a3a", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 2 + }, + { + "color": "#299c46", + "value": 3 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 0, + "y": 59 + }, + "id": 52, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "avg({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_quorumsize\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Quorum Size", + "type": "stat" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "Number of Alive Connections", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#299c46", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 60 + }, + { + "color": "#d44a3a", + "value": 120 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 4, + "y": 59 + }, + "id": 54, + "interval": "", + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "sum({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_numaliveconnections\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Alive Connections", + "type": "stat" + }, + { + "alert": { + "conditions": [ + { + "evaluator": { + "params": [ + 10 + ], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A", + "5m", + "now" + ] + }, + "reducer": { + "params": [], + "type": "avg" + }, + "type": "query" + } + ], + "executionErrorState": "alerting", + "for": "0m", + "frequency": "60s", + "handler": 1, + "name": "Outstanding Requests alert", + "noDataState": "no_data", + "notifications": [] + }, + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Number of queued requests in the server. This goes up when the server receives more requests than it can process", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 16, + "x": 8, + "y": 59 + }, + "hiddenSeries": false, + "id": 12, + "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, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_outstandingrequests\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"} ", + "format": "time_series", + "instant": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{kubernetes_pod_name}}-{{name2}}", + "refId": "A" + } + ], + "thresholds": [ + { + "colorMode": "critical", + "fill": true, + "line": true, + "op": "gt", + "value": 10, + "visible": true + } + ], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Outstanding Requests", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#299c46", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 500 + }, + { + "color": "#d44a3a", + "value": 800 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 0, + "y": 63 + }, + "id": 64, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "avg({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_nodecount\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Number of ZNodes", + "type": "stat" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "Number of Watchers", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#299c46", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 100 + }, + { + "color": "#d44a3a", + "value": 200 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 4, + "y": 63 + }, + "id": 66, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "sum({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_watchcount\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Number of Watchers", + "type": "stat" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Amount of time it takes for the server to respond to a client request", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 67 + }, + "hiddenSeries": false, + "id": 10, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_minrequestlatency\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{kubernetes_pod_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Request Latency - Minimum", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Zookeeper Disk Usage (txnlog)", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 67 + }, + "hiddenSeries": false, + "id": 122, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kubelet_volume_stats_used_bytes{persistentvolumeclaim=~\"txnlog-$component_name.*\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{persistentvolumeclaim}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Disk Usage (txnlog)", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:2848", + "format": "bytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:2849", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "alert": { + "conditions": [ + { + "evaluator": { + "params": [ + 20 + ], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A", + "5m", + "now" + ] + }, + "reducer": { + "params": [], + "type": "avg" + }, + "type": "query" + } + ], + "executionErrorState": "alerting", + "frequency": "60s", + "handler": 1, + "name": "Request Latency - Maximum alert", + "noDataState": "no_data", + "notifications": [] + }, + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Amount of time it takes for the server to respond to a client request", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 74 + }, + "hiddenSeries": false, + "id": 8, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_maxrequestlatency\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{kubernetes_pod_name}}", + "refId": "A" + } + ], + "thresholds": [ + { + "colorMode": "critical", + "fill": true, + "line": true, + "op": "gt", + "value": 20, + "visible": true + } + ], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Request Latency - Maximum", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "alert": { + "conditions": [ + { + "evaluator": { + "params": [ + 10 + ], + "type": "gt" + }, + "operator": { + "type": "and" + }, + "query": { + "params": [ + "A", + "5m", + "now" + ] + }, + "reducer": { + "params": [], + "type": "avg" + }, + "type": "query" + } + ], + "executionErrorState": "alerting", + "frequency": "60s", + "handler": 1, + "name": "Request Latency - Average alert", + "noDataState": "no_data", + "notifications": [] + }, + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Amount of time it takes for the server to respond to a client request", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 75 + }, + "hiddenSeries": false, + "id": 6, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_avgrequestlatency\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{kubernetes_pod_name}}", + "refId": "A" + } + ], + "thresholds": [ + { + "colorMode": "critical", + "fill": true, + "line": true, + "op": "gt", + "value": 10, + "visible": true + } + ], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Request Latency - Average", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": false, + "datasource": "prometheus", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 83 + }, + "id": 97, + "panels": [], + "repeat": null, + "title": "Confluent Connect/Replicator", + "type": "row" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#299c46", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 1000000000 + }, + { + "color": "#d44a3a" + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 0, + "y": 84 + }, + "id": 99, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "sum(kafka_connect_connect_worker_metrics_connector_count{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "format": "time_series", + "instant": false, + "intervalFactor": 1, + "legendFormat": "{{ kubernetes_pod_name}}", + "refId": "A" + } + ], + "title": "Number of Connectors", + "type": "stat" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "The total number of connector starts that succeeded.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#299c46", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 100000000 + }, + { + "color": "#d44a3a" + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 4, + "y": 84 + }, + "id": 103, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "sum(kafka_connect_connect_worker_metrics_connector_startup_success_total{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Connector Startup Success Total", + "type": "stat" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "The total number of connector starts that failed.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#299c46", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 1 + }, + { + "color": "#d44a3a", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 8, + "y": 84 + }, + "id": 104, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "sum(kafka_connect_connect_worker_metrics_connector_startup_failure_total{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Connector Startup Failure Total", + "type": "stat" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#299c46", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 10000000000 + }, + { + "color": "#d44a3a" + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 12, + "y": 84 + }, + "id": 101, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "sum(kafka_connect_connect_worker_metrics_task_count{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Number of Tasks", + "type": "stat" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "The total number of task starts that succeeded.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#299c46", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 10000000000 + }, + { + "color": "#d44a3a" + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 16, + "y": 84 + }, + "id": 105, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "sum(kafka_connect_connect_worker_metrics_task_startup_success_total{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Task Startup Success Total", + "type": "stat" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "The total number of task starts that failed.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#299c46", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 1 + }, + { + "color": "#d44a3a", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 20, + "y": 84 + }, + "id": 106, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "sum(kafka_connect_connect_worker_metrics_task_startup_failure_total{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Task Startup Failure Total", + "type": "stat" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 0, + "y": 88 + }, + "hiddenSeries": false, + "id": 93, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kafka_connect_connect_metrics_io_ratio{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{ kubernetes_pod_name }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Connect Metrics: IO Rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 8, + "y": 88 + }, + "hiddenSeries": false, + "id": 91, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kafka_connect_connect_metrics_incoming_byte_rate{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{kubernetes_pod_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Connect Metrics: Incoming Byte Rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 8, + "x": 16, + "y": 88 + }, + "hiddenSeries": false, + "id": 95, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "8.1.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "kafka_connect_connect_metrics_network_io_rate{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{kubernetes_pod_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Connect Metrics: Network IO Rate", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "collapsed": true, + "datasource": "prometheus", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 95 + }, + "id": 110, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Total number of bytes consumed.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 8, + "x": 0, + "y": 34 + }, + "hiddenSeries": false, + "id": 108, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "repeat": null, + "repeatDirection": "h", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_bytes_consumed_total\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "format": "time_series", + "hide": false, + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ kubernetes_pod_name }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "KSQL Metrics: Bytes Consumed", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Messages consumed per second.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 8, + "x": 8, + "y": 34 + }, + "hiddenSeries": false, + "id": 114, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_messages_consumed_per_sec\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ kubernetes_pod_name }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "KSQL Metrics: Messages Consumed", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Messages produced per second.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 8, + "x": 16, + "y": 34 + }, + "hiddenSeries": false, + "id": 116, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_messages_produced_per_sec\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ kubernetes_pod_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "KSQL Metrics: Messages Produced", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Number of active queries.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 8, + "x": 0, + "y": 40 + }, + "hiddenSeries": false, + "id": 118, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_num_active_queries\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ kubernetes_pod_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "KSQL Metrics: Active Queries", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Number of idle queries.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 8, + "x": 8, + "y": 40 + }, + "hiddenSeries": false, + "id": 119, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_num_idle_queries\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{kubernetes_pod_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "KSQL Metrics: Idle Queries", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "description": "Number of persistent queries.", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 6, + "w": 8, + "x": 16, + "y": 40 + }, + "hiddenSeries": false, + "id": 120, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.2", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_num_persistent_queries\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": " {{kubernetes_pod_name}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "KSQL Metrics: Persistent Queries", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "title": "Confluent ksqlDB Server", + "type": "row" + }, + { + "collapsed": true, + "datasource": "prometheus", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 96 + }, + "id": 79, + "panels": [ + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "Number of Kafka Schema Registry servers", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#d44a3a", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 1 + }, + { + "color": "#299c46", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 5, + "x": 0, + "y": 35 + }, + "id": 123, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "exemplar": true, + "expr": "count({__name__=~\"schemaregistry_.*_jetty_metrics_connections_active\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "title": "Number of Kafka Schema Registry servers", + "type": "stat" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "Total number of active TCP connections.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#d44a3a", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 0 + }, + { + "color": "#299c46", + "value": 0 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 5, + "x": 5, + "y": 35 + }, + "id": 73, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "sum({__name__=~\"schemaregistry_.*_jetty_metrics_connections_active\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Active Connections", + "type": "stat" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "The average rate per second of opened TCP connections.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#299c46", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 50 + }, + { + "color": "#d44a3a", + "value": 100 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 5, + "x": 10, + "y": 35 + }, + "id": 74, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "avg({__name__=~\"schemaregistry_.*_jetty_metrics_connections_opened_rate\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Open Rate", + "type": "stat" + }, + { + "cacheTimeout": null, + "datasource": "prometheus", + "description": "The average rate per second of closed TCP connections.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#299c46", + "value": null + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 50 + }, + { + "color": "#d44a3a", + "value": 100 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 5, + "x": 15, + "y": 35 + }, + "id": 75, + "interval": null, + "links": [], + "maxDataPoints": 100, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "auto" + }, + "pluginVersion": "8.1.2", + "targets": [ + { + "expr": "avg({__name__=~\"schemaregistry_.*_jetty_metrics_connections_closed_rate\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "format": "time_series", + "intervalFactor": 1, + "refId": "A" + } + ], + "title": "Close Rate", + "type": "stat" + } + ], + "title": "Confluent Schema Registry", + "type": "row" + }, + { + "collapsed": true, + "datasource": "prometheus", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 97 + }, + "id": 125, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "prometheus", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 30 + }, + "hiddenSeries": false, + "id": 130, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.5.2", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "exemplar": true, + "expr": "confluent_controlcenter_healthcheck_streams_status{kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"}", + "format": "time_series", + "instant": false, + "interval": "", + "legendFormat": "{{kubernetes_pod_name}}", + "refId": "Healthcheck Streams Status" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Healthcheck Streams Status", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:2476", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:2477", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "title": "Confluent ControlCenter", + "type": "row" + } + ], + "schemaVersion": 30, + "style": "dark", + "tags": [ + "6.0.x", + "6.1.x", + "6.2.x" + ], + "templating": { + "list": [ + { + "allValue": ".+", + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": "prometheus", + "definition": "label_values(kubernetes_namespace)", + "description": null, + "error": null, + "hide": 0, + "includeAll": true, + "label": "Namespace", + "multi": false, + "name": "namespace", + "options": [], + "query": { + "query": "label_values(kubernetes_namespace)", + "refId": "Prometheus-namespace-Variable-Query" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": ".+", + "current": { + "selected": true, + "text": "kafka", + "value": "kafka" + }, + "datasource": "prometheus", + "definition": "label_values(platform_confluent_io_type)", + "description": null, + "error": null, + "hide": 0, + "includeAll": false, + "label": "ClusterType", + "multi": false, + "name": "controller_type", + "options": [], + "query": { + "query": "label_values(platform_confluent_io_type)", + "refId": "StandardVariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": null, + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": "prometheus", + "definition": "label_values(kube_pod_labels{label_confluent_platform=\"true\",label_platform_confluent_io_type=\"$controller_type\"}, label_app)", + "description": null, + "error": null, + "hide": 0, + "includeAll": true, + "label": "Component", + "multi": false, + "name": "component_name", + "options": [], + "query": { + "query": "label_values(kube_pod_labels{label_confluent_platform=\"true\",label_platform_confluent_io_type=\"$controller_type\"}, label_app)", + "refId": "StandardVariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "Confluent Platform", + "uid": "hLZApsInk", + "version": 1 + } diff --git a/examples/monitoring/grafana/datasources.yaml b/examples/monitoring/grafana/datasources.yaml new file mode 100644 index 0000000..816d4d6 --- /dev/null +++ b/examples/monitoring/grafana/datasources.yaml @@ -0,0 +1,22 @@ +--- +# Source: prometheus/templates/server/cm.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + component: "server" + app: grafna + release: oso + name: oso-grafana-server-datasources +data: + prometheus.yml: | + apiVersion: 1 + datasources: + - access: 'proxy' + editable: true + is_default: true + name: 'prometheus' + org_id: 1 + type: 'prometheus' + url: 'http://oso-prometheus-server.sandbox.svc.cluster.local:80' + version: 1 \ No newline at end of file diff --git a/examples/monitoring/grafana/deployment.yaml b/examples/monitoring/grafana/deployment.yaml new file mode 100644 index 0000000..d4dc9db --- /dev/null +++ b/examples/monitoring/grafana/deployment.yaml @@ -0,0 +1,118 @@ +--- +# Source: grafana/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: oso-grafana + namespace: default + labels: + app.kubernetes.io/name: grafana + helm.sh/chart: grafana-6.1.11 + app.kubernetes.io/instance: oso + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: grafana +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: oso + app.kubernetes.io/component: grafana + strategy: + type: RollingUpdate + template: + metadata: + labels: + app.kubernetes.io/name: grafana + helm.sh/chart: grafana-6.1.11 + app.kubernetes.io/instance: oso + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: grafana + annotations: + checksum/secret: 071b561f1f90acdf28cf77c354e8db5aa60fe52dc656c5f175e72a7aed28abe5 + checksum/config: ca8b427900a3dcdd9888348a7e0abc43422f5e557b57164c9464a5b5c0e0e957 + checksum/dashboard-provider: 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b + spec: + serviceAccountName: oso-grafana + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: oso + app.kubernetes.io/component: grafana + namespaces: + - "default" + topologyKey: kubernetes.io/hostname + weight: 1 + nodeAffinity: + + securityContext: + runAsUser: 1001 + fsGroup: 1001 + runAsNonRoot: true + containers: + - name: grafana + image: docker.io/bitnami/grafana:8.1.2-debian-10-r6 + imagePullPolicy: IfNotPresent + envFrom: + - configMapRef: + name: oso-grafana-envvars + env: + - name: GF_INSTALL_PLUGINS + value: "grafana-piechart-panel" + - name: GF_SECURITY_ADMIN_USER + value: "admin" + - name: GF_SECURITY_ADMIN_PASSWORD + value: "password" + - name: GF_USERS_ALLOW_SIGN_UP + value: "false" + volumeMounts: + - name: data + mountPath: /opt/bitnami/grafana/data + - name: data-sources + mountPath: /opt/bitnami/grafana/conf/provisioning/datasources + - name: dashboard-config + mountPath: /opt/bitnami/grafana/conf/provisioning/dashboards + - name: dashboards + mountPath: /opt/bitnami/grafana/conf/provisioning/dashboard-source + ports: + - name: dashboard + containerPort: 3000 + protocol: TCP + livenessProbe: + httpGet: + path: /api/health + port: dashboard + initialDelaySeconds: 120 + periodSeconds: 10 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 6 + readinessProbe: + httpGet: + path: /api/health + port: dashboard + initialDelaySeconds: 30 + periodSeconds: 10 + timeoutSeconds: 5 + successThreshold: 1 + failureThreshold: 6 + resources: + limits: {} + requests: {} + volumes: + - name: data + persistentVolumeClaim: + claimName: oso-grafana + - name: data-sources + configMap: + name: oso-grafana-server-datasources + - name: dashboards + configMap: + name: oso-grafana-server-dashboards + - name: dashboard-config + configMap: + name: oso-grafana-server-dashboard-config diff --git a/examples/monitoring/grafana/kustomization.yaml b/examples/monitoring/grafana/kustomization.yaml new file mode 100644 index 0000000..8615b5a --- /dev/null +++ b/examples/monitoring/grafana/kustomization.yaml @@ -0,0 +1,11 @@ +namespace: sandbox +resources: +- configmap.yaml +- datasources.yaml +- dashboards.yaml +- dashboard-config.yaml +- deployment.yaml +- pvc.yaml +- secret.yaml +- service.yaml +- serviceaccount.yaml diff --git a/examples/monitoring/grafana/pvc.yaml b/examples/monitoring/grafana/pvc.yaml new file mode 100644 index 0000000..9a0f348 --- /dev/null +++ b/examples/monitoring/grafana/pvc.yaml @@ -0,0 +1,19 @@ +--- +# Source: grafana/templates/pvc.yaml +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: oso-grafana + namespace: default + labels: + app.kubernetes.io/name: grafana + helm.sh/chart: grafana-6.1.11 + app.kubernetes.io/instance: oso + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: grafana +spec: + accessModes: + - "ReadWriteOnce" + resources: + requests: + storage: "10Gi" diff --git a/examples/monitoring/grafana/secret.yaml b/examples/monitoring/grafana/secret.yaml new file mode 100644 index 0000000..7734e43 --- /dev/null +++ b/examples/monitoring/grafana/secret.yaml @@ -0,0 +1,16 @@ +--- +# Source: grafana/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + name: oso-grafana-admin + namespace: default + labels: + app.kubernetes.io/name: grafana + helm.sh/chart: grafana-6.1.11 + app.kubernetes.io/instance: oso + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: grafana +type: Opaque +data: + GF_SECURITY_ADMIN_PASSWORD: "T2gwaGk1a3NNcA==" diff --git a/examples/monitoring/grafana/service.yaml b/examples/monitoring/grafana/service.yaml new file mode 100644 index 0000000..b7e327e --- /dev/null +++ b/examples/monitoring/grafana/service.yaml @@ -0,0 +1,25 @@ +--- +# Source: grafana/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: oso-grafana + namespace: default + labels: + app.kubernetes.io/name: grafana + helm.sh/chart: grafana-6.1.11 + app.kubernetes.io/instance: oso + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: grafana +spec: + type: ClusterIP + ports: + - port: 3000 + targetPort: dashboard + protocol: TCP + name: http + nodePort: null + selector: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: oso + app.kubernetes.io/component: grafana diff --git a/examples/monitoring/grafana/serviceaccount.yaml b/examples/monitoring/grafana/serviceaccount.yaml new file mode 100644 index 0000000..31d011f --- /dev/null +++ b/examples/monitoring/grafana/serviceaccount.yaml @@ -0,0 +1,14 @@ +--- +# Source: grafana/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: oso-grafana + namespace: default + labels: + app.kubernetes.io/name: grafana + helm.sh/chart: grafana-6.1.11 + app.kubernetes.io/instance: oso + app.kubernetes.io/managed-by: Helm +secrets: + - name: oso-grafana-admin diff --git a/examples/monitoring/kustomization.yaml b/examples/monitoring/kustomization.yaml new file mode 100644 index 0000000..0e09071 --- /dev/null +++ b/examples/monitoring/kustomization.yaml @@ -0,0 +1,8 @@ +namespace: sandbox +resources: + - confluent + - operator + - rolebindings + - grafana + - prometheus + - producer diff --git a/examples/monitoring/operator/deployment.yaml b/examples/monitoring/operator/deployment.yaml new file mode 100644 index 0000000..71998eb --- /dev/null +++ b/examples/monitoring/operator/deployment.yaml @@ -0,0 +1,12 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: confluent-operator +spec: + template: + spec: + containers: + - args: + - --debug=false + - --namespaces=sandbox + name: confluent-operator diff --git a/examples/monitoring/operator/kustomization.yaml b/examples/monitoring/operator/kustomization.yaml new file mode 100644 index 0000000..339e199 --- /dev/null +++ b/examples/monitoring/operator/kustomization.yaml @@ -0,0 +1,5 @@ +namespace: sandbox +resources: +- ../../../kustomize/base/operator +patchesStrategicMerge: + - deployment.yaml \ No newline at end of file diff --git a/examples/monitoring/producer/generate_propery.sh b/examples/monitoring/producer/generate_propery.sh new file mode 100755 index 0000000..00e4a7a --- /dev/null +++ b/examples/monitoring/producer/generate_propery.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +kubectl create secret generic kafka-client-config \ +--from-file=kafka.properties=./kafka.properties \ +--dry-run=client --output=yaml > ./kafka-client-config.yaml \ No newline at end of file diff --git a/examples/monitoring/producer/kafka-client-config.yaml b/examples/monitoring/producer/kafka-client-config.yaml new file mode 100644 index 0000000..578dcbe --- /dev/null +++ b/examples/monitoring/producer/kafka-client-config.yaml @@ -0,0 +1,7 @@ +apiVersion: v1 +data: + kafka.properties: Ym9vdHN0cmFwLnNlcnZlcnM9a2Fma2Euc2FuZGJveC5zdmMuY2x1c3Rlci5sb2NhbDo5MDcxCnNhc2wuamFhcy5jb25maWc9b3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VjdXJpdHkucGxhaW4uUGxhaW5Mb2dpbk1vZHVsZSByZXF1aXJlZCB1c2VybmFtZT1rYWZrYSBwYXNzd29yZD1rYWZrYS1zZWNyZXQ7CnNhc2wubWVjaGFuaXNtPVBMQUlOCnNlY3VyaXR5LnByb3RvY29sPVNBU0xfU1NMCnNzbC50cnVzdHN0b3JlLmxvY2F0aW9uPS9tbnQvc3NsY2VydHMvdHJ1c3RzdG9yZS5wMTIKc3NsLnRydXN0c3RvcmUucGFzc3dvcmQ9bXlzdG9yZXBhc3N3b3Jk +kind: Secret +metadata: + creationTimestamp: null + name: kafka-client-config diff --git a/examples/monitoring/producer/kafka.properties b/examples/monitoring/producer/kafka.properties new file mode 100644 index 0000000..84608fd --- /dev/null +++ b/examples/monitoring/producer/kafka.properties @@ -0,0 +1,6 @@ +bootstrap.servers=kafka.sandbox.svc.cluster.local:9071 +sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username=kafka password=kafka-secret; +sasl.mechanism=PLAIN +security.protocol=SASL_SSL +ssl.truststore.location=/mnt/sslcerts/truststore.p12 +ssl.truststore.password=mystorepassword \ No newline at end of file diff --git a/examples/monitoring/producer/kustomization.yaml b/examples/monitoring/producer/kustomization.yaml new file mode 100644 index 0000000..99be802 --- /dev/null +++ b/examples/monitoring/producer/kustomization.yaml @@ -0,0 +1,5 @@ +namespace: sandbox +resources: +- source-topic.yaml +- kafka-client-config.yaml +- producer-app.yaml diff --git a/examples/monitoring/producer/producer-app.yaml b/examples/monitoring/producer/producer-app.yaml new file mode 100644 index 0000000..1e5affb --- /dev/null +++ b/examples/monitoring/producer/producer-app.yaml @@ -0,0 +1,55 @@ +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: console-producer + namespace: sandbox +spec: + serviceName: console-producer + podManagementPolicy: Parallel + replicas: 1 + selector: + matchLabels: + app: console-producer + template: + metadata: + labels: + app: console-producer + spec: + containers: + - name: console-producer + image: confluentinc/cp-kafka:latest + command: + - /bin/sh + - -c + - | + kafka-producer-perf-test \ + --topic brand-new-topic \ + --record-size 1024 \ + --throughput 5 \ + --producer.config /mnt/kafka.properties \ + --num-records 100000 + volumeMounts: + - name: kafka-properties + mountPath: /mnt + - name: kafka-ssl-autogenerated + mountPath: /mnt/sslcerts + resources: + requests: + memory: 512Mi # 768Mi + cpu: 500m # 1000m + volumes: + - name: kafka-properties # Create secret with name `kafka-client-config` with client configurations + secret: + secretName: kafka-client-config + - name: kafka-ssl-autogenerated + secret: + secretName: kafka-pkcs12 +--- +apiVersion: v1 +kind: Service +metadata: + name: console-producer + namespace: sandbox +spec: + clusterIP: None \ No newline at end of file diff --git a/examples/monitoring/producer/source-topic.yaml b/examples/monitoring/producer/source-topic.yaml new file mode 100644 index 0000000..395a0b1 --- /dev/null +++ b/examples/monitoring/producer/source-topic.yaml @@ -0,0 +1,14 @@ +apiVersion: platform.confluent.io/v1beta1 +kind: KafkaTopic +metadata: + name: topic-in-source +spec: + replicas: 2 + partitionCount: 4 + kafkaClusterRef: + name: kafka + namespace: sandbox + kafkaRest: + endpoint: http://kafka.sandbox.svc.cluster.local:8090 + configs: + cleanup.policy: "delete" diff --git a/examples/monitoring/prometheus/alertmanager/clusterrole.yaml b/examples/monitoring/prometheus/alertmanager/clusterrole.yaml new file mode 100644 index 0000000..3a77abf --- /dev/null +++ b/examples/monitoring/prometheus/alertmanager/clusterrole.yaml @@ -0,0 +1,14 @@ +--- +# Source: prometheus/templates/alertmanager/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + component: "alertmanager" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-alertmanager +rules: + [] diff --git a/examples/monitoring/prometheus/alertmanager/clusterrolebinding.yaml b/examples/monitoring/prometheus/alertmanager/clusterrolebinding.yaml new file mode 100644 index 0000000..f71aa80 --- /dev/null +++ b/examples/monitoring/prometheus/alertmanager/clusterrolebinding.yaml @@ -0,0 +1,20 @@ +--- +# Source: prometheus/templates/alertmanager/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + component: "alertmanager" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-alertmanager +subjects: + - kind: ServiceAccount + name: oso-prometheus-alertmanager + namespace: default +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: oso-prometheus-alertmanager diff --git a/examples/monitoring/prometheus/alertmanager/cm.yaml b/examples/monitoring/prometheus/alertmanager/cm.yaml new file mode 100644 index 0000000..a23ef21 --- /dev/null +++ b/examples/monitoring/prometheus/alertmanager/cm.yaml @@ -0,0 +1,23 @@ +--- +# Source: prometheus/templates/alertmanager/cm.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + component: "alertmanager" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-alertmanager + namespace: default +data: + alertmanager.yml: | + global: {} + receivers: + - name: default-receiver + route: + group_interval: 5m + group_wait: 10s + receiver: default-receiver + repeat_interval: 3h diff --git a/examples/monitoring/prometheus/alertmanager/deploy.yaml b/examples/monitoring/prometheus/alertmanager/deploy.yaml new file mode 100644 index 0000000..2f33a7e --- /dev/null +++ b/examples/monitoring/prometheus/alertmanager/deploy.yaml @@ -0,0 +1,86 @@ +--- +# Source: prometheus/templates/alertmanager/deploy.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + component: "alertmanager" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-alertmanager + namespace: default +spec: + selector: + matchLabels: + component: "alertmanager" + app: prometheus + release: oso + replicas: 1 + template: + metadata: + labels: + component: "alertmanager" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + spec: + serviceAccountName: oso-prometheus-alertmanager + containers: + - name: prometheus-alertmanager + image: "quay.io/prometheus/alertmanager:v0.21.0" + imagePullPolicy: "IfNotPresent" + env: + - name: POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + args: + - --config.file=/etc/config/alertmanager.yml + - --storage.path=/data + - --cluster.advertise-address=[$(POD_IP)]:6783 + - --web.external-url=http://localhost:9093 + + ports: + - containerPort: 9093 + readinessProbe: + httpGet: + path: /-/ready + port: 9093 + initialDelaySeconds: 30 + timeoutSeconds: 30 + resources: + {} + volumeMounts: + - name: config-volume + mountPath: /etc/config + - name: storage-volume + mountPath: "/data" + subPath: "" + - name: prometheus-alertmanager-configmap-reload + image: "jimmidyson/configmap-reload:v0.5.0" + imagePullPolicy: "IfNotPresent" + args: + - --volume-dir=/etc/config + - --webhook-url=http://127.0.0.1:9093/-/reload + resources: + {} + volumeMounts: + - name: config-volume + mountPath: /etc/config + readOnly: true + securityContext: + fsGroup: 65534 + runAsGroup: 65534 + runAsNonRoot: true + runAsUser: 65534 + volumes: + - name: config-volume + configMap: + name: oso-prometheus-alertmanager + - name: storage-volume + persistentVolumeClaim: + claimName: oso-prometheus-alertmanager diff --git a/examples/monitoring/prometheus/alertmanager/kustomization.yaml b/examples/monitoring/prometheus/alertmanager/kustomization.yaml new file mode 100644 index 0000000..33b9ddd --- /dev/null +++ b/examples/monitoring/prometheus/alertmanager/kustomization.yaml @@ -0,0 +1,9 @@ +namespace: sandbox +resources: + - clusterrole.yaml + - clusterrolebinding.yaml + - cm.yaml + - deploy.yaml + - pvc.yaml + - service.yaml + - serviceaccount.yaml \ No newline at end of file diff --git a/examples/monitoring/prometheus/alertmanager/pvc.yaml b/examples/monitoring/prometheus/alertmanager/pvc.yaml new file mode 100644 index 0000000..2d96e4d --- /dev/null +++ b/examples/monitoring/prometheus/alertmanager/pvc.yaml @@ -0,0 +1,19 @@ +--- +# Source: prometheus/templates/alertmanager/pvc.yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + labels: + component: "alertmanager" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-alertmanager + namespace: default +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: "2Gi" diff --git a/examples/monitoring/prometheus/alertmanager/service.yaml b/examples/monitoring/prometheus/alertmanager/service.yaml new file mode 100644 index 0000000..3a4db20 --- /dev/null +++ b/examples/monitoring/prometheus/alertmanager/service.yaml @@ -0,0 +1,25 @@ +--- +# Source: prometheus/templates/alertmanager/service.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + component: "alertmanager" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-alertmanager + namespace: default +spec: + ports: + - name: http + port: 80 + protocol: TCP + targetPort: 9093 + selector: + component: "alertmanager" + app: prometheus + release: oso + sessionAffinity: None + type: "ClusterIP" diff --git a/examples/monitoring/prometheus/alertmanager/serviceaccount.yaml b/examples/monitoring/prometheus/alertmanager/serviceaccount.yaml new file mode 100644 index 0000000..f57d4e5 --- /dev/null +++ b/examples/monitoring/prometheus/alertmanager/serviceaccount.yaml @@ -0,0 +1,15 @@ +--- +# Source: prometheus/templates/alertmanager/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + component: "alertmanager" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-alertmanager + namespace: default + annotations: + {} diff --git a/examples/monitoring/prometheus/kafka-exporter/deployment.yaml b/examples/monitoring/prometheus/kafka-exporter/deployment.yaml new file mode 100644 index 0000000..733cb8d --- /dev/null +++ b/examples/monitoring/prometheus/kafka-exporter/deployment.yaml @@ -0,0 +1,41 @@ +--- +# Source: prometheus-kafka-exporter/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: oso-prometheus-kafka-exporter + labels: + app: prometheus-kafka-exporter + chart: prometheus-kafka-exporter-1.4.0 + release: oso + heritage: Helm +spec: + replicas: 1 + selector: + matchLabels: + app: prometheus-kafka-exporter + release: oso + template: + metadata: + annotations: + {} + labels: + app: prometheus-kafka-exporter + release: oso + spec: + serviceAccountName: oso-prometheus-kafka-exporter + containers: + - args: + - '--log.level=info' + - '--kafka.server=kafka-server:9092' + env: + [] + name: prometheus-kafka-exporter + image: "danielqsj/kafka-exporter:v1.3.1" + imagePullPolicy: IfNotPresent + ports: + - name: exporter-port + containerPort: 9308 + protocol: TCP + resources: + {} diff --git a/examples/monitoring/prometheus/kafka-exporter/kustomization.yaml b/examples/monitoring/prometheus/kafka-exporter/kustomization.yaml new file mode 100644 index 0000000..798078b --- /dev/null +++ b/examples/monitoring/prometheus/kafka-exporter/kustomization.yaml @@ -0,0 +1,8 @@ +namespace: sandbox +resources: +- deployment.yaml +- podsecuritypolicy.yaml +- role.yaml +- rolebinding.yaml +- service.yaml +- serviceaccount.yaml diff --git a/examples/monitoring/prometheus/kafka-exporter/podsecuritypolicy.yaml b/examples/monitoring/prometheus/kafka-exporter/podsecuritypolicy.yaml new file mode 100644 index 0000000..2f7857d --- /dev/null +++ b/examples/monitoring/prometheus/kafka-exporter/podsecuritypolicy.yaml @@ -0,0 +1,39 @@ +--- +# Source: prometheus-kafka-exporter/templates/podsecuritypolicy.yaml +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: oso-prometheus-kafka-exporter + labels: + app: prometheus-kafka-exporter + chart: prometheus-kafka-exporter-1.4.0 + heritage: Helm + release: oso + annotations: + seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default' + apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default' + seccomp.security.alpha.kubernetes.io/defaultProfileName: 'docker/default' + apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' +spec: + privileged: false + allowPrivilegeEscalation: false + requiredDropCapabilities: + - ALL + volumes: + - 'configMap' + - 'emptyDir' + - 'projected' + - 'secret' + - 'downwardAPI' + hostNetwork: false + hostIPC: false + hostPID: false + runAsUser: + rule: 'RunAsAny' + seLinux: + rule: 'RunAsAny' + supplementalGroups: + rule: 'RunAsAny' + fsGroup: + rule: 'RunAsAny' + readOnlyRootFilesystem: false diff --git a/examples/monitoring/prometheus/kafka-exporter/role.yaml b/examples/monitoring/prometheus/kafka-exporter/role.yaml new file mode 100644 index 0000000..f968a7c --- /dev/null +++ b/examples/monitoring/prometheus/kafka-exporter/role.yaml @@ -0,0 +1,16 @@ +--- +# Source: prometheus-kafka-exporter/templates/role.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: oso-prometheus-kafka-exporter + labels: + app: prometheus-kafka-exporter + chart: prometheus-kafka-exporter-1.4.0 + heritage: Helm + release: oso +rules: +- apiGroups: ['extensions'] + resources: ['podsecuritypolicies'] + verbs: ['use'] + resourceNames: [oso-prometheus-kafka-exporter] diff --git a/examples/monitoring/prometheus/kafka-exporter/rolebinding.yaml b/examples/monitoring/prometheus/kafka-exporter/rolebinding.yaml new file mode 100644 index 0000000..00322e1 --- /dev/null +++ b/examples/monitoring/prometheus/kafka-exporter/rolebinding.yaml @@ -0,0 +1,18 @@ +--- +# Source: prometheus-kafka-exporter/templates/rolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: oso-prometheus-kafka-exporter + labels: + app: prometheus-kafka-exporter + chart: prometheus-kafka-exporter-1.4.0 + heritage: Helm + release: oso +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: oso-prometheus-kafka-exporter +subjects: +- kind: ServiceAccount + name: oso-prometheus-kafka-exporter diff --git a/examples/monitoring/prometheus/kafka-exporter/service.yaml b/examples/monitoring/prometheus/kafka-exporter/service.yaml new file mode 100644 index 0000000..f3fc34c --- /dev/null +++ b/examples/monitoring/prometheus/kafka-exporter/service.yaml @@ -0,0 +1,23 @@ +--- +# Source: prometheus-kafka-exporter/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: oso-prometheus-kafka-exporter + annotations: + {} + labels: + app: prometheus-kafka-exporter + chart: prometheus-kafka-exporter-1.4.0 + release: oso + heritage: Helm +spec: + type: ClusterIP + ports: + - port: 9308 + targetPort: exporter-port + protocol: TCP + name: exporter-port + selector: + app: prometheus-kafka-exporter + release: oso diff --git a/examples/monitoring/prometheus/kafka-exporter/serviceaccount.yaml b/examples/monitoring/prometheus/kafka-exporter/serviceaccount.yaml new file mode 100644 index 0000000..6a28c86 --- /dev/null +++ b/examples/monitoring/prometheus/kafka-exporter/serviceaccount.yaml @@ -0,0 +1,11 @@ +--- +# Source: prometheus-kafka-exporter/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: oso-prometheus-kafka-exporter + labels: + app: prometheus-kafka-exporter + chart: prometheus-kafka-exporter-1.4.0 + release: "oso" + heritage: "Helm" diff --git a/examples/monitoring/prometheus/kustomization.yaml b/examples/monitoring/prometheus/kustomization.yaml new file mode 100644 index 0000000..7da6cf0 --- /dev/null +++ b/examples/monitoring/prometheus/kustomization.yaml @@ -0,0 +1,6 @@ +namespace: sandbox +resources: +- server +- alertmanager +- node-exporter +#- kafka-exporter diff --git a/examples/monitoring/prometheus/node-exporter/daemonset.yaml b/examples/monitoring/prometheus/node-exporter/daemonset.yaml new file mode 100644 index 0000000..6078939 --- /dev/null +++ b/examples/monitoring/prometheus/node-exporter/daemonset.yaml @@ -0,0 +1,74 @@ +--- +# Source: prometheus/templates/node-exporter/daemonset.yaml +apiVersion: apps/v1 +kind: DaemonSet +metadata: + labels: + component: "node-exporter" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-node-exporter + namespace: default +spec: + selector: + matchLabels: + component: "node-exporter" + app: prometheus + release: oso + updateStrategy: + type: RollingUpdate + template: + metadata: + labels: + component: "node-exporter" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + spec: + serviceAccountName: oso-prometheus-node-exporter + containers: + - name: prometheus-node-exporter + image: "quay.io/prometheus/node-exporter:v1.1.2" + imagePullPolicy: "IfNotPresent" + args: + - --path.procfs=/host/proc + - --path.sysfs=/host/sys + - --path.rootfs=/host/root + - --web.listen-address=:9100 + ports: + - name: metrics + containerPort: 9100 + hostPort: 9100 + resources: + {} + volumeMounts: + - name: proc + mountPath: /host/proc + readOnly: true + - name: sys + mountPath: /host/sys + readOnly: true + - name: root + mountPath: /host/root + mountPropagation: HostToContainer + readOnly: true + hostNetwork: true + hostPID: true + securityContext: + fsGroup: 65534 + runAsGroup: 65534 + runAsNonRoot: true + runAsUser: 65534 + volumes: + - name: proc + hostPath: + path: /proc + - name: sys + hostPath: + path: /sys + - name: root + hostPath: + path: / diff --git a/examples/monitoring/prometheus/node-exporter/kustomization.yaml b/examples/monitoring/prometheus/node-exporter/kustomization.yaml new file mode 100644 index 0000000..c199f8e --- /dev/null +++ b/examples/monitoring/prometheus/node-exporter/kustomization.yaml @@ -0,0 +1,5 @@ +namespace: sandbox +resources: + - daemonset.yaml + - serviceaccount.yaml + - svc.yaml \ No newline at end of file diff --git a/examples/monitoring/prometheus/node-exporter/serviceaccount.yaml b/examples/monitoring/prometheus/node-exporter/serviceaccount.yaml new file mode 100644 index 0000000..3ce4c66 --- /dev/null +++ b/examples/monitoring/prometheus/node-exporter/serviceaccount.yaml @@ -0,0 +1,15 @@ +--- +# Source: prometheus/templates/node-exporter/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + component: "node-exporter" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-node-exporter + namespace: default + annotations: + {} diff --git a/examples/monitoring/prometheus/node-exporter/svc.yaml b/examples/monitoring/prometheus/node-exporter/svc.yaml new file mode 100644 index 0000000..6729f84 --- /dev/null +++ b/examples/monitoring/prometheus/node-exporter/svc.yaml @@ -0,0 +1,27 @@ +--- +# Source: prometheus/templates/node-exporter/svc.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + prometheus.io/scrape: "true" + labels: + component: "node-exporter" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-node-exporter + namespace: default +spec: + clusterIP: None + ports: + - name: metrics + port: 9100 + protocol: TCP + targetPort: 9100 + selector: + component: "node-exporter" + app: prometheus + release: oso + type: "ClusterIP" diff --git a/examples/monitoring/prometheus/pushgateway/clusterrole.yaml b/examples/monitoring/prometheus/pushgateway/clusterrole.yaml new file mode 100644 index 0000000..94fe773 --- /dev/null +++ b/examples/monitoring/prometheus/pushgateway/clusterrole.yaml @@ -0,0 +1,14 @@ +--- +# Source: prometheus/templates/pushgateway/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + component: "pushgateway" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-pushgateway +rules: + [] diff --git a/examples/monitoring/prometheus/pushgateway/clusterrolebinding.yaml b/examples/monitoring/prometheus/pushgateway/clusterrolebinding.yaml new file mode 100644 index 0000000..8831136 --- /dev/null +++ b/examples/monitoring/prometheus/pushgateway/clusterrolebinding.yaml @@ -0,0 +1,20 @@ +--- +# Source: prometheus/templates/pushgateway/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + component: "pushgateway" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-pushgateway +subjects: + - kind: ServiceAccount + name: oso-prometheus-pushgateway + namespace: default +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: oso-prometheus-pushgateway diff --git a/examples/monitoring/prometheus/pushgateway/deploy.yaml b/examples/monitoring/prometheus/pushgateway/deploy.yaml new file mode 100644 index 0000000..b629512 --- /dev/null +++ b/examples/monitoring/prometheus/pushgateway/deploy.yaml @@ -0,0 +1,54 @@ +--- +# Source: prometheus/templates/pushgateway/deploy.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + component: "pushgateway" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-pushgateway + namespace: default +spec: + selector: + matchLabels: + component: "pushgateway" + app: prometheus + release: oso + replicas: 1 + template: + metadata: + labels: + component: "pushgateway" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + spec: + serviceAccountName: oso-prometheus-pushgateway + containers: + - name: prometheus-pushgateway + image: "prom/pushgateway:v1.3.1" + imagePullPolicy: "IfNotPresent" + args: + ports: + - containerPort: 9091 + livenessProbe: + httpGet: + path: /-/healthy + port: 9091 + initialDelaySeconds: 10 + timeoutSeconds: 10 + readinessProbe: + httpGet: + path: /-/ready + port: 9091 + initialDelaySeconds: 10 + timeoutSeconds: 10 + resources: + {} + securityContext: + runAsNonRoot: true + runAsUser: 65534 diff --git a/examples/monitoring/prometheus/pushgateway/service.yaml b/examples/monitoring/prometheus/pushgateway/service.yaml new file mode 100644 index 0000000..9d3723a --- /dev/null +++ b/examples/monitoring/prometheus/pushgateway/service.yaml @@ -0,0 +1,26 @@ +--- +# Source: prometheus/templates/pushgateway/service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + prometheus.io/probe: pushgateway + labels: + component: "pushgateway" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-pushgateway + namespace: default +spec: + ports: + - name: http + port: 9091 + protocol: TCP + targetPort: 9091 + selector: + component: "pushgateway" + app: prometheus + release: oso + type: "ClusterIP" diff --git a/examples/monitoring/prometheus/pushgateway/serviceaccount.yaml b/examples/monitoring/prometheus/pushgateway/serviceaccount.yaml new file mode 100644 index 0000000..5a438d1 --- /dev/null +++ b/examples/monitoring/prometheus/pushgateway/serviceaccount.yaml @@ -0,0 +1,15 @@ +--- +# Source: prometheus/templates/pushgateway/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + component: "pushgateway" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-pushgateway + namespace: default + annotations: + {} diff --git a/examples/monitoring/prometheus/server/clusterrole.yaml b/examples/monitoring/prometheus/server/clusterrole.yaml new file mode 100644 index 0000000..0f05d85 --- /dev/null +++ b/examples/monitoring/prometheus/server/clusterrole.yaml @@ -0,0 +1,42 @@ +--- +# Source: prometheus/templates/server/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + component: "server" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-server +rules: + - apiGroups: + - "" + resources: + - nodes + - nodes/proxy + - nodes/metrics + - services + - endpoints + - pods + - ingresses + - configmaps + verbs: + - get + - list + - watch + - apiGroups: + - "extensions" + - "networking.k8s.io" + resources: + - ingresses/status + - ingresses + verbs: + - get + - list + - watch + - nonResourceURLs: + - "/metrics" + verbs: + - get diff --git a/examples/monitoring/prometheus/server/clusterrolebinding.yaml b/examples/monitoring/prometheus/server/clusterrolebinding.yaml new file mode 100644 index 0000000..70aa7ec --- /dev/null +++ b/examples/monitoring/prometheus/server/clusterrolebinding.yaml @@ -0,0 +1,20 @@ +--- +# Source: prometheus/templates/server/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + component: "server" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-server +subjects: + - kind: ServiceAccount + name: oso-prometheus-server + namespace: default +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: oso-prometheus-server diff --git a/examples/monitoring/prometheus/server/cm.yaml b/examples/monitoring/prometheus/server/cm.yaml new file mode 100644 index 0000000..b33af72 --- /dev/null +++ b/examples/monitoring/prometheus/server/cm.yaml @@ -0,0 +1,374 @@ +--- +# Source: prometheus/templates/server/cm.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + component: "server" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-server + namespace: default +data: + alerting_rules.yml: | + {} + alerts: | + {} + prometheus.yml: | + global: + evaluation_interval: 1m + scrape_interval: 1m + scrape_timeout: 10s + rule_files: + - /etc/config/recording_rules.yml + - /etc/config/alerting_rules.yml + - /etc/config/rules + - /etc/config/alerts + scrape_configs: + - job_name: "prometheus" + static_configs: + - targets: ["localhost:9090"] + - job_name: "node-exporter" + static_configs: + - targets: ["oso-prometheus-node-exporter:9100"] + - job_name: "kafka" + static_configs: + - targets: + - "kafka:7778" + labels: + env: "dev" + - job_name: "zookeeper" + static_configs: + - targets: + - "zookeeper:7778" + labels: + env: "dev" + - job_name: "connect" + static_configs: + - targets: + - "connect:7778" + labels: + env: "dev" + cluster: "cluster1" + #- job_name: "streams-demo" + # static_configs: + # - targets: + # - "streams-demo:1234" + # labels: + # env: "dev" + - job_name: "schemaregistry" + static_configs: + - targets: + - "schemaregistry:7778" + labels: + env: "dev" + - job_name: "ksqldb" + static_configs: + - targets: + - "ksqldb:7778" + labels: + env: "dev" + #- job_name: "restproxy" + # static_configs: + # - targets: + # - "restproxy:1234" + # labels: + # env: "dev" + # No producer for the moment in cp-demo + # - job_name: 'producer' + # static_configs: + # - targets: + # - 'producer:1234' + # labels: + # env: 'dev' + + # No consumer for the moment in cp-demo + # - job_name: 'consumer' + # static_configs: + # - targets: + # - "consumer:1234" + # labels: + # env: 'dev' + - job_name: "kafka-lag-exporter" + static_configs: + - targets: + - "kafka-lag-exporter:9999" + labels: + env: "dev" + - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + job_name: kubernetes-apiservers + kubernetes_sd_configs: + - role: endpoints + relabel_configs: + - action: keep + regex: default;kubernetes;https + source_labels: + - __meta_kubernetes_namespace + - __meta_kubernetes_service_name + - __meta_kubernetes_endpoint_port_name + scheme: https + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + insecure_skip_verify: true + - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + job_name: kubernetes-nodes + kubernetes_sd_configs: + - role: node + relabel_configs: + - action: labelmap + regex: __meta_kubernetes_node_label_(.+) + - replacement: kubernetes.default.svc:443 + target_label: __address__ + - regex: (.+) + replacement: /api/v1/nodes/$1/proxy/metrics + source_labels: + - __meta_kubernetes_node_name + target_label: __metrics_path__ + scheme: https + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + insecure_skip_verify: true + - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + job_name: kubernetes-nodes-cadvisor + kubernetes_sd_configs: + - role: node + relabel_configs: + - action: labelmap + regex: __meta_kubernetes_node_label_(.+) + - replacement: kubernetes.default.svc:443 + target_label: __address__ + - regex: (.+) + replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor + source_labels: + - __meta_kubernetes_node_name + target_label: __metrics_path__ + scheme: https + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + insecure_skip_verify: true + - job_name: kubernetes-service-endpoints + kubernetes_sd_configs: + - role: endpoints + relabel_configs: + - action: keep + regex: true + source_labels: + - __meta_kubernetes_service_annotation_prometheus_io_scrape + - action: replace + regex: (https?) + source_labels: + - __meta_kubernetes_service_annotation_prometheus_io_scheme + target_label: __scheme__ + - action: replace + regex: (.+) + source_labels: + - __meta_kubernetes_service_annotation_prometheus_io_path + target_label: __metrics_path__ + - action: replace + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + source_labels: + - __address__ + - __meta_kubernetes_service_annotation_prometheus_io_port + target_label: __address__ + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - action: replace + source_labels: + - __meta_kubernetes_namespace + target_label: kubernetes_namespace + - action: replace + source_labels: + - __meta_kubernetes_service_name + target_label: kubernetes_name + - action: replace + source_labels: + - __meta_kubernetes_pod_node_name + target_label: kubernetes_node + - job_name: kubernetes-service-endpoints-slow + kubernetes_sd_configs: + - role: endpoints + relabel_configs: + - action: keep + regex: true + source_labels: + - __meta_kubernetes_service_annotation_prometheus_io_scrape_slow + - action: replace + regex: (https?) + source_labels: + - __meta_kubernetes_service_annotation_prometheus_io_scheme + target_label: __scheme__ + - action: replace + regex: (.+) + source_labels: + - __meta_kubernetes_service_annotation_prometheus_io_path + target_label: __metrics_path__ + - action: replace + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + source_labels: + - __address__ + - __meta_kubernetes_service_annotation_prometheus_io_port + target_label: __address__ + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - action: replace + source_labels: + - __meta_kubernetes_namespace + target_label: kubernetes_namespace + - action: replace + source_labels: + - __meta_kubernetes_service_name + target_label: kubernetes_name + - action: replace + source_labels: + - __meta_kubernetes_pod_node_name + target_label: kubernetes_node + scrape_interval: 5m + scrape_timeout: 30s + - honor_labels: true + job_name: prometheus-pushgateway + kubernetes_sd_configs: + - role: service + relabel_configs: + - action: keep + regex: pushgateway + source_labels: + - __meta_kubernetes_service_annotation_prometheus_io_probe + - job_name: kubernetes-services + kubernetes_sd_configs: + - role: service + metrics_path: /probe + params: + module: + - http_2xx + relabel_configs: + - action: keep + regex: true + source_labels: + - __meta_kubernetes_service_annotation_prometheus_io_probe + - source_labels: + - __address__ + target_label: __param_target + - replacement: blackbox + target_label: __address__ + - source_labels: + - __param_target + target_label: instance + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - source_labels: + - __meta_kubernetes_namespace + target_label: kubernetes_namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: kubernetes_name + - job_name: kubernetes-pods + kubernetes_sd_configs: + - role: pod + relabel_configs: + - action: keep + regex: true + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_scrape + - action: replace + regex: (https?) + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_scheme + target_label: __scheme__ + - action: replace + regex: (.+) + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_path + target_label: __metrics_path__ + - action: replace + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + source_labels: + - __address__ + - __meta_kubernetes_pod_annotation_prometheus_io_port + target_label: __address__ + - action: labelmap + regex: __meta_kubernetes_pod_label_(.+) + - action: replace + source_labels: + - __meta_kubernetes_namespace + target_label: kubernetes_namespace + - action: replace + source_labels: + - __meta_kubernetes_pod_name + target_label: kubernetes_pod_name + - action: drop + regex: Pending|Succeeded|Failed|Completed + source_labels: + - __meta_kubernetes_pod_phase + - job_name: kubernetes-pods-slow + kubernetes_sd_configs: + - role: pod + relabel_configs: + - action: keep + regex: true + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_scrape_slow + - action: replace + regex: (https?) + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_scheme + target_label: __scheme__ + - action: replace + regex: (.+) + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_path + target_label: __metrics_path__ + - action: replace + regex: ([^:]+)(?::\d+)?;(\d+) + replacement: $1:$2 + source_labels: + - __address__ + - __meta_kubernetes_pod_annotation_prometheus_io_port + target_label: __address__ + - action: labelmap + regex: __meta_kubernetes_pod_label_(.+) + - action: replace + source_labels: + - __meta_kubernetes_namespace + target_label: kubernetes_namespace + - action: replace + source_labels: + - __meta_kubernetes_pod_name + target_label: kubernetes_pod_name + - action: drop + regex: Pending|Succeeded|Failed|Completed + source_labels: + - __meta_kubernetes_pod_phase + scrape_interval: 5m + scrape_timeout: 30s + alerting: + alertmanagers: + - kubernetes_sd_configs: + - role: pod + tls_config: + ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt + bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + relabel_configs: + - source_labels: [__meta_kubernetes_namespace] + regex: default + action: keep + - source_labels: [__meta_kubernetes_pod_label_app] + regex: prometheus + action: keep + - source_labels: [__meta_kubernetes_pod_label_component] + regex: alertmanager + action: keep + - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_probe] + regex: .* + action: keep + - source_labels: [__meta_kubernetes_pod_container_port_number] + regex: "9093" + action: keep + recording_rules.yml: | + {} + rules: | + {} diff --git a/examples/monitoring/prometheus/server/deploy.yaml b/examples/monitoring/prometheus/server/deploy.yaml new file mode 100644 index 0000000..a93fb42 --- /dev/null +++ b/examples/monitoring/prometheus/server/deploy.yaml @@ -0,0 +1,98 @@ +--- +# Source: prometheus/templates/server/deploy.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + component: "server" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-server + namespace: default +spec: + selector: + matchLabels: + component: "server" + app: prometheus + release: oso + replicas: 1 + template: + metadata: + labels: + component: "server" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + spec: + enableServiceLinks: true + serviceAccountName: oso-prometheus-server + containers: + - name: prometheus-server-configmap-reload + image: "jimmidyson/configmap-reload:v0.5.0" + imagePullPolicy: "IfNotPresent" + args: + - --volume-dir=/etc/config + - --webhook-url=http://127.0.0.1:9090/-/reload + resources: + {} + volumeMounts: + - name: config-volume + mountPath: /etc/config + readOnly: true + + - name: prometheus-server + image: "quay.io/prometheus/prometheus:v2.26.0" + imagePullPolicy: "IfNotPresent" + args: + - --storage.tsdb.retention.time=15d + - --config.file=/etc/config/prometheus.yml + - --storage.tsdb.path=/data + - --web.console.libraries=/etc/prometheus/console_libraries + - --web.console.templates=/etc/prometheus/consoles + - --web.enable-lifecycle + ports: + - containerPort: 9090 + readinessProbe: + httpGet: + path: /-/ready + port: 9090 + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 4 + failureThreshold: 3 + successThreshold: 1 + livenessProbe: + httpGet: + path: /-/healthy + port: 9090 + initialDelaySeconds: 30 + periodSeconds: 15 + timeoutSeconds: 10 + failureThreshold: 3 + successThreshold: 1 + resources: + {} + volumeMounts: + - name: config-volume + mountPath: /etc/config + - name: storage-volume + mountPath: /data + subPath: "" + hostNetwork: false + dnsPolicy: ClusterFirst + securityContext: + fsGroup: 65534 + runAsGroup: 65534 + runAsNonRoot: true + runAsUser: 65534 + terminationGracePeriodSeconds: 300 + volumes: + - name: config-volume + configMap: + name: oso-prometheus-server + - name: storage-volume + persistentVolumeClaim: + claimName: oso-prometheus-server diff --git a/examples/monitoring/prometheus/server/kustomization.yaml b/examples/monitoring/prometheus/server/kustomization.yaml new file mode 100644 index 0000000..2061178 --- /dev/null +++ b/examples/monitoring/prometheus/server/kustomization.yaml @@ -0,0 +1,9 @@ +namespace: sandbox +resources: +- clusterrole.yaml +- clusterrolebinding.yaml +- cm.yaml +- deploy.yaml +- pvc.yaml +- service.yaml +- serviceaccount.yaml diff --git a/examples/monitoring/prometheus/server/pvc.yaml b/examples/monitoring/prometheus/server/pvc.yaml new file mode 100644 index 0000000..e067b55 --- /dev/null +++ b/examples/monitoring/prometheus/server/pvc.yaml @@ -0,0 +1,19 @@ +--- +# Source: prometheus/templates/server/pvc.yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + labels: + component: "server" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-server + namespace: default +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: "8Gi" diff --git a/examples/monitoring/prometheus/server/service.yaml b/examples/monitoring/prometheus/server/service.yaml new file mode 100644 index 0000000..7fe17b5 --- /dev/null +++ b/examples/monitoring/prometheus/server/service.yaml @@ -0,0 +1,25 @@ +--- +# Source: prometheus/templates/server/service.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + component: "server" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-server + namespace: default +spec: + ports: + - name: http + port: 80 + protocol: TCP + targetPort: 9090 + selector: + component: "server" + app: prometheus + release: oso + sessionAffinity: None + type: "ClusterIP" diff --git a/examples/monitoring/prometheus/server/serviceaccount.yaml b/examples/monitoring/prometheus/server/serviceaccount.yaml new file mode 100644 index 0000000..60e510e --- /dev/null +++ b/examples/monitoring/prometheus/server/serviceaccount.yaml @@ -0,0 +1,15 @@ +--- +# Source: prometheus/templates/server/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + component: "server" + app: prometheus + release: oso + chart: prometheus-14.6.0 + heritage: Helm + name: oso-prometheus-server + namespace: default + annotations: + {} diff --git a/examples/monitoring/rolebindings/connect/connect-base.yaml b/examples/monitoring/rolebindings/connect/connect-base.yaml new file mode 100644 index 0000000..a413025 --- /dev/null +++ b/examples/monitoring/rolebindings/connect/connect-base.yaml @@ -0,0 +1,45 @@ + +apiVersion: platform.confluent.io/v1beta1 +kind: ConfluentRolebinding +metadata: + name: connect-cluster-base +spec: + clustersScopeByIds: + connectClusterId: sandbox.connect + principal: + name: connect + type: user + role: SecurityAdmin +--- +apiVersion: platform.confluent.io/v1beta1 +kind: ConfluentRolebinding +metadata: + name: connect-resources-base +spec: + principal: + name: connect + type: user + resourcePatterns: + - name: sandbox.connect + patternType: LITERAL + resourceType: Group + - name: sandbox.connect- + patternType: PREFIXED + resourceType: Topic + role: ResourceOwner +--- +apiVersion: platform.confluent.io/v1beta1 +kind: ConfluentRolebinding +metadata: + name: connect-monitoring-base +spec: + principal: + name: connect + type: user + resourcePatterns: + - name: _confluent-monitoring + patternType: PREFIXED + resourceType: Topic + role: DeveloperWrite + + diff --git a/examples/monitoring/rolebindings/connect/kustomization.yaml b/examples/monitoring/rolebindings/connect/kustomization.yaml new file mode 100644 index 0000000..6de76ef --- /dev/null +++ b/examples/monitoring/rolebindings/connect/kustomization.yaml @@ -0,0 +1,5 @@ +namespace: sandbox +resources: + - ../../../../kustomize/base/rolebindings/connect +patchesStrategicMerge: + - connect-base.yaml \ No newline at end of file diff --git a/examples/monitoring/rolebindings/controlcenter-testadmin-rolebindings.yaml b/examples/monitoring/rolebindings/controlcenter-testadmin-rolebindings.yaml new file mode 100644 index 0000000..caca456 --- /dev/null +++ b/examples/monitoring/rolebindings/controlcenter-testadmin-rolebindings.yaml @@ -0,0 +1,70 @@ +--- +# rolebinding `testadmin-rb` allows `testadmin` to see kafkaCluster +apiVersion: platform.confluent.io/v1beta1 +kind: ConfluentRolebinding +metadata: + name: testadmin-rb +spec: + principal: + type: user + name: testadmin + role: ClusterAdmin + ## if use other kafkaRestClass except for default, need to configure accordingly + #kafkaRestClassRef: + # name: default +--- +# rolebinding `testadmin-rb-sr` allows `testadmin` to see schemaregistry information +# `schemaRegistryCllusterId` pattern: `id__` +apiVersion: platform.confluent.io/v1beta1 +kind: ConfluentRolebinding +metadata: + name: testadmin-rb-sr +spec: + principal: + type: user + name: testadmin + clustersScopeByIds: + schemaRegistryClusterId: id_schemaregistry_sandbox + role: ClusterAdmin + ## if use other kafkaRestClass except for default, need to configure accordingly + #kafkaRestClassRef: + # name: default +--- +# rolebinding `testadmin-rb-connect` allows `testadmin` to see connect cluster +# `connectClusterId` pattern: `.` +apiVersion: platform.confluent.io/v1beta1 +kind: ConfluentRolebinding +metadata: + name: testadmin-rb-connect +spec: + principal: + type: user + name: testadmin + clustersScopeByIds: + connectClusterId: sandbox.connect + role: SystemAdmin + ## if use other kafkaRestClass except for default, need to configure accordingly + #kafkaRestClassRef: + # name: default +--- +# rolebinding `testadmin-rb-ksql` allows `testadmin` to see ksqldb cluster +# `ksqlClusterId` pattern: `.` +apiVersion: platform.confluent.io/v1beta1 +kind: ConfluentRolebinding +metadata: + name: testadmin-rb-ksql +spec: + principal: + type: user + name: testadmin + clustersScopeByIds: + ksqlClusterId: sandbox.ksqldb_ + role: ResourceOwner + resourcePatterns: + - name: ksql-cluster + patternType: LITERAL + resourceType: KsqlCluster + ## if use other kafkaRestClass except for default, need to configure accordingly + #kafkaRestClassRef: + # name: default +--- \ No newline at end of file diff --git a/examples/monitoring/rolebindings/ksqldb/ksqldb-base.yaml b/examples/monitoring/rolebindings/ksqldb/ksqldb-base.yaml new file mode 100644 index 0000000..fa8bf02 --- /dev/null +++ b/examples/monitoring/rolebindings/ksqldb/ksqldb-base.yaml @@ -0,0 +1,29 @@ +apiVersion: platform.confluent.io/v1beta1 +kind: ConfluentRolebinding +metadata: + name: ksqldb-cluster-base +spec: + clustersScopeByIds: + ksqlClusterId: sandbox.ksqldb_ + principal: + name: ksql + type: user + resourcePatterns: + - name: ksql-cluster + patternType: LITERAL + resourceType: KsqlCluster + role: ResourceOwner +--- +apiVersion: platform.confluent.io/v1beta1 +kind: ConfluentRolebinding +metadata: + name: ksqldb-cluster-resources-base +spec: + principal: + name: ksql + type: user + resourcePatterns: + - name: _confluent-ksql-confluent.ksqldb_ + patternType: PREFIXED + resourceType: Topic + role: ResourceOwner diff --git a/examples/monitoring/rolebindings/ksqldb/kustomization.yaml b/examples/monitoring/rolebindings/ksqldb/kustomization.yaml new file mode 100644 index 0000000..20a884d --- /dev/null +++ b/examples/monitoring/rolebindings/ksqldb/kustomization.yaml @@ -0,0 +1,5 @@ +namespace: sandbox +resources: + - ../../../../kustomize/base/rolebindings/ksqldb +patchesStrategicMerge: + - ksqldb-base.yaml \ No newline at end of file diff --git a/examples/monitoring/rolebindings/kustomization.yaml b/examples/monitoring/rolebindings/kustomization.yaml new file mode 100644 index 0000000..72fb0dd --- /dev/null +++ b/examples/monitoring/rolebindings/kustomization.yaml @@ -0,0 +1,6 @@ +namespace: sandbox +resources: + - connect + - ksqldb + - schemaregistry + - controlcenter-testadmin-rolebindings.yaml \ No newline at end of file diff --git a/examples/monitoring/rolebindings/schemaregistry/kustomization.yaml b/examples/monitoring/rolebindings/schemaregistry/kustomization.yaml new file mode 100644 index 0000000..2dd2b46 --- /dev/null +++ b/examples/monitoring/rolebindings/schemaregistry/kustomization.yaml @@ -0,0 +1,6 @@ +namespace: sandbox +resources: + - ../../../../kustomize/base/rolebindings/schemaregistry + - test-user.yaml +patchesStrategicMerge: + - schemaregistry-base.yaml \ No newline at end of file diff --git a/examples/monitoring/rolebindings/schemaregistry/schemaregistry-base.yaml b/examples/monitoring/rolebindings/schemaregistry/schemaregistry-base.yaml new file mode 100644 index 0000000..300f7a8 --- /dev/null +++ b/examples/monitoring/rolebindings/schemaregistry/schemaregistry-base.yaml @@ -0,0 +1,32 @@ +apiVersion: platform.confluent.io/v1beta1 +kind: ConfluentRolebinding +metadata: + name: registry-base +spec: + clustersScopeByIds: + schemaRegistryClusterId: id_registry_sandbox + principal: + name: registry + type: user + role: SecurityAdmin +--- +apiVersion: platform.confluent.io/v1beta1 +kind: ConfluentRolebinding +metadata: + name: registry-mds-client-resources-base +spec: + principal: + name: registry + type: user + resourcePatterns: + - name: _confluent-license + patternType: LITERAL + resourceType: Topic + - name: _schemas_schemaregistry_confluent + patternType: LITERAL + resourceType: Topic + - name: id_schemaregistry_confluent + patternType: LITERAL + resourceType: Group + role: ResourceOwner +--- diff --git a/examples/monitoring/rolebindings/schemaregistry/test-user.yaml b/examples/monitoring/rolebindings/schemaregistry/test-user.yaml new file mode 100644 index 0000000..3cf7dec --- /dev/null +++ b/examples/monitoring/rolebindings/schemaregistry/test-user.yaml @@ -0,0 +1,32 @@ +apiVersion: platform.confluent.io/v1beta1 +kind: KafkaTopic +metadata: + name: brand-new-topic +spec: + kafkaClusterRef: + name: kafka + namespace: sandbox + kafkaRest: + authentication: + type: bearer + bearer: + secretRef: mds-client-c3 + endpoint: https://kafka.sandbox.svc.cluster.local:8090 + configs: + confluent.key.schema.validation: "true" +--- +apiVersion: platform.confluent.io/v1beta1 +kind: ConfluentRolebinding +metadata: + name: brand-new-topic +spec: + clustersScopeByIds: + schemaRegistryClusterId: id_schemaregistry_sandbox + principal: + name: alice + type: user + resourcePatterns: + - name: value_brand-new-topics + patternType: LITERAL + resourceType: Subject + role: ResourceOwner \ No newline at end of file diff --git a/kustomize/base/operator/clusterrole.yaml b/kustomize/base/operator/clusterrole.yaml index c9b4d85..b8761cd 100644 --- a/kustomize/base/operator/clusterrole.yaml +++ b/kustomize/base/operator/clusterrole.yaml @@ -9,7 +9,7 @@ metadata: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: "confluent-operator" - helm.sh/chart: confluent-for-kubernetes-0.174.21 + helm.sh/chart: confluent-for-kubernetes-0.174.13 name: confluent-operator namespace: default rules: diff --git a/kustomize/base/operator/clusterrolebinding.yaml b/kustomize/base/operator/clusterrolebinding.yaml index c502054..60d147e 100644 --- a/kustomize/base/operator/clusterrolebinding.yaml +++ b/kustomize/base/operator/clusterrolebinding.yaml @@ -9,7 +9,7 @@ metadata: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: "confluent-operator" - helm.sh/chart: confluent-for-kubernetes-0.174.21 + helm.sh/chart: confluent-for-kubernetes-0.174.13 name: confluent-operator namespace: default subjects: diff --git a/kustomize/base/operator/deployment.yaml b/kustomize/base/operator/deployment.yaml index 03928cc..1e75414 100644 --- a/kustomize/base/operator/deployment.yaml +++ b/kustomize/base/operator/deployment.yaml @@ -9,8 +9,8 @@ metadata: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: "confluent-operator" - helm.sh/chart: confluent-for-kubernetes-0.174.21 - version: 0.174.21 + helm.sh/chart: confluent-for-kubernetes-0.174.13 + version: 0.174.13 name: confluent-operator namespace: default spec: @@ -35,7 +35,7 @@ spec: app.kubernetes.io/name: "confluent-operator" app.kubernetes.io/instance: RELEASE-NAME confluent-platform: "true" - version: 0.174.21 + version: 0.174.13 spec: securityContext: fsGroup: 1001 @@ -46,7 +46,7 @@ spec: - --debug=false - --namespaces=default name: confluent-operator - image: docker.io/confluentinc/confluent-operator:0.174.21 + image: docker.io/confluentinc/confluent-operator:0.174.13 imagePullPolicy: IfNotPresent terminationMessagePath: /dev/termination-log terminationMessagePolicy: File diff --git a/kustomize/base/operator/licensing.yaml b/kustomize/base/operator/licensing.yaml index c536271..a2219a6 100644 --- a/kustomize/base/operator/licensing.yaml +++ b/kustomize/base/operator/licensing.yaml @@ -9,7 +9,7 @@ metadata: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: "confluent-operator" - helm.sh/chart: confluent-for-kubernetes-0.174.21 + helm.sh/chart: confluent-for-kubernetes-0.174.13 namespace: default name: confluent-operator-licensing type: Opaque diff --git a/kustomize/base/operator/service.yaml b/kustomize/base/operator/service.yaml index 430528e..b6ba389 100644 --- a/kustomize/base/operator/service.yaml +++ b/kustomize/base/operator/service.yaml @@ -9,7 +9,7 @@ metadata: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: "confluent-operator" - helm.sh/chart: confluent-for-kubernetes-0.174.21 + helm.sh/chart: confluent-for-kubernetes-0.174.13 name: confluent-operator namespace: default spec: diff --git a/kustomize/base/operator/serviceaccount.yaml b/kustomize/base/operator/serviceaccount.yaml index 48d5063..eb68e19 100644 --- a/kustomize/base/operator/serviceaccount.yaml +++ b/kustomize/base/operator/serviceaccount.yaml @@ -11,6 +11,6 @@ metadata: app.kubernetes.io/instance: RELEASE-NAME app.kubernetes.io/managed-by: Helm app.kubernetes.io/component: "confluent-operator" - helm.sh/chart: confluent-for-kubernetes-0.174.21 + helm.sh/chart: confluent-for-kubernetes-0.174.13 name: confluent-for-kubernetes namespace: default diff --git a/kustomize/crds/crds/platform.confluent.io_connects.yaml b/kustomize/crds/crds/platform.confluent.io_connects.yaml index 42c6afb..e8d9cdf 100644 --- a/kustomize/crds/crds/platform.confluent.io_connects.yaml +++ b/kustomize/crds/crds/platform.confluent.io_connects.yaml @@ -1142,6 +1142,256 @@ spec: description: CPExternalAccess holds all external access policies for non-kafka components properties: + ingress: + description: Ingress allows to create a ingress service Not implemented + yet! + properties: + annotations: + additionalProperties: + type: string + description: Annotations allows to add annotations for the kubernetes + service type ingress service + type: object + spec: + description: IngressSpec describes the Ingress the user wishes + to exist. + properties: + backend: + description: A default backend capable of servicing requests + that don't match any rule. At least one of 'backend' or + 'rules' must be specified. This field is optional to allow + the loadbalancer controller or defaulting logic to specify + a global default. + properties: + resource: + description: Resource is an ObjectRef to another Kubernetes + resource in the namespace of the Ingress object. If + resource is specified, serviceName and servicePort + must not be specified. + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, + the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being + referenced + type: string + name: + description: Name is the name of resource being + referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the name of the referenced service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the port of the referenced service. + x-kubernetes-int-or-string: true + type: object + ingressClassName: + description: IngressClassName is the name of the IngressClass + cluster resource. The associated IngressClass defines + which controller will implement the resource. This replaces + the deprecated `kubernetes.io/ingress.class` annotation. + For backwards compatibility, when that annotation is set, + it must be given precedence over this field. The controller + may emit a warning if the field and annotation have different + values. Implementations of this API should ignore Ingresses + without a class specified. An IngressClass resource may + be marked as default, which can be used to set a default + value for this field. For more information, refer to the + IngressClass documentation. + type: string + rules: + description: A list of host rules used to configure the + Ingress. If unspecified, or no rule matches, all traffic + is sent to the default backend. + items: + description: IngressRule represents the rules mapping + the paths under a specified host to the related backend + services. Incoming requests are first evaluated for + a host match, then routed to the backend associated + with the matching IngressRuleValue. + properties: + host: + description: "Host is the fully qualified domain name + of a network host, as defined by RFC 3986. Note + the following deviations from the \"host\" part + of the URI as defined in RFC 3986: 1. IPs are not + allowed. Currently an IngressRuleValue can only + apply to the IP in the Spec of the parent Ingress. + 2. The `:` delimiter is not respected because ports + are not allowed. \t Currently the port of an Ingress + is implicitly :80 for http and \t :443 for https. + Both these may change in the future. Incoming requests + are matched against the host before the IngressRuleValue. + If the host is unspecified, the Ingress routes all + traffic based on the specified IngressRuleValue. + \n Host can be \"precise\" which is a domain name + without the terminating dot of a network host (e.g. + \"foo.bar.com\") or \"wildcard\", which is a domain + name prefixed with a single wildcard label (e.g. + \"*.foo.com\"). The wildcard character '*' must + appear by itself as the first DNS label and matches + only a single label. You cannot have a wildcard + label by itself (e.g. Host == \"*\"). Requests will + be matched against the Host field in the following + way: 1. If Host is precise, the request matches + this rule if the http host header is equal to Host. + 2. If Host is a wildcard, then the request matches + this rule if the http host header is to equal to + the suffix (removing the first label) of the wildcard + rule." + type: string + http: + description: 'HTTPIngressRuleValue is a list of http + selectors pointing to backends. In the example: + http:///? -> backend where + where parts of the url correspond to RFC 3986, this + resource will be used to match against everything + after the last ''/'' and before the first ''?'' + or ''#''.' + properties: + paths: + description: A collection of paths that map requests + to backends. + items: + description: HTTPIngressPath associates a path + with a backend. Incoming urls matching the + path are forwarded to the backend. + properties: + backend: + description: Backend defines the referenced + service endpoint to which the traffic + will be forwarded to. + properties: + resource: + description: Resource is an ObjectRef + to another Kubernetes resource in + the namespace of the Ingress object. + If resource is specified, serviceName + and servicePort must not be specified. + properties: + apiGroup: + description: APIGroup is the group + for the resource being referenced. + If APIGroup is not specified, + the specified Kind must be in + the core API group. For any other + third-party types, APIGroup is + required. + type: string + kind: + description: Kind is the type of + resource being referenced + type: string + name: + description: Name is the name of + resource being referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the name of the + referenced service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the port of the + referenced service. + x-kubernetes-int-or-string: true + type: object + path: + description: Path is matched against the + path of an incoming request. Currently + it can contain characters disallowed from + the conventional "path" part of a URL + as defined by RFC 3986. Paths must begin + with a '/'. When unspecified, all paths + from incoming requests are matched. + type: string + pathType: + description: 'PathType determines the interpretation + of the Path matching. PathType can be + one of the following values: * Exact: + Matches the URL path exactly. * Prefix: + Matches based on a URL path prefix split + by ''/''. Matching is done on a path + element by element basis. A path element + refers is the list of labels in the + path split by the ''/'' separator. A request + is a match for path p if every p is + an element-wise prefix of p of the request + path. Note that if the last element of + the path is a substring of the last + element in request path, it is not a match + (e.g. /foo/bar matches /foo/bar/baz, + but does not match /foo/barbaz). * ImplementationSpecific: + Interpretation of the Path matching is + up to the IngressClass. Implementations + can treat this as a separate PathType or + treat it identically to Prefix or Exact + path types. Implementations are required + to support all path types. Defaults to + ImplementationSpecific.' + type: string + required: + - backend + type: object + type: array + required: + - paths + type: object + type: object + type: array + tls: + description: TLS configuration. Currently the Ingress only + supports a single TLS port, 443. If multiple members of + this list specify different hosts, they will be multiplexed + on the same port according to the hostname specified through + the SNI TLS extension, if the ingress controller fulfilling + the ingress supports SNI. + items: + description: IngressTLS describes the transport layer + security associated with an Ingress. + properties: + hosts: + description: Hosts are a list of hosts included in + the TLS certificate. The values in this list must + match the name/s used in the tlsSecret. Defaults + to the wildcard host setting for the loadbalancer + controller fulfilling this Ingress, if left unspecified. + items: + type: string + type: array + secretName: + description: SecretName is the name of the secret + used to terminate TLS traffic on port 443. Field + is left optional to allow TLS routing based on SNI + hostname alone. If the SNI host in a listener conflicts + with the "Host" header field used by an IngressRule, + the SNI host is used for termination and value of + the Host header is used for routing. + type: string + type: object + type: array + type: object + required: + - spec + type: object loadBalancer: description: LoadBalancer allows to create a kubernetes load balancer service @@ -1275,8 +1525,7 @@ spec: type: integer servicePorts: description: ServicePorts allows to specify user-provided service - port(s) For Kafka with nodePort type, it will only apply to - kafka bootstrap service + port(s) items: description: ServicePort contains information on service's port. @@ -1392,14 +1641,6 @@ spec: description: Init defines init-container name pattern: .+:.+ type: string - pullPolicy: - description: ImagePullPolicy, One of Always, Never, IfNotPresent. - Defaults to IfNotPresent. - enum: - - Always - - Never - - IfNotPresent - type: string pullSecretRef: description: 'ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that @@ -2637,112 +2878,24 @@ spec: type: string type: object type: array - topologySpreadConstraints: - description: TopologySpreadConstraints describes how a group of - pods ought to spread across topology domains. Scheduler will schedule - pods in a way which abides by the constraints. All topologySpreadConstraints - are ANDed. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine - the number of pods in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. - If the operator is In or NotIn, the values array - must be non-empty. If the operator is Exists or - DoesNotExist, the values array must be empty. - This array is replaced during a strategic merge - patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. - A single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is - "key", the operator is "In", and the values array contains - only "value". The requirements are ANDed. - type: object - type: object - maxSkew: - description: 'MaxSkew describes the degree to which pods may - be unevenly distributed. It''s the maximum permitted difference - between the number of matching pods in any two topology - domains of a given topology type. For example, in a 3-zone - cluster, MaxSkew is set to 1, and pods with the same labelSelector - spread as 1/1/0: | zone1 | zone2 | zone3 | | P | P | | - - if MaxSkew is 1, incoming pod can only be scheduled to - zone3 to become 1/1/1; scheduling it onto zone1(zone2) would - make the ActualSkew(2-0) on zone1(zone2) violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any - zone. It''s a required field. Default value is 1 and 0 is - not allowed.' - format: int32 - type: integer - topologyKey: - description: TopologyKey is the key of node labels. Nodes - that have a label with this key and identical values are - considered to be in the same topology. We consider each - as a "bucket", and try to put balanced number - of pods into each bucket. It's a required field. - type: string - whenUnsatisfiable: - description: 'WhenUnsatisfiable indicates how to deal with - a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule - (default) tells the scheduler not to schedule it - ScheduleAnyway - tells the scheduler to still schedule it It''s considered - as "Unsatisfiable" if and only if placing incoming pod on - any topology violates "MaxSkew". For example, in a 3-zone - cluster, MaxSkew is set to 1, and pods with the same labelSelector - spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod - can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) - as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). - In other words, the cluster can still be imbalanced, but - scheduler won''t make it *more* imbalanced. It''s a required - field.' - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - type: array type: object replicas: description: Replicas is the desired number of replicas of the given Template. Change will roll the cluster format: int32 type: integer + storageClass: + description: Storage class used for creating pvc's of created connect + pods + properties: + name: + description: Name defines name is the storage class reference name + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + required: + - name + type: object telemetry: description: ConfluentTelemetry defines the confluent telemetry reporter configuration @@ -2923,10 +3076,6 @@ spec: description: AuthenticationType defines authentication type configured by a listener type: string - externalAccessType: - description: ExternalAccessType is the external access type used - for the listener - type: string externalEndpoint: description: ExternalEndpoint defines the external endpoint to connect to the service diff --git a/kustomize/crds/crds/platform.confluent.io_controlcenters.yaml b/kustomize/crds/crds/platform.confluent.io_controlcenters.yaml index 0f18682..d7d7783 100644 --- a/kustomize/crds/crds/platform.confluent.io_controlcenters.yaml +++ b/kustomize/crds/crds/platform.confluent.io_controlcenters.yaml @@ -864,6 +864,256 @@ spec: externalAccess: description: ExternalAccess defines the external access configuration properties: + ingress: + description: Ingress allows to create a ingress service Not implemented + yet! + properties: + annotations: + additionalProperties: + type: string + description: Annotations allows to add annotations for the kubernetes + service type ingress service + type: object + spec: + description: IngressSpec describes the Ingress the user wishes + to exist. + properties: + backend: + description: A default backend capable of servicing requests + that don't match any rule. At least one of 'backend' or + 'rules' must be specified. This field is optional to allow + the loadbalancer controller or defaulting logic to specify + a global default. + properties: + resource: + description: Resource is an ObjectRef to another Kubernetes + resource in the namespace of the Ingress object. If + resource is specified, serviceName and servicePort + must not be specified. + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, + the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being + referenced + type: string + name: + description: Name is the name of resource being + referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the name of the referenced service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the port of the referenced service. + x-kubernetes-int-or-string: true + type: object + ingressClassName: + description: IngressClassName is the name of the IngressClass + cluster resource. The associated IngressClass defines + which controller will implement the resource. This replaces + the deprecated `kubernetes.io/ingress.class` annotation. + For backwards compatibility, when that annotation is set, + it must be given precedence over this field. The controller + may emit a warning if the field and annotation have different + values. Implementations of this API should ignore Ingresses + without a class specified. An IngressClass resource may + be marked as default, which can be used to set a default + value for this field. For more information, refer to the + IngressClass documentation. + type: string + rules: + description: A list of host rules used to configure the + Ingress. If unspecified, or no rule matches, all traffic + is sent to the default backend. + items: + description: IngressRule represents the rules mapping + the paths under a specified host to the related backend + services. Incoming requests are first evaluated for + a host match, then routed to the backend associated + with the matching IngressRuleValue. + properties: + host: + description: "Host is the fully qualified domain name + of a network host, as defined by RFC 3986. Note + the following deviations from the \"host\" part + of the URI as defined in RFC 3986: 1. IPs are not + allowed. Currently an IngressRuleValue can only + apply to the IP in the Spec of the parent Ingress. + 2. The `:` delimiter is not respected because ports + are not allowed. \t Currently the port of an Ingress + is implicitly :80 for http and \t :443 for https. + Both these may change in the future. Incoming requests + are matched against the host before the IngressRuleValue. + If the host is unspecified, the Ingress routes all + traffic based on the specified IngressRuleValue. + \n Host can be \"precise\" which is a domain name + without the terminating dot of a network host (e.g. + \"foo.bar.com\") or \"wildcard\", which is a domain + name prefixed with a single wildcard label (e.g. + \"*.foo.com\"). The wildcard character '*' must + appear by itself as the first DNS label and matches + only a single label. You cannot have a wildcard + label by itself (e.g. Host == \"*\"). Requests will + be matched against the Host field in the following + way: 1. If Host is precise, the request matches + this rule if the http host header is equal to Host. + 2. If Host is a wildcard, then the request matches + this rule if the http host header is to equal to + the suffix (removing the first label) of the wildcard + rule." + type: string + http: + description: 'HTTPIngressRuleValue is a list of http + selectors pointing to backends. In the example: + http:///? -> backend where + where parts of the url correspond to RFC 3986, this + resource will be used to match against everything + after the last ''/'' and before the first ''?'' + or ''#''.' + properties: + paths: + description: A collection of paths that map requests + to backends. + items: + description: HTTPIngressPath associates a path + with a backend. Incoming urls matching the + path are forwarded to the backend. + properties: + backend: + description: Backend defines the referenced + service endpoint to which the traffic + will be forwarded to. + properties: + resource: + description: Resource is an ObjectRef + to another Kubernetes resource in + the namespace of the Ingress object. + If resource is specified, serviceName + and servicePort must not be specified. + properties: + apiGroup: + description: APIGroup is the group + for the resource being referenced. + If APIGroup is not specified, + the specified Kind must be in + the core API group. For any other + third-party types, APIGroup is + required. + type: string + kind: + description: Kind is the type of + resource being referenced + type: string + name: + description: Name is the name of + resource being referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the name of the + referenced service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the port of the + referenced service. + x-kubernetes-int-or-string: true + type: object + path: + description: Path is matched against the + path of an incoming request. Currently + it can contain characters disallowed from + the conventional "path" part of a URL + as defined by RFC 3986. Paths must begin + with a '/'. When unspecified, all paths + from incoming requests are matched. + type: string + pathType: + description: 'PathType determines the interpretation + of the Path matching. PathType can be + one of the following values: * Exact: + Matches the URL path exactly. * Prefix: + Matches based on a URL path prefix split + by ''/''. Matching is done on a path + element by element basis. A path element + refers is the list of labels in the + path split by the ''/'' separator. A request + is a match for path p if every p is + an element-wise prefix of p of the request + path. Note that if the last element of + the path is a substring of the last + element in request path, it is not a match + (e.g. /foo/bar matches /foo/bar/baz, + but does not match /foo/barbaz). * ImplementationSpecific: + Interpretation of the Path matching is + up to the IngressClass. Implementations + can treat this as a separate PathType or + treat it identically to Prefix or Exact + path types. Implementations are required + to support all path types. Defaults to + ImplementationSpecific.' + type: string + required: + - backend + type: object + type: array + required: + - paths + type: object + type: object + type: array + tls: + description: TLS configuration. Currently the Ingress only + supports a single TLS port, 443. If multiple members of + this list specify different hosts, they will be multiplexed + on the same port according to the hostname specified through + the SNI TLS extension, if the ingress controller fulfilling + the ingress supports SNI. + items: + description: IngressTLS describes the transport layer + security associated with an Ingress. + properties: + hosts: + description: Hosts are a list of hosts included in + the TLS certificate. The values in this list must + match the name/s used in the tlsSecret. Defaults + to the wildcard host setting for the loadbalancer + controller fulfilling this Ingress, if left unspecified. + items: + type: string + type: array + secretName: + description: SecretName is the name of the secret + used to terminate TLS traffic on port 443. Field + is left optional to allow TLS routing based on SNI + hostname alone. If the SNI host in a listener conflicts + with the "Host" header field used by an IngressRule, + the SNI host is used for termination and value of + the Host header is used for routing. + type: string + type: object + type: array + type: object + required: + - spec + type: object loadBalancer: description: LoadBalancer allows to create a kubernetes load balancer service @@ -997,8 +1247,7 @@ spec: type: integer servicePorts: description: ServicePorts allows to specify user-provided service - port(s) For Kafka with nodePort type, it will only apply to - kafka bootstrap service + port(s) items: description: ServicePort contains information on service's port. @@ -1119,14 +1368,6 @@ spec: description: Init defines init-container name pattern: .+:.+ type: string - pullPolicy: - description: ImagePullPolicy, One of Always, Never, IfNotPresent. - Defaults to IfNotPresent. - enum: - - Always - - Never - - IfNotPresent - type: string pullSecretRef: description: 'ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that @@ -2567,106 +2808,6 @@ spec: type: string type: object type: array - topologySpreadConstraints: - description: TopologySpreadConstraints describes how a group of - pods ought to spread across topology domains. Scheduler will schedule - pods in a way which abides by the constraints. All topologySpreadConstraints - are ANDed. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine - the number of pods in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. - If the operator is In or NotIn, the values array - must be non-empty. If the operator is Exists or - DoesNotExist, the values array must be empty. - This array is replaced during a strategic merge - patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. - A single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is - "key", the operator is "In", and the values array contains - only "value". The requirements are ANDed. - type: object - type: object - maxSkew: - description: 'MaxSkew describes the degree to which pods may - be unevenly distributed. It''s the maximum permitted difference - between the number of matching pods in any two topology - domains of a given topology type. For example, in a 3-zone - cluster, MaxSkew is set to 1, and pods with the same labelSelector - spread as 1/1/0: | zone1 | zone2 | zone3 | | P | P | | - - if MaxSkew is 1, incoming pod can only be scheduled to - zone3 to become 1/1/1; scheduling it onto zone1(zone2) would - make the ActualSkew(2-0) on zone1(zone2) violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any - zone. It''s a required field. Default value is 1 and 0 is - not allowed.' - format: int32 - type: integer - topologyKey: - description: TopologyKey is the key of node labels. Nodes - that have a label with this key and identical values are - considered to be in the same topology. We consider each - as a "bucket", and try to put balanced number - of pods into each bucket. It's a required field. - type: string - whenUnsatisfiable: - description: 'WhenUnsatisfiable indicates how to deal with - a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule - (default) tells the scheduler not to schedule it - ScheduleAnyway - tells the scheduler to still schedule it It''s considered - as "Unsatisfiable" if and only if placing incoming pod on - any topology violates "MaxSkew". For example, in a 3-zone - cluster, MaxSkew is set to 1, and pods with the same labelSelector - spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod - can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) - as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). - In other words, the cluster can still be imbalanced, but - scheduler won''t make it *more* imbalanced. It''s a required - field.' - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - type: array type: object replicas: description: Replicas is the desired number of replicas of the given @@ -2862,10 +3003,6 @@ spec: description: AuthenticationType defines authentication type configured by a listener type: string - externalAccessType: - description: ExternalAccessType is the external access type used - for the listener - type: string externalEndpoint: description: ExternalEndpoint defines the external endpoint to connect to the service diff --git a/kustomize/crds/crds/platform.confluent.io_kafkarestclasses.yaml b/kustomize/crds/crds/platform.confluent.io_kafkarestclasses.yaml index 56f6cf4..d685a88 100644 --- a/kustomize/crds/crds/platform.confluent.io_kafkarestclasses.yaml +++ b/kustomize/crds/crds/platform.confluent.io_kafkarestclasses.yaml @@ -73,29 +73,48 @@ spec: API properties: basic: - description: KafkaRestBasicAuthentication defines basic authentication + description: BasicAuthentication defines basic authentication properties: + directoryPathInContainer: + description: DirectoryPathInContainer allows to pass basic + credential through directory path in a container + minLength: 1 + type: string + restrictedRoles: + description: RestrictedRoles defines restricted roles on + the server side only. Changes will be only reflected in + ControlCenter (C3). This configuration is ignored on the + client side configuration + items: + type: string + minItems: 1 + type: array + roles: + description: Role defines list of roles configuration on + the server side only. This configuration is ignored on + the client side configuration + items: + type: string + type: array secretRef: description: Name of the secret reference maxLength: 30 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - required: - - secretRef type: object bearer: - description: KafkaRestBearerAuthentication defines bearer authentication, - used by MDS clients when RBAC enabled + description: BearerAuthentication used by MDS clients properties: + directoryPathInContainer: + minLength: 1 + type: string secretRef: description: Name of the secret reference maxLength: 30 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - required: - - secretRef type: object type: enum: @@ -181,29 +200,48 @@ spec: API properties: basic: - description: KafkaRestBasicAuthentication defines basic authentication + description: BasicAuthentication defines basic authentication properties: + directoryPathInContainer: + description: DirectoryPathInContainer allows to pass basic + credential through directory path in a container + minLength: 1 + type: string + restrictedRoles: + description: RestrictedRoles defines restricted roles on + the server side only. Changes will be only reflected in + ControlCenter (C3). This configuration is ignored on the + client side configuration + items: + type: string + minItems: 1 + type: array + roles: + description: Role defines list of roles configuration on + the server side only. This configuration is ignored on + the client side configuration + items: + type: string + type: array secretRef: description: Name of the secret reference maxLength: 30 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - required: - - secretRef type: object bearer: - description: KafkaRestBearerAuthentication defines bearer authentication, - used by MDS clients when RBAC enabled + description: BearerAuthentication used by MDS clients properties: + directoryPathInContainer: + minLength: 1 + type: string secretRef: description: Name of the secret reference maxLength: 30 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - required: - - secretRef type: object type: enum: diff --git a/kustomize/crds/crds/platform.confluent.io_kafkas.yaml b/kustomize/crds/crds/platform.confluent.io_kafkas.yaml index 44f4cce..3d61f2d 100644 --- a/kustomize/crds/crds/platform.confluent.io_kafkas.yaml +++ b/kustomize/crds/crds/platform.confluent.io_kafkas.yaml @@ -403,109 +403,6 @@ spec: - kafka - tokenKeyPair type: object - schemaRegistry: - description: SchemaRegistryClientDependency allows configuring CP - component dependency to configure schemaRegistry settings - properties: - authentication: - description: Authentication defines the authentication for the - schemaregistry cluster - properties: - basic: - description: Basic defines basic authentication - properties: - directoryPathInContainer: - description: DirectoryPathInContainer allows to pass - basic credential through directory path in a container - minLength: 1 - type: string - restrictedRoles: - description: RestrictedRoles defines restricted roles - on the server side only. Changes will be only reflected - in ControlCenter (C3). This configuration is ignored - on the client side configuration - items: - type: string - minItems: 1 - type: array - roles: - description: Role defines list of roles configuration - on the server side only. This configuration is ignored - on the client side configuration - items: - type: string - type: array - secretRef: - description: Name of the secret reference - maxLength: 30 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - type: object - type: - description: Type defines supported authentication scheme - for Rest client - enum: - - basic - - mtls - type: string - required: - - type - type: object - tls: - description: TLSDependencyConfig defines the client side TLS - setting for schemaregistry cluster - properties: - directoryPathInContainer: - description: DirectoryPathInContainer contains the directory - path in container where keystore/truststore.jks/jksPassword.txt - keys are mounted. CP will not configure truststore.jks - can be ignored with IgnoreTrustStoreConfig field - minLength: 1 - type: string - enabled: - description: Enabled enables the TLS configuration for CP - component - type: boolean - ignoreTrustStoreConfig: - description: IgnoreTrustStoreConfig when configure ignores - the truststore configuration for CP component - type: boolean - jksPassword: - description: JksPassword defines the secret name referenced - for jks password - properties: - secretRef: - description: SecretRef defines the secret name referenced - for jks password More information about jks password - key/value format can be found in Confluent Operator - document - maxLength: 30 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - required: - - secretRef - type: object - secretRef: - description: SecretRef defines the secret name referenced - for certificates More information about certificates key/value - format can be found in Confluent Operator document - maxLength: 30 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - required: - - enabled - type: object - url: - description: URL defines the URL endpoint - minLength: 1 - pattern: ^https?://.* - type: string - required: - - url - type: object zookeeper: description: KafkaZookeeperDependencies properties: @@ -641,14 +538,6 @@ spec: description: Init defines init-container name pattern: .+:.+ type: string - pullPolicy: - description: ImagePullPolicy, One of Always, Never, IfNotPresent. - Defaults to IfNotPresent. - enum: - - Always - - Never - - IfNotPresent - type: string pullSecretRef: description: 'ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that @@ -767,6 +656,291 @@ spec: description: KafkaExternalAccess allows to configure external access for Kafka cluster properties: + ingress: + description: Ingress allows to create a ingress service + Not implemented yet! + properties: + annotations: + additionalProperties: + type: string + description: Annotations allows to add annotations + for the kubernetes service type ingress service + type: object + spec: + description: IngressSpec describes the Ingress the + user wishes to exist. + properties: + backend: + description: A default backend capable of servicing + requests that don't match any rule. At least + one of 'backend' or 'rules' must be specified. + This field is optional to allow the loadbalancer + controller or defaulting logic to specify a + global default. + properties: + resource: + description: Resource is an ObjectRef to another + Kubernetes resource in the namespace of + the Ingress object. If resource is specified, + serviceName and servicePort must not be + specified. + properties: + apiGroup: + description: APIGroup is the group for + the resource being referenced. If APIGroup + is not specified, the specified Kind + must be in the core API group. For any + other third-party types, APIGroup is + required. + type: string + kind: + description: Kind is the type of resource + being referenced + type: string + name: + description: Name is the name of resource + being referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the name of the referenced + service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the port of the referenced + service. + x-kubernetes-int-or-string: true + type: object + ingressClassName: + description: IngressClassName is the name of the + IngressClass cluster resource. The associated + IngressClass defines which controller will implement + the resource. This replaces the deprecated `kubernetes.io/ingress.class` + annotation. For backwards compatibility, when + that annotation is set, it must be given precedence + over this field. The controller may emit a warning + if the field and annotation have different values. + Implementations of this API should ignore Ingresses + without a class specified. An IngressClass resource + may be marked as default, which can be used + to set a default value for this field. For more + information, refer to the IngressClass documentation. + type: string + rules: + description: A list of host rules used to configure + the Ingress. If unspecified, or no rule matches, + all traffic is sent to the default backend. + items: + description: IngressRule represents the rules + mapping the paths under a specified host to + the related backend services. Incoming requests + are first evaluated for a host match, then + routed to the backend associated with the + matching IngressRuleValue. + properties: + host: + description: "Host is the fully qualified + domain name of a network host, as defined + by RFC 3986. Note the following deviations + from the \"host\" part of the URI as defined + in RFC 3986: 1. IPs are not allowed. Currently + an IngressRuleValue can only apply to + \ the IP in the Spec of the parent Ingress. + 2. The `:` delimiter is not respected + because ports are not allowed. \t Currently + the port of an Ingress is implicitly :80 + for http and \t :443 for https. Both + these may change in the future. Incoming + requests are matched against the host + before the IngressRuleValue. If the host + is unspecified, the Ingress routes all + traffic based on the specified IngressRuleValue. + \n Host can be \"precise\" which is a + domain name without the terminating dot + of a network host (e.g. \"foo.bar.com\") + or \"wildcard\", which is a domain name + prefixed with a single wildcard label + (e.g. \"*.foo.com\"). The wildcard character + '*' must appear by itself as the first + DNS label and matches only a single label. + You cannot have a wildcard label by itself + (e.g. Host == \"*\"). Requests will be + matched against the Host field in the + following way: 1. If Host is precise, + the request matches this rule if the http + host header is equal to Host. 2. If Host + is a wildcard, then the request matches + this rule if the http host header is to + equal to the suffix (removing the first + label) of the wildcard rule." + type: string + http: + description: 'HTTPIngressRuleValue is a + list of http selectors pointing to backends. + In the example: http:///? + -> backend where where parts of the url + correspond to RFC 3986, this resource + will be used to match against everything + after the last ''/'' and before the first + ''?'' or ''#''.' + properties: + paths: + description: A collection of paths that + map requests to backends. + items: + description: HTTPIngressPath associates + a path with a backend. Incoming + urls matching the path are forwarded + to the backend. + properties: + backend: + description: Backend defines the + referenced service endpoint + to which the traffic will be + forwarded to. + properties: + resource: + description: Resource is an + ObjectRef to another Kubernetes + resource in the namespace + of the Ingress object. If + resource is specified, serviceName + and servicePort must not + be specified. + properties: + apiGroup: + description: APIGroup + is the group for the + resource being referenced. + If APIGroup is not specified, + the specified Kind must + be in the core API group. + For any other third-party + types, APIGroup is required. + type: string + kind: + description: Kind is the + type of resource being + referenced + type: string + name: + description: Name is the + name of resource being + referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the + name of the referenced service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the + port of the referenced service. + x-kubernetes-int-or-string: true + type: object + path: + description: Path is matched against + the path of an incoming request. + Currently it can contain characters + disallowed from the conventional + "path" part of a URL as defined + by RFC 3986. Paths must begin + with a '/'. When unspecified, + all paths from incoming requests + are matched. + type: string + pathType: + description: 'PathType determines + the interpretation of the Path + matching. PathType can be one + of the following values: * Exact: + Matches the URL path exactly. + * Prefix: Matches based on a + URL path prefix split by ''/''. + Matching is done on a path + element by element basis. A + path element refers is the list + of labels in the path split + by the ''/'' separator. A request + is a match for path p if every + p is an element-wise prefix + of p of the request path. + Note that if the last element + of the path is a substring of + the last element in request + path, it is not a match (e.g. + /foo/bar matches /foo/bar/baz, + but does not match /foo/barbaz). + * ImplementationSpecific: Interpretation + of the Path matching is up to the + IngressClass. Implementations + can treat this as a separate + PathType or treat it identically + to Prefix or Exact path types. + Implementations are required + to support all path types. Defaults + to ImplementationSpecific.' + type: string + required: + - backend + type: object + type: array + required: + - paths + type: object + type: object + type: array + tls: + description: TLS configuration. Currently the + Ingress only supports a single TLS port, 443. + If multiple members of this list specify different + hosts, they will be multiplexed on the same + port according to the hostname specified through + the SNI TLS extension, if the ingress controller + fulfilling the ingress supports SNI. + items: + description: IngressTLS describes the transport + layer security associated with an Ingress. + properties: + hosts: + description: Hosts are a list of hosts included + in the TLS certificate. The values in + this list must match the name/s used in + the tlsSecret. Defaults to the wildcard + host setting for the loadbalancer controller + fulfilling this Ingress, if left unspecified. + items: + type: string + type: array + secretName: + description: SecretName is the name of the + secret used to terminate TLS traffic on + port 443. Field is left optional to allow + TLS routing based on SNI hostname alone. + If the SNI host in a listener conflicts + with the "Host" header field used by an + IngressRule, the SNI host is used for + termination and value of the Host header + is used for routing. + type: string + type: object + type: array + type: object + required: + - spec + type: object loadBalancer: description: LoadBalancer allows to create a kubernetes load balancer service @@ -911,8 +1085,7 @@ spec: type: integer servicePorts: description: ServicePorts allows to specify user-provided - service port(s) For Kafka with nodePort type, it - will only apply to kafka bootstrap service + service port(s) items: description: ServicePort contains information on service's port. @@ -1210,6 +1383,284 @@ spec: description: KafkaExternalAccess allows to configure external access for Kafka cluster properties: + ingress: + description: Ingress allows to create a ingress service + Not implemented yet! + properties: + annotations: + additionalProperties: + type: string + description: Annotations allows to add annotations for + the kubernetes service type ingress service + type: object + spec: + description: IngressSpec describes the Ingress the user + wishes to exist. + properties: + backend: + description: A default backend capable of servicing + requests that don't match any rule. At least one + of 'backend' or 'rules' must be specified. This + field is optional to allow the loadbalancer controller + or defaulting logic to specify a global default. + properties: + resource: + description: Resource is an ObjectRef to another + Kubernetes resource in the namespace of the + Ingress object. If resource is specified, + serviceName and servicePort must not be specified. + properties: + apiGroup: + description: APIGroup is the group for the + resource being referenced. If APIGroup + is not specified, the specified Kind must + be in the core API group. For any other + third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource + being referenced + type: string + name: + description: Name is the name of resource + being referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the name of the referenced + service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the port of the referenced + service. + x-kubernetes-int-or-string: true + type: object + ingressClassName: + description: IngressClassName is the name of the + IngressClass cluster resource. The associated + IngressClass defines which controller will implement + the resource. This replaces the deprecated `kubernetes.io/ingress.class` + annotation. For backwards compatibility, when + that annotation is set, it must be given precedence + over this field. The controller may emit a warning + if the field and annotation have different values. + Implementations of this API should ignore Ingresses + without a class specified. An IngressClass resource + may be marked as default, which can be used to + set a default value for this field. For more information, + refer to the IngressClass documentation. + type: string + rules: + description: A list of host rules used to configure + the Ingress. If unspecified, or no rule matches, + all traffic is sent to the default backend. + items: + description: IngressRule represents the rules + mapping the paths under a specified host to + the related backend services. Incoming requests + are first evaluated for a host match, then routed + to the backend associated with the matching + IngressRuleValue. + properties: + host: + description: "Host is the fully qualified + domain name of a network host, as defined + by RFC 3986. Note the following deviations + from the \"host\" part of the URI as defined + in RFC 3986: 1. IPs are not allowed. Currently + an IngressRuleValue can only apply to the + IP in the Spec of the parent Ingress. 2. + The `:` delimiter is not respected because + ports are not allowed. \t Currently the + port of an Ingress is implicitly :80 for + http and \t :443 for https. Both these + may change in the future. Incoming requests + are matched against the host before the + IngressRuleValue. If the host is unspecified, + the Ingress routes all traffic based on + the specified IngressRuleValue. \n Host + can be \"precise\" which is a domain name + without the terminating dot of a network + host (e.g. \"foo.bar.com\") or \"wildcard\", + which is a domain name prefixed with a single + wildcard label (e.g. \"*.foo.com\"). The + wildcard character '*' must appear by itself + as the first DNS label and matches only + a single label. You cannot have a wildcard + label by itself (e.g. Host == \"*\"). Requests + will be matched against the Host field in + the following way: 1. If Host is precise, + the request matches this rule if the http + host header is equal to Host. 2. If Host + is a wildcard, then the request matches + this rule if the http host header is to + equal to the suffix (removing the first + label) of the wildcard rule." + type: string + http: + description: 'HTTPIngressRuleValue is a list + of http selectors pointing to backends. + In the example: http:///? + -> backend where where parts of the url + correspond to RFC 3986, this resource will + be used to match against everything after + the last ''/'' and before the first ''?'' + or ''#''.' + properties: + paths: + description: A collection of paths that + map requests to backends. + items: + description: HTTPIngressPath associates + a path with a backend. Incoming urls + matching the path are forwarded to + the backend. + properties: + backend: + description: Backend defines the + referenced service endpoint to + which the traffic will be forwarded + to. + properties: + resource: + description: Resource is an + ObjectRef to another Kubernetes + resource in the namespace + of the Ingress object. If + resource is specified, serviceName + and servicePort must not be + specified. + properties: + apiGroup: + description: APIGroup is + the group for the resource + being referenced. If APIGroup + is not specified, the + specified Kind must be + in the core API group. + For any other third-party + types, APIGroup is required. + type: string + kind: + description: Kind is the + type of resource being + referenced + type: string + name: + description: Name is the + name of resource being + referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the name + of the referenced service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the port + of the referenced service. + x-kubernetes-int-or-string: true + type: object + path: + description: Path is matched against + the path of an incoming request. + Currently it can contain characters + disallowed from the conventional + "path" part of a URL as defined + by RFC 3986. Paths must begin + with a '/'. When unspecified, + all paths from incoming requests + are matched. + type: string + pathType: + description: 'PathType determines + the interpretation of the Path + matching. PathType can be one + of the following values: * Exact: + Matches the URL path exactly. + * Prefix: Matches based on a URL + path prefix split by ''/''. Matching + is done on a path element by + element basis. A path element + refers is the list of labels + in the path split by the ''/'' + separator. A request is a match + for path p if every p is an element-wise + prefix of p of the request path. + Note that if the last element + of the path is a substring of + the last element in request path, + it is not a match (e.g. /foo/bar matches + /foo/bar/baz, but does not match + /foo/barbaz). * ImplementationSpecific: + Interpretation of the Path matching + is up to the IngressClass. Implementations + can treat this as a separate PathType or + treat it identically to Prefix + or Exact path types. Implementations + are required to support all path + types. Defaults to ImplementationSpecific.' + type: string + required: + - backend + type: object + type: array + required: + - paths + type: object + type: object + type: array + tls: + description: TLS configuration. Currently the Ingress + only supports a single TLS port, 443. If multiple + members of this list specify different hosts, + they will be multiplexed on the same port according + to the hostname specified through the SNI TLS + extension, if the ingress controller fulfilling + the ingress supports SNI. + items: + description: IngressTLS describes the transport + layer security associated with an Ingress. + properties: + hosts: + description: Hosts are a list of hosts included + in the TLS certificate. The values in this + list must match the name/s used in the tlsSecret. + Defaults to the wildcard host setting for + the loadbalancer controller fulfilling this + Ingress, if left unspecified. + items: + type: string + type: array + secretName: + description: SecretName is the name of the + secret used to terminate TLS traffic on + port 443. Field is left optional to allow + TLS routing based on SNI hostname alone. + If the SNI host in a listener conflicts + with the "Host" header field used by an + IngressRule, the SNI host is used for termination + and value of the Host header is used for + routing. + type: string + type: object + type: array + type: object + required: + - spec + type: object loadBalancer: description: LoadBalancer allows to create a kubernetes load balancer service @@ -1350,8 +1801,7 @@ spec: type: integer servicePorts: description: ServicePorts allows to specify user-provided - service port(s) For Kafka with nodePort type, it will - only apply to kafka bootstrap service + service port(s) items: description: ServicePort contains information on service's port. @@ -2941,106 +3391,6 @@ spec: type: string type: object type: array - topologySpreadConstraints: - description: TopologySpreadConstraints describes how a group of - pods ought to spread across topology domains. Scheduler will schedule - pods in a way which abides by the constraints. All topologySpreadConstraints - are ANDed. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine - the number of pods in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. - If the operator is In or NotIn, the values array - must be non-empty. If the operator is Exists or - DoesNotExist, the values array must be empty. - This array is replaced during a strategic merge - patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. - A single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is - "key", the operator is "In", and the values array contains - only "value". The requirements are ANDed. - type: object - type: object - maxSkew: - description: 'MaxSkew describes the degree to which pods may - be unevenly distributed. It''s the maximum permitted difference - between the number of matching pods in any two topology - domains of a given topology type. For example, in a 3-zone - cluster, MaxSkew is set to 1, and pods with the same labelSelector - spread as 1/1/0: | zone1 | zone2 | zone3 | | P | P | | - - if MaxSkew is 1, incoming pod can only be scheduled to - zone3 to become 1/1/1; scheduling it onto zone1(zone2) would - make the ActualSkew(2-0) on zone1(zone2) violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any - zone. It''s a required field. Default value is 1 and 0 is - not allowed.' - format: int32 - type: integer - topologyKey: - description: TopologyKey is the key of node labels. Nodes - that have a label with this key and identical values are - considered to be in the same topology. We consider each - as a "bucket", and try to put balanced number - of pods into each bucket. It's a required field. - type: string - whenUnsatisfiable: - description: 'WhenUnsatisfiable indicates how to deal with - a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule - (default) tells the scheduler not to schedule it - ScheduleAnyway - tells the scheduler to still schedule it It''s considered - as "Unsatisfiable" if and only if placing incoming pod on - any topology violates "MaxSkew". For example, in a 3-zone - cluster, MaxSkew is set to 1, and pods with the same labelSelector - spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod - can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) - as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). - In other words, the cluster can still be imbalanced, but - scheduler won''t make it *more* imbalanced. It''s a required - field.' - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - type: array type: object rackAssignment: description: RackAssignment defines the rack awareness capability for @@ -3072,55 +3422,288 @@ spec: kafkaRest: description: RestApiServer embedded rest api server properties: - authentication: - description: RestServerAuthentication server authentication - support to the CP Component - properties: - basic: - description: Basic defines basic authentication - properties: - directoryPathInContainer: - description: DirectoryPathInContainer allows to pass - basic credential through directory path in a container - minLength: 1 - type: string - restrictedRoles: - description: RestrictedRoles defines restricted roles - on the server side only. Changes will be only reflected - in ControlCenter (C3). This configuration is ignored - on the client side configuration - items: - type: string - minItems: 1 - type: array - roles: - description: Role defines list of roles configuration - on the server side only. This configuration is ignored - on the client side configuration - items: - type: string - type: array - secretRef: - description: Name of the secret reference - maxLength: 30 - minLength: 1 - pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ - type: string - type: object - type: - description: Type defines supported authentication scheme - for Rest Server - enum: - - basic - - mtls - type: string - required: - - type - type: object externalAccess: description: CPExternalAccess holds all external access policies for non-kafka components properties: + ingress: + description: Ingress allows to create a ingress service + Not implemented yet! + properties: + annotations: + additionalProperties: + type: string + description: Annotations allows to add annotations for + the kubernetes service type ingress service + type: object + spec: + description: IngressSpec describes the Ingress the user + wishes to exist. + properties: + backend: + description: A default backend capable of servicing + requests that don't match any rule. At least one + of 'backend' or 'rules' must be specified. This + field is optional to allow the loadbalancer controller + or defaulting logic to specify a global default. + properties: + resource: + description: Resource is an ObjectRef to another + Kubernetes resource in the namespace of the + Ingress object. If resource is specified, + serviceName and servicePort must not be specified. + properties: + apiGroup: + description: APIGroup is the group for the + resource being referenced. If APIGroup + is not specified, the specified Kind must + be in the core API group. For any other + third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource + being referenced + type: string + name: + description: Name is the name of resource + being referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the name of the referenced + service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the port of the referenced + service. + x-kubernetes-int-or-string: true + type: object + ingressClassName: + description: IngressClassName is the name of the + IngressClass cluster resource. The associated + IngressClass defines which controller will implement + the resource. This replaces the deprecated `kubernetes.io/ingress.class` + annotation. For backwards compatibility, when + that annotation is set, it must be given precedence + over this field. The controller may emit a warning + if the field and annotation have different values. + Implementations of this API should ignore Ingresses + without a class specified. An IngressClass resource + may be marked as default, which can be used to + set a default value for this field. For more information, + refer to the IngressClass documentation. + type: string + rules: + description: A list of host rules used to configure + the Ingress. If unspecified, or no rule matches, + all traffic is sent to the default backend. + items: + description: IngressRule represents the rules + mapping the paths under a specified host to + the related backend services. Incoming requests + are first evaluated for a host match, then routed + to the backend associated with the matching + IngressRuleValue. + properties: + host: + description: "Host is the fully qualified + domain name of a network host, as defined + by RFC 3986. Note the following deviations + from the \"host\" part of the URI as defined + in RFC 3986: 1. IPs are not allowed. Currently + an IngressRuleValue can only apply to the + IP in the Spec of the parent Ingress. 2. + The `:` delimiter is not respected because + ports are not allowed. \t Currently the + port of an Ingress is implicitly :80 for + http and \t :443 for https. Both these + may change in the future. Incoming requests + are matched against the host before the + IngressRuleValue. If the host is unspecified, + the Ingress routes all traffic based on + the specified IngressRuleValue. \n Host + can be \"precise\" which is a domain name + without the terminating dot of a network + host (e.g. \"foo.bar.com\") or \"wildcard\", + which is a domain name prefixed with a single + wildcard label (e.g. \"*.foo.com\"). The + wildcard character '*' must appear by itself + as the first DNS label and matches only + a single label. You cannot have a wildcard + label by itself (e.g. Host == \"*\"). Requests + will be matched against the Host field in + the following way: 1. If Host is precise, + the request matches this rule if the http + host header is equal to Host. 2. If Host + is a wildcard, then the request matches + this rule if the http host header is to + equal to the suffix (removing the first + label) of the wildcard rule." + type: string + http: + description: 'HTTPIngressRuleValue is a list + of http selectors pointing to backends. + In the example: http:///? + -> backend where where parts of the url + correspond to RFC 3986, this resource will + be used to match against everything after + the last ''/'' and before the first ''?'' + or ''#''.' + properties: + paths: + description: A collection of paths that + map requests to backends. + items: + description: HTTPIngressPath associates + a path with a backend. Incoming urls + matching the path are forwarded to + the backend. + properties: + backend: + description: Backend defines the + referenced service endpoint to + which the traffic will be forwarded + to. + properties: + resource: + description: Resource is an + ObjectRef to another Kubernetes + resource in the namespace + of the Ingress object. If + resource is specified, serviceName + and servicePort must not be + specified. + properties: + apiGroup: + description: APIGroup is + the group for the resource + being referenced. If APIGroup + is not specified, the + specified Kind must be + in the core API group. + For any other third-party + types, APIGroup is required. + type: string + kind: + description: Kind is the + type of resource being + referenced + type: string + name: + description: Name is the + name of resource being + referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the name + of the referenced service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the port + of the referenced service. + x-kubernetes-int-or-string: true + type: object + path: + description: Path is matched against + the path of an incoming request. + Currently it can contain characters + disallowed from the conventional + "path" part of a URL as defined + by RFC 3986. Paths must begin + with a '/'. When unspecified, + all paths from incoming requests + are matched. + type: string + pathType: + description: 'PathType determines + the interpretation of the Path + matching. PathType can be one + of the following values: * Exact: + Matches the URL path exactly. + * Prefix: Matches based on a URL + path prefix split by ''/''. Matching + is done on a path element by + element basis. A path element + refers is the list of labels + in the path split by the ''/'' + separator. A request is a match + for path p if every p is an element-wise + prefix of p of the request path. + Note that if the last element + of the path is a substring of + the last element in request path, + it is not a match (e.g. /foo/bar matches + /foo/bar/baz, but does not match + /foo/barbaz). * ImplementationSpecific: + Interpretation of the Path matching + is up to the IngressClass. Implementations + can treat this as a separate PathType or + treat it identically to Prefix + or Exact path types. Implementations + are required to support all path + types. Defaults to ImplementationSpecific.' + type: string + required: + - backend + type: object + type: array + required: + - paths + type: object + type: object + type: array + tls: + description: TLS configuration. Currently the Ingress + only supports a single TLS port, 443. If multiple + members of this list specify different hosts, + they will be multiplexed on the same port according + to the hostname specified through the SNI TLS + extension, if the ingress controller fulfilling + the ingress supports SNI. + items: + description: IngressTLS describes the transport + layer security associated with an Ingress. + properties: + hosts: + description: Hosts are a list of hosts included + in the TLS certificate. The values in this + list must match the name/s used in the tlsSecret. + Defaults to the wildcard host setting for + the loadbalancer controller fulfilling this + Ingress, if left unspecified. + items: + type: string + type: array + secretName: + description: SecretName is the name of the + secret used to terminate TLS traffic on + port 443. Field is left optional to allow + TLS routing based on SNI hostname alone. + If the SNI host in a listener conflicts + with the "Host" header field used by an + IngressRule, the SNI host is used for termination + and value of the Host header is used for + routing. + type: string + type: object + type: array + type: object + required: + - spec + type: object loadBalancer: description: LoadBalancer allows to create a kubernetes load balancer service @@ -3261,8 +3844,7 @@ spec: type: integer servicePorts: description: ServicePorts allows to specify user-provided - service port(s) For Kafka with nodePort type, it will - only apply to kafka bootstrap service + service port(s) items: description: ServicePort contains information on service's port. @@ -3437,6 +4019,284 @@ spec: description: CPExternalAccess holds all external access policies for non-kafka components properties: + ingress: + description: Ingress allows to create a ingress service + Not implemented yet! + properties: + annotations: + additionalProperties: + type: string + description: Annotations allows to add annotations for + the kubernetes service type ingress service + type: object + spec: + description: IngressSpec describes the Ingress the user + wishes to exist. + properties: + backend: + description: A default backend capable of servicing + requests that don't match any rule. At least one + of 'backend' or 'rules' must be specified. This + field is optional to allow the loadbalancer controller + or defaulting logic to specify a global default. + properties: + resource: + description: Resource is an ObjectRef to another + Kubernetes resource in the namespace of the + Ingress object. If resource is specified, + serviceName and servicePort must not be specified. + properties: + apiGroup: + description: APIGroup is the group for the + resource being referenced. If APIGroup + is not specified, the specified Kind must + be in the core API group. For any other + third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource + being referenced + type: string + name: + description: Name is the name of resource + being referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the name of the referenced + service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the port of the referenced + service. + x-kubernetes-int-or-string: true + type: object + ingressClassName: + description: IngressClassName is the name of the + IngressClass cluster resource. The associated + IngressClass defines which controller will implement + the resource. This replaces the deprecated `kubernetes.io/ingress.class` + annotation. For backwards compatibility, when + that annotation is set, it must be given precedence + over this field. The controller may emit a warning + if the field and annotation have different values. + Implementations of this API should ignore Ingresses + without a class specified. An IngressClass resource + may be marked as default, which can be used to + set a default value for this field. For more information, + refer to the IngressClass documentation. + type: string + rules: + description: A list of host rules used to configure + the Ingress. If unspecified, or no rule matches, + all traffic is sent to the default backend. + items: + description: IngressRule represents the rules + mapping the paths under a specified host to + the related backend services. Incoming requests + are first evaluated for a host match, then routed + to the backend associated with the matching + IngressRuleValue. + properties: + host: + description: "Host is the fully qualified + domain name of a network host, as defined + by RFC 3986. Note the following deviations + from the \"host\" part of the URI as defined + in RFC 3986: 1. IPs are not allowed. Currently + an IngressRuleValue can only apply to the + IP in the Spec of the parent Ingress. 2. + The `:` delimiter is not respected because + ports are not allowed. \t Currently the + port of an Ingress is implicitly :80 for + http and \t :443 for https. Both these + may change in the future. Incoming requests + are matched against the host before the + IngressRuleValue. If the host is unspecified, + the Ingress routes all traffic based on + the specified IngressRuleValue. \n Host + can be \"precise\" which is a domain name + without the terminating dot of a network + host (e.g. \"foo.bar.com\") or \"wildcard\", + which is a domain name prefixed with a single + wildcard label (e.g. \"*.foo.com\"). The + wildcard character '*' must appear by itself + as the first DNS label and matches only + a single label. You cannot have a wildcard + label by itself (e.g. Host == \"*\"). Requests + will be matched against the Host field in + the following way: 1. If Host is precise, + the request matches this rule if the http + host header is equal to Host. 2. If Host + is a wildcard, then the request matches + this rule if the http host header is to + equal to the suffix (removing the first + label) of the wildcard rule." + type: string + http: + description: 'HTTPIngressRuleValue is a list + of http selectors pointing to backends. + In the example: http:///? + -> backend where where parts of the url + correspond to RFC 3986, this resource will + be used to match against everything after + the last ''/'' and before the first ''?'' + or ''#''.' + properties: + paths: + description: A collection of paths that + map requests to backends. + items: + description: HTTPIngressPath associates + a path with a backend. Incoming urls + matching the path are forwarded to + the backend. + properties: + backend: + description: Backend defines the + referenced service endpoint to + which the traffic will be forwarded + to. + properties: + resource: + description: Resource is an + ObjectRef to another Kubernetes + resource in the namespace + of the Ingress object. If + resource is specified, serviceName + and servicePort must not be + specified. + properties: + apiGroup: + description: APIGroup is + the group for the resource + being referenced. If APIGroup + is not specified, the + specified Kind must be + in the core API group. + For any other third-party + types, APIGroup is required. + type: string + kind: + description: Kind is the + type of resource being + referenced + type: string + name: + description: Name is the + name of resource being + referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the name + of the referenced service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the port + of the referenced service. + x-kubernetes-int-or-string: true + type: object + path: + description: Path is matched against + the path of an incoming request. + Currently it can contain characters + disallowed from the conventional + "path" part of a URL as defined + by RFC 3986. Paths must begin + with a '/'. When unspecified, + all paths from incoming requests + are matched. + type: string + pathType: + description: 'PathType determines + the interpretation of the Path + matching. PathType can be one + of the following values: * Exact: + Matches the URL path exactly. + * Prefix: Matches based on a URL + path prefix split by ''/''. Matching + is done on a path element by + element basis. A path element + refers is the list of labels + in the path split by the ''/'' + separator. A request is a match + for path p if every p is an element-wise + prefix of p of the request path. + Note that if the last element + of the path is a substring of + the last element in request path, + it is not a match (e.g. /foo/bar matches + /foo/bar/baz, but does not match + /foo/barbaz). * ImplementationSpecific: + Interpretation of the Path matching + is up to the IngressClass. Implementations + can treat this as a separate PathType or + treat it identically to Prefix + or Exact path types. Implementations + are required to support all path + types. Defaults to ImplementationSpecific.' + type: string + required: + - backend + type: object + type: array + required: + - paths + type: object + type: object + type: array + tls: + description: TLS configuration. Currently the Ingress + only supports a single TLS port, 443. If multiple + members of this list specify different hosts, + they will be multiplexed on the same port according + to the hostname specified through the SNI TLS + extension, if the ingress controller fulfilling + the ingress supports SNI. + items: + description: IngressTLS describes the transport + layer security associated with an Ingress. + properties: + hosts: + description: Hosts are a list of hosts included + in the TLS certificate. The values in this + list must match the name/s used in the tlsSecret. + Defaults to the wildcard host setting for + the loadbalancer controller fulfilling this + Ingress, if left unspecified. + items: + type: string + type: array + secretName: + description: SecretName is the name of the + secret used to terminate TLS traffic on + port 443. Field is left optional to allow + TLS routing based on SNI hostname alone. + If the SNI host in a listener conflicts + with the "Host" header field used by an + IngressRule, the SNI host is used for termination + and value of the Host header is used for + routing. + type: string + type: object + type: array + type: object + required: + - spec + type: object loadBalancer: description: LoadBalancer allows to create a kubernetes load balancer service @@ -3577,8 +4437,7 @@ spec: type: integer servicePorts: description: ServicePorts allows to specify user-provided - service port(s) For Kafka with nodePort type, it will - only apply to kafka bootstrap service + service port(s) items: description: ServicePort contains information on service's port. @@ -4044,10 +4903,6 @@ spec: type: string client: type: string - externalAccessType: - description: ExternalAccessType is the external access type used - for the listener - type: string externalEndpoint: description: ExternalEndpoint defines the external endpoint to connect to the service @@ -4096,10 +4951,6 @@ spec: description: AuthenticationType defines authentication type configured by a listener type: string - externalAccessType: - description: ExternalAccessType is the external access type used - for the listener - type: string externalEndpoint: description: ExternalEndpoint defines the external endpoint to connect to the service diff --git a/kustomize/crds/crds/platform.confluent.io_kafkatopics.yaml b/kustomize/crds/crds/platform.confluent.io_kafkatopics.yaml index bd6ba8c..47ce7b4 100644 --- a/kustomize/crds/crds/platform.confluent.io_kafkatopics.yaml +++ b/kustomize/crds/crds/platform.confluent.io_kafkatopics.yaml @@ -91,29 +91,48 @@ spec: API properties: basic: - description: KafkaRestBasicAuthentication defines basic authentication + description: BasicAuthentication defines basic authentication properties: + directoryPathInContainer: + description: DirectoryPathInContainer allows to pass basic + credential through directory path in a container + minLength: 1 + type: string + restrictedRoles: + description: RestrictedRoles defines restricted roles on + the server side only. Changes will be only reflected in + ControlCenter (C3). This configuration is ignored on the + client side configuration + items: + type: string + minItems: 1 + type: array + roles: + description: Role defines list of roles configuration on + the server side only. This configuration is ignored on + the client side configuration + items: + type: string + type: array secretRef: description: Name of the secret reference maxLength: 30 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - required: - - secretRef type: object bearer: - description: KafkaRestBearerAuthentication defines bearer authentication, - used by MDS clients when RBAC enabled + description: BearerAuthentication used by MDS clients properties: + directoryPathInContainer: + minLength: 1 + type: string secretRef: description: Name of the secret reference maxLength: 30 minLength: 1 pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ type: string - required: - - secretRef type: object type: enum: diff --git a/kustomize/crds/crds/platform.confluent.io_ksqldbs.yaml b/kustomize/crds/crds/platform.confluent.io_ksqldbs.yaml index 8a16e2a..4c773c8 100644 --- a/kustomize/crds/crds/platform.confluent.io_ksqldbs.yaml +++ b/kustomize/crds/crds/platform.confluent.io_ksqldbs.yaml @@ -770,6 +770,256 @@ spec: description: Provides configuring endpoints and services to make ksqlDB accessible from outside the cluster properties: + ingress: + description: Ingress allows to create a ingress service Not implemented + yet! + properties: + annotations: + additionalProperties: + type: string + description: Annotations allows to add annotations for the kubernetes + service type ingress service + type: object + spec: + description: IngressSpec describes the Ingress the user wishes + to exist. + properties: + backend: + description: A default backend capable of servicing requests + that don't match any rule. At least one of 'backend' or + 'rules' must be specified. This field is optional to allow + the loadbalancer controller or defaulting logic to specify + a global default. + properties: + resource: + description: Resource is an ObjectRef to another Kubernetes + resource in the namespace of the Ingress object. If + resource is specified, serviceName and servicePort + must not be specified. + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, + the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being + referenced + type: string + name: + description: Name is the name of resource being + referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the name of the referenced service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the port of the referenced service. + x-kubernetes-int-or-string: true + type: object + ingressClassName: + description: IngressClassName is the name of the IngressClass + cluster resource. The associated IngressClass defines + which controller will implement the resource. This replaces + the deprecated `kubernetes.io/ingress.class` annotation. + For backwards compatibility, when that annotation is set, + it must be given precedence over this field. The controller + may emit a warning if the field and annotation have different + values. Implementations of this API should ignore Ingresses + without a class specified. An IngressClass resource may + be marked as default, which can be used to set a default + value for this field. For more information, refer to the + IngressClass documentation. + type: string + rules: + description: A list of host rules used to configure the + Ingress. If unspecified, or no rule matches, all traffic + is sent to the default backend. + items: + description: IngressRule represents the rules mapping + the paths under a specified host to the related backend + services. Incoming requests are first evaluated for + a host match, then routed to the backend associated + with the matching IngressRuleValue. + properties: + host: + description: "Host is the fully qualified domain name + of a network host, as defined by RFC 3986. Note + the following deviations from the \"host\" part + of the URI as defined in RFC 3986: 1. IPs are not + allowed. Currently an IngressRuleValue can only + apply to the IP in the Spec of the parent Ingress. + 2. The `:` delimiter is not respected because ports + are not allowed. \t Currently the port of an Ingress + is implicitly :80 for http and \t :443 for https. + Both these may change in the future. Incoming requests + are matched against the host before the IngressRuleValue. + If the host is unspecified, the Ingress routes all + traffic based on the specified IngressRuleValue. + \n Host can be \"precise\" which is a domain name + without the terminating dot of a network host (e.g. + \"foo.bar.com\") or \"wildcard\", which is a domain + name prefixed with a single wildcard label (e.g. + \"*.foo.com\"). The wildcard character '*' must + appear by itself as the first DNS label and matches + only a single label. You cannot have a wildcard + label by itself (e.g. Host == \"*\"). Requests will + be matched against the Host field in the following + way: 1. If Host is precise, the request matches + this rule if the http host header is equal to Host. + 2. If Host is a wildcard, then the request matches + this rule if the http host header is to equal to + the suffix (removing the first label) of the wildcard + rule." + type: string + http: + description: 'HTTPIngressRuleValue is a list of http + selectors pointing to backends. In the example: + http:///? -> backend where + where parts of the url correspond to RFC 3986, this + resource will be used to match against everything + after the last ''/'' and before the first ''?'' + or ''#''.' + properties: + paths: + description: A collection of paths that map requests + to backends. + items: + description: HTTPIngressPath associates a path + with a backend. Incoming urls matching the + path are forwarded to the backend. + properties: + backend: + description: Backend defines the referenced + service endpoint to which the traffic + will be forwarded to. + properties: + resource: + description: Resource is an ObjectRef + to another Kubernetes resource in + the namespace of the Ingress object. + If resource is specified, serviceName + and servicePort must not be specified. + properties: + apiGroup: + description: APIGroup is the group + for the resource being referenced. + If APIGroup is not specified, + the specified Kind must be in + the core API group. For any other + third-party types, APIGroup is + required. + type: string + kind: + description: Kind is the type of + resource being referenced + type: string + name: + description: Name is the name of + resource being referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the name of the + referenced service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the port of the + referenced service. + x-kubernetes-int-or-string: true + type: object + path: + description: Path is matched against the + path of an incoming request. Currently + it can contain characters disallowed from + the conventional "path" part of a URL + as defined by RFC 3986. Paths must begin + with a '/'. When unspecified, all paths + from incoming requests are matched. + type: string + pathType: + description: 'PathType determines the interpretation + of the Path matching. PathType can be + one of the following values: * Exact: + Matches the URL path exactly. * Prefix: + Matches based on a URL path prefix split + by ''/''. Matching is done on a path + element by element basis. A path element + refers is the list of labels in the + path split by the ''/'' separator. A request + is a match for path p if every p is + an element-wise prefix of p of the request + path. Note that if the last element of + the path is a substring of the last + element in request path, it is not a match + (e.g. /foo/bar matches /foo/bar/baz, + but does not match /foo/barbaz). * ImplementationSpecific: + Interpretation of the Path matching is + up to the IngressClass. Implementations + can treat this as a separate PathType or + treat it identically to Prefix or Exact + path types. Implementations are required + to support all path types. Defaults to + ImplementationSpecific.' + type: string + required: + - backend + type: object + type: array + required: + - paths + type: object + type: object + type: array + tls: + description: TLS configuration. Currently the Ingress only + supports a single TLS port, 443. If multiple members of + this list specify different hosts, they will be multiplexed + on the same port according to the hostname specified through + the SNI TLS extension, if the ingress controller fulfilling + the ingress supports SNI. + items: + description: IngressTLS describes the transport layer + security associated with an Ingress. + properties: + hosts: + description: Hosts are a list of hosts included in + the TLS certificate. The values in this list must + match the name/s used in the tlsSecret. Defaults + to the wildcard host setting for the loadbalancer + controller fulfilling this Ingress, if left unspecified. + items: + type: string + type: array + secretName: + description: SecretName is the name of the secret + used to terminate TLS traffic on port 443. Field + is left optional to allow TLS routing based on SNI + hostname alone. If the SNI host in a listener conflicts + with the "Host" header field used by an IngressRule, + the SNI host is used for termination and value of + the Host header is used for routing. + type: string + type: object + type: array + type: object + required: + - spec + type: object loadBalancer: description: LoadBalancer allows to create a kubernetes load balancer service @@ -903,8 +1153,7 @@ spec: type: integer servicePorts: description: ServicePorts allows to specify user-provided service - port(s) For Kafka with nodePort type, it will only apply to - kafka bootstrap service + port(s) items: description: ServicePort contains information on service's port. @@ -1020,14 +1269,6 @@ spec: description: Init defines init-container name pattern: .+:.+ type: string - pullPolicy: - description: ImagePullPolicy, One of Always, Never, IfNotPresent. - Defaults to IfNotPresent. - enum: - - Always - - Never - - IfNotPresent - type: string pullSecretRef: description: 'ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that @@ -2258,106 +2499,6 @@ spec: type: string type: object type: array - topologySpreadConstraints: - description: TopologySpreadConstraints describes how a group of - pods ought to spread across topology domains. Scheduler will schedule - pods in a way which abides by the constraints. All topologySpreadConstraints - are ANDed. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine - the number of pods in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. - If the operator is In or NotIn, the values array - must be non-empty. If the operator is Exists or - DoesNotExist, the values array must be empty. - This array is replaced during a strategic merge - patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. - A single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is - "key", the operator is "In", and the values array contains - only "value". The requirements are ANDed. - type: object - type: object - maxSkew: - description: 'MaxSkew describes the degree to which pods may - be unevenly distributed. It''s the maximum permitted difference - between the number of matching pods in any two topology - domains of a given topology type. For example, in a 3-zone - cluster, MaxSkew is set to 1, and pods with the same labelSelector - spread as 1/1/0: | zone1 | zone2 | zone3 | | P | P | | - - if MaxSkew is 1, incoming pod can only be scheduled to - zone3 to become 1/1/1; scheduling it onto zone1(zone2) would - make the ActualSkew(2-0) on zone1(zone2) violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any - zone. It''s a required field. Default value is 1 and 0 is - not allowed.' - format: int32 - type: integer - topologyKey: - description: TopologyKey is the key of node labels. Nodes - that have a label with this key and identical values are - considered to be in the same topology. We consider each - as a "bucket", and try to put balanced number - of pods into each bucket. It's a required field. - type: string - whenUnsatisfiable: - description: 'WhenUnsatisfiable indicates how to deal with - a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule - (default) tells the scheduler not to schedule it - ScheduleAnyway - tells the scheduler to still schedule it It''s considered - as "Unsatisfiable" if and only if placing incoming pod on - any topology violates "MaxSkew". For example, in a 3-zone - cluster, MaxSkew is set to 1, and pods with the same labelSelector - spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod - can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) - as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). - In other words, the cluster can still be imbalanced, but - scheduler won''t make it *more* imbalanced. It''s a required - field.' - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - type: array type: object replicas: description: Replicas is the desired number of replicas of the given @@ -2549,10 +2690,6 @@ spec: description: AuthenticationType defines authentication type configured by a listener type: string - externalAccessType: - description: ExternalAccessType is the external access type used - for the listener - type: string externalEndpoint: description: ExternalEndpoint defines the external endpoint to connect to the service diff --git a/kustomize/crds/crds/platform.confluent.io_schemaregistries.yaml b/kustomize/crds/crds/platform.confluent.io_schemaregistries.yaml index f0822c2..988d12e 100644 --- a/kustomize/crds/crds/platform.confluent.io_schemaregistries.yaml +++ b/kustomize/crds/crds/platform.confluent.io_schemaregistries.yaml @@ -384,6 +384,256 @@ spec: externalAccess: description: ExternalAccess defines the external access configuration properties: + ingress: + description: Ingress allows to create a ingress service Not implemented + yet! + properties: + annotations: + additionalProperties: + type: string + description: Annotations allows to add annotations for the kubernetes + service type ingress service + type: object + spec: + description: IngressSpec describes the Ingress the user wishes + to exist. + properties: + backend: + description: A default backend capable of servicing requests + that don't match any rule. At least one of 'backend' or + 'rules' must be specified. This field is optional to allow + the loadbalancer controller or defaulting logic to specify + a global default. + properties: + resource: + description: Resource is an ObjectRef to another Kubernetes + resource in the namespace of the Ingress object. If + resource is specified, serviceName and servicePort + must not be specified. + properties: + apiGroup: + description: APIGroup is the group for the resource + being referenced. If APIGroup is not specified, + the specified Kind must be in the core API group. + For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being + referenced + type: string + name: + description: Name is the name of resource being + referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the name of the referenced service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the port of the referenced service. + x-kubernetes-int-or-string: true + type: object + ingressClassName: + description: IngressClassName is the name of the IngressClass + cluster resource. The associated IngressClass defines + which controller will implement the resource. This replaces + the deprecated `kubernetes.io/ingress.class` annotation. + For backwards compatibility, when that annotation is set, + it must be given precedence over this field. The controller + may emit a warning if the field and annotation have different + values. Implementations of this API should ignore Ingresses + without a class specified. An IngressClass resource may + be marked as default, which can be used to set a default + value for this field. For more information, refer to the + IngressClass documentation. + type: string + rules: + description: A list of host rules used to configure the + Ingress. If unspecified, or no rule matches, all traffic + is sent to the default backend. + items: + description: IngressRule represents the rules mapping + the paths under a specified host to the related backend + services. Incoming requests are first evaluated for + a host match, then routed to the backend associated + with the matching IngressRuleValue. + properties: + host: + description: "Host is the fully qualified domain name + of a network host, as defined by RFC 3986. Note + the following deviations from the \"host\" part + of the URI as defined in RFC 3986: 1. IPs are not + allowed. Currently an IngressRuleValue can only + apply to the IP in the Spec of the parent Ingress. + 2. The `:` delimiter is not respected because ports + are not allowed. \t Currently the port of an Ingress + is implicitly :80 for http and \t :443 for https. + Both these may change in the future. Incoming requests + are matched against the host before the IngressRuleValue. + If the host is unspecified, the Ingress routes all + traffic based on the specified IngressRuleValue. + \n Host can be \"precise\" which is a domain name + without the terminating dot of a network host (e.g. + \"foo.bar.com\") or \"wildcard\", which is a domain + name prefixed with a single wildcard label (e.g. + \"*.foo.com\"). The wildcard character '*' must + appear by itself as the first DNS label and matches + only a single label. You cannot have a wildcard + label by itself (e.g. Host == \"*\"). Requests will + be matched against the Host field in the following + way: 1. If Host is precise, the request matches + this rule if the http host header is equal to Host. + 2. If Host is a wildcard, then the request matches + this rule if the http host header is to equal to + the suffix (removing the first label) of the wildcard + rule." + type: string + http: + description: 'HTTPIngressRuleValue is a list of http + selectors pointing to backends. In the example: + http:///? -> backend where + where parts of the url correspond to RFC 3986, this + resource will be used to match against everything + after the last ''/'' and before the first ''?'' + or ''#''.' + properties: + paths: + description: A collection of paths that map requests + to backends. + items: + description: HTTPIngressPath associates a path + with a backend. Incoming urls matching the + path are forwarded to the backend. + properties: + backend: + description: Backend defines the referenced + service endpoint to which the traffic + will be forwarded to. + properties: + resource: + description: Resource is an ObjectRef + to another Kubernetes resource in + the namespace of the Ingress object. + If resource is specified, serviceName + and servicePort must not be specified. + properties: + apiGroup: + description: APIGroup is the group + for the resource being referenced. + If APIGroup is not specified, + the specified Kind must be in + the core API group. For any other + third-party types, APIGroup is + required. + type: string + kind: + description: Kind is the type of + resource being referenced + type: string + name: + description: Name is the name of + resource being referenced + type: string + required: + - kind + - name + type: object + serviceName: + description: Specifies the name of the + referenced service. + type: string + servicePort: + anyOf: + - type: integer + - type: string + description: Specifies the port of the + referenced service. + x-kubernetes-int-or-string: true + type: object + path: + description: Path is matched against the + path of an incoming request. Currently + it can contain characters disallowed from + the conventional "path" part of a URL + as defined by RFC 3986. Paths must begin + with a '/'. When unspecified, all paths + from incoming requests are matched. + type: string + pathType: + description: 'PathType determines the interpretation + of the Path matching. PathType can be + one of the following values: * Exact: + Matches the URL path exactly. * Prefix: + Matches based on a URL path prefix split + by ''/''. Matching is done on a path + element by element basis. A path element + refers is the list of labels in the + path split by the ''/'' separator. A request + is a match for path p if every p is + an element-wise prefix of p of the request + path. Note that if the last element of + the path is a substring of the last + element in request path, it is not a match + (e.g. /foo/bar matches /foo/bar/baz, + but does not match /foo/barbaz). * ImplementationSpecific: + Interpretation of the Path matching is + up to the IngressClass. Implementations + can treat this as a separate PathType or + treat it identically to Prefix or Exact + path types. Implementations are required + to support all path types. Defaults to + ImplementationSpecific.' + type: string + required: + - backend + type: object + type: array + required: + - paths + type: object + type: object + type: array + tls: + description: TLS configuration. Currently the Ingress only + supports a single TLS port, 443. If multiple members of + this list specify different hosts, they will be multiplexed + on the same port according to the hostname specified through + the SNI TLS extension, if the ingress controller fulfilling + the ingress supports SNI. + items: + description: IngressTLS describes the transport layer + security associated with an Ingress. + properties: + hosts: + description: Hosts are a list of hosts included in + the TLS certificate. The values in this list must + match the name/s used in the tlsSecret. Defaults + to the wildcard host setting for the loadbalancer + controller fulfilling this Ingress, if left unspecified. + items: + type: string + type: array + secretName: + description: SecretName is the name of the secret + used to terminate TLS traffic on port 443. Field + is left optional to allow TLS routing based on SNI + hostname alone. If the SNI host in a listener conflicts + with the "Host" header field used by an IngressRule, + the SNI host is used for termination and value of + the Host header is used for routing. + type: string + type: object + type: array + type: object + required: + - spec + type: object loadBalancer: description: LoadBalancer allows to create a kubernetes load balancer service @@ -517,8 +767,7 @@ spec: type: integer servicePorts: description: ServicePorts allows to specify user-provided service - port(s) For Kafka with nodePort type, it will only apply to - kafka bootstrap service + port(s) items: description: ServicePort contains information on service's port. @@ -634,14 +883,6 @@ spec: description: Init defines init-container name pattern: .+:.+ type: string - pullPolicy: - description: ImagePullPolicy, One of Always, Never, IfNotPresent. - Defaults to IfNotPresent. - enum: - - Always - - Never - - IfNotPresent - type: string pullSecretRef: description: 'ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that @@ -1872,112 +2113,23 @@ spec: type: string type: object type: array - topologySpreadConstraints: - description: TopologySpreadConstraints describes how a group of - pods ought to spread across topology domains. Scheduler will schedule - pods in a way which abides by the constraints. All topologySpreadConstraints - are ANDed. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine - the number of pods in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. - If the operator is In or NotIn, the values array - must be non-empty. If the operator is Exists or - DoesNotExist, the values array must be empty. - This array is replaced during a strategic merge - patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. - A single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is - "key", the operator is "In", and the values array contains - only "value". The requirements are ANDed. - type: object - type: object - maxSkew: - description: 'MaxSkew describes the degree to which pods may - be unevenly distributed. It''s the maximum permitted difference - between the number of matching pods in any two topology - domains of a given topology type. For example, in a 3-zone - cluster, MaxSkew is set to 1, and pods with the same labelSelector - spread as 1/1/0: | zone1 | zone2 | zone3 | | P | P | | - - if MaxSkew is 1, incoming pod can only be scheduled to - zone3 to become 1/1/1; scheduling it onto zone1(zone2) would - make the ActualSkew(2-0) on zone1(zone2) violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any - zone. It''s a required field. Default value is 1 and 0 is - not allowed.' - format: int32 - type: integer - topologyKey: - description: TopologyKey is the key of node labels. Nodes - that have a label with this key and identical values are - considered to be in the same topology. We consider each - as a "bucket", and try to put balanced number - of pods into each bucket. It's a required field. - type: string - whenUnsatisfiable: - description: 'WhenUnsatisfiable indicates how to deal with - a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule - (default) tells the scheduler not to schedule it - ScheduleAnyway - tells the scheduler to still schedule it It''s considered - as "Unsatisfiable" if and only if placing incoming pod on - any topology violates "MaxSkew". For example, in a 3-zone - cluster, MaxSkew is set to 1, and pods with the same labelSelector - spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod - can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) - as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). - In other words, the cluster can still be imbalanced, but - scheduler won''t make it *more* imbalanced. It''s a required - field.' - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - type: array type: object replicas: description: Replicas is the desired number of replicas of the given Template. Change will roll the cluster format: int32 type: integer + storageClass: + description: Storage defines + properties: + name: + description: Name defines name is the storage class reference name + minLength: 1 + pattern: ^[a-z0-9]([-a-z0-9]*[a-z0-9])?$ + type: string + required: + - name + type: object telemetry: description: ConfluentTelemetry defines the confluent telemetry reporter configuration @@ -2154,10 +2306,6 @@ spec: description: AuthenticationType defines authentication type configured by a listener type: string - externalAccessType: - description: ExternalAccessType is the external access type used - for the listener - type: string externalEndpoint: description: ExternalEndpoint defines the external endpoint to connect to the service diff --git a/kustomize/crds/crds/platform.confluent.io_zookeepers.yaml b/kustomize/crds/crds/platform.confluent.io_zookeepers.yaml index 19b661d..36a4461 100644 --- a/kustomize/crds/crds/platform.confluent.io_zookeepers.yaml +++ b/kustomize/crds/crds/platform.confluent.io_zookeepers.yaml @@ -157,14 +157,6 @@ spec: description: Init defines init-container name pattern: .+:.+ type: string - pullPolicy: - description: ImagePullPolicy, One of Always, Never, IfNotPresent. - Defaults to IfNotPresent. - enum: - - Always - - Never - - IfNotPresent - type: string pullSecretRef: description: 'ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that @@ -1398,106 +1390,6 @@ spec: type: string type: object type: array - topologySpreadConstraints: - description: TopologySpreadConstraints describes how a group of - pods ought to spread across topology domains. Scheduler will schedule - pods in a way which abides by the constraints. All topologySpreadConstraints - are ANDed. - items: - description: TopologySpreadConstraint specifies how to spread - matching pods among the given topology. - properties: - labelSelector: - description: LabelSelector is used to find matching pods. - Pods that match this label selector are counted to determine - the number of pods in their corresponding topology domain. - properties: - matchExpressions: - description: matchExpressions is a list of label selector - requirements. The requirements are ANDed. - items: - description: A label selector requirement is a selector - that contains values, a key, and an operator that - relates the key and values. - properties: - key: - description: key is the label key that the selector - applies to. - type: string - operator: - description: operator represents a key's relationship - to a set of values. Valid operators are In, NotIn, - Exists and DoesNotExist. - type: string - values: - description: values is an array of string values. - If the operator is In or NotIn, the values array - must be non-empty. If the operator is Exists or - DoesNotExist, the values array must be empty. - This array is replaced during a strategic merge - patch. - items: - type: string - type: array - required: - - key - - operator - type: object - type: array - matchLabels: - additionalProperties: - type: string - description: matchLabels is a map of {key,value} pairs. - A single {key,value} in the matchLabels map is equivalent - to an element of matchExpressions, whose key field is - "key", the operator is "In", and the values array contains - only "value". The requirements are ANDed. - type: object - type: object - maxSkew: - description: 'MaxSkew describes the degree to which pods may - be unevenly distributed. It''s the maximum permitted difference - between the number of matching pods in any two topology - domains of a given topology type. For example, in a 3-zone - cluster, MaxSkew is set to 1, and pods with the same labelSelector - spread as 1/1/0: | zone1 | zone2 | zone3 | | P | P | | - - if MaxSkew is 1, incoming pod can only be scheduled to - zone3 to become 1/1/1; scheduling it onto zone1(zone2) would - make the ActualSkew(2-0) on zone1(zone2) violate MaxSkew(1). - - if MaxSkew is 2, incoming pod can be scheduled onto any - zone. It''s a required field. Default value is 1 and 0 is - not allowed.' - format: int32 - type: integer - topologyKey: - description: TopologyKey is the key of node labels. Nodes - that have a label with this key and identical values are - considered to be in the same topology. We consider each - as a "bucket", and try to put balanced number - of pods into each bucket. It's a required field. - type: string - whenUnsatisfiable: - description: 'WhenUnsatisfiable indicates how to deal with - a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule - (default) tells the scheduler not to schedule it - ScheduleAnyway - tells the scheduler to still schedule it It''s considered - as "Unsatisfiable" if and only if placing incoming pod on - any topology violates "MaxSkew". For example, in a 3-zone - cluster, MaxSkew is set to 1, and pods with the same labelSelector - spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | - If WhenUnsatisfiable is set to DoNotSchedule, incoming pod - can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) - as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). - In other words, the cluster can still be imbalanced, but - scheduler won''t make it *more* imbalanced. It''s a required - field.' - type: string - required: - - maxSkew - - topologyKey - - whenUnsatisfiable - type: object - type: array type: object replicas: description: Replicas is the desired number of replicas of the given @@ -1628,10 +1520,6 @@ spec: items: type: string type: array - myIdOffset: - description: MyIdOffset myid offset configuration - format: int32 - type: integer operatorVersion: description: OperatorVersion defines the internal version of operator type: string From b116e99d9242a932e8cecf972816d62a493ce5b2 Mon Sep 17 00:00:00 2001 From: Andrew McCully Date: Wed, 15 Sep 2021 14:53:03 +0100 Subject: [PATCH 2/5] removing unwanted aspp --- examples/monitoring/grafana/dashboards.yaml | 94 ++++++++++----------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/examples/monitoring/grafana/dashboards.yaml b/examples/monitoring/grafana/dashboards.yaml index 9234ee0..9274896 100644 --- a/examples/monitoring/grafana/dashboards.yaml +++ b/examples/monitoring/grafana/dashboards.yaml @@ -100,7 +100,7 @@ data: "targets": [ { "exemplar": true, - "expr": "io_confluent_caas_volumemetrics_used{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "io_confluent_caas_volumemetrics_used{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -109,7 +109,7 @@ data: }, { "exemplar": true, - "expr": "io_confluent_caas_volumemetrics_total{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "io_confluent_caas_volumemetrics_total{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "hide": false, "instant": false, "interval": "", @@ -205,7 +205,7 @@ data: "targets": [ { "exemplar": true, - "expr": "io_confluent_caas_volumemetrics_percentused{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "io_confluent_caas_volumemetrics_percentused{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -301,7 +301,7 @@ data: "targets": [ { "exemplar": true, - "expr": "io_confluent_caas_volumemetrics_percentavailable{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "io_confluent_caas_volumemetrics_percentavailable{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -648,7 +648,7 @@ data: "repeatDirection": "h", "targets": [ { - "expr": "count(kafka_server_replicamanager_value{name=\"LeaderCount\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "count(kafka_server_replicamanager_value{name=\"LeaderCount\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", "format": "time_series", "intervalFactor": 1, "legendFormat": "", @@ -726,7 +726,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(sum(kafka_controller_kafkacontroller_value{name=\"ActiveControllerCount\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"}))", + "expr": "sum(sum(kafka_controller_kafkacontroller_value{name=\"ActiveControllerCount\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"}))", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -803,7 +803,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_controller_controllerstats_oneminuterate{name=~\"UncleanLeaderElectionsPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_controller_controllerstats_oneminuterate{name=~\"UncleanLeaderElectionsPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -881,7 +881,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_server_replicamanager_value{name=~\"PartitionCount\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_replicamanager_value{name=~\"PartitionCount\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -959,7 +959,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_server_replicamanager_value{name=~\"UnderReplicatedPartitions\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_replicamanager_value{name=~\"UnderReplicatedPartitions\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", "format": "time_series", "hide": false, "intervalFactor": 2, @@ -1038,7 +1038,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_server_replicamanager_value{name=~\"OfflineReplicaCount\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_replicamanager_value{name=~\"OfflineReplicaCount\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -1095,7 +1095,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"BytesInPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"BytesInPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", "format": "time_series", "hide": false, "interval": "", @@ -1104,7 +1104,7 @@ data: "refId": "A" }, { - "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"BytesOutPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"BytesOutPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", "format": "time_series", "hide": false, "intervalFactor": 1, @@ -1199,7 +1199,7 @@ data: "targets": [ { "exemplar": true, - "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"MessagesInPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"MessagesInPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1293,7 +1293,7 @@ data: "targets": [ { "exemplar": true, - "expr": "kafka_server_kafkarequesthandlerpool_oneminuterate{name=~\"RequestHandlerAvgIdlePercent\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"}*100", + "expr": "kafka_server_kafkarequesthandlerpool_oneminuterate{name=~\"RequestHandlerAvgIdlePercent\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"}*100", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1386,14 +1386,14 @@ data: "steppedLine": false, "targets": [ { - "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"TotalProduceRequestsPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"TotalProduceRequestsPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", "format": "time_series", "intervalFactor": 1, "legendFormat": "Total Produce Request Rate", "refId": "A" }, { - "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"FailedProduceRequestsPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"FailedProduceRequestsPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", "format": "time_series", "intervalFactor": 1, "legendFormat": "Failed Produce Request Rate", @@ -1486,7 +1486,7 @@ data: "targets": [ { "exemplar": true, - "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=~\"TotalFetchRequestsPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=~\"TotalFetchRequestsPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1494,7 +1494,7 @@ data: "refId": "A" }, { - "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=~\"FailedFetchRequestsPerSec\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=~\"FailedFetchRequestsPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", "format": "time_series", "intervalFactor": 1, "legendFormat": "Failed Fetch Request Rate", @@ -1587,7 +1587,7 @@ data: "targets": [ { "exemplar": true, - "expr": "kafka_network_socketserver_value{name=~\"NetworkProcessorAvgIdlePercent\",kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"}*100", + "expr": "kafka_network_socketserver_value{name=~\"NetworkProcessorAvgIdlePercent\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"}*100", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1724,7 +1724,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "avg({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_quorumsize\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "avg({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_quorumsize\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -1802,7 +1802,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_numaliveconnections\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_numaliveconnections\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "hide": false, "instant": false, @@ -1895,7 +1895,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_outstandingrequests\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"} ", + "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_outstandingrequests\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"} ", "format": "time_series", "instant": false, "interval": "", @@ -2022,7 +2022,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "avg({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_nodecount\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "avg({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_nodecount\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -2100,7 +2100,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_watchcount\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_watchcount\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -2153,7 +2153,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_minrequestlatency\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_minrequestlatency\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{kubernetes_pod_name}}", @@ -2372,7 +2372,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_maxrequestlatency\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_maxrequestlatency\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{kubernetes_pod_name}}", @@ -2506,7 +2506,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_avgrequestlatency\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_avgrequestlatency\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{kubernetes_pod_name}}", @@ -2649,7 +2649,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_connect_connect_worker_metrics_connector_count{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum(kafka_connect_connect_worker_metrics_connector_count{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "instant": false, "intervalFactor": 1, @@ -2728,7 +2728,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_connect_connect_worker_metrics_connector_startup_success_total{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum(kafka_connect_connect_worker_metrics_connector_startup_success_total{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -2806,7 +2806,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_connect_connect_worker_metrics_connector_startup_failure_total{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum(kafka_connect_connect_worker_metrics_connector_startup_failure_total{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -2882,7 +2882,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_connect_connect_worker_metrics_task_count{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum(kafka_connect_connect_worker_metrics_task_count{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -2959,7 +2959,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_connect_connect_worker_metrics_task_startup_success_total{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum(kafka_connect_connect_worker_metrics_task_startup_success_total{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -3037,7 +3037,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_connect_connect_worker_metrics_task_startup_failure_total{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum(kafka_connect_connect_worker_metrics_task_startup_failure_total{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -3089,7 +3089,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "kafka_connect_connect_metrics_io_ratio{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "kafka_connect_connect_metrics_io_ratio{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{ kubernetes_pod_name }}", @@ -3180,7 +3180,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "kafka_connect_connect_metrics_incoming_byte_rate{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "kafka_connect_connect_metrics_incoming_byte_rate{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{kubernetes_pod_name}}", @@ -3271,7 +3271,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "kafka_connect_connect_metrics_network_io_rate{app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "kafka_connect_connect_metrics_network_io_rate{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{kubernetes_pod_name}}", @@ -3385,7 +3385,7 @@ data: "targets": [ { "exemplar": true, - "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_bytes_consumed_total\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_bytes_consumed_total\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "hide": false, "interval": "", @@ -3484,7 +3484,7 @@ data: "targets": [ { "exemplar": true, - "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_messages_consumed_per_sec\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_messages_consumed_per_sec\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -3582,7 +3582,7 @@ data: "targets": [ { "exemplar": true, - "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_messages_produced_per_sec\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_messages_produced_per_sec\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -3680,7 +3680,7 @@ data: "targets": [ { "exemplar": true, - "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_num_active_queries\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_num_active_queries\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -3778,7 +3778,7 @@ data: "targets": [ { "exemplar": true, - "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_num_idle_queries\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_num_idle_queries\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -3876,7 +3876,7 @@ data: "targets": [ { "exemplar": true, - "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_num_persistent_queries\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_num_persistent_queries\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -4014,7 +4014,7 @@ data: "targets": [ { "exemplar": true, - "expr": "count({__name__=~\"schemaregistry_.*_jetty_metrics_connections_active\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "count({__name__=~\"schemaregistry_.*_jetty_metrics_connections_active\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -4094,7 +4094,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum({__name__=~\"schemaregistry_.*_jetty_metrics_connections_active\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum({__name__=~\"schemaregistry_.*_jetty_metrics_connections_active\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -4172,7 +4172,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "avg({__name__=~\"schemaregistry_.*_jetty_metrics_connections_opened_rate\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "avg({__name__=~\"schemaregistry_.*_jetty_metrics_connections_opened_rate\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -4250,7 +4250,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "avg({__name__=~\"schemaregistry_.*_jetty_metrics_connections_closed_rate\",app=~\"$component_name\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "avg({__name__=~\"schemaregistry_.*_jetty_metrics_connections_closed_rate\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -4325,7 +4325,7 @@ data: "targets": [ { "exemplar": true, - "expr": "confluent_controlcenter_healthcheck_streams_status{kubernetes_namespace=~\"$namespace\",app=~\"$component_name\",platform_confluent_io_type=~\"$controller_type\"}", + "expr": "confluent_controlcenter_healthcheck_streams_status{kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"}", "format": "time_series", "instant": false, "interval": "", From 4cf3237dc7a844695f79c69e8a079d474bfddbb8 Mon Sep 17 00:00:00 2001 From: Andrew McCully Date: Wed, 15 Sep 2021 15:07:01 +0100 Subject: [PATCH 3/5] working for each component --- examples/monitoring/grafana/dashboards.yaml | 56 ++++++++++----------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/examples/monitoring/grafana/dashboards.yaml b/examples/monitoring/grafana/dashboards.yaml index 9274896..f9d5e50 100644 --- a/examples/monitoring/grafana/dashboards.yaml +++ b/examples/monitoring/grafana/dashboards.yaml @@ -1724,7 +1724,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "avg({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_quorumsize\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "avg({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_quorumsize\", platform_confluent_io_type=~\"zookeeper\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -1802,7 +1802,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_numaliveconnections\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_numaliveconnections\", platform_confluent_io_type=~\"zookeeper\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "hide": false, "instant": false, @@ -1895,7 +1895,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_outstandingrequests\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"} ", + "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_outstandingrequests\", platform_confluent_io_type=~\"zookeeper\",kubernetes_namespace=~\"$namespace\"} ", "format": "time_series", "instant": false, "interval": "", @@ -2022,7 +2022,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "avg({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_nodecount\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "avg({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_nodecount\", platform_confluent_io_type=~\"zookeeper\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -2100,7 +2100,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_watchcount\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum({__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_watchcount\", platform_confluent_io_type=~\"zookeeper\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -2153,7 +2153,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_minrequestlatency\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_minrequestlatency\", platform_confluent_io_type=~\"zookeeper\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{kubernetes_pod_name}}", @@ -2372,7 +2372,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_maxrequestlatency\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_maxrequestlatency\", platform_confluent_io_type=~\"zookeeper\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{kubernetes_pod_name}}", @@ -2506,7 +2506,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_avgrequestlatency\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"org_apache_zookeeperservice_replicatedserver_.*_avgrequestlatency\", platform_confluent_io_type=~\"zookeeper\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{kubernetes_pod_name}}", @@ -2649,7 +2649,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_connect_connect_worker_metrics_connector_count{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum(kafka_connect_connect_worker_metrics_connector_count{ platform_confluent_io_type=~\"zookeeper\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "instant": false, "intervalFactor": 1, @@ -2728,7 +2728,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_connect_connect_worker_metrics_connector_startup_success_total{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum(kafka_connect_connect_worker_metrics_connector_startup_success_total{ platform_confluent_io_type=~\"connect\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -2806,7 +2806,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_connect_connect_worker_metrics_connector_startup_failure_total{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum(kafka_connect_connect_worker_metrics_connector_startup_failure_total{ platform_confluent_io_type=~\"connect\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -2882,7 +2882,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_connect_connect_worker_metrics_task_count{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum(kafka_connect_connect_worker_metrics_task_count{ platform_confluent_io_type=~\"connect\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -2959,7 +2959,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_connect_connect_worker_metrics_task_startup_success_total{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum(kafka_connect_connect_worker_metrics_task_startup_success_total{ platform_confluent_io_type=~\"connect\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -3037,7 +3037,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_connect_connect_worker_metrics_task_startup_failure_total{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum(kafka_connect_connect_worker_metrics_task_startup_failure_total{ platform_confluent_io_type=~\"connect\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -3089,7 +3089,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "kafka_connect_connect_metrics_io_ratio{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "kafka_connect_connect_metrics_io_ratio{ platform_confluent_io_type=~\"connect\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{ kubernetes_pod_name }}", @@ -3180,7 +3180,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "kafka_connect_connect_metrics_incoming_byte_rate{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "kafka_connect_connect_metrics_incoming_byte_rate{ platform_confluent_io_type=~\"connect\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{kubernetes_pod_name}}", @@ -3271,7 +3271,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "kafka_connect_connect_metrics_network_io_rate{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "kafka_connect_connect_metrics_network_io_rate{ platform_confluent_io_type=~\"connect\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{kubernetes_pod_name}}", @@ -3385,7 +3385,7 @@ data: "targets": [ { "exemplar": true, - "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_bytes_consumed_total\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_bytes_consumed_total\", platform_confluent_io_type=~\"ksqldb\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "hide": false, "interval": "", @@ -3484,7 +3484,7 @@ data: "targets": [ { "exemplar": true, - "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_messages_consumed_per_sec\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_messages_consumed_per_sec\", platform_confluent_io_type=~\"ksqldb\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -3582,7 +3582,7 @@ data: "targets": [ { "exemplar": true, - "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_messages_produced_per_sec\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_messages_produced_per_sec\", platform_confluent_io_type=~\"ksqldb\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -3680,7 +3680,7 @@ data: "targets": [ { "exemplar": true, - "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_num_active_queries\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_num_active_queries\", platform_confluent_io_type=~\"ksqldb\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -3778,7 +3778,7 @@ data: "targets": [ { "exemplar": true, - "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_num_idle_queries\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_num_idle_queries\", platform_confluent_io_type=~\"ksqldb\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -3876,7 +3876,7 @@ data: "targets": [ { "exemplar": true, - "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_num_persistent_queries\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "{__name__=~\"io_confluent_ksql_metrics_confluent_ksql_engine_query_stats_num_persistent_queries\", platform_confluent_io_type=~\"ksqldb\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -4014,7 +4014,7 @@ data: "targets": [ { "exemplar": true, - "expr": "count({__name__=~\"schemaregistry_.*_jetty_metrics_connections_active\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "count({__name__=~\"schemaregistry_.*_jetty_metrics_connections_active\", platform_confluent_io_type=~\"schemaregistry\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -4094,7 +4094,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum({__name__=~\"schemaregistry_.*_jetty_metrics_connections_active\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "sum({__name__=~\"schemaregistry_.*_jetty_metrics_connections_active\", platform_confluent_io_type=~\"schemaregistry\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -4172,7 +4172,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "avg({__name__=~\"schemaregistry_.*_jetty_metrics_connections_opened_rate\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "avg({__name__=~\"schemaregistry_.*_jetty_metrics_connections_opened_rate\", platform_confluent_io_type=~\"schemaregistry\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -4250,7 +4250,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "avg({__name__=~\"schemaregistry_.*_jetty_metrics_connections_closed_rate\", platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"})", + "expr": "avg({__name__=~\"schemaregistry_.*_jetty_metrics_connections_closed_rate\", platform_confluent_io_type=~\"schemaregistry\",kubernetes_namespace=~\"$namespace\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -4325,7 +4325,7 @@ data: "targets": [ { "exemplar": true, - "expr": "confluent_controlcenter_healthcheck_streams_status{kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"}", + "expr": "confluent_controlcenter_healthcheck_streams_status{kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"controlcenter\"}", "format": "time_series", "instant": false, "interval": "", From 5fdfc35edf0703362bbe03fe18ff6c34c913b158 Mon Sep 17 00:00:00 2001 From: Andrew McCully Date: Wed, 15 Sep 2021 15:15:38 +0100 Subject: [PATCH 4/5] working with component removed --- examples/monitoring/grafana/dashboards.yaml | 36 ++------------------- 1 file changed, 3 insertions(+), 33 deletions(-) diff --git a/examples/monitoring/grafana/dashboards.yaml b/examples/monitoring/grafana/dashboards.yaml index f9d5e50..28d0c79 100644 --- a/examples/monitoring/grafana/dashboards.yaml +++ b/examples/monitoring/grafana/dashboards.yaml @@ -4393,9 +4393,9 @@ data: { "allValue": ".+", "current": { - "selected": false, - "text": "All", - "value": "$__all" + "selected": true, + "text": "sandbox", + "value": "sandbox" }, "datasource": "prometheus", "definition": "label_values(kubernetes_namespace)", @@ -4449,36 +4449,6 @@ data: "tagsQuery": "", "type": "query", "useTags": false - }, - { - "allValue": null, - "current": { - "selected": false, - "text": "All", - "value": "$__all" - }, - "datasource": "prometheus", - "definition": "label_values(kube_pod_labels{label_confluent_platform=\"true\",label_platform_confluent_io_type=\"$controller_type\"}, label_app)", - "description": null, - "error": null, - "hide": 0, - "includeAll": true, - "label": "Component", - "multi": false, - "name": "component_name", - "options": [], - "query": { - "query": "label_values(kube_pod_labels{label_confluent_platform=\"true\",label_platform_confluent_io_type=\"$controller_type\"}, label_app)", - "refId": "StandardVariableQuery" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false } ] }, From 1b3f8dcd5ba140d4b7832bce58386a158fa7b26d Mon Sep 17 00:00:00 2001 From: Andrew McCully Date: Wed, 15 Sep 2021 15:46:56 +0100 Subject: [PATCH 5/5] Working monitoring example --- examples/monitoring/README.md | 52 ++++++++++---- examples/monitoring/grafana/dashboards.yaml | 68 +++++------------- examples/monitoring/prometheus/server/cm.yaml | 7 -- resources/images/grafana-dashboard.png | Bin 0 -> 118133 bytes resources/images/grafana-dashboard2.png | Bin 0 -> 115297 bytes resources/images/prometheus_targets.png | Bin 0 -> 149201 bytes 6 files changed, 57 insertions(+), 70 deletions(-) create mode 100644 resources/images/grafana-dashboard.png create mode 100644 resources/images/grafana-dashboard2.png create mode 100644 resources/images/prometheus_targets.png diff --git a/examples/monitoring/README.md b/examples/monitoring/README.md index 8346687..3de795b 100644 --- a/examples/monitoring/README.md +++ b/examples/monitoring/README.md @@ -1,22 +1,46 @@ -# Basic Deployment -This example deploys a basic deployment. No RBAC/LDAP. Just a single topic 'foobar' is added as part of the pipeline. -### Deploy CRDs -Deploy the CRDS using the standard way: +# Monitoring (JMX/Prometheus/Grafana) +In this example, we deploy an RBAC enabled Confluent cluster with Prometheus/Grafana integration. + +## Deploy Stack +From within this present directory(./examples/monitoring), run the following command: + ```shell -kubectl apply -k ../../kustomize/crds +kubectl apply -k ../../kustomize/crds && sleep 1 && kubectl apply -k . ``` -### Deploy Confluent Operator and Confluent Services -Deploy the confluent operator and services: + +Once all the the pods are in a 'Running' status, we can start to investigate the rest of the stack. + +## Prometheus +Prometheus has a UI you can view by forwarding port 9090 with the following command, and then accessing `http://127.0.0.1:9090` from a local browser. ```shell -kubectl apply -k . +kubectl port-forward \ +$(kubectl get pods -n sandbox -l app=prometheus -l component=server -o name) \ +9090 --namespace sandbox ``` +If you navigate to `http://localhost:9090/targets` you should hopefully see a screen such as this which indicates that Prometheus is successfully scraping from the Confluent Services +![](../../resources/images/prometheus_targets.png)0 -Portforward Grafana -Login with admin/password - -opensofttools/kafka_exporter:latest +The configuration file for Prometheus can be found at `./examples/monitoring/prometheus/server/cm.yaml` +## Grafana +Grafana's Web UI runs on port 3000. Similar to Prometheus, forward that port to your local machines with the following command: +```shell kubectl port-forward \ -$(kubectl get pods -n default -l app.kubernetes.io/name=grafana,app.kubernetes.io/instance=grafana -o name) \ -3000 --namespace default \ No newline at end of file +$(kubectl get pods -n sandbox kubectl get pods -n sandbox -l app.kubernetes.io/component=grafana -o name) \ +3000 --namespace sandbox +``` + +Navigate to http://localhost:3000 + +You will need to login with the username 'admin' and the password 'password'. At the home screen you will see a dashboard called 'Confluent Platform'. Click on this +![](../../resources/images/grafana-dashboard.png) + +This dashboard will display various metrics/alerts for the various Confluent services. This dashboard has been captured in code, and can be edited at `./examples/grafana/dashboards.yaml` +![](../../resources/images/grafana-dashboard2.png) + + + + + + diff --git a/examples/monitoring/grafana/dashboards.yaml b/examples/monitoring/grafana/dashboards.yaml index 28d0c79..99e7c2e 100644 --- a/examples/monitoring/grafana/dashboards.yaml +++ b/examples/monitoring/grafana/dashboards.yaml @@ -100,7 +100,7 @@ data: "targets": [ { "exemplar": true, - "expr": "io_confluent_caas_volumemetrics_used{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "io_confluent_caas_volumemetrics_used{ platform_confluent_io_type=~\"kafka\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -109,7 +109,7 @@ data: }, { "exemplar": true, - "expr": "io_confluent_caas_volumemetrics_total{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "io_confluent_caas_volumemetrics_total{ platform_confluent_io_type=~\"kafka\",kubernetes_namespace=~\"$namespace\"}", "hide": false, "instant": false, "interval": "", @@ -205,7 +205,7 @@ data: "targets": [ { "exemplar": true, - "expr": "io_confluent_caas_volumemetrics_percentused{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "io_confluent_caas_volumemetrics_percentused{ platform_confluent_io_type=~\"kafka\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -301,7 +301,7 @@ data: "targets": [ { "exemplar": true, - "expr": "io_confluent_caas_volumemetrics_percentavailable{ platform_confluent_io_type=~\"$controller_type\",kubernetes_namespace=~\"$namespace\"}", + "expr": "io_confluent_caas_volumemetrics_percentavailable{ platform_confluent_io_type=~\"kafka\",kubernetes_namespace=~\"$namespace\"}", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -648,7 +648,7 @@ data: "repeatDirection": "h", "targets": [ { - "expr": "count(kafka_server_replicamanager_value{name=\"LeaderCount\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "count(kafka_server_replicamanager_value{name=\"LeaderCount\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"kafka\"})", "format": "time_series", "intervalFactor": 1, "legendFormat": "", @@ -726,7 +726,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(sum(kafka_controller_kafkacontroller_value{name=\"ActiveControllerCount\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"}))", + "expr": "sum(sum(kafka_controller_kafkacontroller_value{name=\"ActiveControllerCount\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"kafka\"}))", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -803,7 +803,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_controller_controllerstats_oneminuterate{name=~\"UncleanLeaderElectionsPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_controller_controllerstats_oneminuterate{name=~\"UncleanLeaderElectionsPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"kafka\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -881,7 +881,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_server_replicamanager_value{name=~\"PartitionCount\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_replicamanager_value{name=~\"PartitionCount\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"kafka\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -959,7 +959,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_server_replicamanager_value{name=~\"UnderReplicatedPartitions\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_replicamanager_value{name=~\"UnderReplicatedPartitions\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"kafka\"})", "format": "time_series", "hide": false, "intervalFactor": 2, @@ -1038,7 +1038,7 @@ data: "pluginVersion": "8.1.2", "targets": [ { - "expr": "sum(kafka_server_replicamanager_value{name=~\"OfflineReplicaCount\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_replicamanager_value{name=~\"OfflineReplicaCount\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"kafka\"})", "format": "time_series", "intervalFactor": 1, "refId": "A" @@ -1095,7 +1095,7 @@ data: "steppedLine": false, "targets": [ { - "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"BytesInPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"BytesInPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"kafka\"})", "format": "time_series", "hide": false, "interval": "", @@ -1104,7 +1104,7 @@ data: "refId": "A" }, { - "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"BytesOutPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"BytesOutPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"kafka\"})", "format": "time_series", "hide": false, "intervalFactor": 1, @@ -1199,7 +1199,7 @@ data: "targets": [ { "exemplar": true, - "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"MessagesInPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"MessagesInPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"kafka\"})", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1293,7 +1293,7 @@ data: "targets": [ { "exemplar": true, - "expr": "kafka_server_kafkarequesthandlerpool_oneminuterate{name=~\"RequestHandlerAvgIdlePercent\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"}*100", + "expr": "kafka_server_kafkarequesthandlerpool_oneminuterate{name=~\"RequestHandlerAvgIdlePercent\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"kafka\"}*100", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1386,14 +1386,14 @@ data: "steppedLine": false, "targets": [ { - "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"TotalProduceRequestsPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"TotalProduceRequestsPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"kafka\"})", "format": "time_series", "intervalFactor": 1, "legendFormat": "Total Produce Request Rate", "refId": "A" }, { - "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"FailedProduceRequestsPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=\"FailedProduceRequestsPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"kafka\"})", "format": "time_series", "intervalFactor": 1, "legendFormat": "Failed Produce Request Rate", @@ -1486,7 +1486,7 @@ data: "targets": [ { "exemplar": true, - "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=~\"TotalFetchRequestsPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=~\"TotalFetchRequestsPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"kafka\"})", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -1494,7 +1494,7 @@ data: "refId": "A" }, { - "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=~\"FailedFetchRequestsPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"})", + "expr": "sum(kafka_server_brokertopicmetrics_oneminuterate{name=~\"FailedFetchRequestsPerSec\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"kafka\"})", "format": "time_series", "intervalFactor": 1, "legendFormat": "Failed Fetch Request Rate", @@ -1587,7 +1587,7 @@ data: "targets": [ { "exemplar": true, - "expr": "kafka_network_socketserver_value{name=~\"NetworkProcessorAvgIdlePercent\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"$controller_type\"}*100", + "expr": "kafka_network_socketserver_value{name=~\"NetworkProcessorAvgIdlePercent\",kubernetes_namespace=~\"$namespace\",platform_confluent_io_type=~\"kafka\"}*100", "format": "time_series", "interval": "", "intervalFactor": 1, @@ -4419,36 +4419,6 @@ data: "tagsQuery": "", "type": "query", "useTags": false - }, - { - "allValue": ".+", - "current": { - "selected": true, - "text": "kafka", - "value": "kafka" - }, - "datasource": "prometheus", - "definition": "label_values(platform_confluent_io_type)", - "description": null, - "error": null, - "hide": 0, - "includeAll": false, - "label": "ClusterType", - "multi": false, - "name": "controller_type", - "options": [], - "query": { - "query": "label_values(platform_confluent_io_type)", - "refId": "StandardVariableQuery" - }, - "refresh": 1, - "regex": "", - "skipUrlSync": false, - "sort": 1, - "tagValuesQuery": "", - "tagsQuery": "", - "type": "query", - "useTags": false } ] }, diff --git a/examples/monitoring/prometheus/server/cm.yaml b/examples/monitoring/prometheus/server/cm.yaml index b33af72..32f8c41 100644 --- a/examples/monitoring/prometheus/server/cm.yaml +++ b/examples/monitoring/prometheus/server/cm.yaml @@ -83,7 +83,6 @@ data: # - 'producer:1234' # labels: # env: 'dev' - # No consumer for the moment in cp-demo # - job_name: 'consumer' # static_configs: @@ -91,12 +90,6 @@ data: # - "consumer:1234" # labels: # env: 'dev' - - job_name: "kafka-lag-exporter" - static_configs: - - targets: - - "kafka-lag-exporter:9999" - labels: - env: "dev" - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token job_name: kubernetes-apiservers kubernetes_sd_configs: diff --git a/resources/images/grafana-dashboard.png b/resources/images/grafana-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..f295258b3d0ede2c184e6c3b75108fe2899be25e GIT binary patch literal 118133 zcmd?RRa6~K*9O?Q1rGrN1W0gqcXubaySuw5xXZy^4i?;9g1cJ??(R0c@Av()=4RIV zXV#jlxjNm|)m62-_TE+d*-xFH3UcDeh@TMw06>9g={Q9gZ4MsW-!dVIPKLw(Rz1KLBlyot#4kN1Q2(|?T%d>JLiA6o z#KG4{`6&OniuIKhnMEH?t9ipReEb-M@Ehqrm9GoZ^3Fc2ztAtY(px!t+`&n0EdA$6 za2Cts$q@r1%RVw^TXy!bbud)Rf5!5-Hf5wYh&Pb1p^v)gm%KK6TM4Jeb=K&%=GW^U z{xdf~%|y*>0qP|Q;=g??9*`Z{vw^m6R*kJ3F@V+Ao9?9Xr`!xmvQSMj$5fopZ3aBJ z`ZbSgXM5yk;eKTDD*+Q_=LQ z59cJ=7P)1=J*-bgNsg5@TD8K3-~;wg3vhZ;ryk#3P3qsce8L4WvM2v5!X$JmkH=-Z zSBydMbGuh(^kgtUV_^?dWZ?(R1B%1@JKogmoVU)GiZVrVYwyJZDN998<~e5G|BBx! z+k$H_w|?^n?DzKgC=J5d)pH{}#zuzcERu(ipC=h-h6NP-_5^>)Fpqt!JyF}++eB6l zq9^5|g#VAK?ElQK^&q$zezHRYm2N&&q2j1w4X0mM?ra~ta2eQw$^53>>A^dEK;Qg} z=3mitxu6v)og|q5P8;;plF`#^7X;Mb4hRQ51AG3?6W_C27q*0kF{V_(&JFuJ-8uTZ z&!_9mM5hxu8!_o7)mQbBfV~!s-mCk>GCX$ee@D?MY34&PPKFA60R()^HpDQw%4@ys z#czoI{tc2!GtFm(LTSQFog~<Wx|8$0O>zdAxKNEaj*zFqq)eC|LO8(AYuV; ztT)ZvO%v+ELjCQIrh3;+AV(L)E{TWYJjepN+{xb?eRhPf{iBg+aRLN{9m=x%@nSK6 zhIUStDR;Z!d#atQ^0?K9h4OFHFSes~)!v&hpMdA0jqhOY` zwKZAUsLs__(Xal-0*FWd#1;+2*&Slwlqk$MZr_|cBXGG##AO70&r_>(bcO_ zX)gqWpG;?LZ(Q56VsU58$`K;)rKKhw{1%^vY{L)dRp(`HVY3WnJu9!akLG z<^32!^?VY5eJH~E&cy=&(dgG=l$g7ye71*#x;`%Rr-?7^E9|zOcTZEYqLl_U+#{h^HbxDY{x`uO(3%Xxccjc>uy_B=h0{cDw%!0OrC#9@C2O!=i94&d;H zx_ejOwgk)`*hFR@!X;pSKl83Rv$JbuJe|#Y;vwI=n)V!?HG4U|F7P-W)Tt9UX>ebc z>EB^iZEC>zN1+Goib8fWmYnuRv;LW*?ZodgJwJKpe)2XU2`%iTQ6@+-#}LE~kuar^ z>|Ob7d%woSBW(cw?;`Bjb@Y1*p4B(L&lZi}6)hB0No8}7Dc(lg62+6GXKm@l?wAiC^#-D$}c<%I-(!5KXh2Lz*iGg%bk9JgoL@f z3{HR$@Lu`za+TovP}-24?fAO8eGrOj>xR2}3JX*-cGwB5!T||;Uu3em9va3y?Z}en zmd6AeL|%TC$ik(w)?Wo_IAPqrjB$G>c|C-g$U8)3-aX=9Wz!ey`GlkX>&atc@`Dme z4@Q8=c~`4#Nu-rsrVL#sXaF44c&%A*dP;YLO5dj6_C7N}*W@G`AVrtqmcGTu$onNU zR2ghlnW)X7=eX&8Hc%zEbNk9;*3hbpbl${s2oE09lSiliLy)3Zd=nw}*79e;&Q`8v z%>)2EdWKFKks(h`X`PzX9IU1{sL8>D%I(a1YVS@_jRW=d5WMVdDTMvY^JY%tkZ^R& z>~@21e_`sbc5&r{@2LFQyMF+-Q)Xhed+~`<0p1i^i<^PRIlCq;JWLgFtCQyI_U!M& z5G?sge-;P6p;cSPB|JDyI)HCiD+#i7Rc}wDZ8vMFydN?&21qDK)TCohc%LV}V*!(& zeD7T{JUl%4Xb|l^aiuo2vXl_IyloyHWBFTB@#LZUW5zaoTsU58!|;x74h>P6haPk` zlu@rtk$1s%!C}u+{mb{93ae#rr&qlPdTR=hz~nB8_bYo!S^LFURS4W-8Y6;~lHaSu za0k_6-uZdsYPlZC=3Y_R#EdfEQ^%gjq|BP|y2g%?*#Jq&{A11YwT@mRkJQq?YZ!-% zo7=*Rf|nL=nq?kcMw6$h&>h00F4JQ>~nBjSgkKM*q3vr~R_Z~#RT;?1Ed z`sNXw4WR?Osod^_;9y!AUQmOy6zV|A?Tb{$Cl?9>Mr9>mvZE1{U2ueVAm6%pN2{xz zyt%=nXU})hmmOve)q=GQQ8_`$bUT`t6%!Z$I7w2a%!W>LRmpt1cE+>dwNvbBc(GQ0 zX!LU}*%)?4LbdEr2l@TF8K4C&>t(~@y?@VNGKa}az&qXf_isvCtGB+^He6&8fg&a{ zu(c*KalMVV1UecH6arCe^ABa_7b*&xTPNDaTF0W;#R%GRe@+%PhmfZ(WbwP@1y(!W zICvRdp{#r_VpQ~dy=H`YC<}|xa)*4r|1R_k1CY^^Uv6Cjl{MQx>eo(>o;}+*1n^Xx2|$B?p^o`WVa$u4N9YHRUbd$+z_xy7>Yn8NH6M@?%c_LaVuE<**(Q*On$e1N~2ZpWR= z_1ajre1&=1D*w*4*_Y>~lLfce)+(!<8k5W76f(MP4%cJln{d?^R`v~O|N2d8xQYz$ zI$zr!&IjP3V!ez$%69a44We*AmRbeq@*?-X7>R#owL*Q(f%K>EEL-#B>E6rq7@YU1 zI1M4Mjm~3dvVM7a{Qa47X>u)mHpCmoL#n; zoH$ixDEYxC!mLNWu589RBSNQDo;UEQ z_VIqz#+Lc#jMe<{?%u`vOXwWXA^H?=)K=Inx&L4UoLOU ztCV5iDAE7fNaEbkp%!NGGXz#vRu(#0jK39DLcb!OQv>C9^KH^qii7sX{E~CZqc_3* zhIpUlPBMphor+A>P&cr%c##3+7i8Me2cQ^fBJ2HqL}ZPA!(WVtILYd^)w_$c$G_i7 z{C28|z1I9H8|BN)L5}S{7{Frc>K*#?uz@96O5+GQ?efj>Nvr&c@{mPv3uujbGVJ<6 zOSevE0vvvIF|tJu?iwEK{b0MB_$tAadZ-2h+fwb0Io6PMbbJ7Scu?M%7ndrRt<*>T zF(L#23uhwTOj=?*u>t+Vn3rE=`-PML1od}k^CAHFNUQb)>qZ&D|AF#UjjycY!OS09 z61M9;4`uoUl}_ZUxbRzB#Py>0s8O&^>XSQ8Z$(B%&3dlkv>hL{&x*?h59;mDiCJD& zn;ZV?M4c&bVMtpQAB(f(=-r0wZjf;-kod&YY7t&`Ro`XIFgxT|lHyQiWngAoG+?;_KLl~onILpOEUTfhoUf4t`5Tnd52na2 z0i&XlgP)MS>w8lXa#%kWYu&fCA4YN3jz$*W9KY;sI^n{utquMxk>}^1J|`8G9bca~ zf~(B1YV_9fuirIeX2UEQ-i2@&86%_gKNu-u*~h8jM+E$p6rtEle(9NF3bge5?6RHn zVqpC1_*rn4Zw$=MQ~fHAq`(jWjZ2ns4+G%eE_zqjrm-NyX^Mn>e^a%3^I1-Z49&ZQF$Xglq6-jx|SJ+)1fi3w?bwpl8%aONx38B`o} zeym2_$1&c7o9TNWb4xp_IB%%sR*~CWr>6So2ffw~H+|LjuO%xBQdDhKzD50P&)PR( z;|SbFSbwf71%Lwf;Q{~{INq7Wba@ZiRa4$J&FY~xR;S7V9EZ0Le`9PM|DZWRO{W3SlAVHoPk2q28szj8OVG&-A`PwI)E?9>QO9QpGr zK=5`dyu5M)j6&tC_>cfeVe7OsoR|XQ3!T%yG4+eapCdIL<%cnoP5MT^G@BRdK^%bS z=2)aod}X=A(%k%hZfLbKOLE1otz&flyMm)&r{dsP(Lnl>8(jMX`3*+9+4v_K%|B+Q zx0kb}prvhq!Dt||p+UYIiTcVXVo105=bk9K1VJEMl)HGgiuxP=zy}&a^2^qd-ZAcCt^!1& zBE|Tc5!x-9!b9<9e1C}evYNB7N0ZyeM6RJ_Un3>o@F3L=#4Oqgf-8^9#)y9 zc(dbmL2o|EGzyV!9b4##&l&+U?IJKuSh%GVp|(y{+?C;4eCxRM4GZy~NJ##JaBr!t z6VI$X0t=B!!iPC5iC%=?o&(poOlbvg?(&@ z!&Bq|^Y!(4Ur`b4#KXFgH;>2G7%YKl#a79d=TYMD?hv4$BIUaiOU$-~9?_+UDujWdlyM5K5<}37z458O& z4$uB^re+HAaDKW>OHlBXIAV;=rxe##!tbVn=(fMyPP0CkxQ_+Wf1cfbWbvRLd(cOs zXq|6fWp3k3z3+y$Cb7ozKwIOQ6HDz-z{Q5$ICE%G#+A+T*P^)J)WhkmCmHJ~f0GEN z%9Ev2-!2HiyAvH9jF(@H{t3=J5lOaXvR;q3tYc1DUCMH8@$SP8Pfr^d8okf|1mp)v zYpu|_{JCg(Q&OHu0b5bgj?%Wa-rVD~zVEGS?h@9LnID)EL#Bz+6uS0CR2!2Zgl_V=J!qDM!sC>{!QYtGgar%4Uc1 ziIU>rW%lev7tit2{>`VEiir&HnLem>B7IL__SO3_eLfdGqU=@1ChYFn|K%x?e%?)n z)n{yN-1>7D0hgpX!BIid1K}qP=R|^1&slMUk`De<-*K08`5wW?w3&_iz|to}Lb$ve zk;k9t^ZlQrx3Aab_s)<|r8q4;Ph~1Tj_PV{Z}nNr@dy12U|r*#_f`z$lY1Jor`vjt z-=X+;&0Qae0Xe=>Im<}&IN-)=_2WYj)l1T5%1UR+!k$a|*3^5vu`46(LKxA~a>h28 z-`dK(*JtK=xUZ03Vta!hKiR1EaydfZ{z41Q=t63B^BzR*q=;wVT%bAg_E?JW|0pVd zHGdS@<;bubPqJF$+vogZMEpYLYO`_#-tc{?=d9w6Q>N^nh~KTr_$FTSy0k(trTDn{ zS@i0k?L1sCJ>);z`9eFHGq2Y*iA1%#O1*`T9c+K<*}v@u2u*9Icapv=GGvkr59_33 zmX@g6I;~e1`If((&MeBOfj2IQaC*mh2@kQdJ?N$B&dTPxp@y(hl;`^zD)e5&&(O#r zxkzsITu(UiJf!}(mum8@;M_R%l{N0sptuEb6T}mapDa86N&l&33;B<+8clJ_HrL-I z%aEy7A>WM9cV1`X(I!cHC9KVx-FTuI=-9ZqrGzvWJ|gVEz7)m2LmMLPh1)$IYbey8 zrEU{gn2#8MXUC_M5;ykH&~hcai8rb{Tw&pN7~xZnnwuMTME{q%tR$JDD!7lI@8R0l zXdd~2dk@Hz4>Lb4W{Tdl$nefu7mu-hyg&U1U2*0*IBGSYyuNVSLoA#oBrHvo$65xb z^GQ3?LyXO9xnW6_0&nQd28a>8$5r1pcu$4?1wwN-GRO^^f%nS)4g}|a37WE?+?}qa z^E@z?OR&5HfqJUFe9G2_QXwWd(zta!tmXe{j)UTC)gxIh`|`LJGvln?>n_pl^uyiZ z|6q^*1KWOv3(unn_gpQ+IhLfrN;ZJz==s<6!vEjlwf~=h!2kP37ZL|`{1HqTEHE-j z5CT(K5PE6<^Zf=+USFO*ic(^Q!`+?5yy$dRl?0It4Jngtv_EA(ZE=eKJ1g+S^^yr> zvYA{-BtzVdb}?HzkJOWxKg7^e+7R3@8$k~fT;ifs?lrX+$mg|Pw8@At2_T@AEq-Y zV_E_840XXLrXF{I9ff{Pg~)HUP>@Sx%Uw(ib_}~(5&&W|mTrroTwclZ zcbN%vop#eEj2W`w0FS{=Es)*3w_9Q1Ls6DvhI!@ z+S=b~JU-6qyH-lmb%f2CKtiq|hY;{RiD)lvcCq;=2=|{f&b3zVQ%O*_`)NfISdWR3 zpgQiM?c0@yc<~agY*aJ(D{;zO`IR@hwv(*zAQK8E$GkV!4>(n{2RTUDow?Dew3&}4~3W+G~4z*;T}BsK0DaobtxAY7X7?* zB!fp1m)5+PgSgSJj35xc`qu4MpO2k{QX=Gda!&#%6|U;OmK0BWT5*pqTY5^{Z6371BeDoXM) z?uj;spi>G%dwiKP(HqqAn-9jvg}bwmB}#eAaIn`~T&Bnh+4)Nf(M#%O`TG#BK))Zh zp|BpE<&IScm$TUs5SUU>=!0)Wi=9XDF4@WVWS+L<^Cf0RIdK_pwEaA z7n(Gse!YZxc#Ln2VcjAcbT!2l z3%|!lHYQg3K_iCo&=lJk4#KJqx~>L#b&^-%{H@)&?08$Gt>GyE(A9OT`FW6Za${yJ z&Tc?I7P>GtJpJ?VWej#=#1mnbqJWfX0hYpC>+@C>$O9&X#`)JKV=6R7!CxyZ4-Ij8 zR#aX*=hL=A-;U^pPc*Oz&{A~&XeU=%{!5LZIZN1j9ByZ?= zhM2P-66NXaFxaS)t0e=i>_oZOxE=jZ|MY!(H_MKSa>J(pe={0;hOn01EH@1f`?)P} zCF?bKVM@l^@GtwQDJCx-JnWz;+o0*~>Vr5Y-)|dylf=%c@*gMZkWXX5WD*S_TaZYD z%^ha9Hk=AeZ%0v^pF5a614Q*SN^8HHEBV2nbrsN?rU5kx+FIsLI{=uyQ@JkV?+5i?G@@%oi?? zYn#VbsHFH227u1xWIxoSEVCPQ&Hd#t@`x2PdAzi+LVXg1dL^C)+f%b!oAY&A^MAMi z5Wq*59rjRJN_si<@8vI~)0Q`b()ct#0<@yE^BPez(&d;&%eBYKwfDU6*DnPF$bcLQ z7*X^f)XF_S0AO)?tKeSXxF#S#BS|-#*j;M%#3HqmuEfD#LxSpigF`SQ*q_8N`yn_uF%1oD3ed&w;|vQ-wse_`N|x#|YwuJgqIxgR)o_$H}DN5i43 z;4CbIPUEEZHc5&y0Nu-JounnIbvFe|R@X7|QFb!(UUlJ8c3p8HxsDRh{t8aby z>Z>iSrQ*wMu9%J9%m4+@e2YFtG=@?+yCLK-Uzz21ePV(@$T6oL8Rt>;6&8!bx1#Ty zB&{_45ca#kor>!8TEa^H7tO2=<=^C@Fw1rJPaFV+CYTzm+4r%eY#Y$W_}DlUBMy+Z zJ2Fv&&n*)$Qt`Dq|EN;qFUfQtHvMVgHwy;@RFmrpKKSpZUGI3B0YgJJe#7R+olY%B zo-V(0%_+w@G!@o~ip*&umIBaobw7~|vU5ETmlaG4ri6C!V^B!mlpgmCdzQunbQQh(Q6+*)g~h1jDZD!Np{St0rsOy1w=uD+d(K5{ zN&yykTW2ug=L4-TS}ZaXxu3^oT}1b%o8@@e5D+Ct<^s1gI9Y2hNOID>LPTg>eleQ( z3oWZSu^p}a`WUCr1sx1SKY84c%XFpi*!+r&$&x%1pF>0shsOp*VF9jY;${Y`l)nV& ze*w9g;~pt#3eocao`|y>1!6}kbw>H@Rc1!YFm?x#;0V|=NdO8d#^fH9X{UVPebKPN z&>bH7P4`B7D>c1l6jP~4)>&I6)d?r=6wcW)6NF#WPHJ=#ioX^zmQRR6{l^d0bIx|Q zVf?i>KdmK91iE#l7B}ak-WwY?tC39RTMWd=S%MGJ;np`)mVJZ07d}=%fU<8PqEsrd+AsiFK%DOkj!^LbVSJ;AS^a$|2mpqZn!1m6fheH1Wehd-o1$om7B`R&I6iDQZqvtH~}R z(Baw#F5davr7-0aDwmzg4ED?u6hdFjRZBNanJ)K@Kwl@b?%M z1LbbE1!RSYu@&HBUyt1Fs%0*Xd1!FR^N6fmdKgo@$9W9@F}RPWt>u?}lYO==c5;&w z0_rxh8l7$uCYdYBslkd(1%G(-0*gl^$lsIzbbrD0MQ|v+Y-Bmnxk0~QZea>Z;#}x< zaH=#JR2DAA<(6FAb@Xx)>}V5SLu+~x)$T`Hho#4&MFk(>*V+K~Njt1k%WXVzOniu7MtqFf!@RKR~PNv59 zlXvm5B~U0f9Adz;J`(eN2rVc63NQlSJWj#AY-a`3YJAf@3@56^;hI_lx83G|#xG@9-<^JvWk!o1on%!LTaESgPdGu)aZ5RXXJd=eLHC5_G1hkLPu&v-OqR zTELJgBVY^w+Wh`0$=|7J@SaK=r8UpzNhSw^pV&S|m353k*}Se1L^vS~EhxjjONNP3Qxj{ocepo5-@l@xmc zP1ir}`N;%PQ9@+4m|y{#vMP&x2}xw6bT5O!Lh@f!4-|bVj*jGC302L!w8#N}p`rp6 zsnQakrulYpCdIIsFjKsiX+g!N2dEpj0Et9+vOyzAAC063d3_T#Qm&NJ>_Ph*h2J7$ zhjv_wTX4{K?x~$x19RQI&;x=RTB)o91uOx@cv^`B>4jg!)-&1`j(=Bnk*?0*c8&;^ z+*@CYJL@b8&^nSzRPv%q;Q<_#uGRpWnktxosqAQDUhzw1K@ynvL@5bz(YuoIJ?gb; zH&QciaC#sCoZ&}8zYFiMi(sIoLJWeWp(@&+S)|Eb_I_47ny)lVrCteI<4P(^zHd)u zbZnv^08KjW*=gF6a*F06`%GyJw&;eszlxARl6EPe4=EAK1BL!k>E;hae6B`uNQLe! zlE}^mN~R%Q3t7?gBJ|J>p70LG*}a%+G(G?v%;kmV?x?C_sY$hA<3KIQ2~6N>L*Zbt z(^#YsdY#WxdnFHiLj4^PPYt(63&!&WAp+MG8mym9occ*mZ1NJrr;jau8*)fJ#LD3n z3JF4>381w*B(~+&sCcjEzkJXj^x_r~^Zag6T0XOu+=Lg@wr}q0 zGZCgl%9pN;X?|wFtp}*G=92-+YHoOtBxW^CUi|lEw=>PGxzW0#-Al+SnYG1vcfFL< zRiDHW-DSQY4KD|u!{bp-zVmnj*U_3NP>DCAEq4e|uq> zg#^l#B6KD?8mV49Hx!aLqa!*v4$N~{z!|@~oK_Gxf&Tjper70{@e#u@XKTuE5KKmr62#--$iBZXBEKUAp~m!o4;=T|V5*4bC-faWmP?Riw6?`~Q;z8FV!h--PmRIT;mP`9? zm{O%7hYaJ4vJWJpK!K(MMi2nNe_5Ll*IW2CDizp@v%hb#N80oDPWPy*xjD7q#yDZvcn0DLkGlGNb*XK>5ZB;qL>O$Xz( z6%)f{6oQk95;86!Nn}GuKLQ-iw2=U>o!6!xMwNB)HEI{(n3k>+vO{d4)JC!?kcb{u*v?@>0Lh zSMq-mo^apm&6C3d*uNSiq~F^c&Z;8xl5&yp*h=>5IbLn(=;Ed(9=d%qkQEEUcw{g9 z;HC`-q&xZbvMVfoEywSXhN2VjUhjb-_RwBP^Pp2Rw5H|ek)>btu z(?cRdi;H!jh4NFg5O`kKG3R}LrFCN|uCB<<7>;2pVo7KK=d0PFV#3Av(V#{38!FWl zz3R*jw`8c?Xo7mPl>!aU^b=i)P8rlIe?+_cWeXqmm-j_|6+*+PCF8mN3z~)XXVf9? z{RZv(rTCU)5I@IDtS?xErd->ttT8-~iqN@U!s??#rEU4MH|`{KC7XzFQF7>rLp~!8 z2?Z7+Fi>p)Kcg|-kN_8tJSLL%R87u6 za2+|NI@q{|fxfD`Mz<(F;&2w~@@cyIxnb}@dGM}M(wZEG*dZ>xN5o1gL;y4Rc=Zn* zC#a^VXlB$(Rc3WQx+L{^ou7Kd$t#1<;k6evD>)X*8ONorZq?bC&+KX#Z1j`s9fHOJ zL}cY}R2-wmTOQe}8DW?MNO@BnL1QrfCLL8Rt-cnwY#B!}?tzSHR;y!>o~ zPuwge2?0o6cj`=;uDZDYgA%#A!t;eq8le77;=+nRs@6hKNd9;B&M<$E?=vCH%MhYHB$A@Q(^LPO9} zCQF?}74pZ#E>chfQd8ZkYm$xh|Q$e;9B=scHrUT#{}(HGjFa#O*(EfQ1d45P4<=-h_siV`n z0>*MRm;wJ5-8DP&2&vo-b`~G>_ML6}?C)5G_`5AiRGy)|k$hjo3TJ1#5kT`RI6BG; z1>5;<`jKIX6aeH$thZXWcGpyvM9Zdc_=0w+ETg|>ym~O^;GaIR4pHc1c5Q0S2$UsI zK@8e?jY1+pmNe8vMjq#ZZr6`1dQndFn2Z{l`&)hUWRwJ;@Ik#WJb3)w&ox-C z4d4UL@jy}_Lz)Ct*pSq3}MBP^6-YFCC`h?LuPH z$|h4Xh4_rkWtAnG%}xzSTZzBN;v9GzFNyh6p&8lf8qE&8%C^KL|7Ha$7SY_kJS2|M zGWARaBjmWW<1&9iDo9%J8rSkMUFD+nvZ5c8pcrFda=Xz+$8R!VPg%uDnCU!Ip;TrN zGQ1tD-(#3v=yxFk;FVE`(Qkd(8~4r@ft+YVg!D-YGo|EAo>k$2ER~j{BlC`>>Dk}4 z)!Hr3^56Jh?G7&ad9RLZ`Df=|@3-vqgOeV`ggqGGVMkWGyF&qmS)I>K>*h|PnZ~$- zseAf^s-K~NAC^z#v2Lyk05k)xSorvbANi08sL@G%IZXeCx=dslK>#wyXxP6j*G7n? zk`fLOAWq=jwv_ALULjV7j1^!?6)DzEu~Dq~?!pceVF$as%b$8V1^^`}7x2wg;0`QB zNIt>E$ChbnLPLTI;&SZAB{U$BftGJ4ZoV|9722KQJ+((>A}y9FcSKF2H}(}8hVXc@ z!<11dMoc3s*;laIrDO0A>xCMLN--hvvi>hOl6fKPGTosfrhi$f;D=g|BFIm(`=<`U ze?z~+q&nbd?8EGR*<=&Ih93neG=d5?#4HSkTYALlHYeLSw2fj}hw37+4m==ZPnioL zAXJ3KtlyR>rG6qt4qltC{0_cxo%7m|?wBnq;Oxg=3=bBwdcy17 zq_&!Vt2stKaw>_`aa&Iny&BQB4yA6e;6>Svp;3o8gp?Od|YO9vglDnws5%z&vU8w-QG|~PL3Bf7# zdp7EH{RMTRhspZ=?B&JkB=o!EdOwc?CEyVE<+Lj%Oo_r82GDP&{mTqd5;|NaxS>vq zRqqG{a&N2zL;E*`F280InCMjC0R9L2J3Ql0^nicauQC{*OZ`t-;X^oH_0#WMKl~+3 zVgN9&EKL9a`@MI=E-GwoS-}JZbgJfUV6Z{KQSS##E33k6)ud0$G0KXExbIO2Fd2G>(`c&t>seUcMp3qf(51#Sy4U2UHF;XHJ&epU|^Ea#`J@|Iyz(v0L*x zDw+uY;7TOmu=D)K0JV%Ujr68=+0}KjWXS@fFGmBe)kZ%?= zz2eiw>Yak=^$n|n=+ezPmDyoVTiw-lWESza>W~H*OGCK>_3`yZSLgf!ZQCR4UBh{W z2Z~Z7%6gE>uQivfj3{cd8js(|_A!a-Be6nP1)NnqNWSrGvaUjv9;C^wnCFp+;8m74{GD?O6}^Y#m|6%)wTHhxc^Ss#^U zCIk%SvAhv9={__vJ<~z(EWqP&vA%s}$Z)gl%V6Usqv9;0A|y4Cd)IEg2r89&M|PH$ zX19S|Aa!SUz7^)X$XZasyQwHC@SU#AOLIXtV_{z~g>x0Zh zrlS?)gvAC(NrB%|mt{X6(2soX$*e0!4pWJc93-<8U~1xdh}YPeyuU2;C7$8d68A+_ z9s{v;b<~SaYVI1KD>K@4w7+bXL#8$H$CjX#&KB{YD!f4m)0j7_dFpLM0;JBgS)lkhfz$6V6r z83N@FdOz?g=#25`4r*hh|2Z=p+tF-=wMKQyrMe6^#&nblbm&z_ur5rG@mq%ERHX)&n#lwg6Qmq%cT$cjYUq}F2$ycZ zFq@#Qk?u?|p#`B7bT~D>qC@xJuYhWr9+&5os4n;0qu9%m;NXGdQbcMLxiHO zBqzUT#S91ijdvyr57J2U+X?4gCodf7eQsq#Q;GdSc%v>8BeE7=(mQ44onX^K+iOHr zW~q2zik%1P(45@=q@s!yHERub^D*dXE-Hvl&%?koRQx^j#d5po{KJ9m%3abUA~FwG zgM$uUqq!?f5a2%7b{MvgpdChvG4>=4(}=r`8*1g$&pr-vSA~sPy!bNP4#hId*V!1Y#eR z!Z650Di*8o%iVHkyu401M7nWgR+?ejv4dn5I zNOW}+2(TmLMgdjSoo2~wg3&v4#Nf8cnw~&$2D7RS!ro!Njm4t8U(J;rNPArAmLN)m zzr0RiV+&Cg9gkdI+j+-8_MDZnYEsV^}f0rL-zUDuw$UxdsomeKXPJ@+7_8J&}h z2imAVAZq+IJUcXzS3oS?AI1(tB|P)dKQBR08EZy38xsDS+%l?1mRc3t$d-5_sRAkmLf#Cbj@u1%FxXa=VL}DD<_GdNCnMkw;0{e&zxdN&PjTc8`l$A~vEb<2{dj zJ)MJ!Qm91ro*9@}?nTnlP` zX9fiJnzuZZg(?Udc)WQSHpEmkemNPxo!>%LCcy&Rsw2RgL-&59-h%a z@hJs8u`ZW~)?mV(n!sY6cXjh_Cq4U~*s1q$pTv)hLK9C4<1Uhe)60Fj2X!OA=UZSt zpRRDAw)e^3^}FaYLUay@V&|q>c37y&WI3RO7JPKRt3A0{^SeFK1a2DtZx7pvo`_^{ zilv=`9B-8ZZ3Z)>x|=3vADPRc^dQE$?)~nK*odu|A06E_UDerH zRhdsdS&h%~#2e(eJ$&HbYt9<%8_+}Y>Lo%otmNIy7UIR=Co9aGPxFg_47})T{dr5 z@FuF7$NwbL8ZZw^tX`lPZ1wWfFJI79^k@0g<3XUf#{ZSTZ@M5NOr>p&I;-bt9 zaq+8^p=aSZU8PdkmqsNCANd_rSW8!i4~h=n=-@M2XK>IykW@!*rB0x1WRvBVrHks>%&)%hSrzDRdf&FGQus3YsU{$Dma) z0H8Yl$!&)g2_U)@faiIJB-E1d>Q2`eu?Dc~-_>`&k4y)kIyuX(x&1}SA$?-nTr&o~ z@{B^8(iIE_j@H{7tX&an!;;L#(;(v@>iM4Ls^QZ~INKDBP+a}&38&NrUMYW)eRF>7 znwW7t%g^W7l4q-z5lCdzv-L6`&fVbs_ce0Iw?+FFO-<uH(#K#!6I)%q`}v>B1red z&Qz%;Pq!*}iO1m;c^vFsC&y1-xzJO%#O>4J-R)psMc$L-EH|{PY_E(LQ~v~mfqNkF z2m@oV#fw$M?e=M|>8d{W@XmYn=;iR5-7nJoXJp?3qD>IB(?KciFN+~7nRi%C1$&dF zT}n$9OX>@yGIvu zt^MT-<`)k>VozSgZI9ub=Dq-m?UWHZo-hdi!=Bhv|6}GEg{#?N+4$3n>=L#uK#5N_!|dn=iF$-a43Iu)h%24G(D73od1Z%XqKzC`%b(jLRI{dcP% z1cXJzzgK}$k5h^A&w&kt0pULftJ=NX{~Y{j3ICgph=B0J{qx>G2MAX}(?ECyD2Kkq z|1^lOi1dHUjiw0I#Ja13m{YYTk+J^i8SZHS>XhL`3Ql;{lD)_iWFn+;F6wjeVwa#KAVnV&rh9OxLm!Zr6nmb zvGJDq-*(51(~z|dxPFfO+g;dq{!gFuIkL=ka)eI3|!r9$#|HzEOlz*=x95P(@6aRDc-;>Dyt`UvU={>Z7u4Hg~C9U$imk4k& zb(JK$*#k@LKPC7G>2*8D)1F0lG<)IVq(rGi$jBF$GSDvw2&>9^6|(~alAwsmnyNq= zt0h33(*AXa>?pS8Us{kmDnmj-t{0yp!1?x_-1YTIIw}va{^uK_1$CkLXXRx9&xp@S z5V~-l+WxmeoW_TeJLM~t|0wDb>i=*3T;(48tpe>`h)JoV;j!-7*0E51^e}trOtJk= zqx>_Eb;o`Nhh=Q;gR6?uW#m{el8_}n=99!>>Aq6mA&_ajddOv6TSOdp`ThOrJ0xZA zRuUfT1scplxadmP{P<%t&0WwoNs}7^CbapW$!+p}#M$u4(5>9O{RR9zFceF31!{O` zXzJ1x-%4s+=b>T;ANq}u0Jx3H>^}6M|B;s@b5D$WA_*2{Wp`HO zs`AnmX>M}LwTWNnqkq}Y^s?i9z?uhkE{UK^a*huW=Qiz{kINlQi{dyEmX>`3C|xOL zdbFf?TGS1S)e%ApFt-0#4(eF-rD3wLF>##=OTV*44`c8k=i{b@)J&V97?;l3jD7)k z7L3QzN`)!)_h!-zEi`jieL3PyM3!;&a@6}Jp*Kaia5}ulL-T6e$@NrnFBLy;vv|rk zX}Yyam;?uOUS@roM_FI72tt{pd=O=Lb-({^9oP%1h@ zF7XyK#|n_F3tPO}#nga6#Mv)zl!7p_o`2Ozu5y~9=;B3Z3Oqr=8J1F{QZ;Y7+WirK zb2J=COjb3GeWcamWoS(ine%&w=x!d3 zn{4>>Bza|@wdt|4&GR{5F~Xv_hMHl{kMQq!Un%I+S{Y^3W13utVxyF&HsfM>iNwK+ zvt2Z)0Wj92Y47@i@W}~n)%p1Wc1AbN@37_lW;;P9ufqwdnMMXlKatnFr&UgIxGy%a z=@SGZKd*PUR_``cGd{W;<`xU_d-Mlc(-RD#N9^u!#K|Zj0WaP=GAk-1?XG>@B==%d zKbuVq1xxX4u-CVY)&s0dw;bizi-wzHkn+k36BpsjQD?Ar^J&8eU)`f_R2I~PUl`c5 zDfpj1SbJJ-$dN>xbmq=5pP2;+<AKv$Ej zTG39@+FAUFhAE(^6JFIci-F5#FL?V6v@Xh^eWI86OCYj^DzARY-OUoY;L@_eTB|M!lJE~oL+8rX>d>!&5MDv+lch) zimKWXp&rwk3>2#WHNSWHc>c1Vq>JtOK?OMEL0ECp#>hVv2_+)@#6(8fDxkcqSQ(!< zyU8iv>uImdf>ZcIyT4^JKD$KU{x}A@TI=IxT@fl0*!_kLKMgktyK9nqyr+-We?|S) zjbFAJ8aUuV^_kChqpv0Rm+Ue%6E;pV6J|^ZpIL*WHi9%@c{#UbK&AJs)BujC#3TGL42c^&H9G zAelozEV%`$meYIYb;@d{WiqvfC-ARwgH-gKKWKX{4G;RaolV~>^|jR~oBQUjDi*Ry zo6_?s+K66fe2mIX7w1TV6wvc~fQ3oPK$WSpjMg_^sgyRmyR}DsV6cPPK;TpZFO&M5 zfHpzd%H8eh5Ei&6q4z5HB`Rt*Nh5I~XQqUXl(MI7TZF{VO)xlC7~iX@_RFVIc7qK) zrP*(O!S8kge&)WgZmHO!l(oR4dW=pDC#dwazX&Ol+=;~+a83+xQto5M=^+i zUKghb=H`%}>hq_SgJIK-xd>l~J1fAQXUgj|)gJ5Z+gr5nP}Wsr4Fe!#ppLaK1{aIv%vfxRzq1BZ*pKqM1c2liRZ?CK-`99(c*nmwfIW3*pHT`$6SP%^a(rZ>zJ2~$3 z9axp)zbTl7YV%rOL^3w~CW|FwX4;oF%+?hK=EsK(@9a7&q;UKDjAW8q91NY?>oZfb zp0KT>p=H}{DXBz= z4W2^MPbPcc6wAPi85bSP=w#5&5}+`S+I(@pccWF@MZH)VU>HzezrCzUV9j^lw`Y!M zZm6JAn(T3wcZ6!iC!F*%gNFg(TyH!&r;MMaKfG>B_9&UjcS!9*Q;+9WNtfC{?T1=^ zQH?@ZW}N27{WEt88JU0}0*<||>Yb>W=5mLbl$w)Tds!#^ho5YFcIy7WRi$Chc9GNZ zb9+z5HMJ)v2sZwjiygawA?f*0R$;otA&LH3jS2; z_!&hsrj}F5%j_=CTxA-13fPBzr=GQWG6poXjnAdL+r|`9fG2F#^0M zURTcSU5xeIyp&^Hbc;GEGp$5>&&?{ad0iKpc-tQK)jcoMpvM`WnWX6YHxr;wDP1j`2L2H?h${WKQB$PHEK ze_n}1*Pm?@8_d0QATU2Gmg;IBP}rM|8&^o`sV!5HK4U=Wx_%Xa6vrS(#P+&7uS-1G z-wq`{poCSGirR45V?ga=RQLz5;=tl*A64`w!8nCXLIrC_Vh*xYGS<$$W`hr4lr+XU z3}RNjC}mT{Wpj6ezpnwWO{8l4QI=Sb#4rSt>jm^0RHFIz3~Dku8cz>Lsm;xIHuOoZ z7+w)Em&*@SJOT0&a|F{j$8a!rzeGpbX_r2K z#QZLGF?WHtUqgzVra)B2-RSkfVyc_3chA2OK%NhV8plR>?!1CmuR*T zjxu*pbW6TnJ^YSBgP?*GoD$2=;@F%>HK6vi+gwB83d)QetVs&p$*GVXl#-hyxK@`X zMT)`PaiVqSD~b+CuDWjU?K_?KJYrZ-b-JrkA?%-_S)a%gc?}OM)oIBP|Fn*@tbX~Z zo#L=q&9yUTadUX(-IV)-f*DroZl30+7{ww_QX+OHS@Hpmvc<4ZD1*{|Dp7cAbn+F$ z5TW$PkgBK?!k4cRMq8fi=jDueWWu0a@7jW`_I59Blq?Kxi=)?a?_W%TnMKfq4VIy< zb<@;AG6}e3p9^PO*I^-I=7#zc+qq=a@7-shY5JcOmU#yF>B~_h)tX%dZy6u|^jH^D zeSqYf+)eAdDW`;gD1tj^9xO&RNpL2{C|N{;$#O&ntW;)bthY@lJ@ni}%}BAV-8?sj zsNO{EsA?yW($n$DSaC(vSRAY+{VJHP)|^$GNIGj||i|+4lwU}|a>77%a*|};h zP4VO-0nY6%d!55#<1@FHB&eJ3-B{2gXfH14kd%77RI6Y9fHYpSh7u_w0L3OMqbk;$ zF+!l60h+8xRUlVP^)w)qO<;qgne6Dm$xYDF^VijMYYE(!Wv4RA%i)h|S2wG1wJuq) zdC8LBv1Fq*ok7Q7Zp{@c^N)x9L%ZF>ZXr#^YHx=!{Rp@^wkF}Niiq~NvDL@lT*ZG6 z03bqhdOG4{Kl76N8=? zTCuaY-Ff-HD9q{Q<>6*G&yW9LDZL$8A(QDtAOhx4L<_8YGAR{mUp( zFgX+j6E`LrBk%n>?)s3@e0z((gj6YB^$OMJ0@)G8lQ+zDgxd==pcF=9Ct8hqs5ds%+~ zOwrQAOmyddiSR?apPcnd-2P2vD1LeHZ!!#scs^%zRZV;ar|5_mKR*Ogf9*R`gi^fX zr1^>7!bANRwPH8AHKjmAnu02c<{q(9X~w6RW_IT#TNpC*a1<>IH!ZaoF~(MT`J0!? z2z^KbMEv8)Y_v;Fa@9xbff8Cd{FI{j@{=9REFmuD-D>Ph{{u@u!A@jZnXigeq_k@9 z6F2TIi8(3=wPn%__wfUB0BuM-E0cD~sw$06 zPTxwBicx0lL6~$fs)`NmNloIf>jR#=6{=ctbfVQ``Pep$%&y zz*wa7e^CNR&T_AShqN-(d@!f0(Y7zJldDQN5Gf4Dyl}|REERJ7qG7Rq6aG!me)Zee zf-j`R0`}_Fo#|ZR#;b~B74M=H-lrXobIF2GRdD;+5)t_#PP=tr8{1N0vAC=~C?}D+ za=_-f*b`emuXlc%MolrdN+_sG+SLS_lF(Z@+*ZTC6=j_N9{!mBu}e!*YW|%tc1kQZ zSrOf^!1q#6qC%IQV>F1})nY8SV;Bsglv38#bdk!$%?Xr| zWh-7$BWKhN<6}}A!j+KypiWvSCl_U0>0x9Q@}=$XY3W9Nf5huQy|#tf4nb>C9zHDN zpK>yli>PK!54wxR6BCL-T5HR~9^z7qH8^b{I9LdWI(ilHXHl#iSz|8{(tUeBgCeq0 z%Z?)EBOI&OgPbiYbF<0v+w~)XA8liM@_xtEuLgAm)2|Tn$r%sgstu!;gk6Y;|D{_I-N+tv8eI*Wub`ts>SjHy_s`W zbaj4^LQ}8C-K~7i80zTXr_IG$AAjZ#CNh!Kk}cMDynP#uzB59=?JAmXhbcfWm2Tb; ztW@P~Z$*Z#A2}o|*XsjGRuelID<<@Pj;_DHl}Aa^kx*HfUtuOgIpV0Sp1Hl1SI}K} zbwG)6ohj@dcpful^t1OvzPO72OP0y;czJh|g)N~}NIkq(--xr|_wUp7U!ah0*&KUW z+1NO=4)1^+SS$SfrvlyIBm6;bZfSl8q|SdI-(M=8V?YWbz{KQ}Ka0 zA|mBe#StUzXeGf08PoJ&_B|Up#CMFI)pJrascr?LC*;)ZC+}m?h8&=0%79>3fm@%7( znCxzoZ6G5;Jrv>wAgn*M3wjPid%4va$1^0j%nNz-(WGK1pvANW;wdSm@*&a0kEh-A zU!+v~2NkhQ0aQXoopfwxf@ID~#+60e`BPnb?S)Fv&*vlo^Ac=U-^t82_8Of!MhPED ztLzLMHjmLnEGntl3mNStC1ndsO-LwXA@RNE1t%Fs(!;|kHP|=x6y!xs7%cB%nwU9o zL_|UrsoF8g!vcdAn+(O!MVk5oMrGOKmv9U;Xp8)ZU)c8)1Kk6R;#Rb?ig_n!Ji}1BH|8N~* zEMQ+vYU^gOkI6!6%!VBxQ4%?|;&Wn{diN-M+_vpxii*jFlkVm=YgOpmXAXAu5gp`am_NSWi+lJ+2Wq+b!p2Y1Id zL@ifd98$(yo%9!qclg=sb8@NIx4bwz>oD<>Pn*A0NVuitLBFNhGbw48PnB3hq2mCD z8O_~|38bMQroiHUcgs4(;p)l~5+a=vyutP>9hFQPWS`+c4bbDYwL zIloN?*sPs^zXgSb5`!NOOMlzo;JLh6mZD+ zzYwX&G*{fbMQ>?#Gk?6zd;PSDb+9$X6!hd!I?iZHS#_CG=b+M{Hqyd4K2pDSQ8zLd z00AIE-X}4yi_{k~5AI7Gr)dI(Pv==#nJ~#bXq}!kA$mZ|cI&a9geDpB$?B<2E6ZKo zQ{8R|as<@~Z%QVA>P6eOSgQiXy~X7uvF9DEyW|anYMhmadtW#e^bQ*F;QVw@ z;`g0PFNdsR6H_4KN*^XkAiFWe^ujSZMTqEA3?81`0zQf?KHtOqnN?)-Bf zZ;dyIIgjUVpFSvcNoz2&2qrw;EU3kGdtNWX?L}+l+*cn;o=(mK+)U@n;uA@ZyviNH zw?$#!F7KKcnvd_WinY(u=Na_dsHd`hWo6vTO=kR{#FOXySih|{4i4b&JIyNSAP%(C2>}MC4KX4C zhDCm>2?fSE#mY5fl){jQ8QgaeY9;+JB#G_?0_l+odb=LQJs!YSgdP8^;+>(PUbe9w$JeMeB$+3yWrTW<+<)iYM1q zZ}mp}PLp~UD0x;wRYU^H{K+IM`yKHy(R1)KMpUl`I&-fA`zESvcPrE=WPj}m={+Ho z(Xw+ZOaLXN*`z$rMLeFHVXtg3K99m*`_|yDHG!dw^KmXIR&-;#327Xsm38$#)jO@e zaUZn`(kmFs@OYVp{9AeKUf|Qflj^R~(Bl;`87Rx&oH`F%)_r%)As>gSG zPvhQ$8%s_(t6p2NwuC;fsd7iIZ&p{s_c*9KNTS!!!44U@Zg;gK4BFuBkAG$Tv&d+f z2EY*YUUa`#(F}y})R^zgRjCXoq#{MQV@AYv#uW)D*onGlr0*wu_6bFsO6F6RTbQ1y z3*9P{7-kfV>$VvT|BU()LKI5;okv-1qVeg@EF^amoN&YOBG{kd&BJbAfyycW%FZHL z7_OH^&-y9LkmEE(ibmoPj=;Re?cfBIJ(&lN&bz3tq^N#rxnrHC*L)8#LzInsq};%H z_|+MOd5c5LV`<%NVLyts%&mz2Vbpq`1Y1K_X#gA+D=N5p1FAxWxTR zdi&DxsI`HHXRrO$5+Gy|s5{rqm|~m?G9cNjjDeoVjjP_tdi02|6J950eW-Xc#DovC zlMvmk=m)wfKT(ib<>Xmw2Z=uoMOVRaYT3c@Z<%dJoNIOI%ho5Y`^&xQHuwu+#lqhB zx26wQL(_yk(wOaV3s*@QJxV@4yY;M}{pc9Eh8BL-Pw6jRH^hj`H%{Eq;Gfv8Ww z<|I=_LpvAnzg^^RSb*|9o+G`eUU>A}Z)zOCp`UsvFO7a| z=L(wg+7XJ$nNxOel`rS{O;dw2bm5w`awEg+v^HpJ*fljA8KTl!R*W;0a@YAYOvl=8 z_Uy{T^RX9NxT_%#ISOL;K43X%NF&#tG<)TqReG!UkaN~FQU!I_?c+#$kjvt#eiT?4 zPURRmo-)cB@;Y36#WU8>9Oe{Tg?E+;`&f;VVLFh}Pj#|e?C9Od_I4~nKNi*ME|+PAiu zJ$4LuiznB>#ZrB}Z%*+a1DC&B@uplP>fcvErEqNy??vu%er5SR26;!>TAcMCwrJX< z*}+Us1${mQd0p8F3qR~~#B#8+F6L&}g^fh6lpUX(Xk8s9IWJBjW&vBY-@Xqf_jeD? zn>ntVE}6ZVZhta`9_^?ia2JIIlc({YeFe?89#mb*hXOYQrg68sYgTqvi`2(*V;anRfqcy{atpXuEW}q^(tql=G&8uzmAZksVX1hVr8H`7R zgge@J(pkgo+k^C4R^dI0@~3~n8hD3htmAL0jsS6u$E6GWo*oKv*+d~Q`G#TCNhLF{ zkcPGqvzF7LBeoOK+rLdAc*YELJHAI$MjOjqX-NhEsOb=az_c&mrphX1XoV*BXc`0& zYHA7xLNb4ANP&G`(`aJ-OLRFGveHcA-CC>Q=Wiw7fRWt1nM4fHz?4{rML=pN?490d7%bo=)3ZvdaNQ){NbD8-p{`^5k^&jz=%yLG~<2PHx$or z8YfG2U3mfUh4qO8I=)hZ+jM5$%$5tjf9j@>*Z}%-pdmn#xg&7b0BB8DP@|{Lp%nw{ z`0~WnPDXU^Gf?rc*6Kh9d(hizu)}tvhiuT@sEr{laeI+J{prt6*wf%hna+sc8-&ri z2IjqbVAQWCWmW!oCaJBKL2&zh?=sjJM@t~36fh2eQ)?T0?!fhf95Ud>^rR8uW@d$F zXQ*EGncua$+hw0Far`^R1kwf2r#L3Bjs*UgS?=!O0=ml_cTsK!=qF3nSUj((MECtR z{iLG#0F>r_E1sG67vwdvJXnCB=)Jd%jm=y1gZ^P|yNy*lpbd_Sg##TNf)kiWUT%(i z#j;aUNk&H7LQfpr&XeycZt#MS@DmV%+g>mBfn0hv+yR1`Fy`mtAfbV;Hu-9 zc}bdygyXPK=jEpi5Pab57y;S)O;xenlI_=>x35!m)dU2fetx$al5TEp5{BcK!y5;% ziP_23VezIgaZ)=@0?+i=!v@MFg`l`NX9b0hD z;Ux2LG1!G)<#B={0I95Wo{W|ln%3*c1!=i@x*MP@mJ^1 zL8n(&IyXHW6jI`LR-2rCk__}0r>BQwqX656^KZv&ba2txD$^7tz%)`{pgeXq+w(OhJI(sm6u`;JNQkz5^j55_FznZ@>oRz41oQ;uv&p z;Tx!K+<#iF88>q3D+G5UzfZBVoh$OvPpM4+q4WgG@lW}?^)v-5N z*pXl%7kv0JJb&lQAFT{rR9$8@D8!fF^!0_ShRCtq8Q)JVE_#@MjS%mwv~b@(IX%5R zJ+(8=CdCMX^y)g-H(^JJThz@hsw1HX@bMCT3X5r5BWdueJM{dj602d{JV4#JmbsW4 zJ2(DknuoH9odR7c+2t|ZPx5GIXKqWN!o3u`PCGhH{JF9pxcVOBy5q8@ zX8X~suqBCwgKg=cX$;m#@;45Sj&A5xU5dX8OmX!}hp7ah#Q0>p>)wnupI_eRS=Wy* zUgNgTtf-H#*(`2NG!_($Ev3Og5xsbRP3GwTrOk5Holj-``Q%LxE8X)G9!nQZUi-w1 z-rswn3|jwoxLRf4DXLEg_d~8}`89+u78S+2x%e1mm=+WmB~Fa`)(v_|utMh@q)L0} zC%Lk?XkqVdHGy1He}tTSxdlAIhZ&uRIyna2Iqsqu0x%f$_Iel}_tf^lwGQgBRK!z> zV(0?y@pW51E(jWrE`gqirfl`Lb{G#X;r|Aiww;R)WDF%C9Tl&ye#P5ayX8yZ8Ca}r zmPFe5%~hp8*Djslzi|D>Ne^U9D}^|2P%>1qGhQGpzdfRu@DJ`?Z+bVuqICar(6Z-- zC#V5a(Nt2tqtI@~a-zNj5dp4tcY292CQxThmU-Xt#+@_q?nj;YJqHW|2qX@x3#T}Q znl>*aH>=og znAibJIB}P(4Z8!H96+P=`XB&Ivpt?{jR-nQnlAg`H7ev0>dc8$@prb~F&%mI>ZkV` z9a{FxZ3fI5F2HvHfrZy0G*0|}2y(KlcT!eunN0vzRM!y$+rOr63{uyN9& zq;4+O_qVgRq7|&P_OFG5cZPFweOqfK=O+eGM#=fP$?Q8CgK!+J3a_kAu>4VYpoR>U z{CpG=T%saVSK}Njej5uM#78@yfHei4^2Uz|G{!(9lV)z*>yk30Jf=##MzXW@M^le+ z;{uYl9}f%6Z4&}dNh7bY9i#JW#>t$XeuwS<417?bf0DZ*q`?Rh$$aX$8Q9Kt>{1?vr%yHvJdy%?_j(N0(7eJ zR2^1c=cUkTWyGCp<1JB1RxWdUngA1%-FpWtZ;OpBpBZlLrO^#YKzxObUAWcA?Satz zndw^NgL!S-TQKS0NQq2Ic%`zvlC77F7uiT~Y73*beDgsEug_UN!uH4qrj47v8E)`b zv0ND<9P+sGW;u;|jw^$jvob{dG=3)PXp$@$b5r+pGE9t=Sd6^4pIQsYKQ(x{-*0y6 z>IxD7p#=q3t~ZXrw;*NXV|gV$8wQk3nW1bFm9|b7Q8Ut8UY3`C3N4%3G={}$xhu_v z|L*DeO-0%X?03Drsl;7pue&jUp_suu+>hTMb~vYGVFi^pUSZTK_?oL6e_6UBM=IVU zmBK4Z6?g16zSk5~LyQk-Ds7kdAJUyaPg*USP77*D1lCj0 zbtqx8hRnPiCgSd4@!${bE-avkGvf#dQBf zy{{aQh%2s13@25GpX95`Ve-f;oSc=Mk1x=?ju9RGReq+A%TR${imyT^d00$D z0j2W@)eCey8Q2!Vn6^qwL-r!L7zFwap>(PL^*O2*-dI62W$dUNiK@g521_WR$yoxC zIn-{cV|`gEBC@L3v|fSStkL-Da}%m}F-qi-FJIe(v)>|tA}K)z;OuWN(WcCh!Gp&; zEDDOratbcRvz^o%09}9)+!-R1hE3QX4}_LfB0$w84EDHFo98cmf0ywp7gzLSm85|x z;pYiVy2bR~M;Yzv%IG|7mYl-i!Cupy3Pkgp3_f?+c+!4&Y#;=(X+}1cN=M69E?Btv zL1~ZRcHD+51_viLk&2a?jxLb|Bu_e&fK4djr%!=6;3|`n{8%4o3Y7yo>B2Jbg0F5$Ja znnF9UC~P!Uc^&7m+m25gk$&72;;b58_A3^mq;5w)*K$ZOFZo#6RS5U)t*?$}UkM5$ z(r(2Ko0rb3=YHo_H;#63dF`@}na6;J-h#zVD+7AC%RzF>*l7^d)gU4uTw5A{2k&ar ztr1diMfcb*auzdDLRm`O1LUPjh&jJqk!bK90kRj;f3bgLP{4 z?Es5xYJVkJ<7+3}@NDA4=_ia~cz+>XlvrQMRAN8Am{C$t_0}wI*EcRD1yxFbt524@ zccl^=qoHJ`gsY&5ogH1Z`TpX~V0ndED8taud=5H9{Bc+XNh#eRHE~5zp*GS%*CaJZRl}1XJ}6%Ttg5IS<` z|LygFrM-NlUA$kuDPkTK55~N|+m3&~gce`K%k^p2tPbk(ICv3)5fgGTgwn(ChMM_8 zsU#s5Vv?}l1{g9==BR}fvZX|mAtFB?4>*l!2fY2@pzEW ze&L*iOgx=Rk*V_@_kQ3{_yIZ-@$SegrsdDt{6WAXS|bpp+A<^xE|7Q4&8Q2NfO7*z z|M1tMYOIx|MgaICyx3AJ*{ql_uH%)}K<;tcN=Ap^x}u47iWt)dThUQOFg^Rp4Dxi8 zEd6G0GvVh0?hLl7V&tkqv8#=Ir%Z#6KCpQBby~5QtsCrLlr54S9)6>GB3-4flsfj# zOhlDZpQvzET;-eBM!~NS%pjQ*Zk-f2OU#k4kiweRMG{1r;Tl-UC*W2lYOj2GGr8VA zMb$3Mf=xm2hnQB*!V9Ti!C61P00FT^vWkkx82FZqa^;uMUIR*JC-+Lk669aM+Q27Y zcQ6f~5%gf7zw1PcSi64b!~L0?L|86oLg_;s!DM_uK3SeMSHP4I>5cBP2hCBjPJRKq z0w)D(eSy57iY}-|2>lC%w57_t-DT`7rzwJDY`=stH^sdT(|jm^1accjI{au*yUxT^ zSl=xU0Y?*|IiMO63I@-Nym=irIiuBL+dl2q#P?LlGzNu&_vMVO=dgw@?o6KqbrPXE z%1hnCW73E>MJWCx;ks-g@z`6bb(ALJSxdEzxj7^QD-2rK{d(G1h3dTGU%@=mw`F@) zR~BQN3KeXW#Iu#pK~K~hfYK;PNhKFrsIetKk< z%^fx)0WpnfWOS6WB9-m*^Vn}0HMNZChQ;)vI37;Iw=09#-vw|(CX zFd*3Z8@HX}_USTXe`he61Tpwb*WmA9u)D#s?z2F%Si$aQn;2AW6e$)O86~ITw1+G{ zYF1bb&>|EOc7~H%8c?!QDb}BJ+SjmP1bt^pcm=|6sCkVT82EnO5$kn^W)_J^b|OjE z^cQe82X4S~11U?%`{pUVRgK~4+n(BhztLmbd>E>3DNJpA^h>DAQbfB%%bbO&^w0QJ zrUI&s`os-aF2JiIX8iVpnmONR1_Dc_Fy8zu4_f~2piCX*U#mz>OijWZZ?;f$z7>uv zO7qp=)I3YERLh4a0MK9vgmTOq0o@RPL2Gn}{KipKnN+U~x$5v?{0{ZDw4${*<8fL` zNje04exJ^`U8Z386PP=^q1l++S6YrNa#>4{khDqPF`=+{TEZ{jvSe%h3#_1_>4az> z$fG$snjG5RWzBArv~!)~BFW34M+Ms|{j5k)q9r-fNdhk2Zxs3C#$yFlyhVy3^2dL9 zObqnJfl0+Oo{MgoEc5NJOOJ;FTaN_)EU=>($KI)`ul4sVGZ>=lkak zM9}c4lg}g)WQk@(awy4166hIbE0U2GL`|HFv1LPu$eO0#?KYb9 z2hq?K=mt!5D^zeXQgi3$khNP>za>>6&kYsOj|d5lzsJW{Nq?_q+i9T#(g|xCSA4E`U(D1-FzbUh^J{(qpD-sq^_X3iT#28Tu2t>E&s~o zD7WmN6fUcV`F)%G7P1~%6-_MF5j)RmCfo53+o%8!d6m7ZU*;VEa(+Vi3Kmq1B$gh! zvo0Mlcg8!55dL_u%MnLZD)2KyO>5YZTh>&z3Jf)5GoC*@q>jef6VJ%!TbP#E z6oQp9T&hxZ7iDD%1IGN;_P+TJRI!9jHLKmMh8qNGt?Wl5?u4uRiK6L5r-)!ib^D6+ zP`?ZkY;xB5834JCEVeMc?SywK`ikV0F!y#?-vqrJN+qDDBctc0iz%Cen|*~5WXnY~ zoy}JFWhssYG#@Hf$YA7z_i`4p5)3YP$OJ1;ND+zrl2eI{avz@*oX+5JjBU@#B%{^Q zNRCqI#YEq^wC>NT=2WtHt`9@b@wdA)yS}7pfpv`x%n!&&2Y;2=K!$Orh`^+H|6MDv zX(D2$XB=B8Zojq;3zL4_g(-M26n}fne?kD=UcqWL>$>W;$bEtDj2n)ECcE{l=MwL{p1r^;gMKVLdQ^0*-J&cd*4ibJtcTbnnn01G*uAl;U} z0N8ZXd1))w>rLHZuAiu%Zf9y~S{Pfp_m7jxF<4$psyLAU;h)qK76=AKh#OdYBc||R z_Paf)@HtIfH6qv0p|*X_ z-0rNpxdJ5aDx;_ymVyiRYB~S2iUUI(ygxMfeAL|&gTfFf>Ehxt%RLj5A2%~T#WA~( z(IIc}Vq%y8Iv?}r-tbXHilff-o<)z92IHyz++=%X;_dqEbFvokc zBa>#o3bjv}0gn$yoO^I~!T0!w2McS?v%ohEQ}J0hUwY?6`Sg~lj4y)0f>QWeH&J&N zP(936TVwX;&azVHfakCAxJ5O5IC%AoO?3U}Xw4ON$ZdXsK~E%2j|7)J7))^IGk&J_ z2VrJX$&v^kw?8}^WuYn*=8v5DO-@)pdr|9LY_L&AYVh<6BEn6ejgmWV+i z=q=Y#)0|-9fewpQgOlar<)fA)$HMh)37f+Pnix!#=)lCKfl9jTtt4OQK1 z1ZRC>0Ju4?PrD>01-MK2R&Z@tdMGiJw$`XOS-jCa$~dTk0q@&Q(ui$Wy1Vu?eSG{?vqS2ALGes*O`9LqvcdK< ziS!&P+>O~)g}&i9`E|xSzG7~tP472Ts3G6{#Asa|eeETIKwZQWp~F9nh*1(SIIM3I z?2wz$lB2d@ShK*uhE!1blNdfC06*YiU}UY(@fJXp1z6VvDFAU--M+!ReGiZlXl%dut~QS-=F0zZYQA{iCgHrn-We`@CM~{afksJ5DWf z1x4lD`(Oh{PMH%Gzq>^z5iK~^3*H1-WO}bC4@;(;E7ZWP+nwT&Qa<}DdwmTc&hdp| z?TA6^a@Sna8#+EQ!NPmrrsVB*Wh{^aTO^C>*Ve9#-l$IvIo9To#@_sl5#wMuyqMH1 zr*NWpv%_IVU07x=OKDpFac7TXG|EvV7!1xRb`}Vu_l9xXe<}ADcepm=kT%pAQ!G1; zKpQJ+TLVXX!~Ds1ADyS*dt(cExUB-x$4JK*?#ZRjCk6^4_e%a9=rj?Hm(_gF|I)|L zJzw0SdRQ-McrRVY_4RwiX&RuhKE3aK!D)x65QQGf?IHRcXv$)5IndAcX#(-!QI`R z#a+J1z3;96ui7f8t(miD&b0T_-4woGoOeP!x+*e?Dj*j)=H{5|19u+oL`7^fOFFIV zeO0_{s1du`%udvFXl3vomA^W8ldjWgk&d6fjV`L`7T3F}Pm9)T7e~9h+Y<2pF|_i{ zc?gP6Of!P@o%OSK>wS~9DVePvGCfZ}t*MidqRM_Q1!-qCs`l#t*WKU>_S2_;Ti^SP zsRH@PM+FfhrJRC~TSrGr)AM3N7APnvA-OBQmoG0b^`^Jw#vjqZ(zT7o8`Skp}^z7OZi%q#OCx5tc?>2Och`T!h zb@9r>J0tBI-T+B;G|B1KJ(O;Eabf%zEd>_3qfe|=9KL24chV(}-mj`#pojc4&vy1d zF79~lyOoHM@AweizlW5+8@bA7h*DL;_-y0u?%DWAEPXpYnargwRF(7-nQM0CJhjK; zU}-t84pHdFSp0_Ay__z#NvFxNPAQhhnfza3YW&ury?u&UZ+?3EYOIt2U(oZls9<-& zdL)t2&(BISb;NZ?s^w_e!`*Y)v_g6rEc3X!z};AqKcS2Es@BsQer;Utn*0kYehRb| z6TxvyM~TcCTcPLYJYKC!*_Knmqr$6-sH^Lip)fKsO>Xxj2@2YF?}OHcj>X`kvtKlm z-wvQYZ9TqCN)24I=-}}3n$~H$RG>?vzzR#NEA3Fc4Ut%yo?TiWpBVy$@6yp7-CWxu zcuNIbP>3j*DwF4)p-FIE~@Xln~CY zTHcN5iYP##8jn?yzBA4UUn5q4`9ebau6ytCpn#ZX zZ=2ulg6NOOXv_GSnxf{@K@bZ4t6;ptrgC4%H-;!37{|r|@7we8Kj-B{hTzOQ)0(D% z%nnKF(K%|TY2*&k`pkEmrqK<{=3jMV9p^=>R0U>Ml!mkMA6ZC?K86u?Zsa%AQAhMi zrMU*R%w5Y#05WcuPin$RLaB6Y%&DoCFLPfRxbS{xo1yHTaP9#90inACw&_Il%>qa8 zTW72Ap~I?ms{8D>q0qjz#nHT0@CemOlxWcY0r|;;Dh;?JyH$*T#*XL+9efMAO8*TO z#gpQO;aOE_6gd{^nt=u|VDn`P7U=Bw%i=N=XaRlcFOw^}FJr2@j&dGi_U_g(Pc=_i?`1DR|PP^g?7+{G0GY#V(feYJof;A>&_dcfFgbAOo zO7)*r*Ie$SKdqNmV*-ZvCcnackzJB4$)2_AL6@#M4ST(deRfFjb&cudsF6 zrUM;KSXcq(6RT+rmdrEcmaq>qX=Jx-?qEvvitmJa&H^Aw*{d!i{@A2Pkja&5<;)9I z4iDpZJ2i10{i>WFdk9W2pSi^}JAylEHKmP31x%a0PGdNLP7Jju^Y)>J2*t92+_%(| z)O+tJlU%rC{d2!JJ<+DkI`CK~G}}Z=Y-YytA(;|_(>TY+*H1(UeTP#=Ebq>>k5b{7 zDhNN>Hxs$`K3AXz}fmY}1kZeqAJx zt<+J1oi@Miua&72nzK(y$C|+2_4TneI{x%V4 zqc3&ekF^Z4IgMdJwMOr9aBqR@;=I8Vg{EpOdg4UBpZ4q2|K4!ARZ=uLCR9=7{gRhM zn@HIlx<+nO{?(X)81p;mVaoBrQ7iWVU0c=4x*55qX|ELE~ zut~)lHtF2M#cOb)tOH>h_=Ptu>laQ#+PWiYD`Z;#;#_~-s$60qJc7!*D6B;VOs=(D_EA;6uH29B0XGWZVW9BkVME*t9H^^ z|8K6Rx%tl<)7R*NVzrwK{&<#8VT;^SGI}jmlD{+CN6vN)JRS*D$%qbm3k<#I<>fJL znpgNbbYHicW}gEsQ3N?0DC``mnS}pdI2qL)$jBd?^Q)I0IR5z}#3_p^UcO+f*L3|b z@vY6x(k$BEEXGP9_QhDVplX^+^o%|H0D>G?s*EGj+Fb5-I!M|VvAsKenDot>VqYn^ zwv1=+V*xxd-ku;+s9&r0JnQe7(MsM?XNr+EIV$p|c< zj>B+wb@!oMbr>9h2cJc%F9Y-k$P+RiOg;PPl#q%nUzg(nrebGIvo0wYdig8^?D^TI zyJOPDZxz0aQ^CKo%^e9jF+n(RM$BmI9ua4Z#O>GgwmD1!l(SBpr3I;eA_7ZH)HYs9 zKFX8Bl{92siD^1ZQ=V^2rj~V6cHRLRiYMrNDF~@Jz=x#vjl|OW$Nola&cjzbyMk{5ywKXEbHSdju})-g8aP|o z(>$CiGdRPdvf&l@VWQs+{<@}h|Ci0*%*uUuBP?f=Vfv*^3GZX@StGs3QdZ4ZDM0*h z4l8X-#&RsnAG@aFHAfY6F?(`~S}D8HlDR!yNd@0Am1o}yNR5){>*CV#xyqK9eX4Sw zRG^WUIwqISsqUoHY!z$o$=q>$5a(9F)-p;3lDm!H5LW>vICrUB`{Fq#?IBlX5DEB& z_E%s$3yOl{*AUJ~%jHa@2iSl8MWOeb;Yglm+iA+!i+0^jItCY%Y++K@s){uZ{EfZ` z0=0C5STL_{aXa}yyeuj#-!K#lGxO0ttf&HenC!1ylOigRCOMf?!Ag-3mi@F!#rX)5 ziHtOz94pn^1D?HJ-sdZ3-$rbotj|MzwO@&V+{BwnO~+Oducs7){dmXj4YZN(=3OO^ zsmXNLl4#6SKec9$&o;_t5TF4W#H|jm?Ph4rn5TL2FIV_}4FnbAHlvo0woPM0HT41GMSr-uN-QP8_trJbryKyEF`X>(5BM$*2@G;rk1VoaHg2*^^ zPCLKgLLVOZudVBlfxgInb}X{dDDt_a&=ebO#q|b6sVcuY!PjHGR`;>wfBD)Z`Axo?RdH9!rk4|LizI1H;GsoNl#34GKKU zkUie!uO)E)_Y>d0G5$p|kReHANtqfVe9;;&<$Tk5a?Tiuyv?2D;w(C~;`~Dtp46D_ zN%y2fotQIrHT=bju&e%u5abx^92Azp|zU z^Je|#%g`MR-6D>GkWb7+YISRbWCf8y>R{Oz2oOJfHA zy-{GJdFZQzcA;Z3riM63The-Mtg+BMntk53>R^kL&MJg5y2SUy-`OB@5is0%wP|MaiTaVo%ckp!DNetdDO;33u@`N}n4L zhn@>RQY(OWV?5}ijEXCan3d5{qTzCHsa}MXnEkkf%FOgb#Gk9j^&3;6x^rx#H|#Z6 z;}ku1d72i$QUv1@r^H*UC%ULn80STb$(WGx!sLxg_b@1{sLw z#*ZS<=?y*3iri2JT(y<+BG%;y79M#Spv|SI<+C^lT~tqf3cna}riy#MpJ~cuKKeH> z9Gs7BJcmkjRjhYNyt1m!Uy5u$ehTv%yK%|O{y4Gr1JAi_?S;4xNR zRrMO-xR6khe$CIhJ@@6b%@mcKp#uk6Ek4VcG-ofC34doBLD-rhIre{B4w3Cjy=()iT`d0eYtim$27ddPbsBD$P%CF=UH|#` z9Gghb8-FXaniGw{a43HowbSCZl|rQ*S9db4GUoQmmV?NNa-{qj7o^_fF(5G zX3N#UxFvSBJ_ys|V|-9v&)oMG0A&>;0c(TpoiSnfyB9`fC-oorX4ESORTAn6+r_h~ zi&s?ftKRuidvr8Mf4+n4Y+kB;&d~9VC3!@t+Z_-_T|fC#En_|7*K#q< zCX^`mpzPVDfkcQUF2w=ZD^a{I>R6CB0beJLMNvvj>jum@&tzp9o#G z09&>8m~OH+%fXX4{`O3GK>ZH&h$-NYzN1OZHCs!Ue5qeUJ2GO-N=)ynJ8Qt+wSiU^ z>|f0vg5&sq2W??XL0rB}*6_$8eQ(grKObugxtMmF`f~?l8kC;)MKjE_I7tBN>DzCf ziKZtM0w!}=xV^q@bGG3Er;-PzrQeg}qkCf9E$2 z002q^ICDft7yfD*#0*@84C!&c{@RYSRH!5Dd7am zxn22d?Q_R|l6!E_XL!~zY{lWRvKyCnAU}4}L*hk$_y&tM=1d4ck8oY2ehY|eV zTePo!yL=T{-J6Q!Q^g!EOPgGGJQPPs%oZsU+wXuJr72$9h9_z?kH`%68B_bwz4qW+;8iyeiy=SuoY=ND720g(z<9hN4 z^GzWD&*!_{~;1FRUQi>Rudo%rdlX zl_!BMlhto0*^YEQVF5!!^n_K1xtdqahO^x~X-MPHX%=B9vexzC<iEYu4L=+&IH3@tY7PeP0evf{8ghQA(-yQ=L+)rNaJNL#QzyygN~NAZ)9X; zWJG|L)--cyQVm0N2GkF!PdELlZT|SahwSV4o~JYg9#{)Qj|8i@& zg^1MgMTMSKlO<%}BLbk^xA-*)v5q%>^=ep|G?>a)aLu$E7dCa}EndI?|6+&IEgB=D zHurX(SP5J*b!|RkUGrFiM6q!Yc|cxScRHsT9cX$V>Jws5i2lGn8O>qkUF**%n~jD! ze`22yjz9DigV*45jCYKv$*(wEPn{}z!`Z~Fx&Ac%Y`j-$bWq(AtJG)7ZV5=p5yAmx zZ1NTycx7TvoR`XvVi96#zj56ukx*%!4sP2*dPsz_8bw!Zh?ipGNlvekU+GXn0V^~#E zqNOjKnVS0e^3-NyQ+6xXKbqp9q~fBYrDbJgl%p$zlMfuOo}(WC%%0Ac9v+fkdI}Q~ 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 Fe*vGR%Lf1e literal 0 HcmV?d00001 diff --git a/resources/images/grafana-dashboard2.png b/resources/images/grafana-dashboard2.png new file mode 100644 index 0000000000000000000000000000000000000000..69d3934bbe9051712b81a87ca17ec12c8a1fb9ae GIT binary patch literal 115297 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 CYQg;g literal 0 HcmV?d00001 diff --git a/resources/images/prometheus_targets.png b/resources/images/prometheus_targets.png new file mode 100644 index 0000000000000000000000000000000000000000..29d78daeeae97c39e59bf2b04c53b117fe11b1ac GIT binary patch literal 149201 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 literal 0 HcmV?d00001