From 59321ac782d906e81dfaf6dc31e7bbe1dc9c7298 Mon Sep 17 00:00:00 2001 From: Maximiliano Pizarro Date: Mon, 3 Nov 2025 19:20:51 -0300 Subject: [PATCH 1/4] Update opentelemetry-demo.yaml --- kubernetes/opentelemetry-demo.yaml | 589 ++++++++++++++--------------- 1 file changed, 287 insertions(+), 302 deletions(-) diff --git a/kubernetes/opentelemetry-demo.yaml b/kubernetes/opentelemetry-demo.yaml index 3e2ca11216..bed24361de 100644 --- a/kubernetes/opentelemetry-demo.yaml +++ b/kubernetes/opentelemetry-demo.yaml @@ -82,11 +82,93 @@ kind: ServiceAccount metadata: name: opentelemetry-demo labels: - - app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo --- +# 1. La SCC personalizada que permite un UID específico Y el perfil seccomp +apiVersion: security.openshift.io/v1 +kind: SecurityContextConstraints +metadata: + name: otel-demo-scc +allowHostDirVolumePlugin: false +allowHostIPC: false +allowHostNetwork: false +allowHostPID: false +allowHostPorts: false +allowPrivilegeEscalation: false +allowPrivilegedContainer: false +allowedCapabilities: [] +defaultAddCapabilities: [] +fsGroup: + type: RunAsAny +groups: [] +priority: 10 +readOnlyRootFilesystem: false +requiredDropCapabilities: +- KILL +- MKNOD +- SETUID +- SETGID +runAsUser: + type: RunAsAny +seLinuxContext: + type: MustRunAs +# Esta es la línea clave que faltaba en 'anyuid' +seccompProfiles: +- runtime/default +supplementalGroups: + type: RunAsAny +users: [] +volumes: +- configMap +- downwardAPI +- emptyDir +- persistentVolumeClaim +- projected +- secret +--- +# 2. El Role que da permiso para "usar" la nueva SCC +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: otel-demo-scc-role + namespace: otel-demo +rules: +- apiGroups: ["security.openshift.io"] + resourceNames: ["otel-demo-scc"] + resources: ["securitycontextconstraints"] + verbs: ["use"] +--- +# 3. El RoleBinding que conecta TODAS las SAs al nuevo Role +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: otel-demo-scc-binding + namespace: otel-demo +subjects: +- kind: ServiceAccount + name: grafana + namespace: otel-demo +- kind: ServiceAccount + name: jaeger + namespace: otel-demo +- kind: ServiceAccount + name: otel-collector + namespace: otel-demo +- kind: ServiceAccount + name: prometheus + namespace: otel-demo +- kind: ServiceAccount + name: opentelemetry-demo + namespace: otel-demo +- kind: ServiceAccount + name: default + namespace: otel-demo +roleRef: + kind: Role + name: otel-demo-scc-role + apiGroup: rbac.authorization.k8s.io +--- # Source: opentelemetry-demo/charts/grafana/templates/secret.yaml apiVersion: v1 kind: Secret @@ -5128,8 +5210,6 @@ metadata: name: grafana-dashboard-linux-dashboard namespace: otel-demo labels: - - app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo grafana_dashboard: "1" @@ -7972,8 +8052,6 @@ metadata: name: grafana-dashboard-opentelemetry-collector namespace: otel-demo labels: - - app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo grafana_dashboard: "1" @@ -14305,8 +14383,6 @@ metadata: name: grafana-dashboard-postgresql-dashboard namespace: otel-demo labels: - - app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo grafana_dashboard: "1" @@ -15794,8 +15870,6 @@ metadata: name: grafana-dashboard-spanmetrics-dashboard namespace: otel-demo labels: - - app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo grafana_dashboard: "1" @@ -16843,8 +16917,6 @@ metadata: name: grafana-datasources namespace: otel-demo labels: - - app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo grafana_datasource: "1" @@ -16927,8 +16999,6 @@ metadata: name: product-catalog-products namespace: otel-demo labels: - - app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo data: @@ -17516,9 +17586,7 @@ kind: Service metadata: name: ad labels: - - opentelemetry.io/name: ad - + opentelemetry.io/name: ad app.kubernetes.io/component: ad app.kubernetes.io/name: ad app.kubernetes.io/version: "2.1.3" @@ -17530,7 +17598,6 @@ spec: name: tcp-service targetPort: 8080 selector: - opentelemetry.io/name: ad --- # Source: opentelemetry-demo/templates/component.yaml @@ -17538,10 +17605,8 @@ apiVersion: v1 kind: Service metadata: name: cart - labels: - + labels: opentelemetry.io/name: cart - app.kubernetes.io/component: cart app.kubernetes.io/name: cart app.kubernetes.io/version: "2.1.3" @@ -17553,7 +17618,6 @@ spec: name: tcp-service targetPort: 8080 selector: - opentelemetry.io/name: cart --- # Source: opentelemetry-demo/templates/component.yaml @@ -17562,9 +17626,7 @@ kind: Service metadata: name: checkout labels: - opentelemetry.io/name: checkout - app.kubernetes.io/component: checkout app.kubernetes.io/name: checkout app.kubernetes.io/version: "2.1.3" @@ -17576,7 +17638,6 @@ spec: name: tcp-service targetPort: 8080 selector: - opentelemetry.io/name: checkout --- # Source: opentelemetry-demo/templates/component.yaml @@ -17585,9 +17646,7 @@ kind: Service metadata: name: currency labels: - - opentelemetry.io/name: currency - + opentelemetry.io/name: currency app.kubernetes.io/component: currency app.kubernetes.io/name: currency app.kubernetes.io/version: "2.1.3" @@ -17598,8 +17657,7 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: - + selector: opentelemetry.io/name: currency --- # Source: opentelemetry-demo/templates/component.yaml @@ -17607,10 +17665,8 @@ apiVersion: v1 kind: Service metadata: name: email - labels: - - opentelemetry.io/name: email - + labels: + opentelemetry.io/name: email app.kubernetes.io/component: email app.kubernetes.io/name: email app.kubernetes.io/version: "2.1.3" @@ -17621,8 +17677,7 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: - + selector: opentelemetry.io/name: email --- # Source: opentelemetry-demo/templates/component.yaml @@ -17630,10 +17685,8 @@ apiVersion: v1 kind: Service metadata: name: flagd - labels: - - opentelemetry.io/name: flagd - + labels: + opentelemetry.io/name: flagd app.kubernetes.io/component: flagd app.kubernetes.io/name: flagd app.kubernetes.io/version: "2.1.3" @@ -17650,8 +17703,7 @@ spec: - port: 4000 name: tcp-service-0 targetPort: 4000 - selector: - + selector: opentelemetry.io/name: flagd --- # Source: opentelemetry-demo/templates/component.yaml @@ -17659,10 +17711,8 @@ apiVersion: v1 kind: Service metadata: name: frontend - labels: - - opentelemetry.io/name: frontend - + labels: + opentelemetry.io/name: frontend app.kubernetes.io/component: frontend app.kubernetes.io/name: frontend app.kubernetes.io/version: "2.1.3" @@ -17673,8 +17723,7 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: - + selector: opentelemetry.io/name: frontend --- # Source: opentelemetry-demo/templates/component.yaml @@ -17682,10 +17731,8 @@ apiVersion: v1 kind: Service metadata: name: frontend-proxy - labels: - - opentelemetry.io/name: frontend-proxy - + labels: + opentelemetry.io/name: frontend-proxy app.kubernetes.io/component: frontend-proxy app.kubernetes.io/name: frontend-proxy app.kubernetes.io/version: "2.1.3" @@ -17696,8 +17743,7 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: - + selector: opentelemetry.io/name: frontend-proxy --- # Source: opentelemetry-demo/templates/component.yaml @@ -17705,10 +17751,8 @@ apiVersion: v1 kind: Service metadata: name: image-provider - labels: - - opentelemetry.io/name: image-provider - + labels: + opentelemetry.io/name: image-provider app.kubernetes.io/component: image-provider app.kubernetes.io/name: image-provider app.kubernetes.io/version: "2.1.3" @@ -17719,8 +17763,7 @@ spec: - port: 8081 name: tcp-service targetPort: 8081 - selector: - + selector: opentelemetry.io/name: image-provider --- # Source: opentelemetry-demo/templates/component.yaml @@ -17728,10 +17771,8 @@ apiVersion: v1 kind: Service metadata: name: kafka - labels: - - opentelemetry.io/name: kafka - + labels: + opentelemetry.io/name: kafka app.kubernetes.io/component: kafka app.kubernetes.io/name: kafka app.kubernetes.io/version: "2.1.3" @@ -17745,8 +17786,7 @@ spec: - port: 9093 name: controller targetPort: 9093 - selector: - + selector: opentelemetry.io/name: kafka --- # Source: opentelemetry-demo/templates/component.yaml @@ -17754,10 +17794,8 @@ apiVersion: v1 kind: Service metadata: name: load-generator - labels: - - opentelemetry.io/name: load-generator - + labels: + opentelemetry.io/name: load-generator app.kubernetes.io/component: load-generator app.kubernetes.io/name: load-generator app.kubernetes.io/version: "2.1.3" @@ -17768,8 +17806,7 @@ spec: - port: 8089 name: tcp-service targetPort: 8089 - selector: - + selector: opentelemetry.io/name: load-generator --- # Source: opentelemetry-demo/templates/component.yaml @@ -17777,10 +17814,8 @@ apiVersion: v1 kind: Service metadata: name: payment - labels: - - opentelemetry.io/name: payment - + labels: + opentelemetry.io/name: payment app.kubernetes.io/component: payment app.kubernetes.io/name: payment app.kubernetes.io/version: "2.1.3" @@ -17791,8 +17826,7 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: - + selector: opentelemetry.io/name: payment --- # Source: opentelemetry-demo/templates/component.yaml @@ -17800,10 +17834,8 @@ apiVersion: v1 kind: Service metadata: name: postgresql - labels: - - opentelemetry.io/name: postgresql - + labels: + opentelemetry.io/name: postgresql app.kubernetes.io/component: postgresql app.kubernetes.io/name: postgresql app.kubernetes.io/version: "2.1.3" @@ -17814,8 +17846,7 @@ spec: - port: 5432 name: tcp-service targetPort: 5432 - selector: - + selector: opentelemetry.io/name: postgresql --- # Source: opentelemetry-demo/templates/component.yaml @@ -17823,10 +17854,8 @@ apiVersion: v1 kind: Service metadata: name: product-catalog - labels: - - opentelemetry.io/name: product-catalog - + labels: + opentelemetry.io/name: product-catalog app.kubernetes.io/component: product-catalog app.kubernetes.io/name: product-catalog app.kubernetes.io/version: "2.1.3" @@ -17837,8 +17866,7 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: - + selector: opentelemetry.io/name: product-catalog --- # Source: opentelemetry-demo/templates/component.yaml @@ -17846,10 +17874,8 @@ apiVersion: v1 kind: Service metadata: name: quote - labels: - - opentelemetry.io/name: quote - + labels: + opentelemetry.io/name: quote app.kubernetes.io/component: quote app.kubernetes.io/name: quote app.kubernetes.io/version: "2.1.3" @@ -17860,8 +17886,7 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: - + selector: opentelemetry.io/name: quote --- # Source: opentelemetry-demo/templates/component.yaml @@ -17869,10 +17894,8 @@ apiVersion: v1 kind: Service metadata: name: recommendation - labels: - - opentelemetry.io/name: recommendation - + labels: + opentelemetry.io/name: recommendation app.kubernetes.io/component: recommendation app.kubernetes.io/name: recommendation app.kubernetes.io/version: "2.1.3" @@ -17883,8 +17906,7 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: - + selector: opentelemetry.io/name: recommendation --- # Source: opentelemetry-demo/templates/component.yaml @@ -17892,10 +17914,8 @@ apiVersion: v1 kind: Service metadata: name: shipping - labels: - - opentelemetry.io/name: shipping - + labels: + opentelemetry.io/name: shipping app.kubernetes.io/component: shipping app.kubernetes.io/name: shipping app.kubernetes.io/version: "2.1.3" @@ -17906,8 +17926,7 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: - + selector: opentelemetry.io/name: shipping --- # Source: opentelemetry-demo/templates/component.yaml @@ -17915,10 +17934,8 @@ apiVersion: v1 kind: Service metadata: name: valkey-cart - labels: - - opentelemetry.io/name: valkey-cart - + labels: + opentelemetry.io/name: valkey-cart app.kubernetes.io/component: valkey-cart app.kubernetes.io/name: valkey-cart app.kubernetes.io/version: "2.1.3" @@ -17929,8 +17946,7 @@ spec: - port: 6379 name: valkey-cart targetPort: 6379 - selector: - + selector: opentelemetry.io/name: valkey-cart --- # Source: opentelemetry-demo/charts/grafana/templates/deployment.yaml @@ -17943,6 +17959,7 @@ metadata: app.kubernetes.io/name: grafana app.kubernetes.io/instance: opentelemetry-demo app.kubernetes.io/version: "12.1.1" + app.openshift.io/runtime: golang spec: replicas: 1 revisionHistoryLimit: 10 @@ -18208,6 +18225,7 @@ metadata: app.kubernetes.io/component: all-in-one prometheus.io/port: "14269" prometheus.io/scrape: "true" + app.openshift.io/runtime: golang spec: replicas: 1 strategy: @@ -18226,8 +18244,7 @@ spec: annotations: prometheus.io/port: "14269" prometheus.io/scrape: "true" - spec: - + spec: containers: - env: - name: METRICS_STORAGE_TYPE @@ -18237,8 +18254,7 @@ spec: - name: COLLECTOR_OTLP_HTTP_HOST_PORT value: 0.0.0.0:4318 - name: SPAN_STORAGE_TYPE - value: memory - + value: memory - name: COLLECTOR_ZIPKIN_HOST_PORT value: :9411 - name: JAEGER_DISABLED @@ -18318,6 +18334,7 @@ metadata: app.kubernetes.io/version: "0.135.0" app.kubernetes.io/part-of: opentelemetry-collector app.kubernetes.io/component: standalone-collector + app.openshift.io/runtime: golang spec: replicas: 1 revisionHistoryLimit: 10 @@ -18337,10 +18354,8 @@ spec: labels: app.kubernetes.io/name: opentelemetry-collector app.kubernetes.io/instance: opentelemetry-demo - component: standalone-collector - - spec: - + component: standalone-collector + spec: serviceAccountName: otel-collector automountServiceAccountToken: true securityContext: @@ -18353,8 +18368,7 @@ spec: {} image: "otel/opentelemetry-collector-contrib:0.135.0" imagePullPolicy: IfNotPresent - ports: - + ports: - name: jaeger-compact containerPort: 6831 protocol: UDP @@ -18417,6 +18431,7 @@ metadata: app.kubernetes.io/instance: opentelemetry-demo app.kubernetes.io/version: v3.6.0 app.kubernetes.io/part-of: prometheus + app.openshift.io/runtime: golang name: prometheus namespace: otel-demo spec: @@ -18437,7 +18452,7 @@ spec: app.kubernetes.io/name: prometheus app.kubernetes.io/instance: opentelemetry-demo app.kubernetes.io/version: v3.6.0 - app.kubernetes.io/part-of: prometheus + app.openshift.io/runtime: prometheus spec: enableServiceLinks: true serviceAccountName: prometheus @@ -18478,7 +18493,7 @@ spec: successThreshold: 1 resources: limits: - memory: 300Mi + memory: 1Gi volumeMounts: - name: config-volume mountPath: /etc/config @@ -18505,27 +18520,23 @@ apiVersion: apps/v1 kind: Deployment metadata: name: accounting - labels: - - opentelemetry.io/name: accounting - + labels: + opentelemetry.io/name: accounting app.kubernetes.io/component: accounting app.kubernetes.io/name: accounting app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: - + matchLabels: opentelemetry.io/name: accounting template: metadata: - labels: - - opentelemetry.io/name: accounting - + labels: + opentelemetry.io/name: accounting app.kubernetes.io/component: accounting app.kubernetes.io/name: accounting spec: @@ -18572,14 +18583,13 @@ apiVersion: apps/v1 kind: Deployment metadata: name: ad - labels: - - opentelemetry.io/name: ad - + labels: + opentelemetry.io/name: ad app.kubernetes.io/component: ad app.kubernetes.io/name: ad app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 @@ -18646,6 +18656,7 @@ metadata: app.kubernetes.io/name: cart app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: dotnet spec: replicas: 1 revisionHistoryLimit: 10 @@ -18714,14 +18725,13 @@ apiVersion: apps/v1 kind: Deployment metadata: name: checkout - labels: - - opentelemetry.io/name: checkout - + labels: + opentelemetry.io/name: checkout app.kubernetes.io/component: checkout app.kubernetes.io/name: checkout app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 @@ -18731,10 +18741,8 @@ spec: opentelemetry.io/name: checkout template: metadata: - labels: - - opentelemetry.io/name: checkout - + labels: + opentelemetry.io/name: checkout app.kubernetes.io/component: checkout app.kubernetes.io/name: checkout spec: @@ -18801,27 +18809,23 @@ apiVersion: apps/v1 kind: Deployment metadata: name: currency - labels: - - opentelemetry.io/name: currency - + labels: + opentelemetry.io/name: currency app.kubernetes.io/component: currency app.kubernetes.io/name: currency app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: - + matchLabels: opentelemetry.io/name: currency template: metadata: - labels: - - opentelemetry.io/name: currency - + labels: + opentelemetry.io/name: currency app.kubernetes.io/component: currency app.kubernetes.io/name: currency spec: @@ -18863,27 +18867,23 @@ apiVersion: apps/v1 kind: Deployment metadata: name: email - labels: - - opentelemetry.io/name: email - + labels: + opentelemetry.io/name: email app.kubernetes.io/component: email app.kubernetes.io/name: email app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: ruby spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: - + matchLabels: opentelemetry.io/name: email template: metadata: - labels: - - opentelemetry.io/name: email - + labels: + opentelemetry.io/name: email app.kubernetes.io/component: email app.kubernetes.io/name: email spec: @@ -18929,14 +18929,13 @@ apiVersion: apps/v1 kind: Deployment metadata: name: flagd - labels: - - opentelemetry.io/name: flagd - + labels: + opentelemetry.io/name: flagd app.kubernetes.io/component: flagd app.kubernetes.io/name: flagd app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: golang spec: replicas: 1 revisionHistoryLimit: 10 @@ -19056,27 +19055,23 @@ apiVersion: apps/v1 kind: Deployment metadata: name: fraud-detection - labels: - - opentelemetry.io/name: fraud-detection - + labels: + opentelemetry.io/name: fraud-detection app.kubernetes.io/component: fraud-detection app.kubernetes.io/name: fraud-detection app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: - + matchLabels: opentelemetry.io/name: fraud-detection template: metadata: - labels: - - opentelemetry.io/name: fraud-detection - + labels: + opentelemetry.io/name: fraud-detection app.kubernetes.io/component: fraud-detection app.kubernetes.io/name: fraud-detection spec: @@ -19127,27 +19122,23 @@ apiVersion: apps/v1 kind: Deployment metadata: name: frontend - labels: - - opentelemetry.io/name: frontend - + labels: + opentelemetry.io/name: frontend app.kubernetes.io/component: frontend app.kubernetes.io/name: frontend app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: nodejs spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: - + matchLabels: opentelemetry.io/name: frontend template: metadata: - labels: - - opentelemetry.io/name: frontend - + labels: + opentelemetry.io/name: frontend app.kubernetes.io/component: frontend app.kubernetes.io/name: frontend spec: @@ -19156,8 +19147,7 @@ spec: - name: frontend image: 'ghcr.io/open-telemetry/demo:2.1.3-frontend' imagePullPolicy: IfNotPresent - ports: - + ports: - containerPort: 8080 name: service env: @@ -19221,14 +19211,13 @@ apiVersion: apps/v1 kind: Deployment metadata: name: frontend-proxy - labels: - - opentelemetry.io/name: frontend-proxy - + labels: + opentelemetry.io/name: frontend-proxy app.kubernetes.io/component: frontend-proxy app.kubernetes.io/name: frontend-proxy app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: nginx spec: replicas: 1 revisionHistoryLimit: 10 @@ -19319,20 +19308,18 @@ apiVersion: apps/v1 kind: Deployment metadata: name: image-provider - labels: - - opentelemetry.io/name: image-provider - + labels: + opentelemetry.io/name: image-provider app.kubernetes.io/component: image-provider app.kubernetes.io/name: image-provider app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: nodejs spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: - + matchLabels: opentelemetry.io/name: image-provider template: metadata: @@ -19381,27 +19368,23 @@ apiVersion: apps/v1 kind: Deployment metadata: name: kafka - labels: - - opentelemetry.io/name: kafka - + labels: + opentelemetry.io/name: kafka app.kubernetes.io/component: kafka app.kubernetes.io/name: kafka app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: - + matchLabels: opentelemetry.io/name: kafka template: metadata: - labels: - - opentelemetry.io/name: kafka - + labels: + opentelemetry.io/name: kafka app.kubernetes.io/component: kafka app.kubernetes.io/name: kafka spec: @@ -19410,8 +19393,7 @@ spec: - name: kafka image: 'ghcr.io/open-telemetry/demo:2.1.3-kafka' imagePullPolicy: IfNotPresent - ports: - + ports: - containerPort: 9092 name: plaintext - containerPort: 9093 @@ -19455,14 +19437,13 @@ apiVersion: apps/v1 kind: Deployment metadata: name: load-generator - labels: - - opentelemetry.io/name: load-generator - + labels: + opentelemetry.io/name: load-generator app.kubernetes.io/component: load-generator app.kubernetes.io/name: load-generator app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: python spec: replicas: 1 revisionHistoryLimit: 10 @@ -19472,10 +19453,8 @@ spec: opentelemetry.io/name: load-generator template: metadata: - labels: - - opentelemetry.io/name: load-generator - + labels: + opentelemetry.io/name: load-generator app.kubernetes.io/component: load-generator app.kubernetes.io/name: load-generator spec: @@ -19537,27 +19516,23 @@ apiVersion: apps/v1 kind: Deployment metadata: name: payment - labels: - - opentelemetry.io/name: payment - + labels: + opentelemetry.io/name: payment app.kubernetes.io/component: payment app.kubernetes.io/name: payment app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: - + matchLabels: opentelemetry.io/name: payment template: metadata: - labels: - - opentelemetry.io/name: payment - + labels: + opentelemetry.io/name: payment app.kubernetes.io/component: payment app.kubernetes.io/name: payment spec: @@ -19566,8 +19541,7 @@ spec: - name: payment image: 'ghcr.io/open-telemetry/demo:2.1.3-payment' imagePullPolicy: IfNotPresent - ports: - + ports: - containerPort: 8080 name: service env: @@ -19605,10 +19579,8 @@ apiVersion: apps/v1 kind: Deployment metadata: name: postgresql - labels: - - opentelemetry.io/name: postgresql - + labels: + opentelemetry.io/name: postgresql app.kubernetes.io/component: postgresql app.kubernetes.io/name: postgresql app.kubernetes.io/version: "2.1.3" @@ -19617,15 +19589,12 @@ spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: - + matchLabels: opentelemetry.io/name: postgresql template: metadata: - labels: - - opentelemetry.io/name: postgresql - + labels: + opentelemetry.io/name: postgresql app.kubernetes.io/component: postgresql app.kubernetes.io/name: postgresql spec: @@ -19667,27 +19636,23 @@ apiVersion: apps/v1 kind: Deployment metadata: name: product-catalog - labels: - - opentelemetry.io/name: product-catalog - + labels: + opentelemetry.io/name: product-catalog app.kubernetes.io/component: product-catalog app.kubernetes.io/name: product-catalog app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: python spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: - + matchLabels: opentelemetry.io/name: product-catalog template: metadata: - labels: - - opentelemetry.io/name: product-catalog - + labels: + opentelemetry.io/name: product-catalog app.kubernetes.io/component: product-catalog app.kubernetes.io/name: product-catalog spec: @@ -19740,27 +19705,23 @@ apiVersion: apps/v1 kind: Deployment metadata: name: quote - labels: - - opentelemetry.io/name: quote - + labels: + opentelemetry.io/name: quote app.kubernetes.io/component: quote app.kubernetes.io/name: quote app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: php spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: - + matchLabels: opentelemetry.io/name: quote template: metadata: - labels: - - opentelemetry.io/name: quote - + labels: + opentelemetry.io/name: quote app.kubernetes.io/component: quote app.kubernetes.io/name: quote spec: @@ -19808,27 +19769,23 @@ apiVersion: apps/v1 kind: Deployment metadata: name: recommendation - labels: - - opentelemetry.io/name: recommendation - + labels: + opentelemetry.io/name: recommendation app.kubernetes.io/component: recommendation app.kubernetes.io/name: recommendation app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: python spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: - + matchLabels: opentelemetry.io/name: recommendation template: metadata: - labels: - - opentelemetry.io/name: recommendation - + labels: + opentelemetry.io/name: recommendation app.kubernetes.io/component: recommendation app.kubernetes.io/name: recommendation spec: @@ -19837,8 +19794,7 @@ spec: - name: recommendation image: 'ghcr.io/open-telemetry/demo:2.1.3-recommendation' imagePullPolicy: IfNotPresent - ports: - + ports: - containerPort: 8080 name: service env: @@ -19878,27 +19834,23 @@ apiVersion: apps/v1 kind: Deployment metadata: name: shipping - labels: - - opentelemetry.io/name: shipping - + labels: + opentelemetry.io/name: shipping app.kubernetes.io/component: shipping app.kubernetes.io/name: shipping app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: - + matchLabels: opentelemetry.io/name: shipping template: metadata: - labels: - - opentelemetry.io/name: shipping - + labels: + opentelemetry.io/name: shipping app.kubernetes.io/component: shipping app.kubernetes.io/name: shipping spec: @@ -19907,8 +19859,7 @@ spec: - name: shipping image: 'ghcr.io/open-telemetry/demo:2.1.3-shipping' imagePullPolicy: IfNotPresent - ports: - + ports: - containerPort: 8080 name: service env: @@ -19940,27 +19891,23 @@ apiVersion: apps/v1 kind: Deployment metadata: name: valkey-cart - labels: - - opentelemetry.io/name: valkey-cart - + labels: + opentelemetry.io/name: valkey-cart app.kubernetes.io/component: valkey-cart app.kubernetes.io/name: valkey-cart app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: redis spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: - + matchLabels: opentelemetry.io/name: valkey-cart template: metadata: - labels: - - opentelemetry.io/name: valkey-cart - + labels: + opentelemetry.io/name: valkey-cart app.kubernetes.io/component: valkey-cart app.kubernetes.io/name: valkey-cart spec: @@ -19969,8 +19916,7 @@ spec: - name: valkey-cart image: 'valkey/valkey:8.1.3-alpine' imagePullPolicy: IfNotPresent - ports: - + ports: - containerPort: 6379 name: valkey-cart env: @@ -20005,6 +19951,7 @@ metadata: app.kubernetes.io/instance: opentelemetry-demo app.kubernetes.io/version: "3.2.0" app.kubernetes.io/component: opensearch + app.openshift.io/runtime: java annotations: majorVersion: "3" spec: @@ -20144,3 +20091,41 @@ spec: - name: config-emptydir mountPath: /usr/share/opensearch/config/opensearch.yml subPath: opensearch.yml +--- +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + name: frontend-proxy + namespace: otel-demo + labels: + app.kubernetes.io/name: frontend-proxy + app.kubernetes.io/part-of: opentelemetry-demo +spec: + path: / + to: + kind: Service + name: frontend-proxy + port: + targetPort: tcp-service + tls: + termination: edge + insecureEdgeTerminationPolicy: Redirect +--- +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + name: jaeger-ui + namespace: otel-demo + labels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/part-of: opentelemetry-demo +spec: + path: /jaeger/ui + to: + kind: Service + name: jaeger-query + port: + targetPort: 16686 + tls: + termination: edge + insecureEdgeTerminationPolicy: Redirect From 3b4af776b8ca49c4ab3541146055b0f8b212ba70 Mon Sep 17 00:00:00 2001 From: Maximiliano Pizarro Date: Tue, 4 Nov 2025 18:00:56 -0300 Subject: [PATCH 2/4] readme.md --- README.md | 4 ++ docs/index.md | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++ docs/otel.png | Bin 0 -> 313582 bytes 3 files changed, 163 insertions(+) create mode 100644 docs/index.md create mode 100644 docs/otel.png diff --git a/README.md b/README.md index 384b265c54..01cb647044 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,10 @@ ## Welcome to the OpenTelemetry Astronomy Shop Demo +
+ +
+ This repository contains the OpenTelemetry Astronomy Shop, a microservice-based distributed system intended to illustrate the implementation of OpenTelemetry in a near real-world environment. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000000..01cb647044 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,159 @@ + +# OTel logo OpenTelemetry Demo + +[![Slack](https://img.shields.io/badge/slack-@cncf/otel/demo-brightgreen.svg?logo=slack)](https://cloud-native.slack.com/archives/C03B4CWV4DA) +[![Version](https://img.shields.io/github/v/release/open-telemetry/opentelemetry-demo?color=blueviolet)](https://github.com/open-telemetry/opentelemetry-demo/releases) +[![Commits](https://img.shields.io/github/commits-since/open-telemetry/opentelemetry-demo/latest?color=ff69b4&include_prereleases)](https://github.com/open-telemetry/opentelemetry-demo/graphs/commit-activity) +[![Downloads](https://img.shields.io/docker/pulls/otel/demo)](https://hub.docker.com/r/otel/demo) +[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg?color=red)](https://github.com/open-telemetry/opentelemetry-demo/blob/main/LICENSE) +[![Integration Tests](https://github.com/open-telemetry/opentelemetry-demo/actions/workflows/run-integration-tests.yml/badge.svg)](https://github.com/open-telemetry/opentelemetry-demo/actions/workflows/run-integration-tests.yml) +[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/opentelemetry-demo)](https://artifacthub.io/packages/helm/opentelemetry-helm/opentelemetry-demo) +[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/9247/badge)](https://www.bestpractices.dev/en/projects/9247) + +## Welcome to the OpenTelemetry Astronomy Shop Demo + +
+ +
+ +This repository contains the OpenTelemetry Astronomy Shop, a microservice-based +distributed system intended to illustrate the implementation of OpenTelemetry in +a near real-world environment. + +Our goals are threefold: + +- Provide a realistic example of a distributed system that can be used to + demonstrate OpenTelemetry instrumentation and observability. +- Build a base for vendors, tooling authors, and others to extend and + demonstrate their OpenTelemetry integrations. +- Create a living example for OpenTelemetry contributors to use for testing new + versions of the API, SDK, and other components or enhancements. + +We've already made [huge +progress](https://github.com/open-telemetry/opentelemetry-demo/blob/main/CHANGELOG.md), +and development is ongoing. We hope to represent the full feature set of +OpenTelemetry across its languages in the future. + +If you'd like to help (**which we would love**), check out our [contributing +guidance](./CONTRIBUTING.md). + +If you'd like to extend this demo or maintain a fork of it, read our +[fork guidance](https://opentelemetry.io/docs/demo/forking/). + +## Quick start + +You can be up and running with the demo in a few minutes. Check out the docs for +your preferred deployment method: + +- [Docker](https://opentelemetry.io/docs/demo/docker_deployment/) +- [Kubernetes](https://opentelemetry.io/docs/demo/kubernetes_deployment/) + +## Documentation + +For detailed documentation, see [Demo Documentation][docs]. If you're curious +about a specific feature, the [docs landing page][docs] can point you in the +right direction. + +## Demos featuring the Astronomy Shop + +We welcome any vendor to fork the project to demonstrate their services and +adding a link below. The community is committed to maintaining the project and +keeping it up to date for you. + +| | | | +|---------------------------|----------------|----------------------------------| +| [AlibabaCloud LogService] | [Elastic] | [Oracle] | +| [Apache Doris] | [Google Cloud] | [Parseable] | +| [AppDynamics] | [Grafana Labs] | [Sentry] | +| [Aspecto] | [Guance] | [ServiceNow Cloud Observability] | +| [Axiom] | [Honeycomb.io] | [SigNoz] | +| [Axoflow] | [Instana] | [Splunk] | +| [Azure Data Explorer] | [Kloudfuse] | [Sumo Logic] | +| [Causely] | [Last9] | [TelemetryHub] | +| [ClickStack] | [Liatrio] | [Teletrace] | +| [Coralogix] | [Logz.io] | [Tinybird] | +| [Dash0] | [New Relic] | [Tracetest] | +| [Datadog] | [OpenObserve] | [Uptrace] | +| [Dynatrace] | [OpenSearch] | [VictoriaMetrics] | + +## Contributing + +To get involved with the project see our [CONTRIBUTING](CONTRIBUTING.md) +documentation. Our [SIG Calls](CONTRIBUTING.md#join-a-sig-call) are every other +Wednesday at 8:30 AM PST and anyone is welcome. + +### Maintainers + +- [Juliano Costa](https://github.com/julianocosta89), Datadog +- [Mikko Viitanen](https://github.com/mviitane), Dynatrace +- [Pierre Tessier](https://github.com/puckpuck), Honeycomb +- [Roger Coll](https://github.com/rogercoll), Elastic + +For more information about the maintainer role, see the [community repository](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#maintainer). + +### Approvers + +- [Cedric Ziel](https://github.com/cedricziel), Grafana Labs +- [Shenoy Pratik](https://github.com/ps48), AWS OpenSearch + +For more information about the approver role, see the [community repository](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#approver). + +### Emeritus + +- [Austin Parker](https://github.com/austinlparker) +- [Carter Socha](https://github.com/cartersocha) +- [Michael Maxwell](https://github.com/mic-max) +- [Morgan McLean](https://github.com/mtwo) +- [Penghan Wang](https://github.com/wph95) +- [Reiley Yang](https://github.com/reyang) +- [Ziqi Zhao](https://github.com/fatsheep9146) + +For more information about the emeritus role, see the [community repository](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#emeritus-maintainerapprovertriager). + +### Thanks to all the people who have contributed + +[![contributors](https://contributors-img.web.app/image?repo=open-telemetry/opentelemetry-demo)](https://github.com/open-telemetry/opentelemetry-demo/graphs/contributors) + +[docs]: https://opentelemetry.io/docs/demo/ + + + +[AlibabaCloud LogService]: https://github.com/aliyun-sls/opentelemetry-demo +[AppDynamics]: https://community.splunk.com/t5/AppDynamics-Knowledge-Base/How-to-observe-Kubernetes-deployment-of-OpenTelemetry-demo-app/ta-p/741454 +[Apache Doris]: https://github.com/apache/doris-opentelemetry-demo +[Aspecto]: https://github.com/aspecto-io/opentelemetry-demo +[Axiom]: https://play.axiom.co/axiom-play-qf1k/dashboards/otel.traces.otel-demo-traces +[Axoflow]: https://axoflow.com/opentelemetry-support-in-more-detail-in-axosyslog-and-syslog-ng/ +[Azure Data Explorer]: https://github.com/Azure/Azure-kusto-opentelemetry-demo +[Causely]: https://github.com/causely-oss/otel-demo +[ClickStack]: https://github.com/ClickHouse/opentelemetry-demo +[Coralogix]: https://coralogix.com/blog/configure-otel-demo-send-telemetry-data-coralogix +[Dash0]: https://github.com/dash0hq/opentelemetry-demo +[Datadog]: https://docs.datadoghq.com/opentelemetry/guide/otel_demo_to_datadog +[Dynatrace]: https://www.dynatrace.com/news/blog/opentelemetry-demo-application-with-dynatrace/ +[Elastic]: https://github.com/elastic/opentelemetry-demo +[Google Cloud]: https://github.com/GoogleCloudPlatform/opentelemetry-demo +[Grafana Labs]: https://github.com/grafana/opentelemetry-demo +[Guance]: https://github.com/GuanceCloud/opentelemetry-demo +[Honeycomb.io]: https://github.com/honeycombio/opentelemetry-demo +[Instana]: https://github.com/instana/opentelemetry-demo +[Kloudfuse]: https://github.com/kloudfuse/opentelemetry-demo +[Last9]: https://last9.io/docs/integrations-opentelemetry-demo/ +[Liatrio]: https://github.com/liatrio/opentelemetry-demo +[Logz.io]: https://logz.io/learn/how-to-run-opentelemetry-demo-with-logz-io/ +[New Relic]: https://github.com/newrelic/opentelemetry-demo +[OpenSearch]: https://github.com/opensearch-project/opentelemetry-demo +[OpenObserve]: https://openobserve.ai/blog/opentelemetry-astronomy-shop-demo/ +[Oracle]: https://github.com/oracle-quickstart/oci-o11y-solutions/blob/main/knowledge-content/opentelemetry-demo +[Parseable]: https://www.parseable.com/blog/open-telemetry-demo-with-parseable-a-complete-observability-setup +[Sentry]: https://github.com/getsentry/opentelemetry-demo +[ServiceNow Cloud Observability]: https://docs.lightstep.com/otel/quick-start-operator#send-data-from-the-opentelemetry-demo +[SigNoz]: https://signoz.io/blog/opentelemetry-demo/ +[Splunk]: https://github.com/signalfx/opentelemetry-demo +[Sumo Logic]: https://www.sumologic.com/blog/common-opentelemetry-demo-application/ +[TelemetryHub]: https://github.com/TelemetryHub/opentelemetry-demo/tree/telemetryhub-backend +[Teletrace]: https://github.com/teletrace/opentelemetry-demo +[Tinybird]: https://github.com/tinybirdco/opentelemetry-demo +[Tracetest]: https://github.com/kubeshop/opentelemetry-demo +[Uptrace]: https://github.com/uptrace/uptrace/tree/master/example/opentelemetry-demo +[VictoriaMetrics]: https://github.com/VictoriaMetrics-Community/opentelemetry-demo diff --git a/docs/otel.png b/docs/otel.png new file mode 100644 index 0000000000000000000000000000000000000000..00b0ba3ab0bf5f8ec33492e76e3d5eeda1ccb930 GIT binary patch literal 313582 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 Date: Wed, 5 Nov 2025 09:41:42 -0300 Subject: [PATCH 3/4] OpenShift version --- README.md | 4 - docs/index.md | 159 ----------------------------- docs/otel.png | Bin 313582 -> 0 bytes kubernetes/opentelemetry-demo.yaml | 2 + 4 files changed, 2 insertions(+), 163 deletions(-) delete mode 100644 docs/index.md delete mode 100644 docs/otel.png diff --git a/README.md b/README.md index 01cb647044..384b265c54 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,6 @@ ## Welcome to the OpenTelemetry Astronomy Shop Demo -

- This repository contains the OpenTelemetry Astronomy Shop, a microservice-based distributed system intended to illustrate the implementation of OpenTelemetry in a near real-world environment. diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 01cb647044..0000000000 --- a/docs/index.md +++ /dev/null @@ -1,159 +0,0 @@ - -# OTel logo OpenTelemetry Demo - -[![Slack](https://img.shields.io/badge/slack-@cncf/otel/demo-brightgreen.svg?logo=slack)](https://cloud-native.slack.com/archives/C03B4CWV4DA) -[![Version](https://img.shields.io/github/v/release/open-telemetry/opentelemetry-demo?color=blueviolet)](https://github.com/open-telemetry/opentelemetry-demo/releases) -[![Commits](https://img.shields.io/github/commits-since/open-telemetry/opentelemetry-demo/latest?color=ff69b4&include_prereleases)](https://github.com/open-telemetry/opentelemetry-demo/graphs/commit-activity) -[![Downloads](https://img.shields.io/docker/pulls/otel/demo)](https://hub.docker.com/r/otel/demo) -[![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg?color=red)](https://github.com/open-telemetry/opentelemetry-demo/blob/main/LICENSE) -[![Integration Tests](https://github.com/open-telemetry/opentelemetry-demo/actions/workflows/run-integration-tests.yml/badge.svg)](https://github.com/open-telemetry/opentelemetry-demo/actions/workflows/run-integration-tests.yml) -[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/opentelemetry-demo)](https://artifacthub.io/packages/helm/opentelemetry-helm/opentelemetry-demo) -[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/9247/badge)](https://www.bestpractices.dev/en/projects/9247) - -## Welcome to the OpenTelemetry Astronomy Shop Demo - -
- -
- -This repository contains the OpenTelemetry Astronomy Shop, a microservice-based -distributed system intended to illustrate the implementation of OpenTelemetry in -a near real-world environment. - -Our goals are threefold: - -- Provide a realistic example of a distributed system that can be used to - demonstrate OpenTelemetry instrumentation and observability. -- Build a base for vendors, tooling authors, and others to extend and - demonstrate their OpenTelemetry integrations. -- Create a living example for OpenTelemetry contributors to use for testing new - versions of the API, SDK, and other components or enhancements. - -We've already made [huge -progress](https://github.com/open-telemetry/opentelemetry-demo/blob/main/CHANGELOG.md), -and development is ongoing. We hope to represent the full feature set of -OpenTelemetry across its languages in the future. - -If you'd like to help (**which we would love**), check out our [contributing -guidance](./CONTRIBUTING.md). - -If you'd like to extend this demo or maintain a fork of it, read our -[fork guidance](https://opentelemetry.io/docs/demo/forking/). - -## Quick start - -You can be up and running with the demo in a few minutes. Check out the docs for -your preferred deployment method: - -- [Docker](https://opentelemetry.io/docs/demo/docker_deployment/) -- [Kubernetes](https://opentelemetry.io/docs/demo/kubernetes_deployment/) - -## Documentation - -For detailed documentation, see [Demo Documentation][docs]. If you're curious -about a specific feature, the [docs landing page][docs] can point you in the -right direction. - -## Demos featuring the Astronomy Shop - -We welcome any vendor to fork the project to demonstrate their services and -adding a link below. The community is committed to maintaining the project and -keeping it up to date for you. - -| | | | -|---------------------------|----------------|----------------------------------| -| [AlibabaCloud LogService] | [Elastic] | [Oracle] | -| [Apache Doris] | [Google Cloud] | [Parseable] | -| [AppDynamics] | [Grafana Labs] | [Sentry] | -| [Aspecto] | [Guance] | [ServiceNow Cloud Observability] | -| [Axiom] | [Honeycomb.io] | [SigNoz] | -| [Axoflow] | [Instana] | [Splunk] | -| [Azure Data Explorer] | [Kloudfuse] | [Sumo Logic] | -| [Causely] | [Last9] | [TelemetryHub] | -| [ClickStack] | [Liatrio] | [Teletrace] | -| [Coralogix] | [Logz.io] | [Tinybird] | -| [Dash0] | [New Relic] | [Tracetest] | -| [Datadog] | [OpenObserve] | [Uptrace] | -| [Dynatrace] | [OpenSearch] | [VictoriaMetrics] | - -## Contributing - -To get involved with the project see our [CONTRIBUTING](CONTRIBUTING.md) -documentation. Our [SIG Calls](CONTRIBUTING.md#join-a-sig-call) are every other -Wednesday at 8:30 AM PST and anyone is welcome. - -### Maintainers - -- [Juliano Costa](https://github.com/julianocosta89), Datadog -- [Mikko Viitanen](https://github.com/mviitane), Dynatrace -- [Pierre Tessier](https://github.com/puckpuck), Honeycomb -- [Roger Coll](https://github.com/rogercoll), Elastic - -For more information about the maintainer role, see the [community repository](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#maintainer). - -### Approvers - -- [Cedric Ziel](https://github.com/cedricziel), Grafana Labs -- [Shenoy Pratik](https://github.com/ps48), AWS OpenSearch - -For more information about the approver role, see the [community repository](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#approver). - -### Emeritus - -- [Austin Parker](https://github.com/austinlparker) -- [Carter Socha](https://github.com/cartersocha) -- [Michael Maxwell](https://github.com/mic-max) -- [Morgan McLean](https://github.com/mtwo) -- [Penghan Wang](https://github.com/wph95) -- [Reiley Yang](https://github.com/reyang) -- [Ziqi Zhao](https://github.com/fatsheep9146) - -For more information about the emeritus role, see the [community repository](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#emeritus-maintainerapprovertriager). - -### Thanks to all the people who have contributed - -[![contributors](https://contributors-img.web.app/image?repo=open-telemetry/opentelemetry-demo)](https://github.com/open-telemetry/opentelemetry-demo/graphs/contributors) - -[docs]: https://opentelemetry.io/docs/demo/ - - - -[AlibabaCloud LogService]: https://github.com/aliyun-sls/opentelemetry-demo -[AppDynamics]: https://community.splunk.com/t5/AppDynamics-Knowledge-Base/How-to-observe-Kubernetes-deployment-of-OpenTelemetry-demo-app/ta-p/741454 -[Apache Doris]: https://github.com/apache/doris-opentelemetry-demo -[Aspecto]: https://github.com/aspecto-io/opentelemetry-demo -[Axiom]: https://play.axiom.co/axiom-play-qf1k/dashboards/otel.traces.otel-demo-traces -[Axoflow]: https://axoflow.com/opentelemetry-support-in-more-detail-in-axosyslog-and-syslog-ng/ -[Azure Data Explorer]: https://github.com/Azure/Azure-kusto-opentelemetry-demo -[Causely]: https://github.com/causely-oss/otel-demo -[ClickStack]: https://github.com/ClickHouse/opentelemetry-demo -[Coralogix]: https://coralogix.com/blog/configure-otel-demo-send-telemetry-data-coralogix -[Dash0]: https://github.com/dash0hq/opentelemetry-demo -[Datadog]: https://docs.datadoghq.com/opentelemetry/guide/otel_demo_to_datadog -[Dynatrace]: https://www.dynatrace.com/news/blog/opentelemetry-demo-application-with-dynatrace/ -[Elastic]: https://github.com/elastic/opentelemetry-demo -[Google Cloud]: https://github.com/GoogleCloudPlatform/opentelemetry-demo -[Grafana Labs]: https://github.com/grafana/opentelemetry-demo -[Guance]: https://github.com/GuanceCloud/opentelemetry-demo -[Honeycomb.io]: https://github.com/honeycombio/opentelemetry-demo -[Instana]: https://github.com/instana/opentelemetry-demo -[Kloudfuse]: https://github.com/kloudfuse/opentelemetry-demo -[Last9]: https://last9.io/docs/integrations-opentelemetry-demo/ -[Liatrio]: https://github.com/liatrio/opentelemetry-demo -[Logz.io]: https://logz.io/learn/how-to-run-opentelemetry-demo-with-logz-io/ -[New Relic]: https://github.com/newrelic/opentelemetry-demo -[OpenSearch]: https://github.com/opensearch-project/opentelemetry-demo -[OpenObserve]: https://openobserve.ai/blog/opentelemetry-astronomy-shop-demo/ -[Oracle]: https://github.com/oracle-quickstart/oci-o11y-solutions/blob/main/knowledge-content/opentelemetry-demo -[Parseable]: https://www.parseable.com/blog/open-telemetry-demo-with-parseable-a-complete-observability-setup -[Sentry]: https://github.com/getsentry/opentelemetry-demo -[ServiceNow Cloud Observability]: https://docs.lightstep.com/otel/quick-start-operator#send-data-from-the-opentelemetry-demo -[SigNoz]: https://signoz.io/blog/opentelemetry-demo/ -[Splunk]: https://github.com/signalfx/opentelemetry-demo -[Sumo Logic]: https://www.sumologic.com/blog/common-opentelemetry-demo-application/ -[TelemetryHub]: https://github.com/TelemetryHub/opentelemetry-demo/tree/telemetryhub-backend -[Teletrace]: https://github.com/teletrace/opentelemetry-demo -[Tinybird]: https://github.com/tinybirdco/opentelemetry-demo -[Tracetest]: https://github.com/kubeshop/opentelemetry-demo -[Uptrace]: https://github.com/uptrace/uptrace/tree/master/example/opentelemetry-demo -[VictoriaMetrics]: https://github.com/VictoriaMetrics-Community/opentelemetry-demo diff --git a/docs/otel.png b/docs/otel.png deleted file mode 100644 index 00b0ba3ab0bf5f8ec33492e76e3d5eeda1ccb930..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313582 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

\"OpenTelemetry Service ${service_namespace}/${service_name}

\n", + "mode": "html" + }, + "pluginVersion": "12.1.0", + "title": "", + "type": "text" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Shows the timestamp of the latest metrics received in the past 24h.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "#24292e", + "mode": "fixed" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 3, + "x": 10, + "y": 0 + }, + "hideTimeOverride": true, + "id": 39, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "/^Time$/", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "timestamp(sum by (deployment_environment_name, service_namespace, service_name) (target_info{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}) or absent{})\n", + "interval": "60s", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "timeFrom": "now-24h", + "title": "Latest metrics received", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 2 + }, + "id": 15, + "panels": [], + "title": "Server RED Metrics", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "HTTP & RPC endpoints aggregation on the `http.server.request.duration` & `rpc.server.duration` metrics.\n\nSee https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpserverrequestduration and https://opentelemetry.io/docs/specs/semconv/rpc/rpc-metrics/#metric-rpcserverduration", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMin": 0, + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "log": 10, + "type": "log" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "noValue": "No HTTP or RPC operation", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 0, + "y": 3 + }, + "id": 17, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(\n 0.95,\n sum by (le, deployment_environment_name, service_namespace, service_name) (\n rate(\n http_server_request_duration_seconds_bucket{\n deployment_environment_name=~\"$deployment_environment_name\",\n service_namespace=~\"$service_namespace\",\n service_name=\"$service_name\"\n }[$__rate_interval]\n )\n )\n)", + "fullMetaSearch": false, + "includeNullMetadata": true, + "interval": "60s", + "legendFormat": "HTTP p95", + "range": true, + "refId": "HTTP P95", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "avg by (deployment_environment_name, service_namespace, service_name) (\n rate(\n http_server_request_duration_seconds_sum{\n deployment_environment_name=~\"$deployment_environment_name\",\n service_namespace=~\"$service_namespace\",\n service_name=\"$service_name\"\n }[$__rate_interval]\n )\n)\n/\navg by (deployment_environment_name, service_namespace, service_name) (\n rate(\n http_server_request_duration_seconds_count{\n deployment_environment_name=~\"$deployment_environment_name\",\n service_namespace=~\"$service_namespace\",\n service_name=\"$service_name\"\n }[$__rate_interval]\n )\n)", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "interval": "60s", + "legendFormat": "HTTP avg", + "range": true, + "refId": "HTTP AVG", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "histogram_quantile(\n 0.95,\n sum by (le, deployment_environment_name, service_namespace, service_name) (\n rate(\n rpc_server_duration_milliseconds_bucket{\n deployment_environment_name=~\"$deployment_environment_name\",\n service_namespace=~\"$service_namespace\",\n service_name=\"$service_name\"\n }[$__rate_interval]\n ) / 1000\n )\n)", + "hide": false, + "instant": false, + "interval": "60", + "legendFormat": "RPC p95", + "range": true, + "refId": "RPC P95" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "avg by (deployment_environment_name, service_namespace, service_name) (\n rate(\n rpc_server_duration_milliseconds_sum{\n deployment_environment_name=~\"$deployment_environment_name\",\n service_namespace=~\"$service_namespace\",\n service_name=\"$service_name\"\n }[$__rate_interval]\n ) / 1000\n)\n/\navg by (deployment_environment_name, service_namespace, service_name) (\n rate(\n rpc_server_duration_milliseconds_count{\n deployment_environment_name=~\"$deployment_environment_name\",\n service_namespace=~\"$service_namespace\",\n service_name=\"$service_name\"\n }[$__rate_interval]\n )\n)", + "hide": false, + "instant": false, + "interval": "60", + "legendFormat": "RPC avg", + "range": true, + "refId": "RPC AVG" + } + ], + "title": "Duration", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "HTTP and RPC endpoints aggregation on the `http.server.request.duration` and `rpc.server.duration` metrics. \n\nErrors are identified by : \n* `http.response.status_code=~\"5..\"`\n* `rpc.grpc.status_code!=\"0\"`\n\nSee https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpserverrequestduration\n", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMax": 100, + "axisSoftMin": 0, + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "noValue": "No HTTP or RPC operation", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 5, + "y": 3 + }, + "id": 18, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "(\n (sum by(deployment_environment_name, service_namespace, service_name) (rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\", http_response_status_code=~\"5..\"}[$__rate_interval])) * 100) \n / \n sum by(deployment_environment_name, service_namespace, service_name) (rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]))\n)\nor\n(\n 0\n * \n sum by(deployment_environment_name, service_namespace, service_name) (rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]))\n)", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "interval": "60s", + "legendFormat": "HTTP 5xx errors", + "range": true, + "refId": "HTTP 5xx", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "((sum without (rpc_grpc_status_code, instance) (rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\", rpc_grpc_status_code!=\"0\"}[$__rate_interval])) * 100) / sum without (rpc_grpc_status_code, instance) (rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval])))\nor\n(0 * sum without (rpc_grpc_status_code, instance) (rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval])))", + "hide": false, + "instant": false, + "interval": "60", + "legendFormat": "RPC errors", + "range": true, + "refId": "RPC Err" + } + ], + "title": "Error", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "HTTP & RPC endpoints aggregation on the `http.server.request.duration` & `rpc.server.duration` metrics.\n\nSee https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpserverrequestduration", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMin": 0, + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "log": 10, + "type": "log" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "noValue": "No HTTP or RPC operation", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 10, + "y": 3 + }, + "id": 19, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "(sum(rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval])) by (deployment_environment_name, service_namespace, service_name)) ", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "HTTP requests", + "range": true, + "refId": "HTTP RPS" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "(sum(rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval])) by (deployment_environment_name, service_namespace, service_name)) * $__interval_ms / 1000", + "hide": false, + "instant": false, + "interval": "60", + "legendFormat": "RPC requests", + "range": true, + "refId": "RPC RPS" + } + ], + "title": "Request Rate", + "type": "timeseries" + }, + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 9, + "x": 15, + "y": 3 + }, + "id": 40, + "options": { + "alertInstanceLabelFilter": "{service_name=\"$service_name\", service_namespace=\"$service_namespace\"}", + "alertName": "", + "dashboardAlerts": false, + "groupBy": [], + "groupMode": "default", + "maxItems": 20, + "showInactiveAlerts": false, + "sortOrder": 1, + "stateFilter": { + "error": true, + "firing": true, + "noData": false, + "normal": false, + "pending": true, + "recovering": true + }, + "viewMode": "list" + }, + "pluginVersion": "12.1.0", + "title": "Alerts", + "type": "alertlist" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Inbound HTTP operations of the service (aka HTTP endpoints) based on the `http.server.request.duration` metric.\n\nErrors are identified by `http.response.status_code=~\"5..\"`.\n\nSee https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpserverrequestduration", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "noValue": "No HTTP operation", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Duration (p99)" + }, + "properties": [ + { + "id": "unit", + "value": "s" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Rate" + }, + "properties": [ + { + "id": "unit", + "value": "reqps" + }, + { + "id": "custom.width", + "value": 219 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Error" + }, + "properties": [ + { + "id": "unit", + "value": "percentunit" + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 21, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [ + { + "desc": true, + "displayName": "Operation" + } + ] + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "\n sum by (operation) (\n label_join(\n rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"operation\",\n \" \",\n \"http_request_method\",\n \"http_route\"\n )\n )\n ", + "fullMetaSearch": false, + "includeNullMetadata": true, + "interval": "60s", + "legendFormat": "{{operation}}", + "range": true, + "refId": "RPS", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "(\n sum by (operation) (\n label_join(\n rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\", http_response_status_code=~\"5..\"}[$__rate_interval]),\n \"operation\",\n \" \",\n \"http_request_method\",\n \"http_route\"\n )\n )\n / \n sum by (operation) (\n label_join(\n rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"operation\",\n \" \",\n \"http_request_method\",\n \"http_route\"\n )\n )\n ) or (0 * \n sum by (operation) (\n label_join(\n rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"operation\",\n \" \",\n \"http_request_method\",\n \"http_route\"\n )\n )\n )", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "{{operation}}", + "range": true, + "refId": "ERR_PCT" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "\n histogram_quantile(\n 0.99,\n sum by (le, operation) (\n label_join(\n rate(http_server_request_duration_seconds_bucket{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[5m]),\n \"operation\",\n \" \",\n \"http_request_method\",\n \"http_route\"\n )\n )\n )\n ", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "{{operation}}", + "range": true, + "refId": "Duration" + } + ], + "title": "HTTP Operations", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "Duration": { + "timeField": "Time" + }, + "ERR_PCT": { + "timeField": "Time" + }, + "RPS": { + "timeField": "Time" + } + } + }, + { + "id": "joinByField", + "options": { + "byField": "operation", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": { + "Trend #Duration": 1, + "Trend #ERR_PCT": 2, + "Trend #RPS": 3, + "operation": 0 + }, + "renameByName": { + "Trend #Duration": "Duration (p99)", + "Trend #ERR_PCT": "Error", + "Trend #RPS": "Rate", + "operation": "Operation" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Inbound gRPC operations of the service (aka gRPC endpoints) based on the `rpc.server.request.duration` metric.\n\nErrors are identified by `rpc.grpc.status_code != 0` which make the panel specific to the gRPC protocol.\n\nhttps://opentelemetry.io/docs/specs/semconv/rpc/rpc-metrics/#metric-rpcserverduration", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "noValue": "No RPC operation", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Duration (p99)" + }, + "properties": [ + { + "id": "unit", + "value": "ms" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Rate" + }, + "properties": [ + { + "id": "unit", + "value": "reqps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Error" + }, + "properties": [ + { + "id": "unit", + "value": "percentunit" + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 12, + "y": 9 + }, + "id": 27, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [ + { + "desc": true, + "displayName": "Operation" + } + ] + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "\nsum by (operation) (\n label_join(\n rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"operation\",\n \"/\",\n \"rpc_service\",\n \"rpc_method\"\n )\n)\n ", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "interval": "60s", + "legendFormat": "__auto", + "range": true, + "refId": "RPS", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "(\n sum by (operation) (\n label_join(\n rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\", rpc_grpc_status_code!=\"0\"}[$__rate_interval]),\n \"operation\",\n \"/\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n / \n sum by (operation) (\n label_join(\n rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"operation\",\n \"/\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n ) or (0 * \n sum by (operation) (\n label_join(\n rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"operation\",\n \"/\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n )\n ", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "__auto", + "range": true, + "refId": "ERR_PCT" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "\n histogram_quantile(\n 0.99,\n sum by (le, operation) (\n label_join(\n rate(rpc_server_duration_milliseconds_bucket{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[5m]),\n \"operation\",\n \"/\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n )\n ", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "{{operation}}", + "range": true, + "refId": "Duration" + } + ], + "title": "gRPC Operations", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "Duration": { + "timeField": "Time" + }, + "ERR_PCT": { + "timeField": "Time" + }, + "RPS": { + "timeField": "Time" + } + } + }, + { + "id": "joinByField", + "options": { + "byField": "operation", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": { + "Trend #Duration": 1, + "Trend #ERR_PCT": 2, + "Trend #RPS": 3, + "operation": 0 + }, + "renameByName": { + "Trend #Duration": "Duration (p99)", + "Trend #ERR_PCT": "Error", + "Trend #RPS": "Rate", + "operation": "Operation" + } + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 28, + "panels": [], + "title": "Outbound Services and Databases", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "HTTP calls made by the service based on the `http.client.request.duration` metric.\n\nCalls broken done by remote `server.address` and by `http.request.method`.\n\nSee https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpclientrequestduration", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "noValue": "No HTTP call", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Duration (P99)" + }, + "properties": [ + { + "id": "unit", + "value": "s" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Rate" + }, + "properties": [ + { + "id": "unit", + "value": "reqps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Error" + }, + "properties": [ + { + "id": "unit", + "value": "percentunit" + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 23, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "\n sum by (outbound_service) (\n label_join(\n rate(http_client_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"outbound_service\",\n \" \",\n \"server_address\",\n \"http_request_method\",\n \"url_template\"\n )\n )\n ", + "fullMetaSearch": false, + "includeNullMetadata": true, + "interval": "60s", + "legendFormat": "{{server_address}} {{http_request_method}} {{url_template}}", + "range": true, + "refId": "RPS", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "(\n sum by (outbound_service) (\n label_join(\n rate(http_client_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\", http_response_status_code=~\"5..\"}[$__rate_interval]),\n \"outbound_service\",\n \" \",\n \"server_address\",\n \"http_request_method\",\n \"url_template\"\n )\n )\n / \n sum by (outbound_service) (\n label_join(\n rate(http_client_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"outbound_service\",\n \" \",\n \"server_address\",\n \"http_request_method\",\n \"url_template\"\n )\n )\n ) or (0 * \n sum by (outbound_service) (\n label_join(\n rate(http_client_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"outbound_service\",\n \" \",\n \"server_address\",\n \"http_request_method\",\n \"url_template\"\n )\n )\n )", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "{{server_address}} {{http_request_method}} {{url_template}}", + "range": true, + "refId": "ERR_PCT" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "\nhistogram_quantile(\n 0.99,\n sum by (le, outbound_service) (\n label_join(\n rate(http_client_request_duration_seconds_bucket{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[5m]),\n \"outbound_service\",\n \" \",\n \"server_address\",\n \"http_request_method\",\n \"url_template\"\n )\n )\n)", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "{{server_address}} {{http_request_method}} {{url_template}}", + "range": true, + "refId": "DURATION" + } + ], + "title": "Outbound HTTP Services", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "Duration": { + "timeField": "Time" + }, + "ERR_PCT": { + "timeField": "Time" + }, + "RPS": { + "timeField": "Time" + } + } + }, + { + "id": "joinByField", + "options": { + "byField": "outbound_service", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": { + "Trend #DURATION": 1, + "Trend #ERR_PCT": 2, + "Trend #RPS": 3, + "outbound_service": 0 + }, + "renameByName": { + "Trend #DURATION": "Duration (P99)", + "Trend #Duration": "Duration (p99)", + "Trend #ERR_PCT": "Error", + "Trend #RPS": "Rate", + "operation": "Operation", + "outbound_service": "Service" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "DB calls made by the service based on the `db.client.operation.duration` metric.\n\nCalls broken down by `server.address` and `db.namespace`.\n\nSee https://opentelemetry.io/docs/specs/semconv/database/database-metrics/#metric-dbclientoperationduration\n", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "noValue": "No database call", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Duration (P99)" + }, + "properties": [ + { + "id": "unit", + "value": "s" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Rate" + }, + "properties": [ + { + "id": "unit", + "value": "reqps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Error" + }, + "properties": [ + { + "id": "unit", + "value": "percentunit" + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 24, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by (database) (\n label_join(\n rate(db_client_operation_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"database\",\n \"/\",\n \"server_address\",\n \"db_namespace\"\n )\n)\n ", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "interval": "60s", + "legendFormat": "{{server_address}} {{db_namespace}}", + "range": true, + "refId": "RPS", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "(\n sum by (database) (\n label_join(\n rate(db_client_operation_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\", http_response_status_code=~\"5..\"}[$__rate_interval]),\n \"database\",\n \"/\",\n \"server_address\",\n \"db_namespace\"\n )\n )\n / \n sum by (database) (\n label_join(\n rate(db_client_operation_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"database\",\n \"/\",\n \"server_address\",\n \"db_namespace\"\n )\n )\n ) or (0 * \n sum by (database) (\n label_join(\n rate(db_client_operation_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"database\",\n \"/\",\n \"server_address\",\n \"db_namespace\"\n )\n )\n )", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "{{server_address}} {{db_namespace}}", + "range": true, + "refId": "ERR_PCT" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "\nhistogram_quantile(\n 0.99,\n sum by (le, database) (\n label_join(\n rate(db_client_operation_duration_seconds_bucket{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[5m]),\n \"database\",\n \"/\",\n \"server_address\",\n \"db_namespace\"\n )\n )\n)", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "{{server_address}} {{db_namespace}}", + "range": true, + "refId": "DURATION" + } + ], + "title": "Outbound Databases", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "DURATION": { + "timeField": "Time" + }, + "Duration": { + "timeField": "Time" + }, + "ERR_PCT": { + "timeField": "Time" + }, + "RPS": { + "timeField": "Time" + } + } + }, + { + "id": "joinByField", + "options": { + "byField": "database", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": { + "Trend #DURATION": 1, + "Trend #ERR_PCT": 2, + "Trend #RPS": 3, + "database": 0 + }, + "renameByName": { + "Trend #DURATION": "Duration (P99)", + "Trend #Duration": "Duration (p99)", + "Trend #ERR_PCT": "Error", + "Trend #RPS": "Rate", + "database": "Database", + "database_operation": "Database Operation", + "operation": "Operation", + "outbound_service": "Service" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "gRPC calls made by the service based on the `rpc.client.request.duration` metric.\n\nSpecific to gRPC due to the usage of the `grpc.status.code` attribute to identify errors.\n\nCalls broken down by `server.address`, `rpc.service`, and `rpc.method`.\n\nSee https://opentelemetry.io/docs/specs/semconv/rpc/rpc-metrics/#rpc-client\n\n", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "noValue": "No RPC call", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Duration (P99)" + }, + "properties": [ + { + "id": "unit", + "value": "ms" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Rate" + }, + "properties": [ + { + "id": "unit", + "value": "reqps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Error" + }, + "properties": [ + { + "id": "unit", + "value": "percentunit" + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 21 + }, + "id": 32, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "\n sum by (outbound_service) (\n label_join(\n rate(rpc_client_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"outbound_service\",\n \"/\",\n \"server_address\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n ", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "interval": "60s", + "legendFormat": "__auto", + "range": true, + "refId": "RPS", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "(\n sum by (outbound_service) (\n label_join(\n rate(rpc_client_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\", http_response_status_code=~\"5..\"}[$__rate_interval]),\n \"outbound_service\",\n \"/\",\n \"server_address\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n / \n sum by (outbound_service) (\n label_join(\n rate(rpc_client_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"outbound_service\",\n \"/\",\n \"server_address\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n ) or (0 * \n sum by (outbound_service) (\n label_join(\n rate(rpc_client_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"outbound_service\",\n \"/\",\n \"server_address\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n )", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "__auto", + "range": true, + "refId": "ERR_PCT" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "\nhistogram_quantile(\n 0.99,\n sum by (le, outbound_service) (\n label_join(\n rate(rpc_client_duration_milliseconds_bucket{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[5m]),\n \"outbound_service\",\n \"/\",\n \"server_address\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n)", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "__auto", + "range": true, + "refId": "DURATION" + } + ], + "title": "Outbound gRPC Services", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "Duration": { + "timeField": "Time" + }, + "ERR_PCT": { + "timeField": "Time" + }, + "RPS": { + "timeField": "Time" + } + } + }, + { + "id": "joinByField", + "options": { + "byField": "outbound_service", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": { + "Trend #DURATION": 1, + "Trend #ERR_PCT": 2, + "Trend #RPS": 3, + "outbound_service": 0 + }, + "renameByName": { + "Trend #DURATION": "Duration (P99)", + "Trend #Duration": "Duration (p99)", + "Trend #ERR_PCT": "Error", + "Trend #RPS": "Rate", + "operation": "Operation", + "outbound_service": "Service Method" + } + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 26 + }, + "id": 42, + "panels": [], + "title": "Service instances", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Host CPU" + }, + "properties": [ + { + "id": "unit", + "value": "percentunit" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Host Memory" + }, + "properties": [ + { + "id": "unit", + "value": "percentunit" + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 24, + "x": 0, + "y": 27 + }, + "id": 41, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "frameIndex": 1, + "showHeader": true + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "editorMode": "code", + "expr": "sum by (service_instance_id_host_name) (\n label_join(\n (\n sum by (service_instance_id, host_name) (\n rate(system_cpu_time_seconds_total{job=\"\", state!=\"idle\"}[$__rate_interval])\n )\n * on(host_name) group_left(service_instance_id)\n target_info{service_name=\"${service_name}\"}\n ),\n \"service_instance_id_host_name\",\n \" / \",\n \"service_instance_id\",\n \"host_name\"\n )\n)", + "hide": false, + "legendFormat": "__auto", + "range": true, + "refId": "cpu_time_percentage" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by (service_instance_id_host_name) (\n label_join(\n (\n (\n sum by (service_instance_id, host_name) (\n system_memory_usage_bytes{job=\"\", state!=\"free\"}\n )\n /\n sum by (service_instance_id, host_name) (\n system_memory_usage_bytes{job=\"\"}\n )\n )\n * on(host_name) group_left(service_instance_id) (\n target_info{service_name=\"${service_name}\"}\n )\n ),\n \"service_instance_id_host_name\",\n \" / \",\n \"service_instance_id\",\n \"host_name\"\n )\n)", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "memory_usage_pct" + } + ], + "title": "Service instance / host", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "A": { + "timeField": "Time" + }, + "cpu_time_percentage": { + "timeField": "Time" + }, + "memory_usage_pct": { + "timeField": "Time" + } + } + }, + { + "id": "joinByField", + "options": { + "byField": "service_instance_id_host_name", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": {}, + "renameByName": { + "Trend #cpu_time_percentage": "Host CPU", + "Trend #memory_usage_pct": "Host Memory", + "service_instance_id_host_name": "Instance / Host" + } + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 31 + }, + "id": 25, + "panels": [], + "title": "Logs", + "type": "row" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "${opensearch_datasource}" + }, + "description": "Logs of the service, filtered by `service.name`, `service.namespace`, and `deployment.environment.name`.\n\nTo explore the logs, open the menu clicking on the icon `⋮` of this panel and click on `Explore`.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "noValue": "No application logs", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "@timestamp" + }, + "properties": [ + { + "id": "custom.width", + "value": 226 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "severity.text" + }, + "properties": [ + { + "id": "custom.width", + "value": 136 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "instrumentationScope.name" + }, + "properties": [ + { + "id": "custom.width", + "value": 246 + } + ] + } + ] + }, + "gridPos": { + "h": 15, + "w": 24, + "x": 0, + "y": 32 + }, + "id": 26, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "observedTimestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "${opensearch_datasource}" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "search source=otel-logs-* | where resource.service.name=\"$service_name\" and resource.service.namespace=\"$service_namespace\" | fields @timestamp, severity.text, body, instrumentationScope.name\n", + "queryType": "PPL", + "refId": "B", + "timeField": "observedTimestamp" + } + ], + "title": "", + "transformations": [ + { + "id": "formatTime", + "options": { + "outputFormat": "YYYY-MM-DD HH:MM:ss.sss", + "timeField": "@timestamp", + "timezone": "browser", + "useTimezone": true + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": { + "@timestamp": 0, + "body": 3, + "instrumentationScope.name": 2, + "severity.text": 1 + }, + "renameByName": { + "@timestamp": "Time", + "body": "Message", + "instrumentationScope.name": "Logger", + "severity.text": "Severity" + } + } + } + ], + "type": "table" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 47 + }, + "id": 29, + "panels": [ + { + "datasource": { + "type": "jaeger", + "uid": "${jaeger_datasource}" + }, + "description": "Traces containing a span emitted by the service", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "noValue": "No traces", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Trace Service" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Span ID" + }, + "properties": [ + { + "id": "custom.hidden", + "value": false + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "deployment.environment.name" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "service.name" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "service.namespace" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 15, + "x": 0, + "y": 58 + }, + "id": 30, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "frameIndex": 0, + "showHeader": true + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "jaeger", + "uid": "${jaeger_datasource}" + }, + "queryType": "search", + "refId": "A", + "service": "$service_name", + "tags": "service.namespace=\"$service_namespace\"" + } + ], + "title": "", + "type": "table" + } + ], + "title": "Traces", + "type": "row" + } + ], + "preload": false, + "refresh": "30s", + "schemaVersion": 41, + "tags": [], + "templating": { + "list": [ + { + "allowCustomValue": false, + "current": { + "text": "Prometheus", + "value": "webstore-metrics" + }, + "description": "OpenTelemetry metrics. \nSend metrics using the Prometheus OTLP endpoint activating `keep_identifying_resource_attributes` and resource attribute promotion (aka `promote_resource_attributes`) including `service.name`, service.namespace`, `service.instance.id`, and `deployment.environment.name`", + "label": "Metrics", + "name": "prometheus_datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "type": "datasource" + }, + { + "allowCustomValue": false, + "current": { + "text": "Jaeger", + "value": "webstore-traces" + }, + "description": "OpenTelemetry traces", + "label": "Traces", + "name": "jaeger_datasource", + "options": [], + "query": "jaeger", + "refresh": 1, + "regex": "", + "type": "datasource" + }, + { + "allowCustomValue": false, + "current": { + "text": "OpenSearch", + "value": "webstore-logs" + }, + "description": "OpenTelemetry logs.", + "label": "Logs", + "name": "opensearch_datasource", + "options": [], + "query": "grafana-opensearch-datasource", + "refresh": 1, + "regex": "", + "type": "datasource" + }, + { + "current": { + "text": ".*", + "value": ".*" + }, + "description": "Waiting to implement support of the optional value of `deployment.environment.name` in the OpenSearch and Jager panels, hide variable.", + "hide": 2, + "label": "Environment", + "name": "deployment_environment_name", + "query": ".*", + "skipUrlSync": true, + "type": "constant" + }, + { + "allValue": ".*", + "allowCustomValue": false, + "current": { + "text": "opentelemetry-demo", + "value": "opentelemetry-demo" + }, + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "definition": "label_values(target_info{deployment_environment_name=~\"$deployment_environment_name\"},service_namespace)", + "description": "Service namespace.\nResource attribute `service.namespace` via `target_info`", + "includeAll": false, + "label": "Namespace", + "name": "service_namespace", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(target_info{deployment_environment_name=~\"$deployment_environment_name\"},service_namespace)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "sort": 1, + "type": "query" + }, + { + "current": { + "text": "checkout", + "value": "checkout" + }, + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "definition": "label_values(target_info{service_namespace=~\"$service_namespace\", deployment_environment_name=~\"$deployment_environment_name\"},service_name)", + "description": "Service name.\nResource attribute `service.name` via `target_info`.", + "label": "Name", + "name": "service_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(target_info{service_namespace=~\"$service_namespace\", deployment_environment_name=~\"$deployment_environment_name\"},service_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "sort": 1, + "type": "query" + } + ] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "APM Dashboard (Jaeger, Prometheus, OpenSearch)", + "uid": "febljk0a32qyoa", + "version": 1 + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-demo-dashboard + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + demo-dashboard.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- 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, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": 2, + "links": [], + "panels": [ + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 21, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "This dashboard shows RED metrics for the selected service, as generated by the spanmetrics connector in the OpenTelemetry Collector.\nIf the selected service emits logs, the logs will also be displayed.\nCustom metrics generated by some services are also displayed. \n
\nChart panels may require 5 minutes after the Demo is started before rendering data.", + "mode": "html" + }, + "pluginVersion": "11.5.2", + "title": "", + "type": "text" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 14, + "panels": [], + "title": "Spanmetrics (RED metrics)", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 4 + }, + "id": 12, + "interval": "2m", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by (span_name) (rate(traces_span_metrics_duration_milliseconds_count{service_name=\"${service}\"}[$__rate_interval]))", + "legendFormat": "{{ span_name }}", + "range": true, + "refId": "A" + } + ], + "title": "Requests Rate by Span Name", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 4 + }, + "id": 10, + "interval": "2m", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by (span_name) (rate(traces_span_metrics_calls_total{status_code=\"STATUS_CODE_ERROR\", service_name=\"${service}\"}[$__rate_interval]))", + "interval": "", + "legendFormat": "{{ span_name }}", + "range": true, + "refId": "A" + } + ], + "title": "Error Rate by Span Name", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dtdurationms" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 4 + }, + "id": 2, + "interval": "2m", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "histogram_quantile(0.50, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=\"${service}\"}[$__rate_interval])) by (le, span_name))", + "legendFormat": "{{span_name}}", + "range": true, + "refId": "A" + } + ], + "title": "Average Duration by Span Name", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 12 + }, + "id": 19, + "panels": [], + "title": "Application Log Records", + "type": "row" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "webstore-logs" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "left", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "count()" + }, + "properties": [ + { + "id": "custom.width", + "value": 90 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 4, + "x": 0, + "y": 13 + }, + "id": 20, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "severity.text.keyword", + "id": "3", + "settings": { + "min_doc_count": "1", + "order": "desc", + "orderBy": "_count", + "size": "0" + }, + "type": "terms" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "webstore-logs" + }, + "format": "table", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "search source=otel-logs-*\n| where resource.service.name=\"${service}\"\n| stats count() by severity.text", + "queryType": "PPL", + "refId": "A", + "timeField": "observedTimestamp" + } + ], + "title": "Log Records by Severity", + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": {}, + "renameByName": { + "Count": "", + "severity.text.keyword": "Severity" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "webstore-logs" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto", + "wrapText": false + }, + "filterable": true, + "inspect": true + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "observedTimestamp" + }, + "properties": [] + }, + { + "matcher": { + "id": "byName", + "options": "body" + }, + "properties": [ + { + "id": "custom.width", + "value": 386 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "severity.text" + }, + "properties": [ + { + "id": "custom.width", + "value": 127 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 20, + "x": 4, + "y": 13 + }, + "id": 17, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "alias": "", + "bucketAggs": [], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "webstore-logs" + }, + "format": "table", + "hide": false, + "metrics": [ + { + "id": "1", + "settings": { + "order": "desc", + "size": "100", + "useTimeRange": true + }, + "type": "raw_data" + } + ], + "query": "search source=otel-logs-*\n| where resource.service.name=\"${service}\"\n| sort - observedTimestamp \n| head 100", + "queryType": "PPL", + "refId": "A", + "timeField": "observedTimestamp" + } + ], + "title": "Log Records (100 recent entries)", + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": { + "@timestamp": true + }, + "includeByName": {}, + "indexByName": { + "@timestamp": 1, + "attributes.data_stream.dataset": 4, + "attributes.data_stream.namespace": 5, + "attributes.data_stream.type": 6, + "attributes.productId": 7, + "attributes.quantity": 8, + "attributes.userId": 9, + "body": 3, + "instrumentationScope.name": 10, + "observedTimestamp": 0, + "resource.container.id": 11, + "resource.docker.cli.cobra.command_path": 12, + "resource.host.name": 13, + "resource.service.name": 14, + "resource.telemetry.sdk.language": 15, + "resource.telemetry.sdk.name": 16, + "resource.telemetry.sdk.version": 17, + "severity.number": 18, + "severity.text": 2, + "spanId": 19, + "traceId": 20 + }, + "renameByName": {} + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 21 + }, + "id": 18, + "panels": [], + "title": "Application Metrics", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 22 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "rate(process_runtime_cpython_cpu_time_seconds_total{type=~\"system\"}[$__rate_interval])*100", + "hide": false, + "interval": "2m", + "legendFormat": "{{job}} ({{type}})", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "rate(process_runtime_cpython_cpu_time_seconds_total{type=~\"user\"}[$__rate_interval])*100", + "hide": false, + "interval": "2m", + "legendFormat": "{{job}} ({{type}})", + "range": true, + "refId": "B" + } + ], + "title": "Python services (CPU%)", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "opentelemetry-demo/(.*)", + "renamePattern": "$1" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 22 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "process_runtime_cpython_memory_bytes{type=\"rss\"}", + "legendFormat": "{{job}}", + "range": true, + "refId": "A" + } + ], + "title": "Python services (Memory)", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "opentelemetry-demo/(.*)", + "renamePattern": "$1" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 30 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "rate(app_recommendations_counter_total{recommendation_type=\"catalog\"}[$__rate_interval])", + "interval": "2m", + "legendFormat": "recommendations", + "range": true, + "refId": "A" + } + ], + "title": "Recommendations Rate", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 30 + }, + "id": 16, + "interval": "2m", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "rate(otel_trace_span_processor_spans{job=\"quote\"}[2m])*120", + "interval": "2m", + "legendFormat": "{{state}}", + "range": true, + "refId": "A" + } + ], + "title": "Quote Service batch span processor", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 38 + }, + "id": 23, + "panels": [], + "title": "Service Dependency", + "type": "row" + }, + { + "datasource": { + "type": "jaeger", + "uid": "webstore-traces" + }, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 18, + "w": 24, + "x": 0, + "y": 39 + }, + "id": 22, + "options": { + "edges": { + "mainStatUnit": "requests" + }, + "nodes": { + "arcs": [], + "mainStatUnit": "" + }, + "zoomMode": "cooperative" + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "jaeger", + "uid": "webstore-traces" + }, + "queryType": "dependencyGraph", + "refId": "A" + } + ], + "title": "Service Dependency", + "type": "nodeGraph" + } + ], + "preload": false, + "refresh": "", + "schemaVersion": 40, + "tags": [], + "templating": { + "list": [ + { + "current": { + "text": "frontend", + "value": "frontend" + }, + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "definition": "traces_span_metrics_duration_milliseconds_bucket", + "includeAll": false, + "label": "Service", + "name": "service", + "options": [], + "query": { + "query": "traces_span_metrics_duration_milliseconds_bucket", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "/.*service.name=\\\"([^\\\"]+)\\\".*/", + "sort": 1, + "type": "query" + } + ] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Demo Dashboard", + "uid": "W2gX2zHVk", + "version": 2, + "weekStart": "" + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-exemplars-dashboard + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + exemplars-dashboard.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 3, + "links": [], + "panels": [ + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 8, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "This dashboard shows the use of metric exemplars.\nExemplars can be used to look up a trace in Jaeger.\nOnly the most recent exemplars may still be available in Jaeger.\n
\nChart panels may require 5 minutes after the Demo is started before rendering data.", + "mode": "html" + }, + "pluginVersion": "11.6.1", + "title": "", + "type": "text" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 2 + }, + "id": 4, + "panels": [], + "title": "GetCart Exemplars", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 2, + "interval": "2m", + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Spectral", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-09 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "exemplar": true, + "expr": "sum by(le) (rate(app_cart_get_cart_latency_seconds_bucket[$__rate_interval]))", + "format": "heatmap", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": true, + "legendFormat": "{{le}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "GetCart Latency Heatmap with Exemplars", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 12 + }, + "id": 5, + "interval": "2m", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "builder", + "exemplar": true, + "expr": "histogram_quantile(0.95, sum by(le) (rate(app_cart_get_cart_latency_seconds_bucket[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "legendFormat": "p95 GetCart", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "95th Pct Cart GetCart Latency with Exemplars", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 22 + }, + "id": 3, + "panels": [], + "title": "AddItem Exemplars", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 6, + "interval": "2m", + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Spectral", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-09 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "exemplar": true, + "expr": "sum by(le) (rate(app_cart_add_item_latency_seconds_bucket[$__rate_interval]))", + "format": "heatmap", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": true, + "legendFormat": "{{le}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "AddItem Latency Heatmap with Exemplars", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 32 + }, + "id": 1, + "interval": "2m", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "builder", + "exemplar": true, + "expr": "histogram_quantile(0.95, sum by(le) (rate(app_cart_add_item_latency_seconds_bucket[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "legendFormat": "p95 AddItem", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "95th Pct Cart AddItem Latency with Exemplars", + "type": "timeseries" + } + ], + "preload": false, + "schemaVersion": 41, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Cart Service Exemplars", + "uid": "ce6sd46kfkglca", + "version": 1 + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-linux-dashboard + namespace: otel-demo + labels: + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + linux-dashboard.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "OpenTelemetry Collector hostmetrics", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": 4, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 267, + "panels": [], + "title": "overview【 $host_name】", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Busy state of all CPU cores together\n\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/hostmetricsreceiver/internal/scraper/cpuscraper/documentation.md", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 1, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)" + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 85 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 95 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 0, + "y": 1 + }, + "id": 20, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(system_cpu_utilization_ratio{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", job=\"\", state!=\"idle\"})", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "CPU Busy", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Non available RAM memory\n\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/hostmetricsreceiver/internal/scraper/memoryscraper/documentation.md", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 1, + "mappings": [], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)" + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 80 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 90 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 3, + "y": 1 + }, + "id": 16, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "system_memory_utilization_ratio{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"$node_name\", host_name=~\"$host_name\", job=\"\", state=\"used\"}", + "format": "time_series", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "intervalFactor": 1, + "range": true, + "refId": "A", + "step": 240, + "useBackend": false + } + ], + "title": "RAM Used", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Used FS\n\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/hostmetricsreceiver#collecting-host-metrics-from-inside-a-container-linux-only", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 1, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)" + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 80 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 90 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 6, + "y": 1 + }, + "id": 154, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "1 \n-\nsum(system_filesystem_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"free\"}) \n/ \nsum(system_filesystem_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"})", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "C" + } + ], + "title": "FS Used", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Busy state of all CPU cores together (5 min average)\n\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/hostmetricsreceiver/internal/scraper/loadscraper/documentation.md", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 1, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)" + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 85 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 95 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 9, + "y": 1 + }, + "id": 155, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "system_cpu_load_average_5m{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"} ", + "format": "time_series", + "hide": false, + "instant": true, + "intervalFactor": 1, + "legendFormat": "__auto", + "range": false, + "refId": "sysload_5m", + "step": 240 + } + ], + "title": "Sys Load (5m avg)", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Busy state of all CPU cores together (15 min average)\n\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/hostmetricsreceiver/internal/scraper/loadscraper/documentation.md", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 1, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)" + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 85 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 95 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 12, + "y": 1 + }, + "id": 19, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "system_cpu_load_average_15m{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"} ", + "hide": false, + "instant": true, + "intervalFactor": 1, + "range": false, + "refId": "sysload_15m", + "step": 240 + } + ], + "title": "Sys Load (15m avg)", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Used Swap\n\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/hostmetricsreceiver/internal/scraper/pagingscraper/documentation.md", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 1, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)" + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 10 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 25 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 15, + "y": 1 + }, + "id": 21, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(system_paging_usage_bytes { k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"used\" })\n/\nsum(system_paging_usage_bytes { k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"})", + "instant": true, + "intervalFactor": 1, + "range": false, + "refId": "A", + "step": 240 + } + ], + "title": "SWAP Used", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "Total number of CPU cores", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 2, + "x": 18, + "y": 1 + }, + "id": 14, + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "expr": "system_cpu_logical_count{ k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"used\" }", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "CPU Cores", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "Total RAM", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 2, + "x": 20, + "y": 1 + }, + "id": 75, + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "exemplar": false, + "expr": "system_memory_limit_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}", + "instant": true, + "intervalFactor": 1, + "legendFormat": "__auto", + "range": false, + "refId": "A", + "step": 240 + } + ], + "title": "RAM Total", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Total SWAP", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 2, + "x": 22, + "y": 1 + }, + "id": 18, + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(system_paging_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"})", + "instant": true, + "intervalFactor": 1, + "legendFormat": "__auto", + "range": false, + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "SWAP Total", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "Total FS\n\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/hostmetricsreceiver/internal/scraper/filesystemscraper/documentation.md", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)" + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 70 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 90 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 2, + "x": 18, + "y": 3 + }, + "id": 23, + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(system_filesystem_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"})", + "format": "time_series", + "hide": false, + "instant": true, + "intervalFactor": 1, + "range": false, + "refId": "A", + "step": 240 + } + ], + "title": "FS Total", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "System uptime", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 1, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 4, + "x": 20, + "y": 3 + }, + "id": 15, + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "system_uptime_seconds{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}", + "instant": true, + "intervalFactor": 1, + "legendFormat": "__auto", + "range": false, + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "Uptime", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 5 + }, + "id": 266, + "panels": [], + "title": "Basic", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "percent" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Busy System" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890F02", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Busy User" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Busy Wait" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Idle" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Busy IRQs" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-yellow", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Busy Other" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Idle" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 6 + }, + "id": 77, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true, + "width": 250 + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "expr": "sum (irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"system\"}[$__rate_interval])) \n/\nsum ((irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}[$__rate_interval])))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Busy System", + "range": true, + "refId": "busy system", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "expr": "sum (irate(system_cpu_time_seconds_total{kk8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"user\"}[$__rate_interval])) \n/ \nsum ((irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}[$__rate_interval])))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Busy User", + "range": true, + "refId": "busy user", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "expr": "sum(irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"wait\"}[$__rate_interval])) \n/ \nsum ((irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}[$__rate_interval])))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Busy Wait", + "range": true, + "refId": "busy wait", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "expr": "sum (irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=~\".*irq\"}[$__rate_interval])) \n/\nsum((irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}[$__rate_interval])))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Busy IRQs", + "range": true, + "refId": "busy irq", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "expr": "sum(irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state!~\".*irq\", state!=\"idle\", state!=\"user\", state!=\"wait\", state!=\"system\"}[$__rate_interval]))\n/\nsum ((irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}[$__rate_interval])))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Busy Other", + "range": true, + "refId": "busy other", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "expr": "sum by(host_name) (irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"idle\"}[$__rate_interval])) \n/ \non(host_name) group_left sum by (host_name)((irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}[$__rate_interval])))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Idle", + "range": true, + "refId": "idle", + "step": 240 + } + ], + "title": "CPU", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Apps" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#629E51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A437C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#CFFAFF", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "SWAP Used" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap Used" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#2F575E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Unused" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM Total" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.stacking", + "value": { + "group": false, + "mode": "normal" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM Cache + Buffer" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Available" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#DEDAF7", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.stacking", + "value": { + "group": false, + "mode": "normal" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 5, + "x": 6, + "y": 6 + }, + "id": 78, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true, + "width": 350 + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(system_memory_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Available", + "range": true, + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(system_memory_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"free\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "RAM Free", + "range": true, + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(system_memory_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=~\"cached|buffered\"})", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "RAM Cache + Buffer", + "range": true, + "refId": "C", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(system_memory_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"used\"})", + "format": "time_series", + "instant": false, + "intervalFactor": 1, + "legendFormat": "Used", + "range": true, + "refId": "E", + "step": 240 + } + ], + "title": "Memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Receive (-) / Transmit (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Rec.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 11, + "y": 6 + }, + "id": 74, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum (rate(system_network_io_bytes_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", direction=\"receive\", job=\"\"}[$__rate_interval]))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Receive", + "range": true, + "refId": "receive", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum (rate(system_network_io_bytes_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", direction=\"transmit\", job=\"\"}[$__rate_interval]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Transmit", + "range": true, + "refId": "transmit", + "step": 240 + } + ], + "title": "Network Traffic", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Read (-) / Write (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Read*./" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 7, + "x": 17, + "y": 6 + }, + "id": 42, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(irate(system_disk_io_bytes_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", direction=\"read\"}[$__rate_interval]))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Read", + "range": true, + "refId": "read", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(irate(system_disk_io_bytes_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", direction=\"write\"}[$__rate_interval]))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Write", + "range": true, + "refId": "write", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "C" + } + ], + "title": "I/O Usage Read / Write", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Trend #transmit_bytes" + }, + "properties": [ + { + "id": "unit", + "value": "binBps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trend #receive_bytes" + }, + "properties": [ + { + "id": "unit", + "value": "binBps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trend #receive_dropped_packets" + }, + "properties": [ + { + "id": "unit", + "value": "pps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trend #transmit_dropped_packets" + }, + "properties": [ + { + "id": "unit", + "value": "pps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trend #receive_errors" + }, + "properties": [ + { + "id": "unit", + "value": "pps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trend #transmit_errors" + }, + "properties": [ + { + "id": "unit", + "value": "pps" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 15, + "x": 0, + "y": 14 + }, + "id": 270, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by(device) (rate(system_network_io_bytes_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", job=\"\", direction=\"transmit\"}[$__rate_interval]))", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "transmit_bytes", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by(device) (rate(system_network_io_bytes_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", job=\"\", direction=\"receive\"}[$__rate_interval]))", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "receive_bytes" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by(device) (rate(system_network_dropped_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", job=\"\",direction=\"receive\"}[$__rate_interval]))", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "receive_dropped_packets" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by(device) (rate(system_network_dropped_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", job=\"\",direction=\"transmit\"}[$__rate_interval]))", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "transmit_dropped_packets" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by(device) (rate(system_network_errors_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", job=\"\",direction=\"receive\"}[$__rate_interval]))", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "receive_errors" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by(device) (rate(system_network_errors_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", job=\"\",direction=\"transmit\"}[$__rate_interval]))", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "transmit_errors" + } + ], + "title": "Network traffic", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "A": { + "timeField": "Time" + }, + "receive": { + "timeField": "Time" + }, + "receive_bytes": { + "timeField": "Time" + }, + "receive_dropped_packets": { + "timeField": "Time" + }, + "receive_errors": { + "timeField": "Time" + }, + "transmit": { + "timeField": "Time" + }, + "transmit_bytes": { + "timeField": "Time" + }, + "transmit_dropped_packets": { + "timeField": "Time" + }, + "transmit_errors": { + "timeField": "Time" + } + } + }, + { + "id": "joinByField", + "options": { + "byField": "device", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": { + "Trend #receive_bytes": 4, + "Trend #receive_dropped_packets": 5, + "Trend #receive_errors": 3, + "Trend #transmit_bytes": 1, + "Trend #transmit_dropped_packets": 2, + "Trend #transmit_errors": 6, + "device": 0 + }, + "renameByName": { + "Trend #receive": "Receive", + "Trend #receive_bytes": "Receive", + "Trend #receive_dropped_packets": "Receive dropped", + "Trend #receive_errors": "Transmit err", + "Trend #transmit": "Transmit", + "Trend #transmit_bytes": "Transmit", + "Trend #transmit_dropped_packets": "Transmit dropped", + "Trend #transmit_errors": "Receive err", + "device": "Interface" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Used %" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "basic", + "type": "gauge", + "valueDisplayMode": "color" + } + }, + { + "id": "unit", + "value": "percentunit" + }, + { + "id": "min", + "value": 0 + }, + { + "id": "max", + "value": 1 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "custom.width", + "value": 80 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total" + }, + "properties": [ + { + "id": "custom.width", + "value": 80 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Used" + }, + "properties": [ + { + "id": "custom.width", + "value": 78 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Mount" + }, + "properties": [ + { + "id": "custom.width", + "value": 200 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 9, + "x": 15, + "y": 14 + }, + "id": 269, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "frameIndex": 0, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "sum by(mountpoint) (system_filesystem_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"free\"})", + "format": "table", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "free", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum by(mountpoint) (system_filesystem_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"})", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "total" + } + ], + "title": "Disk usage", + "transformations": [ + { + "id": "groupBy", + "options": { + "fields": { + "/oldroot": { + "aggregations": [ + "lastNotNull" + ], + "operation": "aggregate" + }, + "/var/lib": { + "aggregations": [ + "lastNotNull" + ], + "operation": "aggregate" + }, + "Value": { + "aggregations": [ + "lastNotNull" + ], + "operation": "aggregate" + }, + "Value #free": { + "aggregations": [ + "lastNotNull" + ], + "operation": "aggregate" + }, + "Value #total": { + "aggregations": [ + "lastNotNull" + ], + "operation": "aggregate" + }, + "mountpoint": { + "aggregations": [], + "operation": "groupby" + } + } + } + }, + { + "id": "merge", + "options": {} + }, + { + "id": "calculateField", + "options": { + "alias": "used", + "binary": { + "left": { + "matcher": { + "id": "byName", + "options": "Value #total (lastNotNull)" + } + }, + "operator": "-", + "right": { + "matcher": { + "id": "byName", + "options": "Value #free (lastNotNull)" + } + } + }, + "mode": "binary", + "reduce": { + "reducer": "sum" + } + } + }, + { + "id": "calculateField", + "options": { + "alias": "Used %", + "binary": { + "left": { + "matcher": { + "id": "byName", + "options": "used" + } + }, + "operator": "/", + "right": { + "matcher": { + "id": "byName", + "options": "Value #total (lastNotNull)" + } + } + }, + "mode": "binary", + "reduce": { + "reducer": "sum" + } + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": {}, + "renameByName": { + "Used %": "Used %", + "Value #free (lastNotNull)": "Free", + "Value #total (lastNotNull)": "Total", + "mountpoint": "Mount", + "used": "Used" + } + } + }, + { + "id": "sortBy", + "options": { + "fields": {}, + "sort": [ + { + "field": "Mount" + } + ] + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 13 + }, + "id": 272, + "panels": [], + "title": "Details", + "type": "row" + } + ], + "preload": false, + "refresh": "", + "schemaVersion": 41, + "tags": [ + "linux", + "opentelemetry" + ], + "templating": { + "list": [ + { + "current": { + "text": "Prometheus", + "value": "webstore-metrics" + }, + "includeAll": false, + "label": "Data Source", + "name": "DS_PROMETHEUS", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "(?!grafanacloud-usage|grafanacloud-ml-metrics).+", + "type": "datasource" + }, + { + "allValue": ".*", + "allowCustomValue": true, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "definition": "label_values(otelcol_process_uptime,k8s_cluster_name)", + "description": "When deploying PostgreSQL on Kubernetes, name of the Kubernetes cluster. \nFor other deployments, select \"All\". ", + "includeAll": true, + "label": "K8s Cluster", + "multi": true, + "name": "k8s_cluster_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(otelcol_process_uptime,k8s_cluster_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "allowCustomValue": false, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "definition": "label_values(otelcol_process_uptime{k8s_cluster_name=~\"$k8s_cluster_name\"},k8s_node_name)", + "description": "When monitoring Kubernetes, name of the K8s node.\nFor other deployments, select \"All\". ", + "includeAll": true, + "label": "K8s node", + "name": "node_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(otelcol_process_uptime{k8s_cluster_name=~\"$k8s_cluster_name\"},k8s_node_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "current": { + "text": "docker-desktop", + "value": "docker-desktop" + }, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "definition": "label_values(otelcol_process_uptime_seconds_total,host_name)", + "includeAll": true, + "label": "Host", + "name": "host_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(otelcol_process_uptime_seconds_total,host_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "sort": 5, + "type": "query" + }, + { + "allowCustomValue": false, + "current": { + "text": "", + "value": "" + }, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "definition": "query_result(count(otelcol_process_uptime{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$ip\"}))", + "hide": 2, + "label": "host count", + "name": "host_count", + "options": [], + "query": { + "qryType": 3, + "query": "query_result(count(otelcol_process_uptime{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$ip\"}))", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "/{} (.*) .*/", + "type": "query" + } + ] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Linux", + "uid": "otel-demo-hostmetrics", + "version": 1 + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-opentelemetry-collector + namespace: otel-demo + labels: + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + opentelemetry-collector.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "Visualize OpenTelemetry (OTEL) collector metrics (tested with OTEL contrib v0.120.1)", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": 4, + "links": [], + "panels": [ + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 86, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "This dashboard uses the metrics generated by the OpenTelemetry Collector.\nIt is used to understand the overall performance and health of the OpenTelemetry Collector.\n
\nChart panels may require 5 minutes after the Demo is started before rendering data.\n", + "mode": "html" + }, + "pluginVersion": "11.5.2", + "title": "", + "type": "text" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 2 + }, + "id": 23, + "panels": [], + "title": "Receivers", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Accepted: count/rate of spans successfully pushed into the pipeline.\nRefused: count/rate of spans that could not be pushed into the pipeline.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 3 + }, + "id": 28, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_receiver_accepted_spans${suffix_total}{receiver=~\"$receiver\",job=\"$job\"}[$__rate_interval])) by (receiver $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Accepted: {{receiver}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_receiver_refused_spans${suffix_total}{receiver=~\"$receiver\",job=\"$job\"}[$__rate_interval])) by (receiver $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Refused: {{receiver}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Spans ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Accepted: count/rate of metric points successfully pushed into the pipeline.\nRefused: count/rate of metric points that could not be pushed into the pipeline.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 3 + }, + "id": 80, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_receiver_accepted_metric_points${suffix_total}{receiver=~\"$receiver\",job=\"$job\"}[$__rate_interval])) by (receiver $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Accepted: {{receiver}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_receiver_refused_metric_points${suffix_total}{receiver=~\"$receiver\",job=\"$job\"}[$__rate_interval])) by (receiver $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Refused: {{receiver}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Metric Points ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Accepted: count/rate of log records successfully pushed into the pipeline.\nRefused: count/rate of log records that could not be pushed into the pipeline.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 3 + }, + "id": 47, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_receiver_accepted_log_records${suffix_total}{receiver=~\"$receiver\",job=\"$job\"}[$__rate_interval])) by (receiver $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Accepted: {{receiver}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_receiver_refused_log_records${suffix_total}{receiver=~\"$receiver\",job=\"$job\"}[$__rate_interval])) by (receiver $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Refused: {{receiver}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Log Records ${metric:text}", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 11 + }, + "id": 34, + "panels": [], + "title": "Processors", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/Dropped.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 12 + }, + "id": 85, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_incoming_items${suffix_total}{processor=~\"$processor\",job=\"$job\",otel_signal=\"traces\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Incomming: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "0-sum(${metric:value}(otelcol_processor_outgoing_items${suffix_total}{processor=~\"$processor\",job=\"$job\",otel_signal=\"traces\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Outgoing: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Spans ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/Dropped.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 12 + }, + "id": 83, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_incoming_items${suffix_total}{processor=~\"$processor\",job=\"$job\",otel_signal=\"metrics\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Incomming: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "0-sum(${metric:value}(otelcol_processor_outgoing_items${suffix_total}{processor=~\"$processor\",job=\"$job\",otel_signal=\"metrics\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Outgoing: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Metric Points ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/Dropped.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 12 + }, + "id": 84, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_incoming_items${suffix_total}{processor=~\"$processor\",job=\"$job\",otel_signal=\"logs\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Incomming: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "0-sum(${metric:value}(otelcol_processor_outgoing_items${suffix_total}{processor=~\"$processor\",job=\"$job\",otel_signal=\"logs\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Outgoing: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Logs Records ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Accepted: count/rate of spans successfully pushed into the next component in the pipeline.\nRefused: count/rate of spans that were rejected by the next component in the pipeline.\nDropped: count/rate of spans that were dropped", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/Dropped.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 20 + }, + "id": 35, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_accepted_spans${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Accepted: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_refused_spans${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Refused: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_dropped_spans${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Dropped: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "Accepted Spans ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Accepted: count/rate of metric points successfully pushed into the next component in the pipeline.\nRefused: count/rate of metric points that were rejected by the next component in the pipeline.\nDropped: count/rate of metric points that were dropped", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/Dropped.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 20 + }, + "id": 50, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_accepted_metric_points${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Accepted: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_refused_metric_points${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Refused: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_dropped_metric_points${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Dropped: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "Accepted Metric Points ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Accepted: count/rate of log records successfully pushed into the next component in the pipeline.\nRefused: count/rate of log records that were rejected by the next component in the pipeline.\nDropped: count/rate of log records that were dropped", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/Dropped.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 20 + }, + "id": 51, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_accepted_log_records${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Accepted: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_refused_log_records${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Refused: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_dropped_log_records${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Dropped: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "Accepted Log Records ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Number of units in the batch", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + }, + "links": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 28 + }, + "id": 49, + "interval": "$minstep", + "maxDataPoints": 50, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "Reds", + "steps": 57 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-09 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(otelcol_processor_batch_batch_send_size_bucket{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "{{le}}", + "refId": "B" + } + ], + "title": "Batch Send Size Heatmap", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*count.*/" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 28 + }, + "id": 36, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_batch_batch_send_size_count{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Batch send size count: {{processor}} {{service_instance_id}}", + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_batch_batch_send_size_sum{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Batch send size sum: {{processor}} {{service_instance_id}}", + "refId": "A" + } + ], + "title": "Batch Metrics 1", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Number of times the batch was sent due to a size trigger. Number of times the batch was sent due to a timeout trigger.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*timeout.*/" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 28 + }, + "id": 56, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_batch_batch_size_trigger_send${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Batch sent due to a size trigger: {{processor}}", + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_batch_timeout_trigger_send${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Batch sent due to a timeout trigger: {{processor}} {{service_instance_id}}", + "refId": "A" + } + ], + "title": "Batch Metrics 2", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 36 + }, + "id": 25, + "panels": [], + "title": "Exporters", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Sent: count/rate of spans successfully sent to destination.\nEnqueue: count/rate of spans failed to be added to the sending queue.\nFailed: count/rate of spans in failed attempts to send to destination.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Failed:.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 37 + }, + "id": 37, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_sent_spans${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Sent: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_enqueue_failed_spans${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Enqueue: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_send_failed_spans${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Failed: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "Spans ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Sent: count/rate of metric points successfully sent to destination.\nEnqueue: count/rate of metric points failed to be added to the sending queue.\nFailed: count/rate of metric points in failed attempts to send to destination.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Failed:.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 37 + }, + "id": 38, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_sent_metric_points${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Sent: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_enqueue_failed_metric_points${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Enqueue: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_send_failed_metric_points${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Failed: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "Metric Points ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Sent: count/rate of log records successfully sent to destination.\nEnqueue: count/rate of log records failed to be added to the sending queue.\nFailed: count/rate of log records in failed attempts to send to destination.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Failed:.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 37 + }, + "id": 48, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_sent_log_records${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Sent: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_enqueue_failed_log_records${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Enqueue: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_send_failed_log_records${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Failed: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "Log Records ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Current size of the retry queue (in batches)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 46 + }, + "id": 10, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(otelcol_exporter_queue_size{exporter=~\"$exporter\",job=\"$job\"}) by (exporter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Max queue size: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "A" + } + ], + "title": "Exporter Queue Size", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Fixed capacity of the retry queue (in batches)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 46 + }, + "id": 55, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "min(otelcol_exporter_queue_capacity{exporter=~\"$exporter\",job=\"$job\"}) by (exporter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Queue capacity: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "A" + } + ], + "title": "Exporter Queue Capacity", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "max": 1, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 46 + }, + "id": 67, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(\r\n otelcol_exporter_queue_size{\r\n exporter=~\"$exporter\", job=\"$job\"\r\n }\r\n) by (exporter $grouping)\r\n/\r\nmin(\r\n otelcol_exporter_queue_capacity{\r\n exporter=~\"$exporter\", job=\"$job\"\r\n }\r\n) by (exporter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Queue capacity usage: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "A" + } + ], + "title": "Exporter Queue Usage", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 55 + }, + "id": 21, + "panels": [], + "title": "Collector", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Total physical memory (resident set size)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Max Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Avg Memory RSS " + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.fillOpacity", + "value": 20 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Min Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.lineWidth", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Avg Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Min Memory RSS " + }, + { + "id": "custom.fillOpacity", + "value": 20 + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 56 + }, + "id": 40, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(otelcol_process_memory_rss${suffix_bytes}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Max Memory RSS {{service_instance_id}}", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "avg(otelcol_process_memory_rss${suffix_bytes}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Avg Memory RSS {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "min(otelcol_process_memory_rss${suffix_bytes}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Min Memory RSS {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Total RSS Memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Total bytes of memory obtained from the OS (see 'go doc runtime.MemStats.Sys')", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Max Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Avg Memory RSS " + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.fillOpacity", + "value": 20 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Min Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.lineWidth", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Avg Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Min Memory RSS " + }, + { + "id": "custom.fillOpacity", + "value": 20 + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 56 + }, + "id": 52, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(otelcol_process_runtime_total_sys_memory_bytes{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Max Memory RSS {{service_instance_id}}", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "avg(otelcol_process_runtime_total_sys_memory_bytes{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Avg Memory RSS {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "min(otelcol_process_runtime_total_sys_memory_bytes{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Min Memory RSS {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Total Runtime Sys Memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Bytes of allocated heap objects (see 'go doc runtime.MemStats.HeapAlloc')", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Max Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Avg Memory RSS " + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.fillOpacity", + "value": 20 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Min Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.lineWidth", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Avg Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Min Memory RSS " + }, + { + "id": "custom.fillOpacity", + "value": 20 + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 56 + }, + "id": 53, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(otelcol_process_runtime_heap_alloc_bytes{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Max Memory RSS {{service_instance_id}}", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "avg(otelcol_process_runtime_heap_alloc_bytes{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Avg Memory RSS {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "min(otelcol_process_runtime_heap_alloc_bytes{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Min Memory RSS {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Total Runtime Heap Memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Total CPU user and system time in percentage", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Max CPU usage " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Avg CPU usage " + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.fillOpacity", + "value": 20 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Avg CPU usage " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Min CPU usage " + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Min CPU usage " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.lineWidth", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 65 + }, + "id": 39, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(rate(otelcol_process_cpu_seconds${suffix_total}{job=\"$job\"}[$__rate_interval])*100) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Max CPU usage {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "avg(rate(otelcol_process_cpu_seconds${suffix_total}{job=\"$job\"}[$__rate_interval])*100) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Avg CPU usage {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "min(rate(otelcol_process_cpu_seconds${suffix_total}{job=\"$job\"}[$__rate_interval])*100) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Min CPU usage {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "CPU Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Number of service instances, which are reporting metrics", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 65 + }, + "id": 41, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "count(count(otelcol_process_cpu_seconds${suffix_total}{service_instance_id=~\".*\",job=\"$job\"}) by (service_instance_id))", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Service instance count", + "range": true, + "refId": "B" + } + ], + "title": "Service Instance Count", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 65 + }, + "id": 54, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(otelcol_process_uptime${suffix_seconds}${suffix_total}{service_instance_id=~\".*\",job=\"$job\"}) by (service_instance_id)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Service instance uptime: {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Uptime by Service Instance", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 24, + "x": 0, + "y": 74 + }, + "id": 57, + "interval": "$minstep", + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(otelcol_process_uptime${suffix_seconds}${suffix_total}{service_instance_id=~\".*\",job=\"$job\",service_version=\".+\"}) by (service_instance_id,service_name,service_version)\r\nor\r\nmax(\r\n otelcol_process_uptime${suffix_seconds}${suffix_total}{service_instance_id=~\".*\",job=\"$job\"} \r\n * on(job, instance) \r\n group_left(service_version) \r\n (\r\n target_info \r\n * on(job, instance) \r\n group_left \r\n label_replace(target_info{}, \"service_instance_id\", \"$1\", \"instance\", \"(.*)\")\r\n )\r\n) by (service_instance_id, service_name, service_version)", + "format": "table", + "hide": false, + "instant": true, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "__auto", + "range": false, + "refId": "B" + } + ], + "title": "Service Instance Details", + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "Value": true + }, + "indexByName": {}, + "renameByName": {} + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 79 + }, + "id": 59, + "panels": [], + "title": "Signal flows", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Receivers -> Processor(s) -> Exporters (Node Graph panel is beta, so this panel may not show data correctly).", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 80 + }, + "id": 58, + "options": { + "edges": {}, + "nodes": { + "mainStatUnit": "flops" + }, + "zoomMode": "cooperative" + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "# receivers\nlabel_replace(\n label_join(\n label_join(\n sum(${metric:value}(\n otelcol_receiver_accepted_spans${suffix_total}{job=\"$job\"}[$__rate_interval])\n ) by (receiver)\n , \"id\", \"-rcv-\", \"transport\", \"receiver\"\n )\n , \"title\", \"\", \"transport\", \"receiver\"\n )\n , \"icon\", \"arrow-to-right\", \"\", \"\"\n)\n\n# dummy processor\nor\nlabel_replace(\n label_replace(\n label_replace(\n (sum(rate(otelcol_process_uptime${suffix_seconds}${suffix_total}{job=\"$job\"}[$__rate_interval])))\n , \"id\", \"processor\", \"\", \"\"\n )\n , \"title\", \"Processor(s)\", \"\", \"\"\n )\n , \"icon\", \"arrow-random\", \"\", \"\"\n)\n\n# exporters\nor\nlabel_replace(\n label_join(\n label_join(\n sum(${metric:value}(\n otelcol_exporter_sent_spans${suffix_total}{job=\"$job\"}[$__rate_interval])\n ) by (exporter)\n , \"id\", \"-exp-\", \"transport\", \"exporter\"\n )\n , \"title\", \"\", \"transport\", \"exporter\"\n )\n , \"icon\", \"arrow-from-right\", \"\", \"\"\n)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "nodes" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "# receivers -> processor\r\nlabel_join(\r\n label_replace(\r\n label_join(\r\n (sum(rate(otelcol_receiver_accepted_spans${suffix_total}{job=\"$job\"}[$__rate_interval])) by (receiver))\r\n ,\"source\", \"-rcv-\", \"transport\", \"receiver\"\r\n )\r\n ,\"target\", \"processor\", \"\", \"\"\r\n )\r\n , \"id\", \"-\", \"source\", \"target\"\r\n)\r\n\r\n# processor -> exporters\r\nor\r\nlabel_join(\r\n label_replace(\r\n label_join(\r\n (sum(rate(otelcol_exporter_sent_spans${suffix_total}{job=\"$job\"}[$__rate_interval])) by (exporter))\r\n , \"target\", \"-exp-\", \"transport\", \"exporter\"\r\n )\r\n , \"source\", \"processor\", \"\", \"\"\r\n )\r\n , \"id\", \"-\", \"source\", \"target\"\r\n)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "edges" + } + ], + "title": "Spans Flow", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "Value", + "renamePattern": "mainstat" + } + }, + { + "disabled": true, + "id": "calculateField", + "options": { + "alias": "secondarystat", + "mode": "reduceRow", + "reduce": { + "include": [ + "mainstat" + ], + "reducer": "sum" + } + } + } + ], + "type": "nodeGraph" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Receivers -> Processor(s) -> Exporters (Node Graph panel is beta, so this panel may not show data correctly).", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 80 + }, + "id": 60, + "options": { + "edges": {}, + "nodes": { + "mainStatUnit": "none" + }, + "zoomMode": "cooperative" + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "# receivers\nlabel_replace(\n label_join(\n label_join(\n (sum(\n ${metric:value}(otelcol_receiver_accepted_metric_points${suffix_total}{job=\"$job\"}[$__rate_interval])\n ) by (receiver))\n , \"id\", \"-rcv-\", \"transport\", \"receiver\"\n )\n , \"title\", \"\", \"transport\", \"receiver\"\n )\n , \"icon\", \"arrow-to-right\", \"\", \"\"\n)\n\n# dummy processor\nor\nlabel_replace(\n label_replace(\n label_replace(\n (sum(rate(otelcol_process_uptime${suffix_seconds}${suffix_total}{job=\"$job\"}[$__rate_interval])))\n , \"id\", \"processor\", \"\", \"\"\n )\n , \"title\", \"Processor(s)\", \"\", \"\"\n )\n , \"icon\", \"arrow-random\", \"\", \"\"\n)\n\n# exporters\nor\nlabel_replace(\n label_join(\n label_join(\n (sum(\n ${metric:value}(otelcol_exporter_sent_metric_points${suffix_total}{job=\"$job\"}[$__rate_interval])\n ) by (exporter))\n , \"id\", \"-exp-\", \"transport\", \"exporter\"\n )\n , \"title\", \"\", \"transport\", \"exporter\"\n )\n , \"icon\", \"arrow-from-right\", \"\", \"\"\n)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "nodes" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "# receivers -> processor\r\nlabel_join(\r\n label_replace(\r\n label_join(\r\n (sum(rate(otelcol_receiver_accepted_metric_points${suffix_total}{job=\"$job\"}[$__rate_interval])) by (receiver))\r\n , \"source\", \"-rcv-\", \"transport\", \"receiver\"\r\n )\r\n , \"target\", \"processor\", \"\", \"\"\r\n )\r\n , \"id\", \"-\", \"source\", \"target\"\r\n)\r\n\r\n# processor -> exporters\r\nor \r\nlabel_join(\r\n label_replace(\r\n label_join(\r\n (sum(rate(otelcol_exporter_sent_metric_points${suffix_total}{job=\"$job\"}[$__rate_interval])) by (exporter))\r\n , \"target\", \"-exp-\", \"transport\", \"exporter\"\r\n )\r\n , \"source\", \"processor\", \"\", \"\"\r\n )\r\n , \"id\", \"-\", \"source\", \"target\"\r\n)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "edges" + } + ], + "title": "Metric Points Flow", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "Value", + "renamePattern": "mainstat" + } + }, + { + "disabled": true, + "id": "calculateField", + "options": { + "alias": "secondarystat", + "mode": "reduceRow", + "reduce": { + "include": [ + "Value #nodes" + ], + "reducer": "sum" + } + } + } + ], + "type": "nodeGraph" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Receivers -> Processor(s) -> Exporters (Node Graph panel is beta, so this panel may not show data correctly).", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 80 + }, + "id": 61, + "options": { + "edges": {}, + "nodes": { + "mainStatUnit": "flops" + }, + "zoomMode": "cooperative" + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "# receivers\nlabel_replace(\n label_join(\n label_join(\n sum(${metric:value}(\n otelcol_receiver_accepted_log_records${suffix_total}{job=\"$job\"}[$__rate_interval])\n ) by (receiver)\n , \"id\", \"-rcv-\", \"transport\", \"receiver\"\n )\n , \"title\", \"\", \"transport\", \"receiver\"\n )\n , \"icon\", \"arrow-to-right\", \"\", \"\"\n)\n\n# dummy processor\nor\nlabel_replace(\n label_replace(\n label_replace(\n (sum(rate(otelcol_process_uptime${suffix_seconds}${suffix_total}{job=\"$job\"}[$__rate_interval])))\n , \"id\", \"processor\", \"\", \"\"\n )\n , \"title\", \"Processor(s)\", \"\", \"\"\n )\n , \"icon\", \"arrow-random\", \"\", \"\"\n)\n\n# exporters\nor\nlabel_replace(\n label_join(\n label_join(\n sum(${metric:value}(\n otelcol_exporter_sent_log_records${suffix_total}{job=\"$job\"}[$__rate_interval])\n ) by (exporter)\n , \"id\", \"-exp-\", \"transport\", \"exporter\"\n )\n , \"title\", \"\", \"transport\", \"exporter\"\n )\n , \"icon\", \"arrow-from-right\", \"\", \"\"\n)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "nodes" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "# receivers -> processor\r\nlabel_join(\r\n label_replace(\r\n label_join(\r\n (sum(rate(otelcol_receiver_accepted_log_records${suffix_total}{job=\"$job\"}[$__rate_interval])) by (receiver))\r\n , \"source\", \"-rcv-\", \"transport\", \"receiver\"\r\n )\r\n , \"target\", \"processor\", \"\", \"\"\r\n )\r\n , \"id\", \"-edg-\", \"source\", \"target\"\r\n)\r\n\r\n# processor -> exporters\r\nor \r\nlabel_join(\r\n label_replace(\r\n label_join(\r\n (sum(rate(otelcol_exporter_sent_log_records${suffix_total}{job=\"$job\"}[$__rate_interval])) by (exporter))\r\n ,\"target\",\"-exp-\",\"transport\",\"exporter\"\r\n )\r\n ,\"source\",\"processor\",\"\",\"\"\r\n )\r\n ,\"id\",\"-edg-\",\"source\",\"target\"\r\n)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "edges" + } + ], + "title": "Log Records Flow", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "Value", + "renamePattern": "mainstat" + } + }, + { + "disabled": true, + "id": "calculateField", + "options": { + "alias": "secondarystat", + "mode": "reduceRow", + "reduce": { + "include": [ + "mainstat" + ], + "reducer": "sum" + } + } + } + ], + "type": "nodeGraph" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 89 + }, + "id": 79, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 88 + }, + "id": 32, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_filter_spans_filtered${suffix_total}{job=\"$job\"}[$__rate_interval])) by (filter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Filtered: {{filter}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + } + ], + "title": "Spans ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 88 + }, + "id": 81, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_filter_datapoints_filtered${suffix_total}{job=\"$job\"}[$__rate_interval])) by (filter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Filtered: {{filter}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + } + ], + "title": "Metric Points ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 88 + }, + "id": 82, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_filter_log_records_filtered${suffix_total}{job=\"$job\"}[$__rate_interval])) by (filter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Filtered: {{filter}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + } + ], + "title": "Log Records ${metric:text}", + "type": "timeseries" + } + ], + "title": "Filter processors", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 90 + }, + "id": 68, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Measures the number of messages received per RPC. Should be 1 for all non-streaming RPCs. GRPC status codes: https://grpc.github.io/grpc/core/md_doc_statuscodes.html", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "0" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "displayName", + "value": "0 - OK" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "1" + }, + "properties": [ + { + "id": "displayName", + "value": "1 - CANCELLED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "2" + }, + "properties": [ + { + "id": "displayName", + "value": "2 - UNKNOWN" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "3" + }, + "properties": [ + { + "id": "displayName", + "value": "3 - INVALID_ARGUMENT" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "4" + }, + "properties": [ + { + "id": "displayName", + "value": "4 - DEADLINE_EXCEEDED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "5" + }, + "properties": [ + { + "id": "displayName", + "value": "5 - NOT_FOUND" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "6" + }, + "properties": [ + { + "id": "displayName", + "value": "6 - ALREADY_EXISTS" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "7" + }, + "properties": [ + { + "id": "displayName", + "value": "7 - PERMISSION_DENIED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "8" + }, + "properties": [ + { + "id": "displayName", + "value": "8 - RESOURCE_EXHAUSTED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "9" + }, + "properties": [ + { + "id": "displayName", + "value": "9 - FAILED_PRECONDITION" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "10" + }, + "properties": [ + { + "id": "displayName", + "value": "10 - ABORTED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "11" + }, + "properties": [ + { + "id": "displayName", + "value": "11 - OUT_OF_RANGE" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "12" + }, + "properties": [ + { + "id": "displayName", + "value": "12 - UNIMPLEMENTED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "13" + }, + "properties": [ + { + "id": "displayName", + "value": "13 - INTERNAL" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "14" + }, + "properties": [ + { + "id": "displayName", + "value": "14 - UNAVAILABLE" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "15" + }, + "properties": [ + { + "id": "displayName", + "value": "15 - DATA_LOSS" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "16" + }, + "properties": [ + { + "id": "displayName", + "value": "16 - UNAUTHENTICATED" + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 291 + }, + "id": 69, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(rpc_grpc_status_code) (${metric:value}(${prefix:raw}rpc_server_responses_per_rpc_count{job=\"$job\"}[$__rate_interval]))", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "RPC server responses by GRPC status code (receivers)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Measures the number of messages received per RPC. Should be 1 for all non-streaming RPCs. GRPC status codes: https://grpc.github.io/grpc/core/md_doc_statuscodes.html", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "0" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "displayName", + "value": "0 - OK" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "1" + }, + "properties": [ + { + "id": "displayName", + "value": "1 - CANCELLED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "2" + }, + "properties": [ + { + "id": "displayName", + "value": "2 - UNKNOWN" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "3" + }, + "properties": [ + { + "id": "displayName", + "value": "3 - INVALID_ARGUMENT" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "4" + }, + "properties": [ + { + "id": "displayName", + "value": "4 - DEADLINE_EXCEEDED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "5" + }, + "properties": [ + { + "id": "displayName", + "value": "5 - NOT_FOUND" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "6" + }, + "properties": [ + { + "id": "displayName", + "value": "6 - ALREADY_EXISTS" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "7" + }, + "properties": [ + { + "id": "displayName", + "value": "7 - PERMISSION_DENIED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "8" + }, + "properties": [ + { + "id": "displayName", + "value": "8 - RESOURCE_EXHAUSTED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "9" + }, + "properties": [ + { + "id": "displayName", + "value": "9 - FAILED_PRECONDITION" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "10" + }, + "properties": [ + { + "id": "displayName", + "value": "10 - ABORTED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "11" + }, + "properties": [ + { + "id": "displayName", + "value": "11 - OUT_OF_RANGE" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "12" + }, + "properties": [ + { + "id": "displayName", + "value": "12 - UNIMPLEMENTED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "13" + }, + "properties": [ + { + "id": "displayName", + "value": "13 - INTERNAL" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "14" + }, + "properties": [ + { + "id": "displayName", + "value": "14 - UNAVAILABLE" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "15" + }, + "properties": [ + { + "id": "displayName", + "value": "15 - DATA_LOSS" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "16" + }, + "properties": [ + { + "id": "displayName", + "value": "16 - UNAUTHENTICATED" + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 291 + }, + "id": 70, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(rpc_grpc_status_code) (${metric:value}(${prefix:raw}rpc_client_responses_per_rpc_count{job=\"$job\"}[$__rate_interval]))", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "RPC client responses by GRPC status code (exporters)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + }, + "links": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 300 + }, + "id": 72, + "interval": "$minstep", + "maxDataPoints": 50, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "Reds", + "steps": 25 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-09 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "ms" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(${prefix:raw}rpc_server_duration_bucket{job=\"$job\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "{{le}}", + "refId": "B" + } + ], + "title": "RPC server duration (receivers)", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + }, + "links": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 300 + }, + "id": 74, + "interval": "$minstep", + "maxDataPoints": 50, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "Reds", + "steps": 25 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-09 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "ms" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(${prefix:raw}rpc_client_duration_bucket{job=\"$job\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "{{le}}", + "refId": "B" + } + ], + "title": "RPC client duration (exporters)", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + }, + "links": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 308 + }, + "id": 73, + "interval": "$minstep", + "maxDataPoints": 50, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "Reds", + "steps": 25 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 0.1 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "bytes" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(${prefix:raw}rpc_server_request_size_bucket{job=\"$job\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "{{le}}", + "refId": "B" + } + ], + "title": "RPC server request size (receivers)", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + }, + "links": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 308 + }, + "id": 75, + "interval": "$minstep", + "maxDataPoints": 50, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "Reds", + "steps": 25 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 0.1 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "bytes" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(${prefix:raw}rpc_client_request_size_bucket{job=\"$job\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "{{le}}", + "refId": "B" + } + ], + "title": "RPC client request size (exporters)", + "type": "heatmap" + } + ], + "title": "RPC server/client", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 91 + }, + "id": 77, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + }, + "links": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 350 + }, + "id": 76, + "interval": "$minstep", + "maxDataPoints": 50, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "Reds", + "steps": 25 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-09 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "ms" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(${prefix:raw}http_server_duration_bucket{job=\"$job\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "__auto", + "refId": "B" + } + ], + "title": "HTTP server duration (receivers)", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + }, + "links": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 350 + }, + "id": 78, + "interval": "$minstep", + "maxDataPoints": 50, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "Reds", + "steps": 25 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-09 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "ms" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(${prefix:raw}http_client_duration_bucket{job=\"$job\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "{{le}}", + "refId": "B" + } + ], + "title": "HTTP client duration (exporters)", + "type": "heatmap" + } + ], + "title": "HTTP server/client", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 92 + }, + "id": 63, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Added: Number of namespace add events received.\nUpdated: Number of namespace update events received.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*updated.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 212 + }, + "id": 64, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "avg(otelcol_otelsvc_k8s_namespace_added${suffix_total}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Added: {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "avg(otelcol_otelsvc_k8s_namespace_updated${suffix_total}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Updated: {{transport}} {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Namespaces", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Added: Number of pod add events received.\nUpdated: Number of pod update events received.\nDeleted: Number of pod delete events received.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 212 + }, + "id": 65, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(otelcol_otelsvc_k8s_pod_added${suffix_total}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Added: {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(otelcol_otelsvc_k8s_pod_updated${suffix_total}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Updated: {{transport}} {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(otelcol_otelsvc_k8s_pod_deleted${suffix_total}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Deleted: {{transport}} {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "Pods", + "type": "timeseries" + } + ], + "title": "Kubernetes", + "type": "row" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 93 + }, + "id": 66, + "panels": [], + "title": "Documentation", + "type": "row" + } + ], + "preload": false, + "refresh": "", + "schemaVersion": 40, + "tags": [ + "opentelemetry" + ], + "templating": { + "list": [ + { + "current": {}, + "includeAll": false, + "label": "Datasource", + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "type": "datasource" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result({__name__=~\"otelcol_process_uptime.*\"})", + "includeAll": false, + "label": "Job", + "name": "job", + "options": [], + "query": { + "qryType": 3, + "query": "query_result({__name__=~\"otelcol_process_uptime.*\"})", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "/.*{.*job=\"([a-zA-Z0-9_-]+)\".*}/", + "sort": 1, + "type": "query" + }, + { + "auto": true, + "auto_count": 300, + "auto_min": "10s", + "current": { + "text": "$__auto", + "value": "$__auto" + }, + "label": "Min step", + "name": "minstep", + "options": [ + { + "selected": false, + "text": "10s", + "value": "10s" + }, + { + "selected": false, + "text": "30s", + "value": "30s" + }, + { + "selected": false, + "text": "1m", + "value": "1m" + }, + { + "selected": false, + "text": "5m", + "value": "5m" + } + ], + "query": "10s,30s,1m,5m", + "refresh": 2, + "type": "interval" + }, + { + "current": { + "text": "rate", + "value": "rate" + }, + "includeAll": false, + "label": "Base metric", + "name": "metric", + "options": [ + { + "selected": true, + "text": "Rate", + "value": "rate" + }, + { + "selected": false, + "text": "Count", + "value": "increase" + } + ], + "query": "Rate : rate, Count : increase", + "type": "custom" + }, + { + "allValue": ".*", + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result(avg by (receiver) ({__name__=~\"otelcol_receiver_.+\",job=\"$job\"}))", + "includeAll": true, + "label": "Receiver", + "name": "receiver", + "options": [], + "query": { + "qryType": 3, + "query": "query_result(avg by (receiver) ({__name__=~\"otelcol_receiver_.+\",job=\"$job\"}))", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "/.*receiver=\"(.*)\".*/", + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result(avg by (processor) ({__name__=~\"otelcol_processor_.+\",job=\"$job\"}))", + "includeAll": true, + "label": "Processor", + "name": "processor", + "options": [], + "query": { + "qryType": 3, + "query": "query_result(avg by (processor) ({__name__=~\"otelcol_processor_.+\",job=\"$job\"}))", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "/.*processor=\"(.*)\".*/", + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result(avg by (exporter) ({__name__=~\"otelcol_exporter_.+\",job=\"$job\"}))", + "includeAll": true, + "label": "Exporter", + "name": "exporter", + "options": [], + "query": { + "qryType": 3, + "query": "query_result(avg by (exporter) ({__name__=~\"otelcol_exporter_.+\",job=\"$job\"}))", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "/.*exporter=\"(.*)\".*/", + "sort": 1, + "type": "query" + }, + { + "current": { + "text": "", + "value": "" + }, + "description": "Detailed metrics must be configured in the collector configuration. They add grouping by transport protocol (http/grpc) for receivers. ", + "includeAll": false, + "label": "Additional groupping", + "name": "grouping", + "options": [ + { + "selected": true, + "text": "None (basic metrics)", + "value": "" + }, + { + "selected": false, + "text": "By transport (detailed metrics)", + "value": ",transport" + }, + { + "selected": false, + "text": "By service instance id", + "value": ",service_instance_id" + } + ], + "query": "None (basic metrics) : , By transport (detailed metrics) : \\,transport, By service instance id : \\,service_instance_id", + "type": "custom" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result({__name__=~\"otelcol_process_uptime.+\",job=\"$job\"})", + "description": "Some exporter(s) configuration(s) may add the metric suffix _total. This variable will detect this case.", + "hide": 2, + "includeAll": false, + "label": "Suffix _total", + "name": "suffix_total", + "options": [], + "query": { + "qryType": 3, + "query": "query_result({__name__=~\"otelcol_process_uptime.+\",job=\"$job\"})", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "/.*(_total)+{.*/", + "type": "query" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result({__name__=~\"otelcol_process_uptime.+\",job=\"$job\"})", + "description": "Some exporter(s) configuration(s) may add the metric suffix _seconds_total. This variable will detect this \"_seconds\" suffix part.", + "hide": 2, + "includeAll": false, + "label": "Suffix _seconds", + "name": "suffix_seconds", + "options": [], + "query": { + "qryType": 3, + "query": "query_result({__name__=~\"otelcol_process_uptime.+\",job=\"$job\"})", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "/otelcol_process_uptime(.*)_total{.*/", + "type": "query" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result({__name__=~\"otelcol_process_memory_rss.+\",job=\"$job\"})", + "description": "Some exporter(s) configuration(s) may add the metric suffix _bytes. This variable will detect this \"_bytes\" suffix part.", + "hide": 2, + "includeAll": false, + "label": "Suffix _bytes", + "name": "suffix_bytes", + "options": [], + "query": { + "qryType": 3, + "query": "query_result({__name__=~\"otelcol_process_memory_rss.+\",job=\"$job\"})", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "/otelcol_process_memory_rss(.*){.*/", + "type": "query" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result({__name__=~\".*.*rpc_server_duration_bucket|.*rpc_client_duration_bucket|.*http_server_duration_bucket|.*http_client_duration_bucket.*\",job=\"$job\"})", + "description": "Some metrics (e.g., RPC, HTTP) may no longer have the otelcol_ prefix. This will detect it. See https://github.com/open-telemetry/opentelemetry-collector/pull/9759", + "hide": 2, + "includeAll": false, + "label": "Prefix", + "name": "prefix", + "options": [], + "query": { + "qryType": 3, + "query": "query_result({__name__=~\".*.*rpc_server_duration_bucket|.*rpc_client_duration_bucket|.*http_server_duration_bucket|.*http_client_duration_bucket.*\",job=\"$job\"})", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "/(.*)(rpc|http)_(server|client)_duration_bucket.*{.*/", + "type": "query" + }, + { + "baseFilters": [], + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "filters": [], + "label": "Ad Hoc", + "name": "adhoc", + "type": "adhoc" + } + ] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "OpenTelemetry Collector", + "uid": "BKf2sowmj", + "version": 1, + "weekStart": "" + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-postgresql-dashboard + namespace: otel-demo + labels: + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + postgresql-dashboard.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "Performance metrics for PostgreSQL instrumented with the OpenTelemetry Collector PostgreSQL receiver.", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 6, + "links": [ + { + "asDropdown": false, + "includeVars": true, + "keepTime": true, + "tags": [ + "postgres-integration" + ], + "title": "Integration dashboards", + "type": "dashboards" + } + ], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 15, + "panels": [], + "title": "PostgreSQL Overview", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "description": "Queries per seconds. Queries being commits or rollbacks.\n", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "rgb(31, 120, 193)", + "mode": "fixed" + }, + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 4, + "x": 0, + "y": 1 + }, + "id": 11, + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(irate(postgresql_commits_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"}[$__rate_interval])) + sum(irate(postgresql_rollbacks_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"}[$__rate_interval]))", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "xact_commit" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "10s" + ], + "type": "non_negative_derivative" + } + ] + ], + "step": 1800, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + } + ], + "title": "QPS", + "type": "stat" + }, + { + "datasource": { + "uid": "$datasource" + }, + "description": "See [pg_stat_database / `tup_fetched`](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-DATABASE-VIEW)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 20, + "x": 4, + "y": 1 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "alias": "fetched", + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(irate(postgresql_tup_fetched_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"}[$__rate_interval]))", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "fetched", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "fetched", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "tup_fetched" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "10s" + ], + "type": "non_negative_derivative" + } + ] + ], + "step": 120, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "alias": "fetched", + "datasource": { + "uid": "$datasource" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(irate(postgresql_tup_returned_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"}[$__rate_interval]))", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "returned", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "returned", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "tup_fetched" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "10s" + ], + "type": "non_negative_derivative" + } + ] + ], + "step": 120, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "alias": "fetched", + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(irate(postgresql_tup_inserted_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"}[$__rate_interval]))", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "intervalFactor": 2, + "legendFormat": "inserted", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "inserted", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "tup_fetched" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "10s" + ], + "type": "non_negative_derivative" + } + ] + ], + "step": 120, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "alias": "fetched", + "datasource": { + "uid": "$datasource" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(irate(postgresql_tup_updated_total{dpostgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"}[$__rate_interval]))", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "intervalFactor": 2, + "legendFormat": "updated", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "updated", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "tup_fetched" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "10s" + ], + "type": "non_negative_derivative" + } + ] + ], + "step": 120, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "alias": "fetched", + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(irate(postgresql_tup_deleted_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"}[$__rate_interval]))", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "intervalFactor": 2, + "legendFormat": "deleted", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "deleted", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "tup_fetched" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "10s" + ], + "type": "non_negative_derivative" + } + ] + ], + "step": 120, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + } + ], + "title": "Rows", + "type": "timeseries" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "alias": "Buffers Allocated", + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "irate(postgresql_bgwriter_buffers_allocated_total{host_name=~\"$host_name\", k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\"}[$__rate_interval])", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "buffers allocated", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "buffers_allocated", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "buffers_alloc" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [], + "type": "difference" + } + ] + ], + "step": 240, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "irate(postgresql_bgwriter_buffers_writes_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\", host_name=~\"$host_name\"}[$__interval])", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "interval": "", + "legendFormat": "buffers write {{source}}", + "range": true, + "refId": "buffers_write", + "useBackend": false + }, + { + "alias": "Buffers Allocated", + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "expr": "irate(pg_stat_bgwriter_buffers_backend_total{job=~\"$job\",cluster=~\"$cluster\",instance=~\"$instance\"}[$__rate_interval])", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "buffers_backend", + "measurement": "postgresql", + "policy": "default", + "refId": "buffers_backend", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "buffers_alloc" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [], + "type": "difference" + } + ] + ], + "step": 240, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "alias": "Buffers Allocated", + "datasource": { + "uid": "$datasource" + }, + "dsType": "prometheus", + "expr": "irate(pg_stat_bgwriter_buffers_clean_total{job=~\"$job\",cluster=~\"$cluster\",instance=~\"$instance\"}[$__rate_interval])", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "buffers_clean", + "measurement": "postgresql", + "policy": "default", + "refId": "buffers_clean", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "buffers_alloc" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [], + "type": "difference" + } + ] + ], + "step": 240, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "alias": "Buffers Allocated", + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "irate(postgresql_bgwriter_checkpoint_count_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\", host_name=~\"$host_name\"}[$__rate_interval])", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "checkpoint {{type}}", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "checkpoint", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "buffers_alloc" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [], + "type": "difference" + } + ] + ], + "step": 240, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + } + ], + "title": "Buffers", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "deadlocks" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-red", + "mode": "fixed" + } + } + ] + }, + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "deadlocks" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "alias": "conflicts", + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(postgresql_deadlocks_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\", host_name=~\"$host_name\"})", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "deadlocks", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "deadlocks", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "conflicts" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [], + "type": "difference" + } + ] + ], + "step": 240, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "alias": "deadlocks", + "datasource": { + "uid": "$datasource" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(postgresql_conflicts_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"})", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "conflicts", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "conflicts-not-yet-implemented-in-otelcol", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "deadlocks" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [], + "type": "difference" + } + ] + ], + "step": 240, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + } + ], + "title": "Conflicts/Deadlocks", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 15 + }, + "id": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "round(\n sum by (postgresql_database_name) (\n rate(\n postgresql_blks_hit_total{\n postgresql_database_name=~\"$db\",\n k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",\n host_name=~\"$host_name\"\n }[$__rate_interval]\n )\n )\n /\n (\n sum by (postgresql_database_name) (\n rate(\n postgresql_blks_hit_total{\n postgresql_database_name=~\"$db\",\n k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",\n host_name=~\"$host_name\"\n }[$__rate_interval]\n )\n )\n +\n sum by (postgresql_database_name) (\n rate(\n postgresql_blks_read_total{\n postgresql_database_name=~\"$db\",\n k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",\n host_name=~\"$host_name\"\n }[$__rate_interval]\n )\n )\n ) * 100,\n 0.001\n)", + "format": "time_series", + "legendFormat": "{{postgresql_database_name}} - cache hit ratio", + "range": true, + "refId": "A", + "step": 240 + } + ], + "title": "Cache hit ratio", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 15 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "postgresql_backends{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\", host_name=~\"$host_name\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{postgresql_database_name}} - connections", + "range": true, + "refId": "A", + "step": 240 + } + ], + "title": "Number of active connections", + "type": "timeseries" + } + ], + "preload": false, + "refresh": "30s", + "schemaVersion": 41, + "tags": [ + "opentelemetry", + "postgresql" + ], + "templating": { + "list": [ + { + "current": { + "text": "Prometheus", + "value": "webstore-metrics" + }, + "includeAll": false, + "label": "Data Source", + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "(?!grafanacloud-usage|grafanacloud-ml-metrics).+", + "type": "datasource" + }, + { + "allValue": ".*", + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "definition": "label_values(postgresql_table_count,k8s_cluster_name)", + "description": "When deploying PostgreSQL on Kubernetes, name of the Kubernetes cluster. \nFor other deployments, select \"All\". ", + "includeAll": true, + "label": "K8s Cluster", + "multi": true, + "name": "k8s_cluster_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(postgresql_table_count,k8s_cluster_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "current": { + "text": "", + "value": "" + }, + "definition": "label_values(postgresql_table_count{k8s_cluster_name=~\"$k8s_cluster_name\"},k8s_statefulset_name)", + "description": "When deploying on Kubernetes, name of the `StatefulSet` of the PostgreSQL deployment (e.g. `my-pg-cluster`).\nFor other deployments, select \"All\". ", + "includeAll": true, + "label": "K8s Statefulset", + "multi": true, + "name": "k8s_statefulset_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(postgresql_table_count{k8s_cluster_name=~\"$k8s_cluster_name\"},k8s_statefulset_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "type": "query" + }, + { + "allValue": ".+", + "current": { + "text": "All", + "value": [ + "$__all" + ] + }, + "datasource": { + "uid": "$datasource" + }, + "definition": "label_values(postgresql_table_count{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\"},host_name)", + "description": "When deploying PostgreSQL on VMs, name on the host on which the database is deployed.\nFor other deployments, select \"All\". ", + "includeAll": true, + "label": "Host", + "multi": true, + "name": "host_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(postgresql_table_count{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\"},host_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "sort": 1, + "type": "query" + }, + { + "allValue": ".+", + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "definition": "label_values(postgresql_table_count{host_name=~\"$host_name\", postgresql_database_name!~\"template.*|postgres\", k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\"},postgresql_database_name)", + "includeAll": true, + "label": "Database", + "name": "db", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(postgresql_table_count{host_name=~\"$host_name\", postgresql_database_name!~\"template.*|postgres\", k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\"},postgresql_database_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "type": "query" + } + ] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "PostgreSQL", + "uid": "xHhbQmdjA", + "version": 5 + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-spanmetrics-dashboard + namespace: otel-demo + labels: + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + spanmetrics-dashboard.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "Spanmetrics way of demo application view.", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 3, + "links": [], + "panels": [ + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 26, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "This dashboard uses RED metrics generated for all services by the spanmetrics connector configured in the OpenTelemetry Collector.\n
\nChart panels may require 5 minutes after the Demo is started before rendering data.", + "mode": "html" + }, + "pluginVersion": "11.4.0", + "title": "", + "type": "text" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 2 + }, + "id": 24, + "panels": [], + "title": "Service Level - Throughput and Latencies", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-BlYlRd" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + }, + { + "color": "green", + "value": 2 + }, + { + "color": "#EAB839", + "value": 64 + }, + { + "color": "orange", + "value": 128 + }, + { + "color": "red", + "value": 256 + } + ] + }, + "unit": "ms" + }, + "overrides": [] + }, + "gridPos": { + "h": 20, + "w": 12, + "x": 0, + "y": 3 + }, + "id": 2, + "interval": "5m", + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(7,histogram_quantile(0.50, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval])) by (le,service_name)))", + "format": "time_series", + "hide": true, + "instant": false, + "interval": "", + "legendFormat": "{{service_name}}-quantile_0.50", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(7,histogram_quantile(0.95, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__range])) by (le,service_name)))", + "hide": false, + "instant": true, + "interval": "", + "legendFormat": "{{service_name}}", + "range": false, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "histogram_quantile(0.99, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval])) by (le,service_name))", + "hide": true, + "interval": "", + "legendFormat": "quantile99", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "histogram_quantile(0.999, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval])) by (le,service_name))", + "hide": true, + "interval": "", + "legendFormat": "quantile999", + "range": true, + "refId": "D" + } + ], + "title": "Top 3x3 - Service Latency - quantile95", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-BlYlRd" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "super-light-blue", + "value": 1 + }, + { + "color": "#EAB839", + "value": 2 + }, + { + "color": "red", + "value": 10 + } + ] + }, + "unit": "reqps" + }, + "overrides": [] + }, + "gridPos": { + "h": 13, + "w": 12, + "x": 12, + "y": 3 + }, + "id": 4, + "interval": "5m", + "options": { + "displayMode": "lcd", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 10, + "minVizWidth": 0, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "text": {}, + "valueMode": "color" + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(7,sum by (service_name) (rate(traces_span_metrics_calls_total{service_name=~\"$service\", span_name=~\"$span_name\"}[$__range])))", + "format": "time_series", + "instant": true, + "interval": "", + "legendFormat": "{{service_name}}", + "range": false, + "refId": "A" + } + ], + "title": "Top 7 Services Mean Rate over Range", + "type": "bargauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-reds" + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 1 + }, + { + "color": "red", + "value": 15 + } + ] + }, + "unit": "reqps" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 15, + "interval": "5m", + "options": { + "displayMode": "lcd", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 10, + "minVizWidth": 0, + "namePlacement": "auto", + "orientation": "vertical", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "text": {}, + "valueMode": "color" + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(7,sum(rate(traces_span_metrics_calls_total{status_code=\"STATUS_CODE_ERROR\",service_name=~\"$service\", span_name=~\"$span_name\"}[$__range])) by (service_name))", + "instant": true, + "interval": "", + "legendFormat": "{{service_name}}", + "range": false, + "refId": "A" + } + ], + "title": "Top 7 Services Mean ERROR Rate over Range", + "type": "bargauge" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 14, + "panels": [], + "title": "span_names Level - Throughput", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "bRate" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "lcd", + "type": "gauge" + } + }, + { + "id": "color", + "value": { + "mode": "continuous-BlYlRd" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "eRate" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "lcd", + "type": "gauge" + } + }, + { + "id": "color", + "value": { + "mode": "continuous-RdYlGr" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Error Rate" + }, + "properties": [ + { + "id": "custom.width", + "value": 663 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Rate" + }, + "properties": [ + { + "id": "custom.width", + "value": 667 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Service" + }, + "properties": [ + { + "id": "custom.width" + } + ] + } + ] + }, + "gridPos": { + "h": 11, + "w": 24, + "x": 0, + "y": 24 + }, + "id": 22, + "interval": "5m", + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "exemplar": false, + "expr": "topk(7, sum(rate(traces_span_metrics_calls_total{service_name=~\"$service\", span_name=~\"$span_name\"}[$__range])) by (span_name,service_name)) ", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "", + "refId": "Rate" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "exemplar": false, + "expr": "topk(7, sum(rate(traces_span_metrics_calls_total{status_code=\"STATUS_CODE_ERROR\",service_name=~\"$service\", span_name=~\"$span_name\"}[$__range])) by (span_name,service_name))", + "format": "table", + "hide": false, + "instant": true, + "interval": "", + "legendFormat": "", + "refId": "Error Rate" + } + ], + "title": "Top 7 span_names and Errors (APM Table)", + "transformations": [ + { + "id": "seriesToColumns", + "options": { + "byField": "span_name" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time 1": true, + "Time 2": true + }, + "indexByName": {}, + "renameByName": { + "Value #Error Rate": "Error Rate", + "Value #Rate": "Rate", + "service_name 1": "Rate in Service", + "service_name 2": "Error Rate in Service" + } + } + }, + { + "id": "calculateField", + "options": { + "alias": "bRate", + "mode": "reduceRow", + "reduce": { + "include": [ + "Rate" + ], + "reducer": "sum" + } + } + }, + { + "id": "calculateField", + "options": { + "alias": "eRate", + "mode": "reduceRow", + "reduce": { + "include": [ + "Error Rate" + ], + "reducer": "sum" + } + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Error Rate": true, + "Rate": true, + "bRate": false + }, + "indexByName": { + "Error Rate": 4, + "Error Rate in Service": 6, + "Rate": 1, + "Rate in Service": 5, + "bRate": 2, + "eRate": 3, + "span_name": 0 + }, + "renameByName": { + "Rate in Service": "Service", + "bRate": "Rate", + "eRate": "Error Rate", + "span_name": "span_name Name" + } + } + }, + { + "id": "sortBy", + "options": { + "fields": {}, + "sort": [ + { + "desc": true, + "field": "Rate" + } + ] + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 35 + }, + "id": 20, + "panels": [], + "title": "span_name Level - Latencies", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-BlYlRd" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue" + }, + { + "color": "green", + "value": 2 + }, + { + "color": "#EAB839", + "value": 64 + }, + { + "color": "orange", + "value": 128 + }, + { + "color": "red", + "value": 256 + } + ] + }, + "unit": "ms" + }, + "overrides": [] + }, + "gridPos": { + "h": 13, + "w": 12, + "x": 0, + "y": 36 + }, + "id": 25, + "interval": "5m", + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(7,histogram_quantile(0.50, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval])) by (le,service_name)))", + "format": "time_series", + "hide": true, + "instant": false, + "interval": "", + "legendFormat": "{{service_name}}-quantile_0.50", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(7,histogram_quantile(0.95, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__range])) by (le,span_name)))", + "hide": false, + "instant": true, + "interval": "", + "legendFormat": "{{span_name}}", + "range": false, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "histogram_quantile(0.99, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval])) by (le,service_name))", + "hide": true, + "interval": "", + "legendFormat": "quantile99", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "histogram_quantile(0.999, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval])) by (le,service_name))", + "hide": true, + "interval": "", + "legendFormat": "quantile999", + "range": true, + "refId": "D" + } + ], + "title": "Top 3x3 - span_name Latency - quantile95", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-BlYlRd" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms" + }, + "overrides": [] + }, + "gridPos": { + "h": 13, + "w": 12, + "x": 12, + "y": 36 + }, + "id": 10, + "interval": "5m", + "options": { + "displayMode": "lcd", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 10, + "minVizWidth": 0, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(7, sum by (span_name,service_name)(increase(traces_span_metrics_duration_milliseconds_sum{service_name=~\"${service}\", span_name=~\"$span_name\"}[5m]) / increase(traces_span_metrics_duration_milliseconds_count{service_name=~\"${service}\",span_name=~\"$span_name\"}[5m\n])))", + "instant": true, + "interval": "", + "legendFormat": "{{span_name}} [{{service_name}}]", + "range": false, + "refId": "A" + } + ], + "title": "Top 7 Highest Endpoint Latencies Mean Over Range ", + "type": "bargauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms" + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 24, + "x": 0, + "y": 49 + }, + "id": 16, + "interval": "5m", + "options": { + "legend": { + "calcs": [ + "mean", + "logmin", + "max", + "delta" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": true, + "expr": "topk(7,sum by (span_name,service_name)(increase(traces_span_metrics_duration_milliseconds_sum{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval]) / increase(traces_span_metrics_duration_milliseconds_count{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval])))", + "instant": false, + "interval": "", + "legendFormat": "[{{service_name}}] {{span_name}}", + "range": true, + "refId": "A" + } + ], + "title": "Top 7 Latencies Over Range ", + "type": "timeseries" + } + ], + "preload": false, + "refresh": "5m", + "schemaVersion": 40, + "tags": [], + "templating": { + "list": [ + { + "allValue": ".*", + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "definition": "query_result(count by (service_name)(count_over_time(traces_span_metrics_calls_total[$__range])))", + "includeAll": true, + "multi": true, + "name": "service", + "options": [], + "query": { + "query": "query_result(count by (service_name)(count_over_time(traces_span_metrics_calls_total[$__range])))", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "/.*service_name=\"(.*)\".*/", + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "definition": "query_result(sum ({__name__=~\".*traces_span_metrics_calls_total\",service_name=~\"$service\"}) by (span_name))", + "includeAll": true, + "multi": true, + "name": "span_name", + "options": [], + "query": { + "query": "query_result(sum ({__name__=~\".*traces_span_metrics_calls_total\",service_name=~\"$service\"}) by (span_name))", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "/.*span_name=\"(.*)\".*/", + "type": "query" + } + ] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Spanmetrics Demo Dashboard", + "uid": "W2gX2zHVk48", + "version": 2, + "weekStart": "" + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-datasources + namespace: otel-demo + labels: + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_datasource: "1" +data: + + default.yaml: | + # Copyright The OpenTelemetry Authors + # SPDX-License-Identifier: Apache-2.0 + + + apiVersion: 1 + + datasources: + - name: Prometheus + uid: webstore-metrics + type: prometheus + url: http://prometheus:9090 + editable: true + isDefault: true + jsonData: + # Align Prometheus data source time interval with the OTel SDKs' export interval (see OTEL_METRIC_EXPORT_INTERVAL) + timeInterval: "60s" + exemplarTraceIdDestinations: + - datasourceUid: webstore-traces + name: trace_id + + - url: http://localhost:8080/jaeger/ui/trace/$${__value.raw} + name: trace_id + urlDisplayLabel: View in Jaeger UI + jaeger.yaml: | + # Copyright The OpenTelemetry Authors + # SPDX-License-Identifier: Apache-2.0 + + + apiVersion: 1 + + datasources: + - name: Jaeger + uid: webstore-traces + type: jaeger + url: http://jaeger:16686/jaeger/ui + editable: true + isDefault: false + jsonData: + tracesToLogsV2: + datasourceUid: webstore-logs + spanStartTimeShift: "-20m" + spanEndTimeShift: "20m" + filterByTraceID: true + filterBySpanID: true + customQuery: true + query: traceId:"$${__trace.traceId}" AND spanId:"$${__span.spanId}" + opensearch.yaml: | + # Copyright The OpenTelemetry Authors + # SPDX-License-Identifier: Apache-2.0 + + apiVersion: 1 + + datasources: + - name: OpenSearch + uid: webstore-logs + type: grafana-opensearch-datasource + url: http://opensearch:9200/ + access: proxy + editable: true + isDefault: false + jsonData: + database: otel-logs-* + flavor: opensearch + logLevelField: severity.text.keyword + logMessageField: body + pplEnabled: true + timeField: observedTimestamp + version: 3.2.0 +--- +# Source: opentelemetry-demo/templates/product-catalog-products.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: product-catalog-products + namespace: otel-demo + labels: + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +data: + + products.json: | + { + "products": [ + { + "id": "OLJCESPC7Z", + "name": "National Park Foundation Explorascope", + "description": "The National Park Foundation’s (NPF) Explorascope 60AZ is a manual alt-azimuth, refractor telescope perfect for celestial viewing on the go. The NPF Explorascope 60 can view the planets, moon, star clusters and brighter deep sky objects like the Orion Nebula and Andromeda Galaxy.", + "picture": "NationalParkFoundationExplorascope.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 101, + "nanos": 960000000 + }, + "categories": [ + "telescopes" + ] + }, + { + "id": "66VCHSJNUP", + "name": "Starsense Explorer Refractor Telescope", + "description": "The first telescope that uses your smartphone to analyze the night sky and calculate its position in real time. StarSense Explorer is ideal for beginners thanks to the app’s user-friendly interface and detailed tutorials. It’s like having your own personal tour guide of the night sky", + "picture": "StarsenseExplorer.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 349, + "nanos": 950000000 + }, + "categories": [ + "telescopes" + ] + }, + { + "id": "1YMWWN1N4O", + "name": "Eclipsmart Travel Refractor Telescope", + "description": "Dedicated white-light solar scope for the observer on the go. The 50mm refracting solar scope uses Solar Safe, ISO compliant, full-aperture glass filter material to ensure the safest view of solar events. The kit comes complete with everything you need, including the dedicated travel solar scope, a Solar Safe finderscope, tripod, a high quality 20mm (18x) Kellner eyepiece and a nylon backpack to carry everything in. This Travel Solar Scope makes it easy to share the Sun as well as partial and total solar eclipses with the whole family and offers much higher magnifications than you would otherwise get using handheld solar viewers or binoculars.", + "picture": "EclipsmartTravelRefractorTelescope.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 129, + "nanos": 950000000 + }, + "categories": [ + "telescopes", + "travel" + ] + }, + { + "id": "L9ECAV7KIM", + "name": "Lens Cleaning Kit", + "description": "Wipe away dust, dirt, fingerprints and other particles on your lenses to see clearly with the Lens Cleaning Kit. This cleaning kit works on all glass and optical surfaces, including telescopes, binoculars, spotting scopes, monoculars, microscopes, and even your camera lenses, computer screens, and mobile devices. The kit comes complete with a retractable lens brush to remove dust particles and dirt and two options to clean smudges and fingerprints off of your optics, pre-moistened lens wipes and a bottled lens cleaning fluid with soft cloth.", + "picture": "LensCleaningKit.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 21, + "nanos": 950000000 + }, + "categories": [ + "accessories" + ] + }, + { + "id": "2ZYFJ3GM2N", + "name": "Roof Binoculars", + "description": "This versatile, all-around binocular is a great choice for the trail, the stadium, the arena, or just about anywhere you want a close-up view of the action without sacrificing brightness or detail. It’s an especially great companion for nature observation and bird watching, with ED glass that helps you spot the subtlest field markings and a close focus of just 6.5 feet.", + "picture": "RoofBinoculars.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 209, + "nanos": 950000000 + }, + "categories": [ + "binoculars" + ] + }, + { + "id": "0PUK6V6EV0", + "name": "Solar System Color Imager", + "description": "You have your new telescope and have observed Saturn and Jupiter. Now you're ready to take the next step and start imaging them. But where do you begin? The NexImage 10 Solar System Imager is the perfect solution.", + "picture": "SolarSystemColorImager.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 175, + "nanos": 0 + }, + "categories": [ + "accessories", + "telescopes" + ] + }, + { + "id": "LS4PSXUNUM", + "name": "Red Flashlight", + "description": "This 3-in-1 device features a 3-mode red flashlight, a hand warmer, and a portable power bank for recharging your personal electronics on the go. Whether you use it to light the way at an astronomy star party, a night walk, or wildlife research, ThermoTorch 3 Astro Red’s rugged, IPX4-rated design will withstand your everyday activities.", + "picture": "RedFlashlight.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 57, + "nanos": 80000000 + }, + "categories": [ + "accessories", + "flashlights" + ] + }, + { + "id": "9SIQT8TOJO", + "name": "Optical Tube Assembly", + "description": "Capturing impressive deep-sky astroimages is easier than ever with Rowe-Ackermann Schmidt Astrograph (RASA) V2, the perfect companion to today’s top DSLR or astronomical CCD cameras. This fast, wide-field f/2.2 system allows for shorter exposure times compared to traditional f/10 astroimaging, without sacrificing resolution. Because shorter sub-exposure times are possible, your equatorial mount won’t need to accurately track over extended periods. The short focal length also lessens equatorial tracking demands. In many cases, autoguiding will not be required.", + "picture": "OpticalTubeAssembly.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 3599, + "nanos": 0 + }, + "categories": [ + "accessories", + "telescopes", + "assembly" + ] + }, + { + "id": "6E92ZMYYFZ", + "name": "Solar Filter", + "description": "Enhance your viewing experience with EclipSmart Solar Filter for 8” telescopes. With two Velcro straps and four self-adhesive Velcro pads for added safety, you can be assured that the solar filter cannot be accidentally knocked off and will provide Solar Safe, ISO compliant viewing.", + "picture": "SolarFilter.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 69, + "nanos": 950000000 + }, + "categories": [ + "accessories", + "telescopes" + ] + }, + { + "id": "HQTGWGPNH4", + "name": "The Comet Book", + "description": "A 16th-century treatise on comets, created anonymously in Flanders (now northern France) and now held at the Universitätsbibliothek Kassel. Commonly known as The Comet Book (or Kometenbuch in German), its full title translates as “Comets and their General and Particular Meanings, According to Ptolomeé, Albumasar, Haly, Aliquind and other Astrologers”. The image is from https://publicdomainreview.org/collection/the-comet-book, made available by the Universitätsbibliothek Kassel under a CC-BY SA 4.0 license (https://creativecommons.org/licenses/by-sa/4.0/)", + "picture": "TheCometBook.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 0, + "nanos": 990000000 + }, + "categories": [ + "books" + ] + } + ] + } +--- +# Source: opentelemetry-demo/charts/grafana/templates/clusterrole.yaml +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" + name: grafana-clusterrole +rules: + - apiGroups: [""] # "" indicates the core API group + resources: ["configmaps", "secrets"] + verbs: ["get", "watch", "list"] +--- +# Source: opentelemetry-demo/charts/opentelemetry-collector/templates/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: otel-collector + labels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "0.135.0" + app.kubernetes.io/part-of: opentelemetry-collector + app.kubernetes.io/component: standalone-collector +rules: + - apiGroups: [""] + resources: ["pods", "namespaces"] + verbs: ["get", "watch", "list"] + - apiGroups: ["apps"] + resources: ["replicasets"] + verbs: ["get", "list", "watch"] + - apiGroups: ["extensions"] + resources: ["replicasets"] + verbs: ["get", "list", "watch"] +--- +# Source: opentelemetry-demo/charts/prometheus/templates/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: v3.6.0 + app.kubernetes.io/part-of: prometheus + name: prometheus +rules: + - apiGroups: + - "" + resources: + - nodes + - nodes/proxy + - nodes/metrics + - services + - endpoints + - pods + - ingresses + - configmaps + verbs: + - get + - list + - watch + - apiGroups: + - "networking.k8s.io" + resources: + - ingresses/status + - ingresses + verbs: + - get + - list + - watch + - apiGroups: + - "discovery.k8s.io" + resources: + - endpointslices + verbs: + - get + - list + - watch + - nonResourceURLs: + - "/metrics" + verbs: + - get +--- +# Source: opentelemetry-demo/charts/grafana/templates/clusterrolebinding.yaml +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: grafana-clusterrolebinding + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" +subjects: + - kind: ServiceAccount + name: grafana + namespace: otel-demo +roleRef: + kind: ClusterRole + name: grafana-clusterrole + apiGroup: rbac.authorization.k8s.io +--- +# Source: opentelemetry-demo/charts/opentelemetry-collector/templates/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: otel-collector + labels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "0.135.0" + app.kubernetes.io/part-of: opentelemetry-collector + app.kubernetes.io/component: standalone-collector +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: otel-collector +subjects: +- kind: ServiceAccount + name: otel-collector + namespace: otel-demo +--- +# Source: opentelemetry-demo/charts/prometheus/templates/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: v3.6.0 + app.kubernetes.io/part-of: prometheus + name: prometheus +subjects: + - kind: ServiceAccount + name: prometheus + namespace: otel-demo +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: prometheus +--- +# Source: opentelemetry-demo/charts/grafana/templates/role.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: grafana + namespace: otel-demo + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" +rules: [] +--- +# Source: opentelemetry-demo/charts/grafana/templates/rolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: grafana + namespace: otel-demo + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: grafana +subjects: +- kind: ServiceAccount + name: grafana + namespace: otel-demo +--- +# Source: opentelemetry-demo/charts/grafana/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: grafana + namespace: otel-demo + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" +spec: + type: ClusterIP + ports: + - name: service + port: 80 + protocol: TCP + targetPort: grafana + selector: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo +--- +# Source: opentelemetry-demo/charts/jaeger/templates/allinone-agent-svc.yaml +apiVersion: v1 +kind: Service +metadata: + name: jaeger-agent + labels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "1.53.0" + app.kubernetes.io/component: service-agent +spec: + clusterIP: None + ports: + - name: zk-compact-trft + port: 5775 + protocol: UDP + targetPort: 0 + - name: config-rest + port: 5778 + targetPort: 0 + - name: jg-compact-trft + port: 6831 + protocol: UDP + targetPort: 0 + - name: jg-binary-trft + port: 6832 + protocol: UDP + targetPort: 0 + selector: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/component: all-in-one +--- +# Source: opentelemetry-demo/charts/jaeger/templates/allinone-collector-svc.yaml +apiVersion: v1 +kind: Service +metadata: + name: jaeger-collector + labels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "1.53.0" + app.kubernetes.io/component: service-collector +spec: + clusterIP: None + ports: + - name: http-zipkin + port: 9411 + targetPort: 0 + appProtocol: http + - name: grpc-http + port: 14250 + targetPort: 0 + appProtocol: grpc + - name: c-tchan-trft + port: 14267 + targetPort: 0 + - name: http-c-binary-trft + port: 14268 + targetPort: 0 + appProtocol: http + - name: otlp-grpc + port: 4317 + targetPort: 0 + appProtocol: grpc + - name: otlp-http + port: 4318 + targetPort: 0 + appProtocol: http + selector: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/component: all-in-one +--- +# Source: opentelemetry-demo/charts/jaeger/templates/allinone-query-svc.yaml +apiVersion: v1 +kind: Service +metadata: + name: jaeger-query + labels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "1.53.0" + app.kubernetes.io/component: service-query +spec: + clusterIP: None + ports: + - name: http-query + port: 16686 + targetPort: 16686 + - name: grpc-query + port: 16685 + targetPort: 16685 + selector: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/component: all-in-one +--- +# Source: opentelemetry-demo/charts/opensearch/templates/service.yaml +kind: Service +apiVersion: v1 +metadata: + name: opensearch + labels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "3.2.0" + app.kubernetes.io/component: opensearch + annotations: + {} +spec: + type: ClusterIP + selector: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + ports: + - name: http + protocol: TCP + port: 9200 + - name: transport + protocol: TCP + port: 9300 + - name: metrics + protocol: TCP + port: 9600 +--- +# Source: opentelemetry-demo/charts/opensearch/templates/service.yaml +kind: Service +apiVersion: v1 +metadata: + name: opensearch-headless + labels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "3.2.0" + app.kubernetes.io/component: opensearch + annotations: + service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" +spec: + clusterIP: None # This is needed for statefulset hostnames like opensearch-0 to resolve + # Create endpoints also if the related pod isn't ready + publishNotReadyAddresses: true + selector: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + ports: + - name: http + port: 9200 + - name: transport + port: 9300 + - name: metrics + port: 9600 +--- +# Source: opentelemetry-demo/charts/opentelemetry-collector/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: otel-collector + namespace: otel-demo + labels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "0.135.0" + app.kubernetes.io/part-of: opentelemetry-collector + app.kubernetes.io/component: standalone-collector + component: standalone-collector +spec: + type: ClusterIP + ports: + + - name: jaeger-compact + port: 6831 + targetPort: 6831 + protocol: UDP + - name: jaeger-grpc + port: 14250 + targetPort: 14250 + protocol: TCP + - name: jaeger-thrift + port: 14268 + targetPort: 14268 + protocol: TCP + - name: metrics + port: 8888 + targetPort: 8888 + protocol: TCP + - name: otlp + port: 4317 + targetPort: 4317 + protocol: TCP + appProtocol: grpc + - name: otlp-http + port: 4318 + targetPort: 4318 + protocol: TCP + - name: zipkin + port: 9411 + targetPort: 9411 + protocol: TCP + selector: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + component: standalone-collector + internalTrafficPolicy: Cluster +--- +# Source: opentelemetry-demo/charts/prometheus/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: v3.6.0 + app.kubernetes.io/part-of: prometheus + name: prometheus + namespace: otel-demo +spec: + ports: + - name: http + port: 9090 + protocol: TCP + targetPort: 9090 + selector: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + sessionAffinity: None + type: "ClusterIP" +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: ad + labels: + opentelemetry.io/name: ad + app.kubernetes.io/component: ad + app.kubernetes.io/name: ad + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + opentelemetry.io/name: ad +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: cart + labels: + opentelemetry.io/name: cart + app.kubernetes.io/component: cart + app.kubernetes.io/name: cart + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + opentelemetry.io/name: cart +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: checkout + labels: + opentelemetry.io/name: checkout + app.kubernetes.io/component: checkout + app.kubernetes.io/name: checkout + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + opentelemetry.io/name: checkout +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: currency + labels: + opentelemetry.io/name: currency + app.kubernetes.io/component: currency + app.kubernetes.io/name: currency + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + opentelemetry.io/name: currency +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: email + labels: + opentelemetry.io/name: email + app.kubernetes.io/component: email + app.kubernetes.io/name: email + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + opentelemetry.io/name: email +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: flagd + labels: + opentelemetry.io/name: flagd + app.kubernetes.io/component: flagd + app.kubernetes.io/name: flagd + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8013 + name: rpc + targetPort: 8013 + - port: 8016 + name: ofrep + targetPort: 8016 + - port: 4000 + name: tcp-service-0 + targetPort: 4000 + selector: + opentelemetry.io/name: flagd +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: frontend + labels: + opentelemetry.io/name: frontend + app.kubernetes.io/component: frontend + app.kubernetes.io/name: frontend + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + opentelemetry.io/name: frontend +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: frontend-proxy + labels: + opentelemetry.io/name: frontend-proxy + app.kubernetes.io/component: frontend-proxy + app.kubernetes.io/name: frontend-proxy + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + opentelemetry.io/name: frontend-proxy +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: image-provider + labels: + opentelemetry.io/name: image-provider + app.kubernetes.io/component: image-provider + app.kubernetes.io/name: image-provider + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8081 + name: tcp-service + targetPort: 8081 + selector: + opentelemetry.io/name: image-provider +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: kafka + labels: + opentelemetry.io/name: kafka + app.kubernetes.io/component: kafka + app.kubernetes.io/name: kafka + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 9092 + name: plaintext + targetPort: 9092 + - port: 9093 + name: controller + targetPort: 9093 + selector: + opentelemetry.io/name: kafka +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: load-generator + labels: + opentelemetry.io/name: load-generator + app.kubernetes.io/component: load-generator + app.kubernetes.io/name: load-generator + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8089 + name: tcp-service + targetPort: 8089 + selector: + opentelemetry.io/name: load-generator +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: payment + labels: + opentelemetry.io/name: payment + app.kubernetes.io/component: payment + app.kubernetes.io/name: payment + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + opentelemetry.io/name: payment +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: postgresql + labels: + opentelemetry.io/name: postgresql + app.kubernetes.io/component: postgresql + app.kubernetes.io/name: postgresql + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 5432 + name: tcp-service + targetPort: 5432 + selector: + opentelemetry.io/name: postgresql +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: product-catalog + labels: + opentelemetry.io/name: product-catalog + app.kubernetes.io/component: product-catalog + app.kubernetes.io/name: product-catalog + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + opentelemetry.io/name: product-catalog +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: quote + labels: + opentelemetry.io/name: quote + app.kubernetes.io/component: quote + app.kubernetes.io/name: quote + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + opentelemetry.io/name: quote +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: recommendation + labels: + opentelemetry.io/name: recommendation + app.kubernetes.io/component: recommendation + app.kubernetes.io/name: recommendation + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + opentelemetry.io/name: recommendation +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: shipping + labels: + opentelemetry.io/name: shipping + app.kubernetes.io/component: shipping + app.kubernetes.io/name: shipping + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + opentelemetry.io/name: shipping +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: valkey-cart + labels: + opentelemetry.io/name: valkey-cart + app.kubernetes.io/component: valkey-cart + app.kubernetes.io/name: valkey-cart + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 6379 + name: valkey-cart + targetPort: 6379 + selector: + opentelemetry.io/name: valkey-cart +--- +# Source: opentelemetry-demo/charts/grafana/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: grafana + namespace: otel-demo + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/part-of: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" + app.openshift.io/runtime: golang +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + strategy: + type: RollingUpdate + template: + metadata: + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" + annotations: + checksum/config: 3aef97dc43bb7f320b3d3f00d79efff7580bf83005ec5574a0619b42268584cf + checksum/sc-dashboard-provider-config: e70bf6a851099d385178a76de9757bb0bef8299da6d8443602590e44f05fdf24 + checksum/secret: bed677784356b2af7fb0d87455db21f077853059b594101a4f6532bfbd962a7f + kubectl.kubernetes.io/default-container: grafana + spec: + + serviceAccountName: grafana + automountServiceAccountToken: true + shareProcessNamespace: false + securityContext: + fsGroup: 472 + runAsGroup: 472 + runAsNonRoot: true + runAsUser: 472 + enableServiceLinks: true + containers: + - name: grafana-sc-alerts + image: "quay.io/kiwigrid/k8s-sidecar:1.30.10" + imagePullPolicy: IfNotPresent + env: + - name: METHOD + value: WATCH + - name: LABEL + value: "grafana_alert" + - name: FOLDER + value: "/etc/grafana/provisioning/alerting" + - name: RESOURCE + value: "both" + - name: REQ_USERNAME + valueFrom: + secretKeyRef: + name: grafana + key: admin-user + - name: REQ_PASSWORD + valueFrom: + secretKeyRef: + name: grafana + key: admin-password + - name: REQ_URL + value: http://localhost:3000/api/admin/provisioning/alerting/reload + - name: REQ_METHOD + value: POST + resources: + limits: + cpu: 100m + memory: 100Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault + volumeMounts: + - name: sc-alerts-volume + mountPath: "/etc/grafana/provisioning/alerting" + - name: grafana-sc-dashboard + image: "quay.io/kiwigrid/k8s-sidecar:1.30.10" + imagePullPolicy: IfNotPresent + env: + - name: METHOD + value: WATCH + - name: LABEL + value: "grafana_dashboard" + - name: FOLDER + value: "/tmp/dashboards" + - name: RESOURCE + value: "both" + - name: REQ_USERNAME + valueFrom: + secretKeyRef: + name: grafana + key: admin-user + - name: REQ_PASSWORD + valueFrom: + secretKeyRef: + name: grafana + key: admin-password + - name: REQ_URL + value: http://localhost:3000/api/admin/provisioning/dashboards/reload + - name: REQ_METHOD + value: POST + resources: + limits: + cpu: 100m + memory: 100Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault + volumeMounts: + - name: sc-dashboard-volume + mountPath: "/tmp/dashboards" + - name: grafana-sc-datasources + image: "quay.io/kiwigrid/k8s-sidecar:1.30.10" + imagePullPolicy: IfNotPresent + env: + - name: METHOD + value: WATCH + - name: LABEL + value: "grafana_datasource" + - name: FOLDER + value: "/etc/grafana/provisioning/datasources" + - name: RESOURCE + value: "both" + - name: REQ_USERNAME + valueFrom: + secretKeyRef: + name: grafana + key: admin-user + - name: REQ_PASSWORD + valueFrom: + secretKeyRef: + name: grafana + key: admin-password + - name: REQ_URL + value: http://localhost:3000/api/admin/provisioning/datasources/reload + - name: REQ_METHOD + value: POST + resources: + limits: + cpu: 100m + memory: 100Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault + volumeMounts: + - name: sc-datasources-volume + mountPath: "/etc/grafana/provisioning/datasources" + - name: grafana + image: "docker.io/grafana/grafana:12.1.1" + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault + volumeMounts: + - name: config + mountPath: "/etc/grafana/grafana.ini" + subPath: grafana.ini + - name: storage + mountPath: "/var/lib/grafana" + - name: sc-alerts-volume + mountPath: "/etc/grafana/provisioning/alerting" + - name: sc-dashboard-volume + mountPath: "/tmp/dashboards" + - name: sc-dashboard-provider + mountPath: "/etc/grafana/provisioning/dashboards/sc-dashboardproviders.yaml" + subPath: provider.yaml + - name: sc-datasources-volume + mountPath: "/etc/grafana/provisioning/datasources" + ports: + - name: grafana + containerPort: 3000 + protocol: TCP + - name: gossip-tcp + containerPort: 9094 + protocol: TCP + - name: gossip-udp + containerPort: 9094 + protocol: UDP + - name: profiling + containerPort: 6060 + protocol: TCP + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: GF_SECURITY_ADMIN_USER + valueFrom: + secretKeyRef: + name: grafana + key: admin-user + - name: GF_SECURITY_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: grafana + key: admin-password + - name: GF_INSTALL_PLUGINS + valueFrom: + configMapKeyRef: + name: grafana + key: plugins + - name: GF_PATHS_DATA + value: /var/lib/grafana/ + - name: GF_PATHS_LOGS + value: /var/log/grafana + - name: GF_PATHS_PLUGINS + value: /var/lib/grafana/plugins + - name: GF_PATHS_PROVISIONING + value: /etc/grafana/provisioning + - name: GOMEMLIMIT + valueFrom: + resourceFieldRef: + divisor: "1" + resource: limits.memory + livenessProbe: + failureThreshold: 10 + httpGet: + path: /api/health + port: 3000 + initialDelaySeconds: 60 + timeoutSeconds: 30 + readinessProbe: + httpGet: + path: /api/health + port: 3000 + resources: + limits: + memory: 150Mi + volumes: + - name: config + configMap: + name: grafana + - name: storage + emptyDir: {} + - name: sc-alerts-volume + emptyDir: {} + - name: sc-dashboard-volume + emptyDir: {} + - name: sc-dashboard-provider + configMap: + name: grafana-config-dashboards + - name: sc-datasources-volume + emptyDir: {} +--- +# Source: opentelemetry-demo/charts/jaeger/templates/allinone-deploy.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: jaeger + labels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/part-of: jaegger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "1.53.0" + app.kubernetes.io/component: all-in-one + prometheus.io/port: "14269" + prometheus.io/scrape: "true" + app.openshift.io/runtime: golang +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/component: all-in-one + template: + metadata: + labels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/component: all-in-one + annotations: + prometheus.io/port: "14269" + prometheus.io/scrape: "true" + spec: + containers: + - env: + - name: METRICS_STORAGE_TYPE + value: prometheus + - name: COLLECTOR_OTLP_GRPC_HOST_PORT + value: 0.0.0.0:4317 + - name: COLLECTOR_OTLP_HTTP_HOST_PORT + value: 0.0.0.0:4318 + - name: SPAN_STORAGE_TYPE + value: memory + - name: COLLECTOR_ZIPKIN_HOST_PORT + value: :9411 + - name: JAEGER_DISABLED + value: "false" + - name: COLLECTOR_OTLP_ENABLED + value: "true" + securityContext: + {} + image: jaegertracing/all-in-one:1.53.0 + imagePullPolicy: IfNotPresent + name: jaeger + args: + - "--memory.max-traces=5000" + - "--query.base-path=/jaeger/ui" + - "--prometheus.server-url=http://prometheus:9090" + - "--prometheus.query.normalize-calls=true" + - "--prometheus.query.normalize-duration=true" + ports: + - containerPort: 5775 + protocol: UDP + - containerPort: 6831 + protocol: UDP + - containerPort: 6832 + protocol: UDP + - containerPort: 5778 + protocol: TCP + - containerPort: 16686 + protocol: TCP + - containerPort: 16685 + protocol: TCP + - containerPort: 9411 + protocol: TCP + - containerPort: 4317 + protocol: TCP + - containerPort: 4318 + protocol: TCP + livenessProbe: + failureThreshold: 5 + httpGet: + path: / + port: 14269 + scheme: HTTP + initialDelaySeconds: 5 + periodSeconds: 15 + successThreshold: 1 + timeoutSeconds: 1 + readinessProbe: + failureThreshold: 3 + httpGet: + path: / + port: 14269 + scheme: HTTP + initialDelaySeconds: 1 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: + limits: + memory: 400Mi + volumeMounts: + securityContext: + fsGroup: 10001 + runAsGroup: 10001 + runAsUser: 10001 + serviceAccountName: jaeger + volumes: +--- +# Source: opentelemetry-demo/charts/opentelemetry-collector/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: otel-collector + namespace: otel-demo + labels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "0.135.0" + app.kubernetes.io/part-of: opentelemetry-collector + app.kubernetes.io/component: standalone-collector + app.openshift.io/runtime: golang +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + component: standalone-collector + strategy: + type: RollingUpdate + template: + metadata: + annotations: + checksum/config: b23c30f9b89a34910edbfdafc7072ff305d9e8bb93ca26ffaed9ac1a8872cefb + opentelemetry_community_demo: "true" + prometheus.io/scrape: "true" + labels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + component: standalone-collector + spec: + serviceAccountName: otel-collector + automountServiceAccountToken: true + securityContext: + {} + containers: + - name: opentelemetry-collector + args: + - --config=/conf/relay.yaml + securityContext: + {} + image: "otel/opentelemetry-collector-contrib:0.135.0" + imagePullPolicy: IfNotPresent + ports: + - name: jaeger-compact + containerPort: 6831 + protocol: UDP + - name: jaeger-grpc + containerPort: 14250 + protocol: TCP + - name: jaeger-thrift + containerPort: 14268 + protocol: TCP + - name: metrics + containerPort: 8888 + protocol: TCP + - name: otlp + containerPort: 4317 + protocol: TCP + - name: otlp-http + containerPort: 4318 + protocol: TCP + - name: zipkin + containerPort: 9411 + protocol: TCP + env: + - name: MY_POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + - name: GOMEMLIMIT + value: "160MiB" + livenessProbe: + httpGet: + path: / + port: 13133 + readinessProbe: + httpGet: + path: / + port: 13133 + resources: + limits: + memory: 200Mi + volumeMounts: + - mountPath: /conf + name: opentelemetry-collector-configmap + volumes: + - name: opentelemetry-collector-configmap + configMap: + name: otel-collector + items: + - key: relay + path: relay.yaml + hostNetwork: false +--- +# Source: opentelemetry-demo/charts/prometheus/templates/deploy.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: v3.6.0 + app.kubernetes.io/part-of: prometheus + app.openshift.io/runtime: golang + name: prometheus + namespace: otel-demo +spec: + strategy: + type: Recreate + rollingUpdate: null + selector: + matchLabels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + replicas: 1 + revisionHistoryLimit: 10 + template: + metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: v3.6.0 + app.openshift.io/runtime: prometheus + spec: + enableServiceLinks: true + serviceAccountName: prometheus + containers: + + - name: prometheus-server + image: "quay.io/prometheus/prometheus:v3.6.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 + - --enable-feature=exemplar-storage + - --web.enable-otlp-receiver + ports: + - containerPort: 9090 + readinessProbe: + httpGet: + path: /-/ready + port: 9090 + scheme: HTTP + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 4 + failureThreshold: 3 + successThreshold: 1 + livenessProbe: + httpGet: + path: /-/healthy + port: 9090 + scheme: HTTP + initialDelaySeconds: 30 + periodSeconds: 15 + timeoutSeconds: 10 + failureThreshold: 3 + successThreshold: 1 + resources: + limits: + memory: 1Gi + volumeMounts: + - name: config-volume + mountPath: /etc/config + - name: storage-volume + mountPath: /data + subPath: "" + dnsPolicy: ClusterFirst + securityContext: + fsGroup: 65534 + runAsGroup: 65534 + runAsNonRoot: true + runAsUser: 65534 + terminationGracePeriodSeconds: 300 + volumes: + - name: config-volume + configMap: + name: prometheus + - name: storage-volume + emptyDir: + {} +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: accounting + labels: + opentelemetry.io/name: accounting + app.kubernetes.io/component: accounting + app.kubernetes.io/name: accounting + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + opentelemetry.io/name: accounting + template: + metadata: + labels: + opentelemetry.io/name: accounting + app.kubernetes.io/component: accounting + app.kubernetes.io/name: accounting + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: accounting + image: 'ghcr.io/open-telemetry/demo:2.1.3-accounting' + imagePullPolicy: IfNotPresent + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: KAFKA_ADDR + value: kafka:9092 + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4318 + - name: DB_CONNECTION_STRING + value: Host=postgresql;Username=otelu;Password=otelp;Database=otel + - name: OTEL_DOTNET_AUTO_TRACES_ENTITYFRAMEWORKCORE_INSTRUMENTATION_ENABLED + value: "false" + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 120Mi + volumeMounts: + initContainers: + - command: + - sh + - -c + - until nc -z -v -w30 kafka 9092; do echo waiting for kafka; sleep 2; done; + image: busybox:latest + name: wait-for-kafka + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ad + labels: + opentelemetry.io/name: ad + app.kubernetes.io/component: ad + app.kubernetes.io/name: ad + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: ad + template: + metadata: + labels: + + opentelemetry.io/name: ad + + app.kubernetes.io/component: ad + app.kubernetes.io/name: ad + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: ad + image: 'ghcr.io/open-telemetry/demo:2.1.3-ad' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: AD_PORT + value: "8080" + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4318 + - name: OTEL_LOGS_EXPORTER + value: otlp + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 300Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: cart + labels: + + opentelemetry.io/name: cart + + app.kubernetes.io/component: cart + app.kubernetes.io/name: cart + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: dotnet +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: cart + template: + metadata: + labels: + + opentelemetry.io/name: cart + + app.kubernetes.io/component: cart + app.kubernetes.io/name: cart + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: cart + image: 'ghcr.io/open-telemetry/demo:2.1.3-cart' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: CART_PORT + value: "8080" + - name: ASPNETCORE_URLS + value: http://*:$(CART_PORT) + - name: VALKEY_ADDR + value: valkey-cart:6379 + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 160Mi + volumeMounts: + initContainers: + - command: + - sh + - -c + - until nc -z -v -w30 valkey-cart 6379; do echo waiting for valkey-cart; sleep 2; + done; + image: busybox:latest + name: wait-for-valkey-cart + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: checkout + labels: + opentelemetry.io/name: checkout + app.kubernetes.io/component: checkout + app.kubernetes.io/name: checkout + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: checkout + template: + metadata: + labels: + opentelemetry.io/name: checkout + app.kubernetes.io/component: checkout + app.kubernetes.io/name: checkout + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: checkout + image: 'ghcr.io/open-telemetry/demo:2.1.3-checkout' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: CHECKOUT_PORT + value: "8080" + - name: CART_ADDR + value: cart:8080 + - name: CURRENCY_ADDR + value: currency:8080 + - name: EMAIL_ADDR + value: http://email:8080 + - name: PAYMENT_ADDR + value: payment:8080 + - name: PRODUCT_CATALOG_ADDR + value: product-catalog:8080 + - name: SHIPPING_ADDR + value: http://shipping:8080 + - name: KAFKA_ADDR + value: kafka:9092 + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: GOMEMLIMIT + value: 16MiB + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 20Mi + volumeMounts: + initContainers: + - command: + - sh + - -c + - until nc -z -v -w30 kafka 9092; do echo waiting for kafka; sleep 2; done; + image: busybox:latest + name: wait-for-kafka + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: currency + labels: + opentelemetry.io/name: currency + app.kubernetes.io/component: currency + app.kubernetes.io/name: currency + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + opentelemetry.io/name: currency + template: + metadata: + labels: + opentelemetry.io/name: currency + app.kubernetes.io/component: currency + app.kubernetes.io/name: currency + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: currency + image: 'ghcr.io/open-telemetry/demo:2.1.3-currency' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: CURRENCY_PORT + value: "8080" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: VERSION + value: '2.1.3' + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 20Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: email + labels: + opentelemetry.io/name: email + app.kubernetes.io/component: email + app.kubernetes.io/name: email + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: ruby +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + opentelemetry.io/name: email + template: + metadata: + labels: + opentelemetry.io/name: email + app.kubernetes.io/component: email + app.kubernetes.io/name: email + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: email + image: 'ghcr.io/open-telemetry/demo:2.1.3-email' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: EMAIL_PORT + value: "8080" + - name: APP_ENV + value: production + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4318 + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 100Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: flagd + labels: + opentelemetry.io/name: flagd + app.kubernetes.io/component: flagd + app.kubernetes.io/name: flagd + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: golang +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: flagd + template: + metadata: + labels: + + opentelemetry.io/name: flagd + + app.kubernetes.io/component: flagd + app.kubernetes.io/name: flagd + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: flagd + image: 'ghcr.io/open-feature/flagd:v0.12.8' + imagePullPolicy: IfNotPresent + command: + - /flagd-build + - start + - --port + - "8013" + - --ofrep-port + - "8016" + - --uri + - file:./etc/flagd/demo.flagd.json + ports: + + - containerPort: 8013 + name: rpc + - containerPort: 8016 + name: ofrep + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: FLAGD_METRICS_EXPORTER + value: otel + - name: FLAGD_OTEL_COLLECTOR_URI + value: $(OTEL_COLLECTOR_NAME):4317 + - name: GOMEMLIMIT + value: 60MiB + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 75Mi + volumeMounts: + - name: config-rw + mountPath: /etc/flagd + - name: flagd-ui + image: 'ghcr.io/open-telemetry/demo:2.1.3-flagd-ui' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 4000 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: FLAGD_METRICS_EXPORTER + value: otel + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4318 + - name: FLAGD_UI_PORT + value: "4000" + - name: SECRET_KEY_BASE + value: yYrECL4qbNwleYInGJYvVnSkwJuSQJ4ijPTx5tirGUXrbznFIBFVJdPl5t6O9ASw + - name: PHX_HOST + value: localhost + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 250Mi + volumeMounts: + - mountPath: /app/data + name: config-rw + initContainers: + - command: + - sh + - -c + - cp /config-ro/demo.flagd.json /config-rw/demo.flagd.json && cat /config-rw/demo.flagd.json + image: busybox + name: init-config + volumeMounts: + - mountPath: /config-ro + name: config-ro + - mountPath: /config-rw + name: config-rw + volumes: + - name: config-rw + emptyDir: {} + - configMap: + name: flagd-config + name: config-ro +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: fraud-detection + labels: + opentelemetry.io/name: fraud-detection + app.kubernetes.io/component: fraud-detection + app.kubernetes.io/name: fraud-detection + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + opentelemetry.io/name: fraud-detection + template: + metadata: + labels: + opentelemetry.io/name: fraud-detection + app.kubernetes.io/component: fraud-detection + app.kubernetes.io/name: fraud-detection + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: fraud-detection + image: 'ghcr.io/open-telemetry/demo:2.1.3-fraud-detection' + imagePullPolicy: IfNotPresent + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: KAFKA_ADDR + value: kafka:9092 + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4318 + - name: OTEL_INSTRUMENTATION_KAFKA_EXPERIMENTAL_SPAN_ATTRIBUTES + value: "true" + - name: OTEL_INSTRUMENTATION_MESSAGING_EXPERIMENTAL_RECEIVE_TELEMETRY_ENABLED + value: "true" + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 300Mi + volumeMounts: + initContainers: + - command: + - sh + - -c + - until nc -z -v -w30 kafka 9092; do echo waiting for kafka; sleep 2; done; + image: busybox:latest + name: wait-for-kafka + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend + labels: + opentelemetry.io/name: frontend + app.kubernetes.io/component: frontend + app.kubernetes.io/name: frontend + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: nodejs +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + opentelemetry.io/name: frontend + template: + metadata: + labels: + opentelemetry.io/name: frontend + app.kubernetes.io/component: frontend + app.kubernetes.io/name: frontend + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: frontend + image: 'ghcr.io/open-telemetry/demo:2.1.3-frontend' + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: FRONTEND_PORT + value: "8080" + - name: PORT + value: $(FRONTEND_PORT) + - name: FRONTEND_ADDR + value: :8080 + - name: AD_ADDR + value: ad:8080 + - name: CART_ADDR + value: cart:8080 + - name: CHECKOUT_ADDR + value: checkout:8080 + - name: CURRENCY_ADDR + value: currency:8080 + - name: PRODUCT_CATALOG_ADDR + value: product-catalog:8080 + - name: RECOMMENDATION_ADDR + value: recommendation:8080 + - name: SHIPPING_ADDR + value: http://shipping:8080 + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: ENV_PLATFORM + value: kubernetes + - name: OTEL_COLLECTOR_HOST + value: $(OTEL_COLLECTOR_NAME) + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: WEB_OTEL_SERVICE_NAME + value: frontend-web + - name: PUBLIC_OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://localhost:8080/otlp-http/v1/traces + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 250Mi + securityContext: + runAsGroup: 1001 + runAsNonRoot: true + runAsUser: 1001 + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend-proxy + labels: + opentelemetry.io/name: frontend-proxy + app.kubernetes.io/component: frontend-proxy + app.kubernetes.io/name: frontend-proxy + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: nginx +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: frontend-proxy + template: + metadata: + labels: + + opentelemetry.io/name: frontend-proxy + + app.kubernetes.io/component: frontend-proxy + app.kubernetes.io/name: frontend-proxy + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: frontend-proxy + image: 'ghcr.io/open-telemetry/demo:2.1.3-frontend-proxy' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: ENVOY_PORT + value: "8080" + - name: ENVOY_ADMIN_PORT + value: "10000" + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: FLAGD_UI_HOST + value: flagd-ui + - name: FLAGD_UI_PORT + value: "4000" + - name: FRONTEND_HOST + value: frontend + - name: FRONTEND_PORT + value: "8080" + - name: GRAFANA_HOST + value: grafana + - name: GRAFANA_PORT + value: "80" + - name: IMAGE_PROVIDER_HOST + value: image-provider + - name: IMAGE_PROVIDER_PORT + value: "8081" + - name: JAEGER_HOST + value: jaeger-query + - name: JAEGER_UI_PORT + value: "16686" + - name: LOCUST_WEB_HOST + value: load-generator + - name: LOCUST_WEB_PORT + value: "8089" + - name: OTEL_COLLECTOR_HOST + value: $(OTEL_COLLECTOR_NAME) + - name: OTEL_COLLECTOR_PORT_GRPC + value: "4317" + - name: OTEL_COLLECTOR_PORT_HTTP + value: "4318" + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 65Mi + securityContext: + runAsGroup: 101 + runAsNonRoot: true + runAsUser: 101 + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: image-provider + labels: + opentelemetry.io/name: image-provider + app.kubernetes.io/component: image-provider + app.kubernetes.io/name: image-provider + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: nodejs +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + opentelemetry.io/name: image-provider + template: + metadata: + labels: + + opentelemetry.io/name: image-provider + + app.kubernetes.io/component: image-provider + app.kubernetes.io/name: image-provider + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: image-provider + image: 'ghcr.io/open-telemetry/demo:2.1.3-image-provider' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8081 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: IMAGE_PROVIDER_PORT + value: "8081" + - name: OTEL_COLLECTOR_PORT_GRPC + value: "4317" + - name: OTEL_COLLECTOR_HOST + value: $(OTEL_COLLECTOR_NAME) + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 50Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: kafka + labels: + opentelemetry.io/name: kafka + app.kubernetes.io/component: kafka + app.kubernetes.io/name: kafka + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + opentelemetry.io/name: kafka + template: + metadata: + labels: + opentelemetry.io/name: kafka + app.kubernetes.io/component: kafka + app.kubernetes.io/name: kafka + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: kafka + image: 'ghcr.io/open-telemetry/demo:2.1.3-kafka' + imagePullPolicy: IfNotPresent + ports: + - containerPort: 9092 + name: plaintext + - containerPort: 9093 + name: controller + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: KAFKA_ADVERTISED_LISTENERS + value: PLAINTEXT://kafka:9092 + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4318 + - name: KAFKA_HEAP_OPTS + value: -Xmx400M -Xms400M + - name: KAFKA_LISTENERS + value: PLAINTEXT://:9092,CONTROLLER://:9093 + - name: KAFKA_CONTROLLER_LISTENER_NAMES + value: CONTROLLER + - name: KAFKA_CONTROLLER_QUORUM_VOTERS + value: 1@kafka:9093 + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 600Mi + securityContext: + runAsGroup: 1000 + runAsNonRoot: true + runAsUser: 1000 + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: load-generator + labels: + opentelemetry.io/name: load-generator + app.kubernetes.io/component: load-generator + app.kubernetes.io/name: load-generator + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: python +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: load-generator + template: + metadata: + labels: + opentelemetry.io/name: load-generator + app.kubernetes.io/component: load-generator + app.kubernetes.io/name: load-generator + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: load-generator + image: 'ghcr.io/open-telemetry/demo:2.1.3-load-generator' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8089 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: LOCUST_WEB_HOST + value: 0.0.0.0 + - name: LOCUST_WEB_PORT + value: "8089" + - name: LOCUST_USERS + value: "10" + - name: LOCUST_SPAWN_RATE + value: "1" + - name: LOCUST_HOST + value: http://frontend-proxy:8080 + - name: LOCUST_HEADLESS + value: "false" + - name: LOCUST_AUTOSTART + value: "true" + - name: LOCUST_BROWSER_TRAFFIC_ENABLED + value: "true" + - name: PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION + value: python + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: FLAGD_OFREP_PORT + value: "8016" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 1500Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: payment + labels: + opentelemetry.io/name: payment + app.kubernetes.io/component: payment + app.kubernetes.io/name: payment + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + opentelemetry.io/name: payment + template: + metadata: + labels: + opentelemetry.io/name: payment + app.kubernetes.io/component: payment + app.kubernetes.io/name: payment + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: payment + image: 'ghcr.io/open-telemetry/demo:2.1.3-payment' + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: PAYMENT_PORT + value: "8080" + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 120Mi + securityContext: + runAsGroup: 1000 + runAsNonRoot: true + runAsUser: 1000 + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: postgresql + labels: + opentelemetry.io/name: postgresql + app.kubernetes.io/component: postgresql + app.kubernetes.io/name: postgresql + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + opentelemetry.io/name: postgresql + template: + metadata: + labels: + opentelemetry.io/name: postgresql + app.kubernetes.io/component: postgresql + app.kubernetes.io/name: postgresql + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: postgresql + image: 'ghcr.io/open-telemetry/demo:2.1.3-postgresql' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 5432 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: POSTGRES_USER + value: root + - name: POSTGRES_PASSWORD + value: otel + - name: POSTGRES_DB + value: otel + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 100Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: product-catalog + labels: + opentelemetry.io/name: product-catalog + app.kubernetes.io/component: product-catalog + app.kubernetes.io/name: product-catalog + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: python +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + opentelemetry.io/name: product-catalog + template: + metadata: + labels: + opentelemetry.io/name: product-catalog + app.kubernetes.io/component: product-catalog + app.kubernetes.io/name: product-catalog + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: product-catalog + image: 'ghcr.io/open-telemetry/demo:2.1.3-product-catalog' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: PRODUCT_CATALOG_PORT + value: "8080" + - name: PRODUCT_CATALOG_RELOAD_INTERVAL + value: "10" + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: GOMEMLIMIT + value: 16MiB + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 20Mi + volumeMounts: + - name: product-catalog-products + mountPath: /usr/src/app/products + volumes: + - name: product-catalog-products + configMap: + name: product-catalog-products +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: quote + labels: + opentelemetry.io/name: quote + app.kubernetes.io/component: quote + app.kubernetes.io/name: quote + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: php +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + opentelemetry.io/name: quote + template: + metadata: + labels: + opentelemetry.io/name: quote + app.kubernetes.io/component: quote + app.kubernetes.io/name: quote + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: quote + image: 'ghcr.io/open-telemetry/demo:2.1.3-quote' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: QUOTE_PORT + value: "8080" + - name: OTEL_PHP_AUTOLOAD_ENABLED + value: "true" + - name: OTEL_PHP_INTERNAL_METRICS_ENABLED + value: "true" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4318 + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 40Mi + securityContext: + runAsGroup: 33 + runAsNonRoot: true + runAsUser: 33 + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: recommendation + labels: + opentelemetry.io/name: recommendation + app.kubernetes.io/component: recommendation + app.kubernetes.io/name: recommendation + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: python +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + opentelemetry.io/name: recommendation + template: + metadata: + labels: + opentelemetry.io/name: recommendation + app.kubernetes.io/component: recommendation + app.kubernetes.io/name: recommendation + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: recommendation + image: 'ghcr.io/open-telemetry/demo:2.1.3-recommendation' + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: RECOMMENDATION_PORT + value: "8080" + - name: PRODUCT_CATALOG_ADDR + value: product-catalog:8080 + - name: OTEL_PYTHON_LOG_CORRELATION + value: "true" + - name: PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION + value: python + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 500Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: shipping + labels: + opentelemetry.io/name: shipping + app.kubernetes.io/component: shipping + app.kubernetes.io/name: shipping + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: java +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + opentelemetry.io/name: shipping + template: + metadata: + labels: + opentelemetry.io/name: shipping + app.kubernetes.io/component: shipping + app.kubernetes.io/name: shipping + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: shipping + image: 'ghcr.io/open-telemetry/demo:2.1.3-shipping' + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: SHIPPING_PORT + value: "8080" + - name: QUOTE_ADDR + value: http://quote:8080 + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 20Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: valkey-cart + labels: + opentelemetry.io/name: valkey-cart + app.kubernetes.io/component: valkey-cart + app.kubernetes.io/name: valkey-cart + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + app.openshift.io/runtime: redis +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + opentelemetry.io/name: valkey-cart + template: + metadata: + labels: + opentelemetry.io/name: valkey-cart + app.kubernetes.io/component: valkey-cart + app.kubernetes.io/name: valkey-cart + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: valkey-cart + image: 'valkey/valkey:8.1.3-alpine' + imagePullPolicy: IfNotPresent + ports: + - containerPort: 6379 + name: valkey-cart + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 20Mi + securityContext: + runAsGroup: 1000 + runAsNonRoot: true + runAsUser: 999 + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/charts/opensearch/templates/statefulset.yaml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: opensearch + labels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "3.2.0" + app.kubernetes.io/component: opensearch + app.openshift.io/runtime: java + annotations: + majorVersion: "3" +spec: + serviceName: opensearch-headless + selector: + matchLabels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + replicas: 1 + podManagementPolicy: Parallel + updateStrategy: + type: RollingUpdate + template: + metadata: + name: "opensearch" + labels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "3.2.0" + app.kubernetes.io/component: opensearch + annotations: + configchecksum: d3638c66a58383c65ae664111c0e7d56d245f2d612896ddc8e6ade4253b8c9b + spec: + securityContext: + fsGroup: 1000 + runAsUser: 1000 + automountServiceAccountToken: false + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 1 + podAffinityTerm: + topologyKey: kubernetes.io/hostname + labelSelector: + matchExpressions: + - key: app.kubernetes.io/instance + operator: In + values: + - opentelemetry-demo + - key: app.kubernetes.io/name + operator: In + values: + - opensearch + terminationGracePeriodSeconds: 120 + volumes: + - name: config + configMap: + name: opensearch-config + - emptyDir: {} + name: config-emptydir + enableServiceLinks: true + initContainers: + - name: configfile + image: "opensearchproject/opensearch:3.2.0" + imagePullPolicy: "IfNotPresent" + command: + - sh + - -c + - | + #!/usr/bin/env bash + cp -r /tmp/configfolder/* /tmp/config/ + securityContext: + capabilities: + drop: + - ALL + runAsNonRoot: true + runAsUser: 1000 + resources: + {} + volumeMounts: + - mountPath: /tmp/config/ + name: config-emptydir + - name: config + mountPath: /tmp/configfolder/opensearch.yml + subPath: opensearch.yml + containers: + - name: "opensearch" + securityContext: + capabilities: + drop: + - ALL + runAsNonRoot: true + runAsUser: 1000 + + image: "opensearchproject/opensearch:3.2.0" + imagePullPolicy: "IfNotPresent" + readinessProbe: + failureThreshold: 3 + periodSeconds: 5 + tcpSocket: + port: 9200 + timeoutSeconds: 3 + startupProbe: + failureThreshold: 30 + initialDelaySeconds: 5 + periodSeconds: 10 + tcpSocket: + port: 9200 + timeoutSeconds: 3 + ports: + - name: http + containerPort: 9200 + - name: transport + containerPort: 9300 + - name: metrics + containerPort: 9600 + resources: + limits: + memory: 1100Mi + requests: + cpu: 1000m + memory: 100Mi + env: + - name: node.name + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: discovery.seed_hosts + value: "opensearch-cluster-master-headless" + - name: cluster.name + value: "demo-cluster" + - name: network.host + value: "0.0.0.0" + - name: OPENSEARCH_JAVA_OPTS + value: "-Xms400m -Xmx400m" + - name: node.roles + value: "master,ingest,data,remote_cluster_client," + - name: discovery.type + value: "single-node" + - name: bootstrap.memory_lock + value: "true" + - name: DISABLE_INSTALL_DEMO_CONFIG + value: "true" + - name: DISABLE_SECURITY_PLUGIN + value: "true" + volumeMounts: + - name: config-emptydir + mountPath: /usr/share/opensearch/config/opensearch.yml + subPath: opensearch.yml +--- +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + name: frontend-proxy + namespace: otel-demo + labels: + app.kubernetes.io/name: frontend-proxy + app.kubernetes.io/part-of: opentelemetry-demo +spec: + path: / + to: + kind: Service + name: frontend-proxy + port: + targetPort: tcp-service + tls: + termination: edge + insecureEdgeTerminationPolicy: Redirect +--- +apiVersion: route.openshift.io/v1 +kind: Route +metadata: + name: jaeger-ui + namespace: otel-demo + labels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/part-of: opentelemetry-demo +spec: + path: /jaeger/ui + to: + kind: Service + name: jaeger-query + port: + targetPort: 16686 + tls: + termination: edge + insecureEdgeTerminationPolicy: Redirect diff --git a/kubernetes/opentelemetry-demo.yaml b/kubernetes/opentelemetry-demo.yaml index b543ac73fd..a8d1dde437 100644 --- a/kubernetes/opentelemetry-demo.yaml +++ b/kubernetes/opentelemetry-demo.yaml @@ -82,93 +82,11 @@ kind: ServiceAccount metadata: name: opentelemetry-demo labels: + + app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo --- -# 1. La SCC personalizada que permite un UID específico Y el perfil seccomp -apiVersion: security.openshift.io/v1 -kind: SecurityContextConstraints -metadata: - name: otel-demo-scc -allowHostDirVolumePlugin: false -allowHostIPC: false -allowHostNetwork: false -allowHostPID: false -allowHostPorts: false -allowPrivilegeEscalation: false -allowPrivilegedContainer: false -allowedCapabilities: [] -defaultAddCapabilities: [] -fsGroup: - type: RunAsAny -groups: [] -priority: 10 -readOnlyRootFilesystem: false -requiredDropCapabilities: -- KILL -- MKNOD -- SETUID -- SETGID -runAsUser: - type: RunAsAny -seLinuxContext: - type: MustRunAs -# Esta es la línea clave que faltaba en 'anyuid' -seccompProfiles: -- runtime/default -supplementalGroups: - type: RunAsAny -users: [] -volumes: -- configMap -- downwardAPI -- emptyDir -- persistentVolumeClaim -- projected -- secret ---- -# 2. El Role que da permiso para "usar" la nueva SCC -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: otel-demo-scc-role - namespace: otel-demo -rules: -- apiGroups: ["security.openshift.io"] - resourceNames: ["otel-demo-scc"] - resources: ["securitycontextconstraints"] - verbs: ["use"] ---- -# 3. El RoleBinding que conecta TODAS las SAs al nuevo Role -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: otel-demo-scc-binding - namespace: otel-demo -subjects: -- kind: ServiceAccount - name: grafana - namespace: otel-demo -- kind: ServiceAccount - name: jaeger - namespace: otel-demo -- kind: ServiceAccount - name: otel-collector - namespace: otel-demo -- kind: ServiceAccount - name: prometheus - namespace: otel-demo -- kind: ServiceAccount - name: opentelemetry-demo - namespace: otel-demo -- kind: ServiceAccount - name: default - namespace: otel-demo -roleRef: - kind: Role - name: otel-demo-scc-role - apiGroup: rbac.authorization.k8s.io ---- # Source: opentelemetry-demo/charts/grafana/templates/secret.yaml apiVersion: v1 kind: Secret @@ -5210,6 +5128,8 @@ metadata: name: grafana-dashboard-linux-dashboard namespace: otel-demo labels: + + app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo grafana_dashboard: "1" @@ -8052,6 +7972,8 @@ metadata: name: grafana-dashboard-opentelemetry-collector namespace: otel-demo labels: + + app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo grafana_dashboard: "1" @@ -14383,6 +14305,8 @@ metadata: name: grafana-dashboard-postgresql-dashboard namespace: otel-demo labels: + + app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo grafana_dashboard: "1" @@ -15870,6 +15794,8 @@ metadata: name: grafana-dashboard-spanmetrics-dashboard namespace: otel-demo labels: + + app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo grafana_dashboard: "1" @@ -16917,6 +16843,8 @@ metadata: name: grafana-datasources namespace: otel-demo labels: + + app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo grafana_datasource: "1" @@ -16999,6 +16927,8 @@ metadata: name: product-catalog-products namespace: otel-demo labels: + + app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo data: @@ -17586,7 +17516,9 @@ kind: Service metadata: name: ad labels: - opentelemetry.io/name: ad + + opentelemetry.io/name: ad + app.kubernetes.io/component: ad app.kubernetes.io/name: ad app.kubernetes.io/version: "2.1.3" @@ -17598,6 +17530,7 @@ spec: name: tcp-service targetPort: 8080 selector: + opentelemetry.io/name: ad --- # Source: opentelemetry-demo/templates/component.yaml @@ -17605,8 +17538,10 @@ apiVersion: v1 kind: Service metadata: name: cart - labels: + labels: + opentelemetry.io/name: cart + app.kubernetes.io/component: cart app.kubernetes.io/name: cart app.kubernetes.io/version: "2.1.3" @@ -17618,6 +17553,7 @@ spec: name: tcp-service targetPort: 8080 selector: + opentelemetry.io/name: cart --- # Source: opentelemetry-demo/templates/component.yaml @@ -17626,7 +17562,9 @@ kind: Service metadata: name: checkout labels: + opentelemetry.io/name: checkout + app.kubernetes.io/component: checkout app.kubernetes.io/name: checkout app.kubernetes.io/version: "2.1.3" @@ -17638,6 +17576,7 @@ spec: name: tcp-service targetPort: 8080 selector: + opentelemetry.io/name: checkout --- # Source: opentelemetry-demo/templates/component.yaml @@ -17646,7 +17585,9 @@ kind: Service metadata: name: currency labels: - opentelemetry.io/name: currency + + opentelemetry.io/name: currency + app.kubernetes.io/component: currency app.kubernetes.io/name: currency app.kubernetes.io/version: "2.1.3" @@ -17657,7 +17598,8 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: + selector: + opentelemetry.io/name: currency --- # Source: opentelemetry-demo/templates/component.yaml @@ -17665,8 +17607,10 @@ apiVersion: v1 kind: Service metadata: name: email - labels: - opentelemetry.io/name: email + labels: + + opentelemetry.io/name: email + app.kubernetes.io/component: email app.kubernetes.io/name: email app.kubernetes.io/version: "2.1.3" @@ -17677,7 +17621,8 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: + selector: + opentelemetry.io/name: email --- # Source: opentelemetry-demo/templates/component.yaml @@ -17685,8 +17630,10 @@ apiVersion: v1 kind: Service metadata: name: flagd - labels: - opentelemetry.io/name: flagd + labels: + + opentelemetry.io/name: flagd + app.kubernetes.io/component: flagd app.kubernetes.io/name: flagd app.kubernetes.io/version: "2.1.3" @@ -17703,7 +17650,8 @@ spec: - port: 4000 name: tcp-service-0 targetPort: 4000 - selector: + selector: + opentelemetry.io/name: flagd --- # Source: opentelemetry-demo/templates/component.yaml @@ -17711,8 +17659,10 @@ apiVersion: v1 kind: Service metadata: name: frontend - labels: - opentelemetry.io/name: frontend + labels: + + opentelemetry.io/name: frontend + app.kubernetes.io/component: frontend app.kubernetes.io/name: frontend app.kubernetes.io/version: "2.1.3" @@ -17723,7 +17673,8 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: + selector: + opentelemetry.io/name: frontend --- # Source: opentelemetry-demo/templates/component.yaml @@ -17731,8 +17682,10 @@ apiVersion: v1 kind: Service metadata: name: frontend-proxy - labels: - opentelemetry.io/name: frontend-proxy + labels: + + opentelemetry.io/name: frontend-proxy + app.kubernetes.io/component: frontend-proxy app.kubernetes.io/name: frontend-proxy app.kubernetes.io/version: "2.1.3" @@ -17743,7 +17696,8 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: + selector: + opentelemetry.io/name: frontend-proxy --- # Source: opentelemetry-demo/templates/component.yaml @@ -17751,8 +17705,10 @@ apiVersion: v1 kind: Service metadata: name: image-provider - labels: - opentelemetry.io/name: image-provider + labels: + + opentelemetry.io/name: image-provider + app.kubernetes.io/component: image-provider app.kubernetes.io/name: image-provider app.kubernetes.io/version: "2.1.3" @@ -17763,7 +17719,8 @@ spec: - port: 8081 name: tcp-service targetPort: 8081 - selector: + selector: + opentelemetry.io/name: image-provider --- # Source: opentelemetry-demo/templates/component.yaml @@ -17771,8 +17728,10 @@ apiVersion: v1 kind: Service metadata: name: kafka - labels: - opentelemetry.io/name: kafka + labels: + + opentelemetry.io/name: kafka + app.kubernetes.io/component: kafka app.kubernetes.io/name: kafka app.kubernetes.io/version: "2.1.3" @@ -17786,7 +17745,8 @@ spec: - port: 9093 name: controller targetPort: 9093 - selector: + selector: + opentelemetry.io/name: kafka --- # Source: opentelemetry-demo/templates/component.yaml @@ -17794,8 +17754,10 @@ apiVersion: v1 kind: Service metadata: name: load-generator - labels: - opentelemetry.io/name: load-generator + labels: + + opentelemetry.io/name: load-generator + app.kubernetes.io/component: load-generator app.kubernetes.io/name: load-generator app.kubernetes.io/version: "2.1.3" @@ -17806,7 +17768,8 @@ spec: - port: 8089 name: tcp-service targetPort: 8089 - selector: + selector: + opentelemetry.io/name: load-generator --- # Source: opentelemetry-demo/templates/component.yaml @@ -17814,8 +17777,10 @@ apiVersion: v1 kind: Service metadata: name: payment - labels: - opentelemetry.io/name: payment + labels: + + opentelemetry.io/name: payment + app.kubernetes.io/component: payment app.kubernetes.io/name: payment app.kubernetes.io/version: "2.1.3" @@ -17826,7 +17791,8 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: + selector: + opentelemetry.io/name: payment --- # Source: opentelemetry-demo/templates/component.yaml @@ -17834,8 +17800,10 @@ apiVersion: v1 kind: Service metadata: name: postgresql - labels: - opentelemetry.io/name: postgresql + labels: + + opentelemetry.io/name: postgresql + app.kubernetes.io/component: postgresql app.kubernetes.io/name: postgresql app.kubernetes.io/version: "2.1.3" @@ -17846,7 +17814,8 @@ spec: - port: 5432 name: tcp-service targetPort: 5432 - selector: + selector: + opentelemetry.io/name: postgresql --- # Source: opentelemetry-demo/templates/component.yaml @@ -17854,8 +17823,10 @@ apiVersion: v1 kind: Service metadata: name: product-catalog - labels: - opentelemetry.io/name: product-catalog + labels: + + opentelemetry.io/name: product-catalog + app.kubernetes.io/component: product-catalog app.kubernetes.io/name: product-catalog app.kubernetes.io/version: "2.1.3" @@ -17866,7 +17837,8 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: + selector: + opentelemetry.io/name: product-catalog --- # Source: opentelemetry-demo/templates/component.yaml @@ -17874,8 +17846,10 @@ apiVersion: v1 kind: Service metadata: name: quote - labels: - opentelemetry.io/name: quote + labels: + + opentelemetry.io/name: quote + app.kubernetes.io/component: quote app.kubernetes.io/name: quote app.kubernetes.io/version: "2.1.3" @@ -17886,7 +17860,8 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: + selector: + opentelemetry.io/name: quote --- # Source: opentelemetry-demo/templates/component.yaml @@ -17894,8 +17869,10 @@ apiVersion: v1 kind: Service metadata: name: recommendation - labels: - opentelemetry.io/name: recommendation + labels: + + opentelemetry.io/name: recommendation + app.kubernetes.io/component: recommendation app.kubernetes.io/name: recommendation app.kubernetes.io/version: "2.1.3" @@ -17906,7 +17883,8 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: + selector: + opentelemetry.io/name: recommendation --- # Source: opentelemetry-demo/templates/component.yaml @@ -17914,8 +17892,10 @@ apiVersion: v1 kind: Service metadata: name: shipping - labels: - opentelemetry.io/name: shipping + labels: + + opentelemetry.io/name: shipping + app.kubernetes.io/component: shipping app.kubernetes.io/name: shipping app.kubernetes.io/version: "2.1.3" @@ -17926,7 +17906,8 @@ spec: - port: 8080 name: tcp-service targetPort: 8080 - selector: + selector: + opentelemetry.io/name: shipping --- # Source: opentelemetry-demo/templates/component.yaml @@ -17934,8 +17915,10 @@ apiVersion: v1 kind: Service metadata: name: valkey-cart - labels: - opentelemetry.io/name: valkey-cart + labels: + + opentelemetry.io/name: valkey-cart + app.kubernetes.io/component: valkey-cart app.kubernetes.io/name: valkey-cart app.kubernetes.io/version: "2.1.3" @@ -17946,7 +17929,8 @@ spec: - port: 6379 name: valkey-cart targetPort: 6379 - selector: + selector: + opentelemetry.io/name: valkey-cart --- # Source: opentelemetry-demo/charts/grafana/templates/deployment.yaml @@ -17957,10 +17941,8 @@ metadata: namespace: otel-demo labels: app.kubernetes.io/name: grafana - app.kubernetes.io/part-of: grafana app.kubernetes.io/instance: opentelemetry-demo app.kubernetes.io/version: "12.1.1" - app.openshift.io/runtime: golang spec: replicas: 1 revisionHistoryLimit: 10 @@ -18221,13 +18203,11 @@ metadata: name: jaeger labels: app.kubernetes.io/name: jaeger - app.kubernetes.io/part-of: jaegger app.kubernetes.io/instance: opentelemetry-demo app.kubernetes.io/version: "1.53.0" app.kubernetes.io/component: all-in-one prometheus.io/port: "14269" prometheus.io/scrape: "true" - app.openshift.io/runtime: golang spec: replicas: 1 strategy: @@ -18246,7 +18226,8 @@ spec: annotations: prometheus.io/port: "14269" prometheus.io/scrape: "true" - spec: + spec: + containers: - env: - name: METRICS_STORAGE_TYPE @@ -18256,7 +18237,8 @@ spec: - name: COLLECTOR_OTLP_HTTP_HOST_PORT value: 0.0.0.0:4318 - name: SPAN_STORAGE_TYPE - value: memory + value: memory + - name: COLLECTOR_ZIPKIN_HOST_PORT value: :9411 - name: JAEGER_DISABLED @@ -18336,7 +18318,6 @@ metadata: app.kubernetes.io/version: "0.135.0" app.kubernetes.io/part-of: opentelemetry-collector app.kubernetes.io/component: standalone-collector - app.openshift.io/runtime: golang spec: replicas: 1 revisionHistoryLimit: 10 @@ -18356,8 +18337,10 @@ spec: labels: app.kubernetes.io/name: opentelemetry-collector app.kubernetes.io/instance: opentelemetry-demo - component: standalone-collector - spec: + component: standalone-collector + + spec: + serviceAccountName: otel-collector automountServiceAccountToken: true securityContext: @@ -18370,7 +18353,8 @@ spec: {} image: "otel/opentelemetry-collector-contrib:0.135.0" imagePullPolicy: IfNotPresent - ports: + ports: + - name: jaeger-compact containerPort: 6831 protocol: UDP @@ -18433,7 +18417,6 @@ metadata: app.kubernetes.io/instance: opentelemetry-demo app.kubernetes.io/version: v3.6.0 app.kubernetes.io/part-of: prometheus - app.openshift.io/runtime: golang name: prometheus namespace: otel-demo spec: @@ -18454,7 +18437,7 @@ spec: app.kubernetes.io/name: prometheus app.kubernetes.io/instance: opentelemetry-demo app.kubernetes.io/version: v3.6.0 - app.openshift.io/runtime: prometheus + app.kubernetes.io/part-of: prometheus spec: enableServiceLinks: true serviceAccountName: prometheus @@ -18495,7 +18478,7 @@ spec: successThreshold: 1 resources: limits: - memory: 1Gi + memory: 300Mi volumeMounts: - name: config-volume mountPath: /etc/config @@ -18522,23 +18505,27 @@ apiVersion: apps/v1 kind: Deployment metadata: name: accounting - labels: - opentelemetry.io/name: accounting + labels: + + opentelemetry.io/name: accounting + app.kubernetes.io/component: accounting app.kubernetes.io/name: accounting app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: + matchLabels: + opentelemetry.io/name: accounting template: metadata: - labels: - opentelemetry.io/name: accounting + labels: + + opentelemetry.io/name: accounting + app.kubernetes.io/component: accounting app.kubernetes.io/name: accounting spec: @@ -18585,13 +18572,14 @@ apiVersion: apps/v1 kind: Deployment metadata: name: ad - labels: - opentelemetry.io/name: ad + labels: + + opentelemetry.io/name: ad + app.kubernetes.io/component: ad app.kubernetes.io/name: ad app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 @@ -18658,7 +18646,6 @@ metadata: app.kubernetes.io/name: cart app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: dotnet spec: replicas: 1 revisionHistoryLimit: 10 @@ -18727,13 +18714,14 @@ apiVersion: apps/v1 kind: Deployment metadata: name: checkout - labels: - opentelemetry.io/name: checkout + labels: + + opentelemetry.io/name: checkout + app.kubernetes.io/component: checkout app.kubernetes.io/name: checkout app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 @@ -18743,8 +18731,10 @@ spec: opentelemetry.io/name: checkout template: metadata: - labels: - opentelemetry.io/name: checkout + labels: + + opentelemetry.io/name: checkout + app.kubernetes.io/component: checkout app.kubernetes.io/name: checkout spec: @@ -18811,23 +18801,27 @@ apiVersion: apps/v1 kind: Deployment metadata: name: currency - labels: - opentelemetry.io/name: currency + labels: + + opentelemetry.io/name: currency + app.kubernetes.io/component: currency app.kubernetes.io/name: currency app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: + matchLabels: + opentelemetry.io/name: currency template: metadata: - labels: - opentelemetry.io/name: currency + labels: + + opentelemetry.io/name: currency + app.kubernetes.io/component: currency app.kubernetes.io/name: currency spec: @@ -18869,23 +18863,27 @@ apiVersion: apps/v1 kind: Deployment metadata: name: email - labels: - opentelemetry.io/name: email + labels: + + opentelemetry.io/name: email + app.kubernetes.io/component: email app.kubernetes.io/name: email app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: ruby spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: + matchLabels: + opentelemetry.io/name: email template: metadata: - labels: - opentelemetry.io/name: email + labels: + + opentelemetry.io/name: email + app.kubernetes.io/component: email app.kubernetes.io/name: email spec: @@ -18931,13 +18929,14 @@ apiVersion: apps/v1 kind: Deployment metadata: name: flagd - labels: - opentelemetry.io/name: flagd + labels: + + opentelemetry.io/name: flagd + app.kubernetes.io/component: flagd app.kubernetes.io/name: flagd app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: golang spec: replicas: 1 revisionHistoryLimit: 10 @@ -19057,23 +19056,27 @@ apiVersion: apps/v1 kind: Deployment metadata: name: fraud-detection - labels: - opentelemetry.io/name: fraud-detection + labels: + + opentelemetry.io/name: fraud-detection + app.kubernetes.io/component: fraud-detection app.kubernetes.io/name: fraud-detection app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: + matchLabels: + opentelemetry.io/name: fraud-detection template: metadata: - labels: - opentelemetry.io/name: fraud-detection + labels: + + opentelemetry.io/name: fraud-detection + app.kubernetes.io/component: fraud-detection app.kubernetes.io/name: fraud-detection spec: @@ -19124,23 +19127,27 @@ apiVersion: apps/v1 kind: Deployment metadata: name: frontend - labels: - opentelemetry.io/name: frontend + labels: + + opentelemetry.io/name: frontend + app.kubernetes.io/component: frontend app.kubernetes.io/name: frontend app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: nodejs spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: + matchLabels: + opentelemetry.io/name: frontend template: metadata: - labels: - opentelemetry.io/name: frontend + labels: + + opentelemetry.io/name: frontend + app.kubernetes.io/component: frontend app.kubernetes.io/name: frontend spec: @@ -19149,7 +19156,8 @@ spec: - name: frontend image: 'ghcr.io/open-telemetry/demo:2.1.3-frontend' imagePullPolicy: IfNotPresent - ports: + ports: + - containerPort: 8080 name: service env: @@ -19213,13 +19221,14 @@ apiVersion: apps/v1 kind: Deployment metadata: name: frontend-proxy - labels: - opentelemetry.io/name: frontend-proxy + labels: + + opentelemetry.io/name: frontend-proxy + app.kubernetes.io/component: frontend-proxy app.kubernetes.io/name: frontend-proxy app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: nginx spec: replicas: 1 revisionHistoryLimit: 10 @@ -19310,18 +19319,20 @@ apiVersion: apps/v1 kind: Deployment metadata: name: image-provider - labels: - opentelemetry.io/name: image-provider + labels: + + opentelemetry.io/name: image-provider + app.kubernetes.io/component: image-provider app.kubernetes.io/name: image-provider app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: nodejs spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: + matchLabels: + opentelemetry.io/name: image-provider template: metadata: @@ -19370,23 +19381,27 @@ apiVersion: apps/v1 kind: Deployment metadata: name: kafka - labels: - opentelemetry.io/name: kafka + labels: + + opentelemetry.io/name: kafka + app.kubernetes.io/component: kafka app.kubernetes.io/name: kafka app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: + matchLabels: + opentelemetry.io/name: kafka template: metadata: - labels: - opentelemetry.io/name: kafka + labels: + + opentelemetry.io/name: kafka + app.kubernetes.io/component: kafka app.kubernetes.io/name: kafka spec: @@ -19395,7 +19410,8 @@ spec: - name: kafka image: 'ghcr.io/open-telemetry/demo:2.1.3-kafka' imagePullPolicy: IfNotPresent - ports: + ports: + - containerPort: 9092 name: plaintext - containerPort: 9093 @@ -19439,13 +19455,14 @@ apiVersion: apps/v1 kind: Deployment metadata: name: load-generator - labels: - opentelemetry.io/name: load-generator + labels: + + opentelemetry.io/name: load-generator + app.kubernetes.io/component: load-generator app.kubernetes.io/name: load-generator app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: python spec: replicas: 1 revisionHistoryLimit: 10 @@ -19455,8 +19472,10 @@ spec: opentelemetry.io/name: load-generator template: metadata: - labels: - opentelemetry.io/name: load-generator + labels: + + opentelemetry.io/name: load-generator + app.kubernetes.io/component: load-generator app.kubernetes.io/name: load-generator spec: @@ -19518,23 +19537,27 @@ apiVersion: apps/v1 kind: Deployment metadata: name: payment - labels: - opentelemetry.io/name: payment + labels: + + opentelemetry.io/name: payment + app.kubernetes.io/component: payment app.kubernetes.io/name: payment app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: + matchLabels: + opentelemetry.io/name: payment template: metadata: - labels: - opentelemetry.io/name: payment + labels: + + opentelemetry.io/name: payment + app.kubernetes.io/component: payment app.kubernetes.io/name: payment spec: @@ -19543,7 +19566,8 @@ spec: - name: payment image: 'ghcr.io/open-telemetry/demo:2.1.3-payment' imagePullPolicy: IfNotPresent - ports: + ports: + - containerPort: 8080 name: service env: @@ -19581,9 +19605,20144 @@ apiVersion: apps/v1 kind: Deployment metadata: name: postgresql - labels: - opentelemetry.io/name: postgresql - app.kubernetes.io/component: postgresql + labels: + + opentelemetry.io/name: postgresql + + app.kubernetes.io/component: postgresql + app.kubernetes.io/name: postgresql + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: postgresql + template: + metadata: + labels: + + opentelemetry.io/name: postgresql + + app.kubernetes.io/component: postgresql + app.kubernetes.io/name: postgresql + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: postgresql + image: 'ghcr.io/open-telemetry/demo:2.1.3-postgresql' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 5432 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: POSTGRES_USER + value: root + - name: POSTGRES_PASSWORD + value: otel + - name: POSTGRES_DB + value: otel + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 100Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: product-catalog + labels: + + opentelemetry.io/name: product-catalog + + app.kubernetes.io/component: product-catalog + app.kubernetes.io/name: product-catalog + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: product-catalog + template: + metadata: + labels: + + opentelemetry.io/name: product-catalog + + app.kubernetes.io/component: product-catalog + app.kubernetes.io/name: product-catalog + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: product-catalog + image: 'ghcr.io/open-telemetry/demo:2.1.3-product-catalog' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: PRODUCT_CATALOG_PORT + value: "8080" + - name: PRODUCT_CATALOG_RELOAD_INTERVAL + value: "10" + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: GOMEMLIMIT + value: 16MiB + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 20Mi + volumeMounts: + - name: product-catalog-products + mountPath: /usr/src/app/products + volumes: + - name: product-catalog-products + configMap: + name: product-catalog-products +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: quote + labels: + + opentelemetry.io/name: quote + + app.kubernetes.io/component: quote + app.kubernetes.io/name: quote + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: quote + template: + metadata: + labels: + + opentelemetry.io/name: quote + + app.kubernetes.io/component: quote + app.kubernetes.io/name: quote + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: quote + image: 'ghcr.io/open-telemetry/demo:2.1.3-quote' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: QUOTE_PORT + value: "8080" + - name: OTEL_PHP_AUTOLOAD_ENABLED + value: "true" + - name: OTEL_PHP_INTERNAL_METRICS_ENABLED + value: "true" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4318 + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 40Mi + securityContext: + runAsGroup: 33 + runAsNonRoot: true + runAsUser: 33 + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: recommendation + labels: + + opentelemetry.io/name: recommendation + + app.kubernetes.io/component: recommendation + app.kubernetes.io/name: recommendation + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: recommendation + template: + metadata: + labels: + + opentelemetry.io/name: recommendation + + app.kubernetes.io/component: recommendation + app.kubernetes.io/name: recommendation + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: recommendation + image: 'ghcr.io/open-telemetry/demo:2.1.3-recommendation' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: RECOMMENDATION_PORT + value: "8080" + - name: PRODUCT_CATALOG_ADDR + value: product-catalog:8080 + - name: OTEL_PYTHON_LOG_CORRELATION + value: "true" + - name: PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION + value: python + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 500Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: shipping + labels: + + opentelemetry.io/name: shipping + + app.kubernetes.io/component: shipping + app.kubernetes.io/name: shipping + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: shipping + template: + metadata: + labels: + + opentelemetry.io/name: shipping + + app.kubernetes.io/component: shipping + app.kubernetes.io/name: shipping + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: shipping + image: 'ghcr.io/open-telemetry/demo:2.1.3-shipping' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: SHIPPING_PORT + value: "8080" + - name: QUOTE_ADDR + value: http://quote:8080 + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 20Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: valkey-cart + labels: + + opentelemetry.io/name: valkey-cart + + app.kubernetes.io/component: valkey-cart + app.kubernetes.io/name: valkey-cart + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: valkey-cart + template: + metadata: + labels: + + opentelemetry.io/name: valkey-cart + + app.kubernetes.io/component: valkey-cart + app.kubernetes.io/name: valkey-cart + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: valkey-cart + image: 'valkey/valkey:8.1.3-alpine' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 6379 + name: valkey-cart + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 20Mi + securityContext: + runAsGroup: 1000 + runAsNonRoot: true + runAsUser: 999 + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/charts/opensearch/templates/statefulset.yaml +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: opensearch + labels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "3.2.0" + app.kubernetes.io/component: opensearch + annotations: + majorVersion: "3" +spec: + serviceName: opensearch-headless + selector: + matchLabels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + replicas: 1 + podManagementPolicy: Parallel + updateStrategy: + type: RollingUpdate + template: + metadata: + name: "opensearch" + labels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "3.2.0" + app.kubernetes.io/component: opensearch + annotations: + configchecksum: d3638c66a58383c65ae664111c0e7d56d245f2d612896ddc8e6ade4253b8c9b + spec: + securityContext: + fsGroup: 1000 + runAsUser: 1000 + automountServiceAccountToken: false + affinity: + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 1 + podAffinityTerm: + topologyKey: kubernetes.io/hostname + labelSelector: + matchExpressions: + - key: app.kubernetes.io/instance + operator: In + values: + - opentelemetry-demo + - key: app.kubernetes.io/name + operator: In + values: + - opensearch + terminationGracePeriodSeconds: 120 + volumes: + - name: config + configMap: + name: opensearch-config + - emptyDir: {} + name: config-emptydir + enableServiceLinks: true + initContainers: + - name: configfile + image: "opensearchproject/opensearch:3.2.0" + imagePullPolicy: "IfNotPresent" + command: + - sh + - -c + - | + #!/usr/bin/env bash + cp -r /tmp/configfolder/* /tmp/config/ + securityContext: + capabilities: + drop: + - ALL + runAsNonRoot: true + runAsUser: 1000 + resources: + {} + volumeMounts: + - mountPath: /tmp/config/ + name: config-emptydir + - name: config + mountPath: /tmp/configfolder/opensearch.yml + subPath: opensearch.yml + containers: + - name: "opensearch" + securityContext: + capabilities: + drop: + - ALL + runAsNonRoot: true + runAsUser: 1000 + + image: "opensearchproject/opensearch:3.2.0" + imagePullPolicy: "IfNotPresent" + readinessProbe: + failureThreshold: 3 + periodSeconds: 5 + tcpSocket: + port: 9200 + timeoutSeconds: 3 + startupProbe: + failureThreshold: 30 + initialDelaySeconds: 5 + periodSeconds: 10 + tcpSocket: + port: 9200 + timeoutSeconds: 3 + ports: + - name: http + containerPort: 9200 + - name: transport + containerPort: 9300 + - name: metrics + containerPort: 9600 + resources: + limits: + memory: 1100Mi + requests: + cpu: 1000m + memory: 100Mi + env: + - name: node.name + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: discovery.seed_hosts + value: "opensearch-cluster-master-headless" + - name: cluster.name + value: "demo-cluster" + - name: network.host + value: "0.0.0.0" + - name: OPENSEARCH_JAVA_OPTS + value: "-Xms400m -Xmx400m" + - name: node.roles + value: "master,ingest,data,remote_cluster_client,# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 +# This file is generated by 'make generate-kubernetes-manifests' +--- +apiVersion: v1 +kind: Namespace +metadata: + name: otel-demo +--- +# Source: opentelemetry-demo/charts/opensearch/templates/poddisruptionbudget.yaml +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: "opensearch-pdb" + labels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "3.2.0" + app.kubernetes.io/component: opensearch +spec: + maxUnavailable: 1 + selector: + matchLabels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo +--- +# Source: opentelemetry-demo/charts/grafana/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +automountServiceAccountToken: false +metadata: + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" + name: grafana + namespace: otel-demo +--- +# Source: opentelemetry-demo/charts/jaeger/templates/allinone-sa.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: jaeger + labels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "1.53.0" + app.kubernetes.io/component: all-in-one +automountServiceAccountToken: true +--- +# Source: opentelemetry-demo/charts/opentelemetry-collector/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: otel-collector + namespace: otel-demo + labels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "0.135.0" + app.kubernetes.io/part-of: opentelemetry-collector + app.kubernetes.io/component: standalone-collector +--- +# Source: opentelemetry-demo/charts/prometheus/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: v3.6.0 + app.kubernetes.io/part-of: prometheus + name: prometheus + namespace: otel-demo + annotations: + {} +--- +# Source: opentelemetry-demo/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: opentelemetry-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +--- +# Source: opentelemetry-demo/charts/grafana/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + name: grafana + namespace: otel-demo + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" +type: Opaque +data: + + admin-user: "YWRtaW4=" + admin-password: "YWRtaW4=" + ldap-toml: "" +--- +# Source: opentelemetry-demo/charts/grafana/templates/configmap-dashboard-provider.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" + name: grafana-config-dashboards + namespace: otel-demo +data: + provider.yaml: |- + apiVersion: 1 + providers: + - name: 'sidecarProvider' + orgId: 1 + folder: '' + folderUid: '' + type: file + disableDeletion: false + allowUiUpdates: false + updateIntervalSeconds: 30 + options: + foldersFromFilesStructure: false + path: /tmp/dashboards +--- +# Source: opentelemetry-demo/charts/grafana/templates/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana + namespace: otel-demo + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" +data: + + plugins: grafana-opensearch-datasource + grafana.ini: | + [analytics] + check_for_updates = true + [auth] + disable_login_form = true + [auth.anonymous] + enabled = true + org_name = Main Org. + org_role = Admin + [grafana_net] + url = https://grafana.net + [log] + mode = console + [paths] + data = /var/lib/grafana/ + logs = /var/log/grafana + plugins = /var/lib/grafana/plugins + provisioning = /etc/grafana/provisioning + [server] + domain = '' + root_url = %(protocol)s://%(domain)s:%(http_port)s/grafana + serve_from_sub_path = true +--- +# Source: opentelemetry-demo/charts/opensearch/templates/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: opensearch-config + labels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "3.2.0" + app.kubernetes.io/component: opensearch +data: + opensearch.yml: | + cluster.name: opensearch-cluster + + # Bind to all interfaces because we don't know what IP address Docker will assign to us. + network.host: 0.0.0.0 + + # Setting network.host to a non-loopback address enables the annoying bootstrap checks. "Single-node" mode disables them again. + # Implicitly done if ".singleNode" is set to "true". + # discovery.type: single-node + + # Start OpenSearch Security Demo Configuration + # WARNING: revise all the lines below before you go into production + # plugins: + # security: + # ssl: + # transport: + # pemcert_filepath: esnode.pem + # pemkey_filepath: esnode-key.pem + # pemtrustedcas_filepath: root-ca.pem + # enforce_hostname_verification: false + # http: + # enabled: true + # pemcert_filepath: esnode.pem + # pemkey_filepath: esnode-key.pem + # pemtrustedcas_filepath: root-ca.pem + # allow_unsafe_democertificates: true + # allow_default_init_securityindex: true + # authcz: + # admin_dn: + # - CN=kirk,OU=client,O=client,L=test,C=de + # audit.type: internal_opensearch + # enable_snapshot_restore_privilege: true + # check_snapshot_restore_write_privileges: true + # restapi: + # roles_enabled: ["all_access", "security_rest_api_access"] + # system_indices: + # enabled: true + # indices: + # [ + # ".opendistro-alerting-config", + # ".opendistro-alerting-alert*", + # ".opendistro-anomaly-results*", + # ".opendistro-anomaly-detector*", + # ".opendistro-anomaly-checkpoints", + # ".opendistro-anomaly-detection-state", + # ".opendistro-reports-*", + # ".opendistro-notifications-*", + # ".opendistro-notebooks", + # ".opendistro-asynchronous-search-response*", + # ] + ######## End OpenSearch Security Demo Configuration ######## +--- +# Source: opentelemetry-demo/charts/opentelemetry-collector/templates/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: otel-collector + namespace: otel-demo + labels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "0.135.0" + app.kubernetes.io/part-of: opentelemetry-collector + app.kubernetes.io/component: standalone-collector +data: + relay: | + connectors: + spanmetrics: {} + exporters: + debug: {} + opensearch: + http: + endpoint: http://opensearch:9200 + tls: + insecure: true + logs_index: otel-logs + logs_index_time_format: yyyy-MM-dd + otlp: + endpoint: jaeger-collector:4317 + tls: + insecure: true + otlphttp/prometheus: + endpoint: http://prometheus:9090/api/v1/otlp + tls: + insecure: true + extensions: + health_check: + endpoint: ${env:MY_POD_IP}:13133 + processors: + batch: {} + k8sattributes: + extract: + metadata: + - k8s.namespace.name + - k8s.deployment.name + - k8s.statefulset.name + - k8s.daemonset.name + - k8s.cronjob.name + - k8s.job.name + - k8s.node.name + - k8s.pod.name + - k8s.pod.uid + - k8s.pod.start_time + passthrough: false + pod_association: + - sources: + - from: resource_attribute + name: k8s.pod.ip + - sources: + - from: resource_attribute + name: k8s.pod.uid + - sources: + - from: connection + memory_limiter: + check_interval: 5s + limit_percentage: 80 + spike_limit_percentage: 25 + resource: + attributes: + - action: insert + from_attribute: k8s.pod.uid + key: service.instance.id + resourcedetection: + detectors: + - env + - system + transform: + error_mode: ignore + trace_statements: + - context: span + statements: + - replace_pattern(name, "\\?.*", "") + - replace_match(name, "GET /api/products/*", "GET /api/products/{productId}") + receivers: + httpcheck/frontend-proxy: + targets: + - endpoint: http://frontend-proxy:8080 + jaeger: + protocols: + grpc: + endpoint: ${env:MY_POD_IP}:14250 + thrift_compact: + endpoint: ${env:MY_POD_IP}:6831 + thrift_http: + endpoint: ${env:MY_POD_IP}:14268 + nginx: + collection_interval: 10s + endpoint: http://image-provider:8081/status + otlp: + protocols: + grpc: + endpoint: ${env:MY_POD_IP}:4317 + http: + cors: + allowed_origins: + - http://* + - https://* + endpoint: ${env:MY_POD_IP}:4318 + postgresql: + endpoint: postgresql:5432 + metrics: + postgresql.blks_hit: + enabled: true + postgresql.blks_read: + enabled: true + postgresql.deadlocks: + enabled: true + postgresql.tup_deleted: + enabled: true + postgresql.tup_fetched: + enabled: true + postgresql.tup_inserted: + enabled: true + postgresql.tup_returned: + enabled: true + postgresql.tup_updated: + enabled: true + password: otel + tls: + insecure: true + username: root + prometheus: + config: + scrape_configs: + - job_name: opentelemetry-collector + scrape_interval: 10s + static_configs: + - targets: + - ${env:MY_POD_IP}:8888 + redis: + collection_interval: 10s + endpoint: valkey-cart:6379 + username: valkey + zipkin: + endpoint: ${env:MY_POD_IP}:9411 + service: + extensions: + - health_check + pipelines: + logs: + exporters: + - opensearch + - debug + processors: + - k8sattributes + - memory_limiter + - resourcedetection + - resource + - batch + receivers: + - otlp + metrics: + exporters: + - otlphttp/prometheus + - debug + processors: + - k8sattributes + - memory_limiter + - resourcedetection + - resource + - batch + receivers: + - httpcheck/frontend-proxy + - nginx + - otlp + - postgresql + - redis + - spanmetrics + traces: + exporters: + - otlp + - debug + - spanmetrics + processors: + - k8sattributes + - memory_limiter + - resourcedetection + - resource + - transform + - batch + receivers: + - otlp + - jaeger + - zipkin + telemetry: + metrics: + level: detailed + readers: + - periodic: + exporter: + otlp: + endpoint: otel-collector:4318 + protocol: http/protobuf + interval: 10000 + timeout: 5000 +--- +# Source: opentelemetry-demo/charts/prometheus/templates/cm.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: v3.6.0 + app.kubernetes.io/part-of: prometheus + name: prometheus + namespace: otel-demo +data: + allow-snippet-annotations: "false" + alerting_rules.yml: | + {} + alerts: | + {} + prometheus.yml: | + global: + evaluation_interval: 1m + scrape_interval: 1m + scrape_timeout: 10s + storage: + tsdb: + out_of_order_time_window: 30m + otlp: + keep_identifying_resource_attributes: true + promote_resource_attributes: + - service.instance.id + - service.name + - service.namespace + - service.version + - cloud.availability_zone + - cloud.region + - deployment.environment.name + - k8s.cluster.name + - k8s.container.name + - k8s.cronjob.name + - k8s.daemonset.name + - k8s.deployment.name + - k8s.job.name + - k8s.namespace.name + - k8s.node.name + - k8s.pod.name + - k8s.replicaset.name + - k8s.statefulset.name + - container.name + - host.name + - postgresql.database.name + - postgresql.schema.name + - postgresql.table.name + - postgresql.index.name + 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 + - 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 + - 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 + - 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 + - honor_labels: 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: drop + 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_annotation_prometheus_io_param_(.+) + replacement: __param_$1 + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - action: replace + source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - action: replace + source_labels: + - __meta_kubernetes_service_name + target_label: service + - action: replace + source_labels: + - __meta_kubernetes_pod_node_name + target_label: node + - honor_labels: true + 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_annotation_prometheus_io_param_(.+) + replacement: __param_$1 + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - action: replace + source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - action: replace + source_labels: + - __meta_kubernetes_service_name + target_label: service + - action: replace + source_labels: + - __meta_kubernetes_pod_node_name + target_label: 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 + - honor_labels: true + 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: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - honor_labels: true + 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: drop + 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+);(([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}) + replacement: '[$2]:$1' + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_port + - __meta_kubernetes_pod_ip + target_label: __address__ + - action: replace + regex: (\d+);((([0-9]+?)(\.|$)){4}) + replacement: $2:$1 + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_port + - __meta_kubernetes_pod_ip + target_label: __address__ + - action: labelmap + regex: __meta_kubernetes_pod_annotation_prometheus_io_param_(.+) + replacement: __param_$1 + - action: labelmap + regex: __meta_kubernetes_pod_label_(.+) + - action: replace + source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - action: replace + source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - action: drop + regex: Pending|Succeeded|Failed|Completed + source_labels: + - __meta_kubernetes_pod_phase + - action: replace + source_labels: + - __meta_kubernetes_pod_node_name + target_label: node + - honor_labels: true + 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+);(([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}) + replacement: '[$2]:$1' + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_port + - __meta_kubernetes_pod_ip + target_label: __address__ + - action: replace + regex: (\d+);((([0-9]+?)(\.|$)){4}) + replacement: $2:$1 + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_port + - __meta_kubernetes_pod_ip + target_label: __address__ + - action: labelmap + regex: __meta_kubernetes_pod_annotation_prometheus_io_param_(.+) + replacement: __param_$1 + - action: labelmap + regex: __meta_kubernetes_pod_label_(.+) + - action: replace + source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - action: replace + source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - action: drop + regex: Pending|Succeeded|Failed|Completed + source_labels: + - __meta_kubernetes_pod_phase + - action: replace + source_labels: + - __meta_kubernetes_pod_node_name + target_label: node + scrape_interval: 5m + scrape_timeout: 30s + recording_rules.yml: | + {} + rules: | + {} +--- +# Source: opentelemetry-demo/templates/flagd-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: flagd-config + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +data: + + demo.flagd.json: | + { + "$schema": "https://flagd.dev/schema/v0/flags.json", + "flags": { + "productCatalogFailure": { + "description": "Fail product catalog service on a specific product", + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off" + }, + "recommendationCacheFailure": { + "description": "Fail recommendation service cache", + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off" + }, + "adManualGc": { + "description": "Triggers full manual garbage collections in the ad service", + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off" + }, + "adHighCpu": { + "description": "Triggers high cpu load in the ad service", + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off" + }, + "adFailure": { + "description": "Fail ad service", + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off" + }, + "kafkaQueueProblems": { + "description": "Overloads Kafka queue while simultaneously introducing a consumer side delay leading to a lag spike", + "state": "ENABLED", + "variants": { + "on": 100, + "off": 0 + }, + "defaultVariant": "off" + }, + "cartFailure": { + "description": "Fail cart service", + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off" + }, + "paymentFailure": { + "description": "Fail payment service charge requests n%", + "state": "ENABLED", + "variants": { + "100%": 1, + "90%": 0.95, + "75%": 0.75, + "50%": 0.5, + "25%": 0.25, + "10%": 0.1, + "off": 0 + }, + "defaultVariant": "off" + }, + "paymentUnreachable": { + "description": "Payment service is unavailable", + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off" + }, + "loadGeneratorFloodHomepage": { + "description": "Flood the frontend with a large amount of requests.", + "state": "ENABLED", + "variants": { + "on": 100, + "off": 0 + }, + "defaultVariant": "off" + }, + "imageSlowLoad": { + "description": "slow loading images in the frontend", + "state": "ENABLED", + "variants": { + "10sec": 10000, + "5sec": 5000, + "off": 0 + }, + "defaultVariant": "off" + } + } + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-alerting + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_alert: "1" +data: + + {} +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-nginx-metrics + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + NGINX-metrics.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 6, + "links": [], + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "The total number of accepted client connections", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 5, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_connections_accepted_total", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Accepted connections", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "The total number of handled connections", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 5, + "x": 5, + "y": 0 + }, + "id": 3, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_connections_handled_total", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "{{__name__}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Connections handled", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "The total number of client requests", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 9, + "x": 10, + "y": 0 + }, + "id": 4, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_requests_total", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "{{__name__}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Total number of client requests", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "The current number of nginx connections by state", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 19, + "x": 0, + "y": 8 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_connections_current", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "{{state}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Number of connections by state", + "type": "timeseries" + } + ], + "preload": false, + "schemaVersion": 41, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "[Image-Provider] NGINX Metrics", + "uid": "6fb665e0-cb81-40a5-bd21-a9485c5477b4", + "version": 1 + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-apm-dashboard + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + apm-dashboard.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "APM dashboard for monitoring OpenTelemetry-based services. \n\nInstrument your applications using OpenTelemetry SDKs and send traces, metrics, and logs to Jaeger for traces, a Prometheus-compatible database for metrics, and OpenSearch for logs. This dashboard provides a centralized view of your application's health and performance. ", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": 5, + "links": [], + "panels": [ + { + "description": "service.namespace=${service_namespace}, service.name=${service_name}, deployment.environment.name=${deployment_environment_name}", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 10, + "x": 0, + "y": 0 + }, + "id": 20, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "

\"OpenTelemetry Service ${service_namespace}/${service_name}

\n", + "mode": "html" + }, + "pluginVersion": "12.1.0", + "title": "", + "type": "text" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Shows the timestamp of the latest metrics received in the past 24h.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "#24292e", + "mode": "fixed" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 3, + "x": 10, + "y": 0 + }, + "hideTimeOverride": true, + "id": 39, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "/^Time$/", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "timestamp(sum by (deployment_environment_name, service_namespace, service_name) (target_info{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}) or absent{})\n", + "interval": "60s", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "timeFrom": "now-24h", + "title": "Latest metrics received", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 2 + }, + "id": 15, + "panels": [], + "title": "Server RED Metrics", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "HTTP & RPC endpoints aggregation on the `http.server.request.duration` & `rpc.server.duration` metrics.\n\nSee https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpserverrequestduration and https://opentelemetry.io/docs/specs/semconv/rpc/rpc-metrics/#metric-rpcserverduration", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMin": 0, + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "log": 10, + "type": "log" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "noValue": "No HTTP or RPC operation", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 0, + "y": 3 + }, + "id": 17, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(\n 0.95,\n sum by (le, deployment_environment_name, service_namespace, service_name) (\n rate(\n http_server_request_duration_seconds_bucket{\n deployment_environment_name=~\"$deployment_environment_name\",\n service_namespace=~\"$service_namespace\",\n service_name=\"$service_name\"\n }[$__rate_interval]\n )\n )\n)", + "fullMetaSearch": false, + "includeNullMetadata": true, + "interval": "60s", + "legendFormat": "HTTP p95", + "range": true, + "refId": "HTTP P95", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "avg by (deployment_environment_name, service_namespace, service_name) (\n rate(\n http_server_request_duration_seconds_sum{\n deployment_environment_name=~\"$deployment_environment_name\",\n service_namespace=~\"$service_namespace\",\n service_name=\"$service_name\"\n }[$__rate_interval]\n )\n)\n/\navg by (deployment_environment_name, service_namespace, service_name) (\n rate(\n http_server_request_duration_seconds_count{\n deployment_environment_name=~\"$deployment_environment_name\",\n service_namespace=~\"$service_namespace\",\n service_name=\"$service_name\"\n }[$__rate_interval]\n )\n)", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "interval": "60s", + "legendFormat": "HTTP avg", + "range": true, + "refId": "HTTP AVG", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "histogram_quantile(\n 0.95,\n sum by (le, deployment_environment_name, service_namespace, service_name) (\n rate(\n rpc_server_duration_milliseconds_bucket{\n deployment_environment_name=~\"$deployment_environment_name\",\n service_namespace=~\"$service_namespace\",\n service_name=\"$service_name\"\n }[$__rate_interval]\n ) / 1000\n )\n)", + "hide": false, + "instant": false, + "interval": "60", + "legendFormat": "RPC p95", + "range": true, + "refId": "RPC P95" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "avg by (deployment_environment_name, service_namespace, service_name) (\n rate(\n rpc_server_duration_milliseconds_sum{\n deployment_environment_name=~\"$deployment_environment_name\",\n service_namespace=~\"$service_namespace\",\n service_name=\"$service_name\"\n }[$__rate_interval]\n ) / 1000\n)\n/\navg by (deployment_environment_name, service_namespace, service_name) (\n rate(\n rpc_server_duration_milliseconds_count{\n deployment_environment_name=~\"$deployment_environment_name\",\n service_namespace=~\"$service_namespace\",\n service_name=\"$service_name\"\n }[$__rate_interval]\n )\n)", + "hide": false, + "instant": false, + "interval": "60", + "legendFormat": "RPC avg", + "range": true, + "refId": "RPC AVG" + } + ], + "title": "Duration", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "HTTP and RPC endpoints aggregation on the `http.server.request.duration` and `rpc.server.duration` metrics. \n\nErrors are identified by : \n* `http.response.status_code=~\"5..\"`\n* `rpc.grpc.status_code!=\"0\"`\n\nSee https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpserverrequestduration\n", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMax": 100, + "axisSoftMin": 0, + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "noValue": "No HTTP or RPC operation", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 5, + "y": 3 + }, + "id": 18, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "(\n (sum by(deployment_environment_name, service_namespace, service_name) (rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\", http_response_status_code=~\"5..\"}[$__rate_interval])) * 100) \n / \n sum by(deployment_environment_name, service_namespace, service_name) (rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]))\n)\nor\n(\n 0\n * \n sum by(deployment_environment_name, service_namespace, service_name) (rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]))\n)", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "interval": "60s", + "legendFormat": "HTTP 5xx errors", + "range": true, + "refId": "HTTP 5xx", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "((sum without (rpc_grpc_status_code, instance) (rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\", rpc_grpc_status_code!=\"0\"}[$__rate_interval])) * 100) / sum without (rpc_grpc_status_code, instance) (rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval])))\nor\n(0 * sum without (rpc_grpc_status_code, instance) (rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval])))", + "hide": false, + "instant": false, + "interval": "60", + "legendFormat": "RPC errors", + "range": true, + "refId": "RPC Err" + } + ], + "title": "Error", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "HTTP & RPC endpoints aggregation on the `http.server.request.duration` & `rpc.server.duration` metrics.\n\nSee https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpserverrequestduration", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMin": 0, + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "log": 10, + "type": "log" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "noValue": "No HTTP or RPC operation", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 5, + "x": 10, + "y": 3 + }, + "id": 19, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "(sum(rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval])) by (deployment_environment_name, service_namespace, service_name)) ", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "HTTP requests", + "range": true, + "refId": "HTTP RPS" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "(sum(rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval])) by (deployment_environment_name, service_namespace, service_name)) * $__interval_ms / 1000", + "hide": false, + "instant": false, + "interval": "60", + "legendFormat": "RPC requests", + "range": true, + "refId": "RPC RPS" + } + ], + "title": "Request Rate", + "type": "timeseries" + }, + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 9, + "x": 15, + "y": 3 + }, + "id": 40, + "options": { + "alertInstanceLabelFilter": "{service_name=\"$service_name\", service_namespace=\"$service_namespace\"}", + "alertName": "", + "dashboardAlerts": false, + "groupBy": [], + "groupMode": "default", + "maxItems": 20, + "showInactiveAlerts": false, + "sortOrder": 1, + "stateFilter": { + "error": true, + "firing": true, + "noData": false, + "normal": false, + "pending": true, + "recovering": true + }, + "viewMode": "list" + }, + "pluginVersion": "12.1.0", + "title": "Alerts", + "type": "alertlist" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Inbound HTTP operations of the service (aka HTTP endpoints) based on the `http.server.request.duration` metric.\n\nErrors are identified by `http.response.status_code=~\"5..\"`.\n\nSee https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpserverrequestduration", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "noValue": "No HTTP operation", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Duration (p99)" + }, + "properties": [ + { + "id": "unit", + "value": "s" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Rate" + }, + "properties": [ + { + "id": "unit", + "value": "reqps" + }, + { + "id": "custom.width", + "value": 219 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Error" + }, + "properties": [ + { + "id": "unit", + "value": "percentunit" + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 0, + "y": 9 + }, + "id": 21, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [ + { + "desc": true, + "displayName": "Operation" + } + ] + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "\n sum by (operation) (\n label_join(\n rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"operation\",\n \" \",\n \"http_request_method\",\n \"http_route\"\n )\n )\n ", + "fullMetaSearch": false, + "includeNullMetadata": true, + "interval": "60s", + "legendFormat": "{{operation}}", + "range": true, + "refId": "RPS", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "(\n sum by (operation) (\n label_join(\n rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\", http_response_status_code=~\"5..\"}[$__rate_interval]),\n \"operation\",\n \" \",\n \"http_request_method\",\n \"http_route\"\n )\n )\n / \n sum by (operation) (\n label_join(\n rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"operation\",\n \" \",\n \"http_request_method\",\n \"http_route\"\n )\n )\n ) or (0 * \n sum by (operation) (\n label_join(\n rate(http_server_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"operation\",\n \" \",\n \"http_request_method\",\n \"http_route\"\n )\n )\n )", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "{{operation}}", + "range": true, + "refId": "ERR_PCT" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "\n histogram_quantile(\n 0.99,\n sum by (le, operation) (\n label_join(\n rate(http_server_request_duration_seconds_bucket{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[5m]),\n \"operation\",\n \" \",\n \"http_request_method\",\n \"http_route\"\n )\n )\n )\n ", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "{{operation}}", + "range": true, + "refId": "Duration" + } + ], + "title": "HTTP Operations", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "Duration": { + "timeField": "Time" + }, + "ERR_PCT": { + "timeField": "Time" + }, + "RPS": { + "timeField": "Time" + } + } + }, + { + "id": "joinByField", + "options": { + "byField": "operation", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": { + "Trend #Duration": 1, + "Trend #ERR_PCT": 2, + "Trend #RPS": 3, + "operation": 0 + }, + "renameByName": { + "Trend #Duration": "Duration (p99)", + "Trend #ERR_PCT": "Error", + "Trend #RPS": "Rate", + "operation": "Operation" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "Inbound gRPC operations of the service (aka gRPC endpoints) based on the `rpc.server.request.duration` metric.\n\nErrors are identified by `rpc.grpc.status_code != 0` which make the panel specific to the gRPC protocol.\n\nhttps://opentelemetry.io/docs/specs/semconv/rpc/rpc-metrics/#metric-rpcserverduration", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "noValue": "No RPC operation", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Duration (p99)" + }, + "properties": [ + { + "id": "unit", + "value": "ms" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Rate" + }, + "properties": [ + { + "id": "unit", + "value": "reqps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Error" + }, + "properties": [ + { + "id": "unit", + "value": "percentunit" + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 12, + "y": 9 + }, + "id": 27, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [ + { + "desc": true, + "displayName": "Operation" + } + ] + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "\nsum by (operation) (\n label_join(\n rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"operation\",\n \"/\",\n \"rpc_service\",\n \"rpc_method\"\n )\n)\n ", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "interval": "60s", + "legendFormat": "__auto", + "range": true, + "refId": "RPS", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "(\n sum by (operation) (\n label_join(\n rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\", rpc_grpc_status_code!=\"0\"}[$__rate_interval]),\n \"operation\",\n \"/\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n / \n sum by (operation) (\n label_join(\n rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"operation\",\n \"/\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n ) or (0 * \n sum by (operation) (\n label_join(\n rate(rpc_server_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"operation\",\n \"/\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n )\n ", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "__auto", + "range": true, + "refId": "ERR_PCT" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "\n histogram_quantile(\n 0.99,\n sum by (le, operation) (\n label_join(\n rate(rpc_server_duration_milliseconds_bucket{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[5m]),\n \"operation\",\n \"/\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n )\n ", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "{{operation}}", + "range": true, + "refId": "Duration" + } + ], + "title": "gRPC Operations", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "Duration": { + "timeField": "Time" + }, + "ERR_PCT": { + "timeField": "Time" + }, + "RPS": { + "timeField": "Time" + } + } + }, + { + "id": "joinByField", + "options": { + "byField": "operation", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": { + "Trend #Duration": 1, + "Trend #ERR_PCT": 2, + "Trend #RPS": 3, + "operation": 0 + }, + "renameByName": { + "Trend #Duration": "Duration (p99)", + "Trend #ERR_PCT": "Error", + "Trend #RPS": "Rate", + "operation": "Operation" + } + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 15 + }, + "id": 28, + "panels": [], + "title": "Outbound Services and Databases", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "HTTP calls made by the service based on the `http.client.request.duration` metric.\n\nCalls broken done by remote `server.address` and by `http.request.method`.\n\nSee https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpclientrequestduration", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "noValue": "No HTTP call", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Duration (P99)" + }, + "properties": [ + { + "id": "unit", + "value": "s" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Rate" + }, + "properties": [ + { + "id": "unit", + "value": "reqps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Error" + }, + "properties": [ + { + "id": "unit", + "value": "percentunit" + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 23, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "\n sum by (outbound_service) (\n label_join(\n rate(http_client_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"outbound_service\",\n \" \",\n \"server_address\",\n \"http_request_method\",\n \"url_template\"\n )\n )\n ", + "fullMetaSearch": false, + "includeNullMetadata": true, + "interval": "60s", + "legendFormat": "{{server_address}} {{http_request_method}} {{url_template}}", + "range": true, + "refId": "RPS", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "(\n sum by (outbound_service) (\n label_join(\n rate(http_client_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\", http_response_status_code=~\"5..\"}[$__rate_interval]),\n \"outbound_service\",\n \" \",\n \"server_address\",\n \"http_request_method\",\n \"url_template\"\n )\n )\n / \n sum by (outbound_service) (\n label_join(\n rate(http_client_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"outbound_service\",\n \" \",\n \"server_address\",\n \"http_request_method\",\n \"url_template\"\n )\n )\n ) or (0 * \n sum by (outbound_service) (\n label_join(\n rate(http_client_request_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"outbound_service\",\n \" \",\n \"server_address\",\n \"http_request_method\",\n \"url_template\"\n )\n )\n )", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "{{server_address}} {{http_request_method}} {{url_template}}", + "range": true, + "refId": "ERR_PCT" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "\nhistogram_quantile(\n 0.99,\n sum by (le, outbound_service) (\n label_join(\n rate(http_client_request_duration_seconds_bucket{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[5m]),\n \"outbound_service\",\n \" \",\n \"server_address\",\n \"http_request_method\",\n \"url_template\"\n )\n )\n)", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "{{server_address}} {{http_request_method}} {{url_template}}", + "range": true, + "refId": "DURATION" + } + ], + "title": "Outbound HTTP Services", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "Duration": { + "timeField": "Time" + }, + "ERR_PCT": { + "timeField": "Time" + }, + "RPS": { + "timeField": "Time" + } + } + }, + { + "id": "joinByField", + "options": { + "byField": "outbound_service", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": { + "Trend #DURATION": 1, + "Trend #ERR_PCT": 2, + "Trend #RPS": 3, + "outbound_service": 0 + }, + "renameByName": { + "Trend #DURATION": "Duration (P99)", + "Trend #Duration": "Duration (p99)", + "Trend #ERR_PCT": "Error", + "Trend #RPS": "Rate", + "operation": "Operation", + "outbound_service": "Service" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "DB calls made by the service based on the `db.client.operation.duration` metric.\n\nCalls broken down by `server.address` and `db.namespace`.\n\nSee https://opentelemetry.io/docs/specs/semconv/database/database-metrics/#metric-dbclientoperationduration\n", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "noValue": "No database call", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Duration (P99)" + }, + "properties": [ + { + "id": "unit", + "value": "s" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Rate" + }, + "properties": [ + { + "id": "unit", + "value": "reqps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Error" + }, + "properties": [ + { + "id": "unit", + "value": "percentunit" + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 24, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by (database) (\n label_join(\n rate(db_client_operation_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"database\",\n \"/\",\n \"server_address\",\n \"db_namespace\"\n )\n)\n ", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "interval": "60s", + "legendFormat": "{{server_address}} {{db_namespace}}", + "range": true, + "refId": "RPS", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "(\n sum by (database) (\n label_join(\n rate(db_client_operation_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\", http_response_status_code=~\"5..\"}[$__rate_interval]),\n \"database\",\n \"/\",\n \"server_address\",\n \"db_namespace\"\n )\n )\n / \n sum by (database) (\n label_join(\n rate(db_client_operation_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"database\",\n \"/\",\n \"server_address\",\n \"db_namespace\"\n )\n )\n ) or (0 * \n sum by (database) (\n label_join(\n rate(db_client_operation_duration_seconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"database\",\n \"/\",\n \"server_address\",\n \"db_namespace\"\n )\n )\n )", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "{{server_address}} {{db_namespace}}", + "range": true, + "refId": "ERR_PCT" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "\nhistogram_quantile(\n 0.99,\n sum by (le, database) (\n label_join(\n rate(db_client_operation_duration_seconds_bucket{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[5m]),\n \"database\",\n \"/\",\n \"server_address\",\n \"db_namespace\"\n )\n )\n)", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "{{server_address}} {{db_namespace}}", + "range": true, + "refId": "DURATION" + } + ], + "title": "Outbound Databases", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "DURATION": { + "timeField": "Time" + }, + "Duration": { + "timeField": "Time" + }, + "ERR_PCT": { + "timeField": "Time" + }, + "RPS": { + "timeField": "Time" + } + } + }, + { + "id": "joinByField", + "options": { + "byField": "database", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": { + "Trend #DURATION": 1, + "Trend #ERR_PCT": 2, + "Trend #RPS": 3, + "database": 0 + }, + "renameByName": { + "Trend #DURATION": "Duration (P99)", + "Trend #Duration": "Duration (p99)", + "Trend #ERR_PCT": "Error", + "Trend #RPS": "Rate", + "database": "Database", + "database_operation": "Database Operation", + "operation": "Operation", + "outbound_service": "Service" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "description": "gRPC calls made by the service based on the `rpc.client.request.duration` metric.\n\nSpecific to gRPC due to the usage of the `grpc.status.code` attribute to identify errors.\n\nCalls broken down by `server.address`, `rpc.service`, and `rpc.method`.\n\nSee https://opentelemetry.io/docs/specs/semconv/rpc/rpc-metrics/#rpc-client\n\n", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "noValue": "No RPC call", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Duration (P99)" + }, + "properties": [ + { + "id": "unit", + "value": "ms" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Rate" + }, + "properties": [ + { + "id": "unit", + "value": "reqps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Error" + }, + "properties": [ + { + "id": "unit", + "value": "percentunit" + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 21 + }, + "id": 32, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "\n sum by (outbound_service) (\n label_join(\n rate(rpc_client_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"outbound_service\",\n \"/\",\n \"server_address\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n ", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "interval": "60s", + "legendFormat": "__auto", + "range": true, + "refId": "RPS", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "editorMode": "code", + "expr": "(\n sum by (outbound_service) (\n label_join(\n rate(rpc_client_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\", http_response_status_code=~\"5..\"}[$__rate_interval]),\n \"outbound_service\",\n \"/\",\n \"server_address\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n / \n sum by (outbound_service) (\n label_join(\n rate(rpc_client_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"outbound_service\",\n \"/\",\n \"server_address\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n ) or (0 * \n sum by (outbound_service) (\n label_join(\n rate(rpc_client_duration_milliseconds_count{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[$__rate_interval]),\n \"outbound_service\",\n \"/\",\n \"server_address\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n )", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "__auto", + "range": true, + "refId": "ERR_PCT" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "\nhistogram_quantile(\n 0.99,\n sum by (le, outbound_service) (\n label_join(\n rate(rpc_client_duration_milliseconds_bucket{deployment_environment_name=~\"$deployment_environment_name\", service_namespace=~\"$service_namespace\", service_name=\"$service_name\"}[5m]),\n \"outbound_service\",\n \"/\",\n \"server_address\",\n \"rpc_service\",\n \"rpc_method\"\n )\n )\n)", + "hide": false, + "instant": false, + "interval": "60s", + "legendFormat": "__auto", + "range": true, + "refId": "DURATION" + } + ], + "title": "Outbound gRPC Services", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "Duration": { + "timeField": "Time" + }, + "ERR_PCT": { + "timeField": "Time" + }, + "RPS": { + "timeField": "Time" + } + } + }, + { + "id": "joinByField", + "options": { + "byField": "outbound_service", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": { + "Trend #DURATION": 1, + "Trend #ERR_PCT": 2, + "Trend #RPS": 3, + "outbound_service": 0 + }, + "renameByName": { + "Trend #DURATION": "Duration (P99)", + "Trend #Duration": "Duration (p99)", + "Trend #ERR_PCT": "Error", + "Trend #RPS": "Rate", + "operation": "Operation", + "outbound_service": "Service Method" + } + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 26 + }, + "id": 42, + "panels": [], + "title": "Service instances", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Host CPU" + }, + "properties": [ + { + "id": "unit", + "value": "percentunit" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Host Memory" + }, + "properties": [ + { + "id": "unit", + "value": "percentunit" + } + ] + } + ] + }, + "gridPos": { + "h": 4, + "w": 24, + "x": 0, + "y": 27 + }, + "id": 41, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "frameIndex": 1, + "showHeader": true + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "editorMode": "code", + "expr": "sum by (service_instance_id_host_name) (\n label_join(\n (\n sum by (service_instance_id, host_name) (\n rate(system_cpu_time_seconds_total{job=\"\", state!=\"idle\"}[$__rate_interval])\n )\n * on(host_name) group_left(service_instance_id)\n target_info{service_name=\"${service_name}\"}\n ),\n \"service_instance_id_host_name\",\n \" / \",\n \"service_instance_id\",\n \"host_name\"\n )\n)", + "hide": false, + "legendFormat": "__auto", + "range": true, + "refId": "cpu_time_percentage" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by (service_instance_id_host_name) (\n label_join(\n (\n (\n sum by (service_instance_id, host_name) (\n system_memory_usage_bytes{job=\"\", state!=\"free\"}\n )\n /\n sum by (service_instance_id, host_name) (\n system_memory_usage_bytes{job=\"\"}\n )\n )\n * on(host_name) group_left(service_instance_id) (\n target_info{service_name=\"${service_name}\"}\n )\n ),\n \"service_instance_id_host_name\",\n \" / \",\n \"service_instance_id\",\n \"host_name\"\n )\n)", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "memory_usage_pct" + } + ], + "title": "Service instance / host", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "A": { + "timeField": "Time" + }, + "cpu_time_percentage": { + "timeField": "Time" + }, + "memory_usage_pct": { + "timeField": "Time" + } + } + }, + { + "id": "joinByField", + "options": { + "byField": "service_instance_id_host_name", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": {}, + "renameByName": { + "Trend #cpu_time_percentage": "Host CPU", + "Trend #memory_usage_pct": "Host Memory", + "service_instance_id_host_name": "Instance / Host" + } + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 31 + }, + "id": 25, + "panels": [], + "title": "Logs", + "type": "row" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "${opensearch_datasource}" + }, + "description": "Logs of the service, filtered by `service.name`, `service.namespace`, and `deployment.environment.name`.\n\nTo explore the logs, open the menu clicking on the icon `⋮` of this panel and click on `Explore`.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "noValue": "No application logs", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "@timestamp" + }, + "properties": [ + { + "id": "custom.width", + "value": 226 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "severity.text" + }, + "properties": [ + { + "id": "custom.width", + "value": 136 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "instrumentationScope.name" + }, + "properties": [ + { + "id": "custom.width", + "value": 246 + } + ] + } + ] + }, + "gridPos": { + "h": 15, + "w": 24, + "x": 0, + "y": 32 + }, + "id": 26, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "observedTimestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "${opensearch_datasource}" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "search source=otel-logs-* | where resource.service.name=\"$service_name\" and resource.service.namespace=\"$service_namespace\" | fields @timestamp, severity.text, body, instrumentationScope.name\n", + "queryType": "PPL", + "refId": "B", + "timeField": "observedTimestamp" + } + ], + "title": "", + "transformations": [ + { + "id": "formatTime", + "options": { + "outputFormat": "YYYY-MM-DD HH:MM:ss.sss", + "timeField": "@timestamp", + "timezone": "browser", + "useTimezone": true + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": { + "@timestamp": 0, + "body": 3, + "instrumentationScope.name": 2, + "severity.text": 1 + }, + "renameByName": { + "@timestamp": "Time", + "body": "Message", + "instrumentationScope.name": "Logger", + "severity.text": "Severity" + } + } + } + ], + "type": "table" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 47 + }, + "id": 29, + "panels": [ + { + "datasource": { + "type": "jaeger", + "uid": "${jaeger_datasource}" + }, + "description": "Traces containing a span emitted by the service", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "noValue": "No traces", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 0 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Trace Service" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Span ID" + }, + "properties": [ + { + "id": "custom.hidden", + "value": false + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "deployment.environment.name" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "service.name" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "service.namespace" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 15, + "x": 0, + "y": 58 + }, + "id": 30, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "frameIndex": 0, + "showHeader": true + }, + "pluginVersion": "12.1.0", + "targets": [ + { + "datasource": { + "type": "jaeger", + "uid": "${jaeger_datasource}" + }, + "queryType": "search", + "refId": "A", + "service": "$service_name", + "tags": "service.namespace=\"$service_namespace\"" + } + ], + "title": "", + "type": "table" + } + ], + "title": "Traces", + "type": "row" + } + ], + "preload": false, + "refresh": "30s", + "schemaVersion": 41, + "tags": [], + "templating": { + "list": [ + { + "allowCustomValue": false, + "current": { + "text": "Prometheus", + "value": "webstore-metrics" + }, + "description": "OpenTelemetry metrics. \nSend metrics using the Prometheus OTLP endpoint activating `keep_identifying_resource_attributes` and resource attribute promotion (aka `promote_resource_attributes`) including `service.name`, service.namespace`, `service.instance.id`, and `deployment.environment.name`", + "label": "Metrics", + "name": "prometheus_datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "type": "datasource" + }, + { + "allowCustomValue": false, + "current": { + "text": "Jaeger", + "value": "webstore-traces" + }, + "description": "OpenTelemetry traces", + "label": "Traces", + "name": "jaeger_datasource", + "options": [], + "query": "jaeger", + "refresh": 1, + "regex": "", + "type": "datasource" + }, + { + "allowCustomValue": false, + "current": { + "text": "OpenSearch", + "value": "webstore-logs" + }, + "description": "OpenTelemetry logs.", + "label": "Logs", + "name": "opensearch_datasource", + "options": [], + "query": "grafana-opensearch-datasource", + "refresh": 1, + "regex": "", + "type": "datasource" + }, + { + "current": { + "text": ".*", + "value": ".*" + }, + "description": "Waiting to implement support of the optional value of `deployment.environment.name` in the OpenSearch and Jager panels, hide variable.", + "hide": 2, + "label": "Environment", + "name": "deployment_environment_name", + "query": ".*", + "skipUrlSync": true, + "type": "constant" + }, + { + "allValue": ".*", + "allowCustomValue": false, + "current": { + "text": "opentelemetry-demo", + "value": "opentelemetry-demo" + }, + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "definition": "label_values(target_info{deployment_environment_name=~\"$deployment_environment_name\"},service_namespace)", + "description": "Service namespace.\nResource attribute `service.namespace` via `target_info`", + "includeAll": false, + "label": "Namespace", + "name": "service_namespace", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(target_info{deployment_environment_name=~\"$deployment_environment_name\"},service_namespace)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "sort": 1, + "type": "query" + }, + { + "current": { + "text": "checkout", + "value": "checkout" + }, + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "definition": "label_values(target_info{service_namespace=~\"$service_namespace\", deployment_environment_name=~\"$deployment_environment_name\"},service_name)", + "description": "Service name.\nResource attribute `service.name` via `target_info`.", + "label": "Name", + "name": "service_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(target_info{service_namespace=~\"$service_namespace\", deployment_environment_name=~\"$deployment_environment_name\"},service_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "sort": 1, + "type": "query" + } + ] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "APM Dashboard (Jaeger, Prometheus, OpenSearch)", + "uid": "febljk0a32qyoa", + "version": 1 + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-demo-dashboard + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + demo-dashboard.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- 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, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": 2, + "links": [], + "panels": [ + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 21, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "This dashboard shows RED metrics for the selected service, as generated by the spanmetrics connector in the OpenTelemetry Collector.\nIf the selected service emits logs, the logs will also be displayed.\nCustom metrics generated by some services are also displayed. \n
\nChart panels may require 5 minutes after the Demo is started before rendering data.", + "mode": "html" + }, + "pluginVersion": "11.5.2", + "title": "", + "type": "text" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 14, + "panels": [], + "title": "Spanmetrics (RED metrics)", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 4 + }, + "id": 12, + "interval": "2m", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by (span_name) (rate(traces_span_metrics_duration_milliseconds_count{service_name=\"${service}\"}[$__rate_interval]))", + "legendFormat": "{{ span_name }}", + "range": true, + "refId": "A" + } + ], + "title": "Requests Rate by Span Name", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 4 + }, + "id": 10, + "interval": "2m", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by (span_name) (rate(traces_span_metrics_calls_total{status_code=\"STATUS_CODE_ERROR\", service_name=\"${service}\"}[$__rate_interval]))", + "interval": "", + "legendFormat": "{{ span_name }}", + "range": true, + "refId": "A" + } + ], + "title": "Error Rate by Span Name", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "dtdurationms" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 4 + }, + "id": 2, + "interval": "2m", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "histogram_quantile(0.50, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=\"${service}\"}[$__rate_interval])) by (le, span_name))", + "legendFormat": "{{span_name}}", + "range": true, + "refId": "A" + } + ], + "title": "Average Duration by Span Name", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 12 + }, + "id": 19, + "panels": [], + "title": "Application Log Records", + "type": "row" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "webstore-logs" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "left", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "count()" + }, + "properties": [ + { + "id": "custom.width", + "value": 90 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 4, + "x": 0, + "y": 13 + }, + "id": 20, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "severity.text.keyword", + "id": "3", + "settings": { + "min_doc_count": "1", + "order": "desc", + "orderBy": "_count", + "size": "0" + }, + "type": "terms" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "webstore-logs" + }, + "format": "table", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "search source=otel-logs-*\n| where resource.service.name=\"${service}\"\n| stats count() by severity.text", + "queryType": "PPL", + "refId": "A", + "timeField": "observedTimestamp" + } + ], + "title": "Log Records by Severity", + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": {}, + "renameByName": { + "Count": "", + "severity.text.keyword": "Severity" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "webstore-logs" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto", + "wrapText": false + }, + "filterable": true, + "inspect": true + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "observedTimestamp" + }, + "properties": [] + }, + { + "matcher": { + "id": "byName", + "options": "body" + }, + "properties": [ + { + "id": "custom.width", + "value": 386 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "severity.text" + }, + "properties": [ + { + "id": "custom.width", + "value": 127 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 20, + "x": 4, + "y": 13 + }, + "id": 17, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "alias": "", + "bucketAggs": [], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "webstore-logs" + }, + "format": "table", + "hide": false, + "metrics": [ + { + "id": "1", + "settings": { + "order": "desc", + "size": "100", + "useTimeRange": true + }, + "type": "raw_data" + } + ], + "query": "search source=otel-logs-*\n| where resource.service.name=\"${service}\"\n| sort - observedTimestamp \n| head 100", + "queryType": "PPL", + "refId": "A", + "timeField": "observedTimestamp" + } + ], + "title": "Log Records (100 recent entries)", + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": { + "@timestamp": true + }, + "includeByName": {}, + "indexByName": { + "@timestamp": 1, + "attributes.data_stream.dataset": 4, + "attributes.data_stream.namespace": 5, + "attributes.data_stream.type": 6, + "attributes.productId": 7, + "attributes.quantity": 8, + "attributes.userId": 9, + "body": 3, + "instrumentationScope.name": 10, + "observedTimestamp": 0, + "resource.container.id": 11, + "resource.docker.cli.cobra.command_path": 12, + "resource.host.name": 13, + "resource.service.name": 14, + "resource.telemetry.sdk.language": 15, + "resource.telemetry.sdk.name": 16, + "resource.telemetry.sdk.version": 17, + "severity.number": 18, + "severity.text": 2, + "spanId": 19, + "traceId": 20 + }, + "renameByName": {} + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 21 + }, + "id": 18, + "panels": [], + "title": "Application Metrics", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 22 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "rate(process_runtime_cpython_cpu_time_seconds_total{type=~\"system\"}[$__rate_interval])*100", + "hide": false, + "interval": "2m", + "legendFormat": "{{job}} ({{type}})", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "rate(process_runtime_cpython_cpu_time_seconds_total{type=~\"user\"}[$__rate_interval])*100", + "hide": false, + "interval": "2m", + "legendFormat": "{{job}} ({{type}})", + "range": true, + "refId": "B" + } + ], + "title": "Python services (CPU%)", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "opentelemetry-demo/(.*)", + "renamePattern": "$1" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 22 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "process_runtime_cpython_memory_bytes{type=\"rss\"}", + "legendFormat": "{{job}}", + "range": true, + "refId": "A" + } + ], + "title": "Python services (Memory)", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "opentelemetry-demo/(.*)", + "renamePattern": "$1" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 30 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "rate(app_recommendations_counter_total{recommendation_type=\"catalog\"}[$__rate_interval])", + "interval": "2m", + "legendFormat": "recommendations", + "range": true, + "refId": "A" + } + ], + "title": "Recommendations Rate", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 30 + }, + "id": 16, + "interval": "2m", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "rate(otel_trace_span_processor_spans{job=\"quote\"}[2m])*120", + "interval": "2m", + "legendFormat": "{{state}}", + "range": true, + "refId": "A" + } + ], + "title": "Quote Service batch span processor", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 38 + }, + "id": 23, + "panels": [], + "title": "Service Dependency", + "type": "row" + }, + { + "datasource": { + "type": "jaeger", + "uid": "webstore-traces" + }, + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 18, + "w": 24, + "x": 0, + "y": 39 + }, + "id": 22, + "options": { + "edges": { + "mainStatUnit": "requests" + }, + "nodes": { + "arcs": [], + "mainStatUnit": "" + }, + "zoomMode": "cooperative" + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "jaeger", + "uid": "webstore-traces" + }, + "queryType": "dependencyGraph", + "refId": "A" + } + ], + "title": "Service Dependency", + "type": "nodeGraph" + } + ], + "preload": false, + "refresh": "", + "schemaVersion": 40, + "tags": [], + "templating": { + "list": [ + { + "current": { + "text": "frontend", + "value": "frontend" + }, + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "definition": "traces_span_metrics_duration_milliseconds_bucket", + "includeAll": false, + "label": "Service", + "name": "service", + "options": [], + "query": { + "query": "traces_span_metrics_duration_milliseconds_bucket", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "/.*service.name=\\\"([^\\\"]+)\\\".*/", + "sort": 1, + "type": "query" + } + ] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Demo Dashboard", + "uid": "W2gX2zHVk", + "version": 2, + "weekStart": "" + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-exemplars-dashboard + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + exemplars-dashboard.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 3, + "links": [], + "panels": [ + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 8, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "This dashboard shows the use of metric exemplars.\nExemplars can be used to look up a trace in Jaeger.\nOnly the most recent exemplars may still be available in Jaeger.\n
\nChart panels may require 5 minutes after the Demo is started before rendering data.", + "mode": "html" + }, + "pluginVersion": "11.6.1", + "title": "", + "type": "text" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 2 + }, + "id": 4, + "panels": [], + "title": "GetCart Exemplars", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 2, + "interval": "2m", + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Spectral", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-09 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "exemplar": true, + "expr": "sum by(le) (rate(app_cart_get_cart_latency_seconds_bucket[$__rate_interval]))", + "format": "heatmap", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": true, + "legendFormat": "{{le}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "GetCart Latency Heatmap with Exemplars", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 12 + }, + "id": 5, + "interval": "2m", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "builder", + "exemplar": true, + "expr": "histogram_quantile(0.95, sum by(le) (rate(app_cart_get_cart_latency_seconds_bucket[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "legendFormat": "p95 GetCart", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "95th Pct Cart GetCart Latency with Exemplars", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 22 + }, + "id": 3, + "panels": [], + "title": "AddItem Exemplars", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 6, + "interval": "2m", + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Spectral", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-09 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "exemplar": true, + "expr": "sum by(le) (rate(app_cart_add_item_latency_seconds_bucket[$__rate_interval]))", + "format": "heatmap", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": true, + "legendFormat": "{{le}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "AddItem Latency Heatmap with Exemplars", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 32 + }, + "id": 1, + "interval": "2m", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.6.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "builder", + "exemplar": true, + "expr": "histogram_quantile(0.95, sum by(le) (rate(app_cart_add_item_latency_seconds_bucket[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "legendFormat": "p95 AddItem", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "95th Pct Cart AddItem Latency with Exemplars", + "type": "timeseries" + } + ], + "preload": false, + "schemaVersion": 41, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Cart Service Exemplars", + "uid": "ce6sd46kfkglca", + "version": 1 + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-linux-dashboard + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + linux-dashboard.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "OpenTelemetry Collector hostmetrics", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": 4, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 267, + "panels": [], + "title": "overview【 $host_name】", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Busy state of all CPU cores together\n\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/hostmetricsreceiver/internal/scraper/cpuscraper/documentation.md", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 1, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)" + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 85 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 95 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 0, + "y": 1 + }, + "id": 20, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(system_cpu_utilization_ratio{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", job=\"\", state!=\"idle\"})", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "CPU Busy", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Non available RAM memory\n\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/hostmetricsreceiver/internal/scraper/memoryscraper/documentation.md", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 1, + "mappings": [], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)" + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 80 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 90 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 3, + "y": 1 + }, + "id": 16, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "system_memory_utilization_ratio{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"$node_name\", host_name=~\"$host_name\", job=\"\", state=\"used\"}", + "format": "time_series", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "intervalFactor": 1, + "range": true, + "refId": "A", + "step": 240, + "useBackend": false + } + ], + "title": "RAM Used", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Used FS\n\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/receiver/hostmetricsreceiver#collecting-host-metrics-from-inside-a-container-linux-only", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 1, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)" + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 80 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 90 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 6, + "y": 1 + }, + "id": 154, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "1 \n-\nsum(system_filesystem_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"free\"}) \n/ \nsum(system_filesystem_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"})", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "C" + } + ], + "title": "FS Used", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Busy state of all CPU cores together (5 min average)\n\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/hostmetricsreceiver/internal/scraper/loadscraper/documentation.md", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 1, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)" + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 85 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 95 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 9, + "y": 1 + }, + "id": 155, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "system_cpu_load_average_5m{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"} ", + "format": "time_series", + "hide": false, + "instant": true, + "intervalFactor": 1, + "legendFormat": "__auto", + "range": false, + "refId": "sysload_5m", + "step": 240 + } + ], + "title": "Sys Load (5m avg)", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Busy state of all CPU cores together (15 min average)\n\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/hostmetricsreceiver/internal/scraper/loadscraper/documentation.md", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 1, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)" + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 85 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 95 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 12, + "y": 1 + }, + "id": 19, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "system_cpu_load_average_15m{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"} ", + "hide": false, + "instant": true, + "intervalFactor": 1, + "range": false, + "refId": "sysload_15m", + "step": 240 + } + ], + "title": "Sys Load (15m avg)", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Used Swap\n\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/hostmetricsreceiver/internal/scraper/pagingscraper/documentation.md", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 1, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)" + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 10 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 25 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 3, + "x": 15, + "y": 1 + }, + "id": 21, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(system_paging_usage_bytes { k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"used\" })\n/\nsum(system_paging_usage_bytes { k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"})", + "instant": true, + "intervalFactor": 1, + "range": false, + "refId": "A", + "step": 240 + } + ], + "title": "SWAP Used", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "Total number of CPU cores", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 2, + "x": 18, + "y": 1 + }, + "id": 14, + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "expr": "system_cpu_logical_count{ k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"used\" }", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "CPU Cores", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "Total RAM", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 2, + "x": 20, + "y": 1 + }, + "id": 75, + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "exemplar": false, + "expr": "system_memory_limit_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}", + "instant": true, + "intervalFactor": 1, + "legendFormat": "__auto", + "range": false, + "refId": "A", + "step": 240 + } + ], + "title": "RAM Total", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "Total SWAP", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 2, + "x": 22, + "y": 1 + }, + "id": 18, + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(system_paging_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"})", + "instant": true, + "intervalFactor": 1, + "legendFormat": "__auto", + "range": false, + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "SWAP Total", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "Total FS\n\nhttps://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/receiver/hostmetricsreceiver/internal/scraper/filesystemscraper/documentation.md", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgba(50, 172, 45, 0.97)" + }, + { + "color": "rgba(237, 129, 40, 0.89)", + "value": 70 + }, + { + "color": "rgba(245, 54, 54, 0.9)", + "value": 90 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 2, + "x": 18, + "y": 3 + }, + "id": 23, + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(system_filesystem_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"})", + "format": "time_series", + "hide": false, + "instant": true, + "intervalFactor": 1, + "range": false, + "refId": "A", + "step": 240 + } + ], + "title": "FS Total", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "System uptime", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "decimals": 1, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 4, + "x": 20, + "y": 3 + }, + "id": 15, + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "system_uptime_seconds{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}", + "instant": true, + "intervalFactor": 1, + "legendFormat": "__auto", + "range": false, + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "B" + } + ], + "title": "Uptime", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 5 + }, + "id": 266, + "panels": [], + "title": "Basic", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "percent" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Busy System" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#890F02", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Busy User" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Busy Wait" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Idle" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Busy IRQs" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-yellow", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Busy Other" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Idle" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 6 + }, + "id": 77, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true, + "width": 250 + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "expr": "sum (irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"system\"}[$__rate_interval])) \n/\nsum ((irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}[$__rate_interval])))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Busy System", + "range": true, + "refId": "busy system", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "expr": "sum (irate(system_cpu_time_seconds_total{kk8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"user\"}[$__rate_interval])) \n/ \nsum ((irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}[$__rate_interval])))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Busy User", + "range": true, + "refId": "busy user", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "expr": "sum(irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"wait\"}[$__rate_interval])) \n/ \nsum ((irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}[$__rate_interval])))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Busy Wait", + "range": true, + "refId": "busy wait", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "expr": "sum (irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=~\".*irq\"}[$__rate_interval])) \n/\nsum((irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}[$__rate_interval])))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Busy IRQs", + "range": true, + "refId": "busy irq", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "expr": "sum(irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state!~\".*irq\", state!=\"idle\", state!=\"user\", state!=\"wait\", state!=\"system\"}[$__rate_interval]))\n/\nsum ((irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}[$__rate_interval])))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Busy Other", + "range": true, + "refId": "busy other", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "fej9ntb4ninswf" + }, + "editorMode": "code", + "expr": "sum by(host_name) (irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"idle\"}[$__rate_interval])) \n/ \non(host_name) group_left sum by (host_name)((irate(system_cpu_time_seconds_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"}[$__rate_interval])))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Idle", + "range": true, + "refId": "idle", + "step": 240 + } + ], + "title": "CPU", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Apps" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#629E51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Buffers" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#614D93", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#6D1F62", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Cached" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#511749", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Committed" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#508642", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A437C", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Hardware Corrupted - Amount of RAM that the kernel identified as corrupted / not working" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#CFFAFF", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Inactive" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#584477", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "PageTables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Page_Tables" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#0A50A1", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "SWAP Used" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#806EB7", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Slab_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0752D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap Used" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#BF1B00", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Cache" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#C15C17", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Swap_Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#2F575E", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Unused" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#EAB839", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM Total" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#E0F9D7", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.stacking", + "value": { + "group": false, + "mode": "normal" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM Cache + Buffer" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#052B51", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "RAM Free" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#7EB26D", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Available" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#DEDAF7", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + }, + { + "id": "custom.stacking", + "value": { + "group": false, + "mode": "normal" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 5, + "x": 6, + "y": 6 + }, + "id": 78, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true, + "width": 350 + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(system_memory_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Available", + "range": true, + "refId": "A", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(system_memory_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"free\"})", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "RAM Free", + "range": true, + "refId": "B", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(system_memory_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=~\"cached|buffered\"})", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "RAM Cache + Buffer", + "range": true, + "refId": "C", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(system_memory_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"used\"})", + "format": "time_series", + "instant": false, + "intervalFactor": 1, + "legendFormat": "Used", + "range": true, + "refId": "E", + "step": 240 + } + ], + "title": "Memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Receive (-) / Transmit (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": 3600000, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Rec.*/" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 11, + "y": 6 + }, + "id": 74, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum (rate(system_network_io_bytes_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", direction=\"receive\", job=\"\"}[$__rate_interval]))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Receive", + "range": true, + "refId": "receive", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum (rate(system_network_io_bytes_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", direction=\"transmit\", job=\"\"}[$__rate_interval]))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "Transmit", + "range": true, + "refId": "transmit", + "step": 240 + } + ], + "title": "Network Traffic", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Read (-) / Write (+)", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "Bps" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*Read*./" + }, + "properties": [ + { + "id": "custom.transform", + "value": "negative-Y" + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 7, + "x": 17, + "y": 6 + }, + "id": 42, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(irate(system_disk_io_bytes_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", direction=\"read\"}[$__rate_interval]))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Read", + "range": true, + "refId": "read", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "sum(irate(system_disk_io_bytes_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", direction=\"write\"}[$__rate_interval]))", + "format": "time_series", + "hide": false, + "intervalFactor": 1, + "legendFormat": "Write", + "range": true, + "refId": "write", + "step": 240 + }, + { + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "editorMode": "code", + "expr": "", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "C" + } + ], + "title": "I/O Usage Read / Write", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Trend #transmit_bytes" + }, + "properties": [ + { + "id": "unit", + "value": "binBps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trend #receive_bytes" + }, + "properties": [ + { + "id": "unit", + "value": "binBps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trend #receive_dropped_packets" + }, + "properties": [ + { + "id": "unit", + "value": "pps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trend #transmit_dropped_packets" + }, + "properties": [ + { + "id": "unit", + "value": "pps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trend #receive_errors" + }, + "properties": [ + { + "id": "unit", + "value": "pps" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Trend #transmit_errors" + }, + "properties": [ + { + "id": "unit", + "value": "pps" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 15, + "x": 0, + "y": 14 + }, + "id": 270, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by(device) (rate(system_network_io_bytes_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", job=\"\", direction=\"transmit\"}[$__rate_interval]))", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "transmit_bytes", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by(device) (rate(system_network_io_bytes_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", job=\"\", direction=\"receive\"}[$__rate_interval]))", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "receive_bytes" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by(device) (rate(system_network_dropped_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", job=\"\",direction=\"receive\"}[$__rate_interval]))", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "receive_dropped_packets" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by(device) (rate(system_network_dropped_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", job=\"\",direction=\"transmit\"}[$__rate_interval]))", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "transmit_dropped_packets" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by(device) (rate(system_network_errors_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", job=\"\",direction=\"receive\"}[$__rate_interval]))", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "receive_errors" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "expr": "sum by(device) (rate(system_network_errors_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", job=\"\",direction=\"transmit\"}[$__rate_interval]))", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "transmit_errors" + } + ], + "title": "Network traffic", + "transformations": [ + { + "id": "timeSeriesTable", + "options": { + "A": { + "timeField": "Time" + }, + "receive": { + "timeField": "Time" + }, + "receive_bytes": { + "timeField": "Time" + }, + "receive_dropped_packets": { + "timeField": "Time" + }, + "receive_errors": { + "timeField": "Time" + }, + "transmit": { + "timeField": "Time" + }, + "transmit_bytes": { + "timeField": "Time" + }, + "transmit_dropped_packets": { + "timeField": "Time" + }, + "transmit_errors": { + "timeField": "Time" + } + } + }, + { + "id": "joinByField", + "options": { + "byField": "device", + "mode": "outer" + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": { + "Trend #receive_bytes": 4, + "Trend #receive_dropped_packets": 5, + "Trend #receive_errors": 3, + "Trend #transmit_bytes": 1, + "Trend #transmit_dropped_packets": 2, + "Trend #transmit_errors": 6, + "device": 0 + }, + "renameByName": { + "Trend #receive": "Receive", + "Trend #receive_bytes": "Receive", + "Trend #receive_dropped_packets": "Receive dropped", + "Trend #receive_errors": "Transmit err", + "Trend #transmit": "Transmit", + "Trend #transmit_bytes": "Transmit", + "Trend #transmit_dropped_packets": "Transmit dropped", + "Trend #transmit_errors": "Receive err", + "device": "Interface" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Used %" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "basic", + "type": "gauge", + "valueDisplayMode": "color" + } + }, + { + "id": "unit", + "value": "percentunit" + }, + { + "id": "min", + "value": 0 + }, + { + "id": "max", + "value": 1 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Free" + }, + "properties": [ + { + "id": "custom.width", + "value": 80 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total" + }, + "properties": [ + { + "id": "custom.width", + "value": 80 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Used" + }, + "properties": [ + { + "id": "custom.width", + "value": 78 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Mount" + }, + "properties": [ + { + "id": "custom.width", + "value": 200 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 9, + "x": 15, + "y": 14 + }, + "id": 269, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "frameIndex": 0, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "sum by(mountpoint) (system_filesystem_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\", state=\"free\"})", + "format": "table", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "free", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum by(mountpoint) (system_filesystem_usage_bytes{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$host_name\"})", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "total" + } + ], + "title": "Disk usage", + "transformations": [ + { + "id": "groupBy", + "options": { + "fields": { + "/oldroot": { + "aggregations": [ + "lastNotNull" + ], + "operation": "aggregate" + }, + "/var/lib": { + "aggregations": [ + "lastNotNull" + ], + "operation": "aggregate" + }, + "Value": { + "aggregations": [ + "lastNotNull" + ], + "operation": "aggregate" + }, + "Value #free": { + "aggregations": [ + "lastNotNull" + ], + "operation": "aggregate" + }, + "Value #total": { + "aggregations": [ + "lastNotNull" + ], + "operation": "aggregate" + }, + "mountpoint": { + "aggregations": [], + "operation": "groupby" + } + } + } + }, + { + "id": "merge", + "options": {} + }, + { + "id": "calculateField", + "options": { + "alias": "used", + "binary": { + "left": { + "matcher": { + "id": "byName", + "options": "Value #total (lastNotNull)" + } + }, + "operator": "-", + "right": { + "matcher": { + "id": "byName", + "options": "Value #free (lastNotNull)" + } + } + }, + "mode": "binary", + "reduce": { + "reducer": "sum" + } + } + }, + { + "id": "calculateField", + "options": { + "alias": "Used %", + "binary": { + "left": { + "matcher": { + "id": "byName", + "options": "used" + } + }, + "operator": "/", + "right": { + "matcher": { + "id": "byName", + "options": "Value #total (lastNotNull)" + } + } + }, + "mode": "binary", + "reduce": { + "reducer": "sum" + } + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "includeByName": {}, + "indexByName": {}, + "renameByName": { + "Used %": "Used %", + "Value #free (lastNotNull)": "Free", + "Value #total (lastNotNull)": "Total", + "mountpoint": "Mount", + "used": "Used" + } + } + }, + { + "id": "sortBy", + "options": { + "fields": {}, + "sort": [ + { + "field": "Mount" + } + ] + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 13 + }, + "id": 272, + "panels": [], + "title": "Details", + "type": "row" + } + ], + "preload": false, + "refresh": "", + "schemaVersion": 41, + "tags": [ + "linux", + "opentelemetry" + ], + "templating": { + "list": [ + { + "current": { + "text": "Prometheus", + "value": "webstore-metrics" + }, + "includeAll": false, + "label": "Data Source", + "name": "DS_PROMETHEUS", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "(?!grafanacloud-usage|grafanacloud-ml-metrics).+", + "type": "datasource" + }, + { + "allValue": ".*", + "allowCustomValue": true, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "definition": "label_values(otelcol_process_uptime,k8s_cluster_name)", + "description": "When deploying PostgreSQL on Kubernetes, name of the Kubernetes cluster. \nFor other deployments, select \"All\". ", + "includeAll": true, + "label": "K8s Cluster", + "multi": true, + "name": "k8s_cluster_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(otelcol_process_uptime,k8s_cluster_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "allowCustomValue": false, + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "definition": "label_values(otelcol_process_uptime{k8s_cluster_name=~\"$k8s_cluster_name\"},k8s_node_name)", + "description": "When monitoring Kubernetes, name of the K8s node.\nFor other deployments, select \"All\". ", + "includeAll": true, + "label": "K8s node", + "name": "node_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(otelcol_process_uptime{k8s_cluster_name=~\"$k8s_cluster_name\"},k8s_node_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "current": { + "text": "docker-desktop", + "value": "docker-desktop" + }, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "definition": "label_values(otelcol_process_uptime_seconds_total,host_name)", + "includeAll": true, + "label": "Host", + "name": "host_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(otelcol_process_uptime_seconds_total,host_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "sort": 5, + "type": "query" + }, + { + "allowCustomValue": false, + "current": { + "text": "", + "value": "" + }, + "datasource": { + "type": "prometheus", + "uid": "${DS_PROMETHEUS}" + }, + "definition": "query_result(count(otelcol_process_uptime{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$ip\"}))", + "hide": 2, + "label": "host count", + "name": "host_count", + "options": [], + "query": { + "qryType": 3, + "query": "query_result(count(otelcol_process_uptime{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_node_name=~\"${node_name}\", host_name=~\"$ip\"}))", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "/{} (.*) .*/", + "type": "query" + } + ] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Linux", + "uid": "otel-demo-hostmetrics", + "version": 1 + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-opentelemetry-collector + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + opentelemetry-collector.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "Visualize OpenTelemetry (OTEL) collector metrics (tested with OTEL contrib v0.120.1)", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": 4, + "links": [], + "panels": [ + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 86, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "This dashboard uses the metrics generated by the OpenTelemetry Collector.\nIt is used to understand the overall performance and health of the OpenTelemetry Collector.\n
\nChart panels may require 5 minutes after the Demo is started before rendering data.\n", + "mode": "html" + }, + "pluginVersion": "11.5.2", + "title": "", + "type": "text" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 2 + }, + "id": 23, + "panels": [], + "title": "Receivers", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Accepted: count/rate of spans successfully pushed into the pipeline.\nRefused: count/rate of spans that could not be pushed into the pipeline.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 3 + }, + "id": 28, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_receiver_accepted_spans${suffix_total}{receiver=~\"$receiver\",job=\"$job\"}[$__rate_interval])) by (receiver $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Accepted: {{receiver}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_receiver_refused_spans${suffix_total}{receiver=~\"$receiver\",job=\"$job\"}[$__rate_interval])) by (receiver $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Refused: {{receiver}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Spans ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Accepted: count/rate of metric points successfully pushed into the pipeline.\nRefused: count/rate of metric points that could not be pushed into the pipeline.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 3 + }, + "id": 80, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_receiver_accepted_metric_points${suffix_total}{receiver=~\"$receiver\",job=\"$job\"}[$__rate_interval])) by (receiver $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Accepted: {{receiver}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_receiver_refused_metric_points${suffix_total}{receiver=~\"$receiver\",job=\"$job\"}[$__rate_interval])) by (receiver $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Refused: {{receiver}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Metric Points ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Accepted: count/rate of log records successfully pushed into the pipeline.\nRefused: count/rate of log records that could not be pushed into the pipeline.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 3 + }, + "id": 47, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_receiver_accepted_log_records${suffix_total}{receiver=~\"$receiver\",job=\"$job\"}[$__rate_interval])) by (receiver $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Accepted: {{receiver}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_receiver_refused_log_records${suffix_total}{receiver=~\"$receiver\",job=\"$job\"}[$__rate_interval])) by (receiver $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Refused: {{receiver}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Log Records ${metric:text}", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 11 + }, + "id": 34, + "panels": [], + "title": "Processors", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/Dropped.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 12 + }, + "id": 85, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_incoming_items${suffix_total}{processor=~\"$processor\",job=\"$job\",otel_signal=\"traces\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Incomming: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "0-sum(${metric:value}(otelcol_processor_outgoing_items${suffix_total}{processor=~\"$processor\",job=\"$job\",otel_signal=\"traces\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Outgoing: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Spans ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/Dropped.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 12 + }, + "id": 83, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_incoming_items${suffix_total}{processor=~\"$processor\",job=\"$job\",otel_signal=\"metrics\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Incomming: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "0-sum(${metric:value}(otelcol_processor_outgoing_items${suffix_total}{processor=~\"$processor\",job=\"$job\",otel_signal=\"metrics\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Outgoing: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Metric Points ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/Dropped.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 12 + }, + "id": 84, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_incoming_items${suffix_total}{processor=~\"$processor\",job=\"$job\",otel_signal=\"logs\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Incomming: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "0-sum(${metric:value}(otelcol_processor_outgoing_items${suffix_total}{processor=~\"$processor\",job=\"$job\",otel_signal=\"logs\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Outgoing: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Logs Records ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Accepted: count/rate of spans successfully pushed into the next component in the pipeline.\nRefused: count/rate of spans that were rejected by the next component in the pipeline.\nDropped: count/rate of spans that were dropped", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/Dropped.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 20 + }, + "id": 35, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_accepted_spans${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Accepted: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_refused_spans${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Refused: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_dropped_spans${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Dropped: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "Accepted Spans ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Accepted: count/rate of metric points successfully pushed into the next component in the pipeline.\nRefused: count/rate of metric points that were rejected by the next component in the pipeline.\nDropped: count/rate of metric points that were dropped", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/Dropped.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 20 + }, + "id": 50, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_accepted_metric_points${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Accepted: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_refused_metric_points${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Refused: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_dropped_metric_points${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Dropped: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "Accepted Metric Points ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Accepted: count/rate of log records successfully pushed into the next component in the pipeline.\nRefused: count/rate of log records that were rejected by the next component in the pipeline.\nDropped: count/rate of log records that were dropped", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Refused.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/Dropped.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 20 + }, + "id": 51, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_accepted_log_records${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Accepted: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_refused_log_records${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Refused: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_dropped_log_records${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Dropped: {{processor}} {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "Accepted Log Records ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Number of units in the batch", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + }, + "links": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 28 + }, + "id": 49, + "interval": "$minstep", + "maxDataPoints": 50, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "Reds", + "steps": 57 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-09 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(otelcol_processor_batch_batch_send_size_bucket{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "{{le}}", + "refId": "B" + } + ], + "title": "Batch Send Size Heatmap", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*count.*/" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 28 + }, + "id": 36, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_batch_batch_send_size_count{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Batch send size count: {{processor}} {{service_instance_id}}", + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_batch_batch_send_size_sum{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Batch send size sum: {{processor}} {{service_instance_id}}", + "refId": "A" + } + ], + "title": "Batch Metrics 1", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Number of times the batch was sent due to a size trigger. Number of times the batch was sent due to a timeout trigger.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*timeout.*/" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 28 + }, + "id": 56, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_batch_batch_size_trigger_send${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Batch sent due to a size trigger: {{processor}}", + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_batch_timeout_trigger_send${suffix_total}{processor=~\"$processor\",job=\"$job\"}[$__rate_interval])) by (processor $grouping)", + "format": "time_series", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Batch sent due to a timeout trigger: {{processor}} {{service_instance_id}}", + "refId": "A" + } + ], + "title": "Batch Metrics 2", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 36 + }, + "id": 25, + "panels": [], + "title": "Exporters", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Sent: count/rate of spans successfully sent to destination.\nEnqueue: count/rate of spans failed to be added to the sending queue.\nFailed: count/rate of spans in failed attempts to send to destination.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Failed:.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 37 + }, + "id": 37, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_sent_spans${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Sent: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_enqueue_failed_spans${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Enqueue: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_send_failed_spans${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Failed: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "Spans ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Sent: count/rate of metric points successfully sent to destination.\nEnqueue: count/rate of metric points failed to be added to the sending queue.\nFailed: count/rate of metric points in failed attempts to send to destination.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Failed:.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 37 + }, + "id": 38, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_sent_metric_points${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Sent: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_enqueue_failed_metric_points${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Enqueue: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_send_failed_metric_points${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Failed: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "Metric Points ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Sent: count/rate of log records successfully sent to destination.\nEnqueue: count/rate of log records failed to be added to the sending queue.\nFailed: count/rate of log records in failed attempts to send to destination.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/Failed:.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 37 + }, + "id": 48, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_sent_log_records${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Sent: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_enqueue_failed_log_records${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Enqueue: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_exporter_send_failed_log_records${suffix_total}{exporter=~\"$exporter\",job=\"$job\"}[$__rate_interval])) by (exporter $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Failed: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "Log Records ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Current size of the retry queue (in batches)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 46 + }, + "id": 10, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(otelcol_exporter_queue_size{exporter=~\"$exporter\",job=\"$job\"}) by (exporter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Max queue size: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "A" + } + ], + "title": "Exporter Queue Size", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Fixed capacity of the retry queue (in batches)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 46 + }, + "id": 55, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "min(otelcol_exporter_queue_capacity{exporter=~\"$exporter\",job=\"$job\"}) by (exporter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Queue capacity: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "A" + } + ], + "title": "Exporter Queue Capacity", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "max": 1, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 46 + }, + "id": 67, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(\r\n otelcol_exporter_queue_size{\r\n exporter=~\"$exporter\", job=\"$job\"\r\n }\r\n) by (exporter $grouping)\r\n/\r\nmin(\r\n otelcol_exporter_queue_capacity{\r\n exporter=~\"$exporter\", job=\"$job\"\r\n }\r\n) by (exporter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Queue capacity usage: {{exporter}} {{service_instance_id}}", + "range": true, + "refId": "A" + } + ], + "title": "Exporter Queue Usage", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 55 + }, + "id": 21, + "panels": [], + "title": "Collector", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Total physical memory (resident set size)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Max Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Avg Memory RSS " + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.fillOpacity", + "value": 20 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Min Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.lineWidth", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Avg Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Min Memory RSS " + }, + { + "id": "custom.fillOpacity", + "value": 20 + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 56 + }, + "id": 40, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(otelcol_process_memory_rss${suffix_bytes}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Max Memory RSS {{service_instance_id}}", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "avg(otelcol_process_memory_rss${suffix_bytes}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Avg Memory RSS {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "min(otelcol_process_memory_rss${suffix_bytes}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Min Memory RSS {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Total RSS Memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Total bytes of memory obtained from the OS (see 'go doc runtime.MemStats.Sys')", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Max Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Avg Memory RSS " + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.fillOpacity", + "value": 20 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Min Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.lineWidth", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Avg Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Min Memory RSS " + }, + { + "id": "custom.fillOpacity", + "value": 20 + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 56 + }, + "id": 52, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(otelcol_process_runtime_total_sys_memory_bytes{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Max Memory RSS {{service_instance_id}}", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "avg(otelcol_process_runtime_total_sys_memory_bytes{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Avg Memory RSS {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "min(otelcol_process_runtime_total_sys_memory_bytes{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Min Memory RSS {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Total Runtime Sys Memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Bytes of allocated heap objects (see 'go doc runtime.MemStats.HeapAlloc')", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Max Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Avg Memory RSS " + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.fillOpacity", + "value": 20 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Min Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.lineWidth", + "value": 0 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Avg Memory RSS " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Min Memory RSS " + }, + { + "id": "custom.fillOpacity", + "value": 20 + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 56 + }, + "id": 53, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(otelcol_process_runtime_heap_alloc_bytes{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Max Memory RSS {{service_instance_id}}", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "avg(otelcol_process_runtime_heap_alloc_bytes{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Avg Memory RSS {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "min(otelcol_process_runtime_heap_alloc_bytes{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Min Memory RSS {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Total Runtime Heap Memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Total CPU user and system time in percentage", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Max CPU usage " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Avg CPU usage " + }, + { + "id": "custom.lineWidth", + "value": 0 + }, + { + "id": "custom.fillOpacity", + "value": 20 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Avg CPU usage " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + }, + { + "id": "custom.fillBelowTo", + "value": "Min CPU usage " + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Min CPU usage " + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + }, + { + "id": "custom.lineWidth", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 65 + }, + "id": 39, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(rate(otelcol_process_cpu_seconds${suffix_total}{job=\"$job\"}[$__rate_interval])*100) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Max CPU usage {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "avg(rate(otelcol_process_cpu_seconds${suffix_total}{job=\"$job\"}[$__rate_interval])*100) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Avg CPU usage {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "min(rate(otelcol_process_cpu_seconds${suffix_total}{job=\"$job\"}[$__rate_interval])*100) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Min CPU usage {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "CPU Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Number of service instances, which are reporting metrics", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 65 + }, + "id": 41, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "count(count(otelcol_process_cpu_seconds${suffix_total}{service_instance_id=~\".*\",job=\"$job\"}) by (service_instance_id))", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Service instance count", + "range": true, + "refId": "B" + } + ], + "title": "Service Instance Count", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 65 + }, + "id": 54, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(otelcol_process_uptime${suffix_seconds}${suffix_total}{service_instance_id=~\".*\",job=\"$job\"}) by (service_instance_id)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Service instance uptime: {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Uptime by Service Instance", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 24, + "x": 0, + "y": 74 + }, + "id": 57, + "interval": "$minstep", + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "max(otelcol_process_uptime${suffix_seconds}${suffix_total}{service_instance_id=~\".*\",job=\"$job\",service_version=\".+\"}) by (service_instance_id,service_name,service_version)\r\nor\r\nmax(\r\n otelcol_process_uptime${suffix_seconds}${suffix_total}{service_instance_id=~\".*\",job=\"$job\"} \r\n * on(job, instance) \r\n group_left(service_version) \r\n (\r\n target_info \r\n * on(job, instance) \r\n group_left \r\n label_replace(target_info{}, \"service_instance_id\", \"$1\", \"instance\", \"(.*)\")\r\n )\r\n) by (service_instance_id, service_name, service_version)", + "format": "table", + "hide": false, + "instant": true, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "__auto", + "range": false, + "refId": "B" + } + ], + "title": "Service Instance Details", + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "Value": true + }, + "indexByName": {}, + "renameByName": {} + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 79 + }, + "id": 59, + "panels": [], + "title": "Signal flows", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Receivers -> Processor(s) -> Exporters (Node Graph panel is beta, so this panel may not show data correctly).", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 0, + "y": 80 + }, + "id": 58, + "options": { + "edges": {}, + "nodes": { + "mainStatUnit": "flops" + }, + "zoomMode": "cooperative" + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "# receivers\nlabel_replace(\n label_join(\n label_join(\n sum(${metric:value}(\n otelcol_receiver_accepted_spans${suffix_total}{job=\"$job\"}[$__rate_interval])\n ) by (receiver)\n , \"id\", \"-rcv-\", \"transport\", \"receiver\"\n )\n , \"title\", \"\", \"transport\", \"receiver\"\n )\n , \"icon\", \"arrow-to-right\", \"\", \"\"\n)\n\n# dummy processor\nor\nlabel_replace(\n label_replace(\n label_replace(\n (sum(rate(otelcol_process_uptime${suffix_seconds}${suffix_total}{job=\"$job\"}[$__rate_interval])))\n , \"id\", \"processor\", \"\", \"\"\n )\n , \"title\", \"Processor(s)\", \"\", \"\"\n )\n , \"icon\", \"arrow-random\", \"\", \"\"\n)\n\n# exporters\nor\nlabel_replace(\n label_join(\n label_join(\n sum(${metric:value}(\n otelcol_exporter_sent_spans${suffix_total}{job=\"$job\"}[$__rate_interval])\n ) by (exporter)\n , \"id\", \"-exp-\", \"transport\", \"exporter\"\n )\n , \"title\", \"\", \"transport\", \"exporter\"\n )\n , \"icon\", \"arrow-from-right\", \"\", \"\"\n)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "nodes" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "# receivers -> processor\r\nlabel_join(\r\n label_replace(\r\n label_join(\r\n (sum(rate(otelcol_receiver_accepted_spans${suffix_total}{job=\"$job\"}[$__rate_interval])) by (receiver))\r\n ,\"source\", \"-rcv-\", \"transport\", \"receiver\"\r\n )\r\n ,\"target\", \"processor\", \"\", \"\"\r\n )\r\n , \"id\", \"-\", \"source\", \"target\"\r\n)\r\n\r\n# processor -> exporters\r\nor\r\nlabel_join(\r\n label_replace(\r\n label_join(\r\n (sum(rate(otelcol_exporter_sent_spans${suffix_total}{job=\"$job\"}[$__rate_interval])) by (exporter))\r\n , \"target\", \"-exp-\", \"transport\", \"exporter\"\r\n )\r\n , \"source\", \"processor\", \"\", \"\"\r\n )\r\n , \"id\", \"-\", \"source\", \"target\"\r\n)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "edges" + } + ], + "title": "Spans Flow", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "Value", + "renamePattern": "mainstat" + } + }, + { + "disabled": true, + "id": "calculateField", + "options": { + "alias": "secondarystat", + "mode": "reduceRow", + "reduce": { + "include": [ + "mainstat" + ], + "reducer": "sum" + } + } + } + ], + "type": "nodeGraph" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Receivers -> Processor(s) -> Exporters (Node Graph panel is beta, so this panel may not show data correctly).", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 8, + "y": 80 + }, + "id": 60, + "options": { + "edges": {}, + "nodes": { + "mainStatUnit": "none" + }, + "zoomMode": "cooperative" + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "# receivers\nlabel_replace(\n label_join(\n label_join(\n (sum(\n ${metric:value}(otelcol_receiver_accepted_metric_points${suffix_total}{job=\"$job\"}[$__rate_interval])\n ) by (receiver))\n , \"id\", \"-rcv-\", \"transport\", \"receiver\"\n )\n , \"title\", \"\", \"transport\", \"receiver\"\n )\n , \"icon\", \"arrow-to-right\", \"\", \"\"\n)\n\n# dummy processor\nor\nlabel_replace(\n label_replace(\n label_replace(\n (sum(rate(otelcol_process_uptime${suffix_seconds}${suffix_total}{job=\"$job\"}[$__rate_interval])))\n , \"id\", \"processor\", \"\", \"\"\n )\n , \"title\", \"Processor(s)\", \"\", \"\"\n )\n , \"icon\", \"arrow-random\", \"\", \"\"\n)\n\n# exporters\nor\nlabel_replace(\n label_join(\n label_join(\n (sum(\n ${metric:value}(otelcol_exporter_sent_metric_points${suffix_total}{job=\"$job\"}[$__rate_interval])\n ) by (exporter))\n , \"id\", \"-exp-\", \"transport\", \"exporter\"\n )\n , \"title\", \"\", \"transport\", \"exporter\"\n )\n , \"icon\", \"arrow-from-right\", \"\", \"\"\n)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "nodes" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "# receivers -> processor\r\nlabel_join(\r\n label_replace(\r\n label_join(\r\n (sum(rate(otelcol_receiver_accepted_metric_points${suffix_total}{job=\"$job\"}[$__rate_interval])) by (receiver))\r\n , \"source\", \"-rcv-\", \"transport\", \"receiver\"\r\n )\r\n , \"target\", \"processor\", \"\", \"\"\r\n )\r\n , \"id\", \"-\", \"source\", \"target\"\r\n)\r\n\r\n# processor -> exporters\r\nor \r\nlabel_join(\r\n label_replace(\r\n label_join(\r\n (sum(rate(otelcol_exporter_sent_metric_points${suffix_total}{job=\"$job\"}[$__rate_interval])) by (exporter))\r\n , \"target\", \"-exp-\", \"transport\", \"exporter\"\r\n )\r\n , \"source\", \"processor\", \"\", \"\"\r\n )\r\n , \"id\", \"-\", \"source\", \"target\"\r\n)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "edges" + } + ], + "title": "Metric Points Flow", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "Value", + "renamePattern": "mainstat" + } + }, + { + "disabled": true, + "id": "calculateField", + "options": { + "alias": "secondarystat", + "mode": "reduceRow", + "reduce": { + "include": [ + "Value #nodes" + ], + "reducer": "sum" + } + } + } + ], + "type": "nodeGraph" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Receivers -> Processor(s) -> Exporters (Node Graph panel is beta, so this panel may not show data correctly).", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 8, + "x": 16, + "y": 80 + }, + "id": 61, + "options": { + "edges": {}, + "nodes": { + "mainStatUnit": "flops" + }, + "zoomMode": "cooperative" + }, + "pluginVersion": "11.5.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "# receivers\nlabel_replace(\n label_join(\n label_join(\n sum(${metric:value}(\n otelcol_receiver_accepted_log_records${suffix_total}{job=\"$job\"}[$__rate_interval])\n ) by (receiver)\n , \"id\", \"-rcv-\", \"transport\", \"receiver\"\n )\n , \"title\", \"\", \"transport\", \"receiver\"\n )\n , \"icon\", \"arrow-to-right\", \"\", \"\"\n)\n\n# dummy processor\nor\nlabel_replace(\n label_replace(\n label_replace(\n (sum(rate(otelcol_process_uptime${suffix_seconds}${suffix_total}{job=\"$job\"}[$__rate_interval])))\n , \"id\", \"processor\", \"\", \"\"\n )\n , \"title\", \"Processor(s)\", \"\", \"\"\n )\n , \"icon\", \"arrow-random\", \"\", \"\"\n)\n\n# exporters\nor\nlabel_replace(\n label_join(\n label_join(\n sum(${metric:value}(\n otelcol_exporter_sent_log_records${suffix_total}{job=\"$job\"}[$__rate_interval])\n ) by (exporter)\n , \"id\", \"-exp-\", \"transport\", \"exporter\"\n )\n , \"title\", \"\", \"transport\", \"exporter\"\n )\n , \"icon\", \"arrow-from-right\", \"\", \"\"\n)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "nodes" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "# receivers -> processor\r\nlabel_join(\r\n label_replace(\r\n label_join(\r\n (sum(rate(otelcol_receiver_accepted_log_records${suffix_total}{job=\"$job\"}[$__rate_interval])) by (receiver))\r\n , \"source\", \"-rcv-\", \"transport\", \"receiver\"\r\n )\r\n , \"target\", \"processor\", \"\", \"\"\r\n )\r\n , \"id\", \"-edg-\", \"source\", \"target\"\r\n)\r\n\r\n# processor -> exporters\r\nor \r\nlabel_join(\r\n label_replace(\r\n label_join(\r\n (sum(rate(otelcol_exporter_sent_log_records${suffix_total}{job=\"$job\"}[$__rate_interval])) by (exporter))\r\n ,\"target\",\"-exp-\",\"transport\",\"exporter\"\r\n )\r\n ,\"source\",\"processor\",\"\",\"\"\r\n )\r\n ,\"id\",\"-edg-\",\"source\",\"target\"\r\n)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "edges" + } + ], + "title": "Log Records Flow", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "Value", + "renamePattern": "mainstat" + } + }, + { + "disabled": true, + "id": "calculateField", + "options": { + "alias": "secondarystat", + "mode": "reduceRow", + "reduce": { + "include": [ + "mainstat" + ], + "reducer": "sum" + } + } + } + ], + "type": "nodeGraph" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 89 + }, + "id": 79, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 88 + }, + "id": 32, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_filter_spans_filtered${suffix_total}{job=\"$job\"}[$__rate_interval])) by (filter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Filtered: {{filter}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + } + ], + "title": "Spans ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 88 + }, + "id": 81, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_filter_datapoints_filtered${suffix_total}{job=\"$job\"}[$__rate_interval])) by (filter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Filtered: {{filter}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + } + ], + "title": "Metric Points ${metric:text}", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 16, + "y": 88 + }, + "id": 82, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(${metric:value}(otelcol_processor_filter_log_records_filtered${suffix_total}{job=\"$job\"}[$__rate_interval])) by (filter $grouping)", + "format": "time_series", + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Filtered: {{filter}} {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + } + ], + "title": "Log Records ${metric:text}", + "type": "timeseries" + } + ], + "title": "Filter processors", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 90 + }, + "id": 68, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Measures the number of messages received per RPC. Should be 1 for all non-streaming RPCs. GRPC status codes: https://grpc.github.io/grpc/core/md_doc_statuscodes.html", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "0" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "displayName", + "value": "0 - OK" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "1" + }, + "properties": [ + { + "id": "displayName", + "value": "1 - CANCELLED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "2" + }, + "properties": [ + { + "id": "displayName", + "value": "2 - UNKNOWN" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "3" + }, + "properties": [ + { + "id": "displayName", + "value": "3 - INVALID_ARGUMENT" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "4" + }, + "properties": [ + { + "id": "displayName", + "value": "4 - DEADLINE_EXCEEDED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "5" + }, + "properties": [ + { + "id": "displayName", + "value": "5 - NOT_FOUND" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "6" + }, + "properties": [ + { + "id": "displayName", + "value": "6 - ALREADY_EXISTS" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "7" + }, + "properties": [ + { + "id": "displayName", + "value": "7 - PERMISSION_DENIED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "8" + }, + "properties": [ + { + "id": "displayName", + "value": "8 - RESOURCE_EXHAUSTED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "9" + }, + "properties": [ + { + "id": "displayName", + "value": "9 - FAILED_PRECONDITION" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "10" + }, + "properties": [ + { + "id": "displayName", + "value": "10 - ABORTED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "11" + }, + "properties": [ + { + "id": "displayName", + "value": "11 - OUT_OF_RANGE" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "12" + }, + "properties": [ + { + "id": "displayName", + "value": "12 - UNIMPLEMENTED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "13" + }, + "properties": [ + { + "id": "displayName", + "value": "13 - INTERNAL" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "14" + }, + "properties": [ + { + "id": "displayName", + "value": "14 - UNAVAILABLE" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "15" + }, + "properties": [ + { + "id": "displayName", + "value": "15 - DATA_LOSS" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "16" + }, + "properties": [ + { + "id": "displayName", + "value": "16 - UNAUTHENTICATED" + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 291 + }, + "id": 69, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(rpc_grpc_status_code) (${metric:value}(${prefix:raw}rpc_server_responses_per_rpc_count{job=\"$job\"}[$__rate_interval]))", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "RPC server responses by GRPC status code (receivers)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Measures the number of messages received per RPC. Should be 1 for all non-streaming RPCs. GRPC status codes: https://grpc.github.io/grpc/core/md_doc_statuscodes.html", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "0" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "displayName", + "value": "0 - OK" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "1" + }, + "properties": [ + { + "id": "displayName", + "value": "1 - CANCELLED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "2" + }, + "properties": [ + { + "id": "displayName", + "value": "2 - UNKNOWN" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "3" + }, + "properties": [ + { + "id": "displayName", + "value": "3 - INVALID_ARGUMENT" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "4" + }, + "properties": [ + { + "id": "displayName", + "value": "4 - DEADLINE_EXCEEDED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "5" + }, + "properties": [ + { + "id": "displayName", + "value": "5 - NOT_FOUND" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "6" + }, + "properties": [ + { + "id": "displayName", + "value": "6 - ALREADY_EXISTS" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "7" + }, + "properties": [ + { + "id": "displayName", + "value": "7 - PERMISSION_DENIED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "8" + }, + "properties": [ + { + "id": "displayName", + "value": "8 - RESOURCE_EXHAUSTED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "9" + }, + "properties": [ + { + "id": "displayName", + "value": "9 - FAILED_PRECONDITION" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "10" + }, + "properties": [ + { + "id": "displayName", + "value": "10 - ABORTED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "11" + }, + "properties": [ + { + "id": "displayName", + "value": "11 - OUT_OF_RANGE" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "12" + }, + "properties": [ + { + "id": "displayName", + "value": "12 - UNIMPLEMENTED" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "13" + }, + "properties": [ + { + "id": "displayName", + "value": "13 - INTERNAL" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "14" + }, + "properties": [ + { + "id": "displayName", + "value": "14 - UNAVAILABLE" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "15" + }, + "properties": [ + { + "id": "displayName", + "value": "15 - DATA_LOSS" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "16" + }, + "properties": [ + { + "id": "displayName", + "value": "16 - UNAUTHENTICATED" + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 291 + }, + "id": 70, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "sum by(rpc_grpc_status_code) (${metric:value}(${prefix:raw}rpc_client_responses_per_rpc_count{job=\"$job\"}[$__rate_interval]))", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "RPC client responses by GRPC status code (exporters)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + }, + "links": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 300 + }, + "id": 72, + "interval": "$minstep", + "maxDataPoints": 50, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "Reds", + "steps": 25 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-09 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "ms" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(${prefix:raw}rpc_server_duration_bucket{job=\"$job\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "{{le}}", + "refId": "B" + } + ], + "title": "RPC server duration (receivers)", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + }, + "links": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 300 + }, + "id": 74, + "interval": "$minstep", + "maxDataPoints": 50, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "Reds", + "steps": 25 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-09 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "ms" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(${prefix:raw}rpc_client_duration_bucket{job=\"$job\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "{{le}}", + "refId": "B" + } + ], + "title": "RPC client duration (exporters)", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + }, + "links": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 308 + }, + "id": 73, + "interval": "$minstep", + "maxDataPoints": 50, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "Reds", + "steps": 25 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 0.1 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "bytes" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(${prefix:raw}rpc_server_request_size_bucket{job=\"$job\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "{{le}}", + "refId": "B" + } + ], + "title": "RPC server request size (receivers)", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + }, + "links": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 308 + }, + "id": 75, + "interval": "$minstep", + "maxDataPoints": 50, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "Reds", + "steps": 25 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 0.1 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "bytes" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(${prefix:raw}rpc_client_request_size_bucket{job=\"$job\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "{{le}}", + "refId": "B" + } + ], + "title": "RPC client request size (exporters)", + "type": "heatmap" + } + ], + "title": "RPC server/client", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 91 + }, + "id": 77, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + }, + "links": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 350 + }, + "id": 76, + "interval": "$minstep", + "maxDataPoints": 50, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "Reds", + "steps": 25 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-09 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "ms" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(${prefix:raw}http_server_duration_bucket{job=\"$job\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "__auto", + "refId": "B" + } + ], + "title": "HTTP server duration (receivers)", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + }, + "links": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 350 + }, + "id": 78, + "interval": "$minstep", + "maxDataPoints": 50, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": true, + "scale": "exponential", + "scheme": "Reds", + "steps": 25 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-09 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "ms" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(increase(${prefix:raw}http_client_duration_bucket{job=\"$job\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "hide": false, + "instant": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "{{le}}", + "refId": "B" + } + ], + "title": "HTTP client duration (exporters)", + "type": "heatmap" + } + ], + "title": "HTTP server/client", + "type": "row" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 92 + }, + "id": 63, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Added: Number of namespace add events received.\nUpdated: Number of namespace update events received.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*updated.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 212 + }, + "id": 64, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "avg(otelcol_otelsvc_k8s_namespace_added${suffix_total}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Added: {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "avg(otelcol_otelsvc_k8s_namespace_updated${suffix_total}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Updated: {{transport}} {{service_instance_id}}", + "range": true, + "refId": "B" + } + ], + "title": "Namespaces", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "description": "Added: Number of pod add events received.\nUpdated: Number of pod update events received.\nDeleted: Number of pod delete events received.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 212 + }, + "id": 65, + "interval": "$minstep", + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(otelcol_otelsvc_k8s_pod_added${suffix_total}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Added: {{transport}} {{service_instance_id}}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(otelcol_otelsvc_k8s_pod_updated${suffix_total}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Updated: {{transport}} {{service_instance_id}}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(otelcol_otelsvc_k8s_pod_deleted${suffix_total}{job=\"$job\"}) by (job $grouping)", + "format": "time_series", + "hide": false, + "interval": "$minstep", + "intervalFactor": 1, + "legendFormat": "Deleted: {{transport}} {{service_instance_id}}", + "range": true, + "refId": "C" + } + ], + "title": "Pods", + "type": "timeseries" + } + ], + "title": "Kubernetes", + "type": "row" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 93 + }, + "id": 66, + "panels": [], + "title": "Documentation", + "type": "row" + } + ], + "preload": false, + "refresh": "", + "schemaVersion": 40, + "tags": [ + "opentelemetry" + ], + "templating": { + "list": [ + { + "current": {}, + "includeAll": false, + "label": "Datasource", + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "", + "type": "datasource" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result({__name__=~\"otelcol_process_uptime.*\"})", + "includeAll": false, + "label": "Job", + "name": "job", + "options": [], + "query": { + "qryType": 3, + "query": "query_result({__name__=~\"otelcol_process_uptime.*\"})", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "/.*{.*job=\"([a-zA-Z0-9_-]+)\".*}/", + "sort": 1, + "type": "query" + }, + { + "auto": true, + "auto_count": 300, + "auto_min": "10s", + "current": { + "text": "$__auto", + "value": "$__auto" + }, + "label": "Min step", + "name": "minstep", + "options": [ + { + "selected": false, + "text": "10s", + "value": "10s" + }, + { + "selected": false, + "text": "30s", + "value": "30s" + }, + { + "selected": false, + "text": "1m", + "value": "1m" + }, + { + "selected": false, + "text": "5m", + "value": "5m" + } + ], + "query": "10s,30s,1m,5m", + "refresh": 2, + "type": "interval" + }, + { + "current": { + "text": "rate", + "value": "rate" + }, + "includeAll": false, + "label": "Base metric", + "name": "metric", + "options": [ + { + "selected": true, + "text": "Rate", + "value": "rate" + }, + { + "selected": false, + "text": "Count", + "value": "increase" + } + ], + "query": "Rate : rate, Count : increase", + "type": "custom" + }, + { + "allValue": ".*", + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result(avg by (receiver) ({__name__=~\"otelcol_receiver_.+\",job=\"$job\"}))", + "includeAll": true, + "label": "Receiver", + "name": "receiver", + "options": [], + "query": { + "qryType": 3, + "query": "query_result(avg by (receiver) ({__name__=~\"otelcol_receiver_.+\",job=\"$job\"}))", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "/.*receiver=\"(.*)\".*/", + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result(avg by (processor) ({__name__=~\"otelcol_processor_.+\",job=\"$job\"}))", + "includeAll": true, + "label": "Processor", + "name": "processor", + "options": [], + "query": { + "qryType": 3, + "query": "query_result(avg by (processor) ({__name__=~\"otelcol_processor_.+\",job=\"$job\"}))", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "/.*processor=\"(.*)\".*/", + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result(avg by (exporter) ({__name__=~\"otelcol_exporter_.+\",job=\"$job\"}))", + "includeAll": true, + "label": "Exporter", + "name": "exporter", + "options": [], + "query": { + "qryType": 3, + "query": "query_result(avg by (exporter) ({__name__=~\"otelcol_exporter_.+\",job=\"$job\"}))", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "/.*exporter=\"(.*)\".*/", + "sort": 1, + "type": "query" + }, + { + "current": { + "text": "", + "value": "" + }, + "description": "Detailed metrics must be configured in the collector configuration. They add grouping by transport protocol (http/grpc) for receivers. ", + "includeAll": false, + "label": "Additional groupping", + "name": "grouping", + "options": [ + { + "selected": true, + "text": "None (basic metrics)", + "value": "" + }, + { + "selected": false, + "text": "By transport (detailed metrics)", + "value": ",transport" + }, + { + "selected": false, + "text": "By service instance id", + "value": ",service_instance_id" + } + ], + "query": "None (basic metrics) : , By transport (detailed metrics) : \\,transport, By service instance id : \\,service_instance_id", + "type": "custom" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result({__name__=~\"otelcol_process_uptime.+\",job=\"$job\"})", + "description": "Some exporter(s) configuration(s) may add the metric suffix _total. This variable will detect this case.", + "hide": 2, + "includeAll": false, + "label": "Suffix _total", + "name": "suffix_total", + "options": [], + "query": { + "qryType": 3, + "query": "query_result({__name__=~\"otelcol_process_uptime.+\",job=\"$job\"})", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "/.*(_total)+{.*/", + "type": "query" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result({__name__=~\"otelcol_process_uptime.+\",job=\"$job\"})", + "description": "Some exporter(s) configuration(s) may add the metric suffix _seconds_total. This variable will detect this \"_seconds\" suffix part.", + "hide": 2, + "includeAll": false, + "label": "Suffix _seconds", + "name": "suffix_seconds", + "options": [], + "query": { + "qryType": 3, + "query": "query_result({__name__=~\"otelcol_process_uptime.+\",job=\"$job\"})", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "/otelcol_process_uptime(.*)_total{.*/", + "type": "query" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result({__name__=~\"otelcol_process_memory_rss.+\",job=\"$job\"})", + "description": "Some exporter(s) configuration(s) may add the metric suffix _bytes. This variable will detect this \"_bytes\" suffix part.", + "hide": 2, + "includeAll": false, + "label": "Suffix _bytes", + "name": "suffix_bytes", + "options": [], + "query": { + "qryType": 3, + "query": "query_result({__name__=~\"otelcol_process_memory_rss.+\",job=\"$job\"})", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "/otelcol_process_memory_rss(.*){.*/", + "type": "query" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "definition": "query_result({__name__=~\".*.*rpc_server_duration_bucket|.*rpc_client_duration_bucket|.*http_server_duration_bucket|.*http_client_duration_bucket.*\",job=\"$job\"})", + "description": "Some metrics (e.g., RPC, HTTP) may no longer have the otelcol_ prefix. This will detect it. See https://github.com/open-telemetry/opentelemetry-collector/pull/9759", + "hide": 2, + "includeAll": false, + "label": "Prefix", + "name": "prefix", + "options": [], + "query": { + "qryType": 3, + "query": "query_result({__name__=~\".*.*rpc_server_duration_bucket|.*rpc_client_duration_bucket|.*http_server_duration_bucket|.*http_client_duration_bucket.*\",job=\"$job\"})", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "/(.*)(rpc|http)_(server|client)_duration_bucket.*{.*/", + "type": "query" + }, + { + "baseFilters": [], + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "filters": [], + "label": "Ad Hoc", + "name": "adhoc", + "type": "adhoc" + } + ] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "OpenTelemetry Collector", + "uid": "BKf2sowmj", + "version": 1, + "weekStart": "" + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-postgresql-dashboard + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + postgresql-dashboard.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "Performance metrics for PostgreSQL instrumented with the OpenTelemetry Collector PostgreSQL receiver.", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 6, + "links": [ + { + "asDropdown": false, + "includeVars": true, + "keepTime": true, + "tags": [ + "postgres-integration" + ], + "title": "Integration dashboards", + "type": "dashboards" + } + ], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 15, + "panels": [], + "title": "PostgreSQL Overview", + "type": "row" + }, + { + "datasource": { + "uid": "$datasource" + }, + "description": "Queries per seconds. Queries being commits or rollbacks.\n", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "rgb(31, 120, 193)", + "mode": "fixed" + }, + "decimals": 0, + "mappings": [ + { + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 4, + "x": 0, + "y": 1 + }, + "id": 11, + "maxDataPoints": 100, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "horizontal", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(irate(postgresql_commits_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"}[$__rate_interval])) + sum(irate(postgresql_rollbacks_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"}[$__rate_interval]))", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "xact_commit" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "10s" + ], + "type": "non_negative_derivative" + } + ] + ], + "step": 1800, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + } + ], + "title": "QPS", + "type": "stat" + }, + { + "datasource": { + "uid": "$datasource" + }, + "description": "See [pg_stat_database / `tup_fetched`](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-DATABASE-VIEW)", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 20, + "x": 4, + "y": 1 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "alias": "fetched", + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(irate(postgresql_tup_fetched_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"}[$__rate_interval]))", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "fetched", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "fetched", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "tup_fetched" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "10s" + ], + "type": "non_negative_derivative" + } + ] + ], + "step": 120, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "alias": "fetched", + "datasource": { + "uid": "$datasource" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(irate(postgresql_tup_returned_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"}[$__rate_interval]))", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "returned", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "returned", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "tup_fetched" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "10s" + ], + "type": "non_negative_derivative" + } + ] + ], + "step": 120, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "alias": "fetched", + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(irate(postgresql_tup_inserted_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"}[$__rate_interval]))", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "intervalFactor": 2, + "legendFormat": "inserted", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "inserted", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "tup_fetched" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "10s" + ], + "type": "non_negative_derivative" + } + ] + ], + "step": 120, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "alias": "fetched", + "datasource": { + "uid": "$datasource" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(irate(postgresql_tup_updated_total{dpostgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"}[$__rate_interval]))", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "intervalFactor": 2, + "legendFormat": "updated", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "updated", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "tup_fetched" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "10s" + ], + "type": "non_negative_derivative" + } + ] + ], + "step": 120, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "alias": "fetched", + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(irate(postgresql_tup_deleted_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"}[$__rate_interval]))", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "intervalFactor": 2, + "legendFormat": "deleted", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "deleted", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "tup_fetched" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "10s" + ], + "type": "non_negative_derivative" + } + ] + ], + "step": 120, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + } + ], + "title": "Rows", + "type": "timeseries" + }, + { + "datasource": { + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "alias": "Buffers Allocated", + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "irate(postgresql_bgwriter_buffers_allocated_total{host_name=~\"$host_name\", k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\"}[$__rate_interval])", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "buffers allocated", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "buffers_allocated", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "buffers_alloc" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [], + "type": "difference" + } + ] + ], + "step": 240, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "irate(postgresql_bgwriter_buffers_writes_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\", host_name=~\"$host_name\"}[$__interval])", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "interval": "", + "legendFormat": "buffers write {{source}}", + "range": true, + "refId": "buffers_write", + "useBackend": false + }, + { + "alias": "Buffers Allocated", + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "expr": "irate(pg_stat_bgwriter_buffers_backend_total{job=~\"$job\",cluster=~\"$cluster\",instance=~\"$instance\"}[$__rate_interval])", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "buffers_backend", + "measurement": "postgresql", + "policy": "default", + "refId": "buffers_backend", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "buffers_alloc" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [], + "type": "difference" + } + ] + ], + "step": 240, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "alias": "Buffers Allocated", + "datasource": { + "uid": "$datasource" + }, + "dsType": "prometheus", + "expr": "irate(pg_stat_bgwriter_buffers_clean_total{job=~\"$job\",cluster=~\"$cluster\",instance=~\"$instance\"}[$__rate_interval])", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "buffers_clean", + "measurement": "postgresql", + "policy": "default", + "refId": "buffers_clean", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "buffers_alloc" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [], + "type": "difference" + } + ] + ], + "step": 240, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "alias": "Buffers Allocated", + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "irate(postgresql_bgwriter_checkpoint_count_total{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\", host_name=~\"$host_name\"}[$__rate_interval])", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "checkpoint {{type}}", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "checkpoint", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "buffers_alloc" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [], + "type": "difference" + } + ] + ], + "step": 240, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + } + ], + "title": "Buffers", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "$datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "deadlocks" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-red", + "mode": "fixed" + } + } + ] + }, + { + "__systemRef": "hideSeriesFrom", + "matcher": { + "id": "byNames", + "options": { + "mode": "exclude", + "names": [ + "deadlocks" + ], + "prefix": "All except:", + "readOnly": true + } + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": false, + "tooltip": false, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "alias": "conflicts", + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(postgresql_deadlocks_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\", host_name=~\"$host_name\"})", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "deadlocks", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "deadlocks", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "conflicts" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [], + "type": "difference" + } + ] + ], + "step": 240, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + }, + { + "alias": "deadlocks", + "datasource": { + "uid": "$datasource" + }, + "dsType": "prometheus", + "editorMode": "code", + "expr": "sum(postgresql_conflicts_total{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",host_name=~\"$host_name\"})", + "format": "time_series", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "intervalFactor": 2, + "legendFormat": "conflicts", + "measurement": "postgresql", + "policy": "default", + "range": true, + "refId": "conflicts-not-yet-implemented-in-otelcol", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "deadlocks" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [], + "type": "difference" + } + ] + ], + "step": 240, + "tags": [ + { + "key": "instance", + "operator": "=~", + "value": "/^$instance$/" + } + ] + } + ], + "title": "Conflicts/Deadlocks", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 15 + }, + "id": 12, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "round(\n sum by (postgresql_database_name) (\n rate(\n postgresql_blks_hit_total{\n postgresql_database_name=~\"$db\",\n k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",\n host_name=~\"$host_name\"\n }[$__rate_interval]\n )\n )\n /\n (\n sum by (postgresql_database_name) (\n rate(\n postgresql_blks_hit_total{\n postgresql_database_name=~\"$db\",\n k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",\n host_name=~\"$host_name\"\n }[$__rate_interval]\n )\n )\n +\n sum by (postgresql_database_name) (\n rate(\n postgresql_blks_read_total{\n postgresql_database_name=~\"$db\",\n k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\",\n host_name=~\"$host_name\"\n }[$__rate_interval]\n )\n )\n ) * 100,\n 0.001\n)", + "format": "time_series", + "legendFormat": "{{postgresql_database_name}} - cache hit ratio", + "range": true, + "refId": "A", + "step": 240 + } + ], + "title": "Cache hit ratio", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 15 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "uid": "$datasource" + }, + "editorMode": "code", + "expr": "postgresql_backends{postgresql_database_name=~\"$db\",k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\", host_name=~\"$host_name\"}", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "{{postgresql_database_name}} - connections", + "range": true, + "refId": "A", + "step": 240 + } + ], + "title": "Number of active connections", + "type": "timeseries" + } + ], + "preload": false, + "refresh": "30s", + "schemaVersion": 41, + "tags": [ + "opentelemetry", + "postgresql" + ], + "templating": { + "list": [ + { + "current": { + "text": "Prometheus", + "value": "webstore-metrics" + }, + "includeAll": false, + "label": "Data Source", + "name": "datasource", + "options": [], + "query": "prometheus", + "refresh": 1, + "regex": "(?!grafanacloud-usage|grafanacloud-ml-metrics).+", + "type": "datasource" + }, + { + "allValue": ".*", + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "definition": "label_values(postgresql_table_count,k8s_cluster_name)", + "description": "When deploying PostgreSQL on Kubernetes, name of the Kubernetes cluster. \nFor other deployments, select \"All\". ", + "includeAll": true, + "label": "K8s Cluster", + "multi": true, + "name": "k8s_cluster_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(postgresql_table_count,k8s_cluster_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "current": { + "text": "", + "value": "" + }, + "definition": "label_values(postgresql_table_count{k8s_cluster_name=~\"$k8s_cluster_name\"},k8s_statefulset_name)", + "description": "When deploying on Kubernetes, name of the `StatefulSet` of the PostgreSQL deployment (e.g. `my-pg-cluster`).\nFor other deployments, select \"All\". ", + "includeAll": true, + "label": "K8s Statefulset", + "multi": true, + "name": "k8s_statefulset_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(postgresql_table_count{k8s_cluster_name=~\"$k8s_cluster_name\"},k8s_statefulset_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "type": "query" + }, + { + "allValue": ".+", + "current": { + "text": "All", + "value": [ + "$__all" + ] + }, + "datasource": { + "uid": "$datasource" + }, + "definition": "label_values(postgresql_table_count{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\"},host_name)", + "description": "When deploying PostgreSQL on VMs, name on the host on which the database is deployed.\nFor other deployments, select \"All\". ", + "includeAll": true, + "label": "Host", + "multi": true, + "name": "host_name", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(postgresql_table_count{k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\"},host_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "sort": 1, + "type": "query" + }, + { + "allValue": ".+", + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "definition": "label_values(postgresql_table_count{host_name=~\"$host_name\", postgresql_database_name!~\"template.*|postgres\", k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\"},postgresql_database_name)", + "includeAll": true, + "label": "Database", + "name": "db", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(postgresql_table_count{host_name=~\"$host_name\", postgresql_database_name!~\"template.*|postgres\", k8s_cluster_name=~\"$k8s_cluster_name\", k8s_statefulset_name=~\"$k8s_statefulset_name\"},postgresql_database_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "type": "query" + } + ] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "PostgreSQL", + "uid": "xHhbQmdjA", + "version": 5 + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-spanmetrics-dashboard + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + spanmetrics-dashboard.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "Spanmetrics way of demo application view.", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 3, + "links": [], + "panels": [ + { + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 26, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "This dashboard uses RED metrics generated for all services by the spanmetrics connector configured in the OpenTelemetry Collector.\n
\nChart panels may require 5 minutes after the Demo is started before rendering data.", + "mode": "html" + }, + "pluginVersion": "11.4.0", + "title": "", + "type": "text" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 2 + }, + "id": 24, + "panels": [], + "title": "Service Level - Throughput and Latencies", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-BlYlRd" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + }, + { + "color": "green", + "value": 2 + }, + { + "color": "#EAB839", + "value": 64 + }, + { + "color": "orange", + "value": 128 + }, + { + "color": "red", + "value": 256 + } + ] + }, + "unit": "ms" + }, + "overrides": [] + }, + "gridPos": { + "h": 20, + "w": 12, + "x": 0, + "y": 3 + }, + "id": 2, + "interval": "5m", + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(7,histogram_quantile(0.50, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval])) by (le,service_name)))", + "format": "time_series", + "hide": true, + "instant": false, + "interval": "", + "legendFormat": "{{service_name}}-quantile_0.50", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(7,histogram_quantile(0.95, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__range])) by (le,service_name)))", + "hide": false, + "instant": true, + "interval": "", + "legendFormat": "{{service_name}}", + "range": false, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "histogram_quantile(0.99, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval])) by (le,service_name))", + "hide": true, + "interval": "", + "legendFormat": "quantile99", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "histogram_quantile(0.999, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval])) by (le,service_name))", + "hide": true, + "interval": "", + "legendFormat": "quantile999", + "range": true, + "refId": "D" + } + ], + "title": "Top 3x3 - Service Latency - quantile95", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-BlYlRd" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "super-light-blue", + "value": 1 + }, + { + "color": "#EAB839", + "value": 2 + }, + { + "color": "red", + "value": 10 + } + ] + }, + "unit": "reqps" + }, + "overrides": [] + }, + "gridPos": { + "h": 13, + "w": 12, + "x": 12, + "y": 3 + }, + "id": 4, + "interval": "5m", + "options": { + "displayMode": "lcd", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 10, + "minVizWidth": 0, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "text": {}, + "valueMode": "color" + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(7,sum by (service_name) (rate(traces_span_metrics_calls_total{service_name=~\"$service\", span_name=~\"$span_name\"}[$__range])))", + "format": "time_series", + "instant": true, + "interval": "", + "legendFormat": "{{service_name}}", + "range": false, + "refId": "A" + } + ], + "title": "Top 7 Services Mean Rate over Range", + "type": "bargauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-reds" + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 1 + }, + { + "color": "red", + "value": 15 + } + ] + }, + "unit": "reqps" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 15, + "interval": "5m", + "options": { + "displayMode": "lcd", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 10, + "minVizWidth": 0, + "namePlacement": "auto", + "orientation": "vertical", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "text": {}, + "valueMode": "color" + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(7,sum(rate(traces_span_metrics_calls_total{status_code=\"STATUS_CODE_ERROR\",service_name=~\"$service\", span_name=~\"$span_name\"}[$__range])) by (service_name))", + "instant": true, + "interval": "", + "legendFormat": "{{service_name}}", + "range": false, + "refId": "A" + } + ], + "title": "Top 7 Services Mean ERROR Rate over Range", + "type": "bargauge" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 23 + }, + "id": 14, + "panels": [], + "title": "span_names Level - Throughput", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "bRate" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "lcd", + "type": "gauge" + } + }, + { + "id": "color", + "value": { + "mode": "continuous-BlYlRd" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "eRate" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "mode": "lcd", + "type": "gauge" + } + }, + { + "id": "color", + "value": { + "mode": "continuous-RdYlGr" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Error Rate" + }, + "properties": [ + { + "id": "custom.width", + "value": 663 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Rate" + }, + "properties": [ + { + "id": "custom.width", + "value": 667 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Service" + }, + "properties": [ + { + "id": "custom.width" + } + ] + } + ] + }, + "gridPos": { + "h": 11, + "w": 24, + "x": 0, + "y": 24 + }, + "id": 22, + "interval": "5m", + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "11.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "exemplar": false, + "expr": "topk(7, sum(rate(traces_span_metrics_calls_total{service_name=~\"$service\", span_name=~\"$span_name\"}[$__range])) by (span_name,service_name)) ", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "", + "refId": "Rate" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "exemplar": false, + "expr": "topk(7, sum(rate(traces_span_metrics_calls_total{status_code=\"STATUS_CODE_ERROR\",service_name=~\"$service\", span_name=~\"$span_name\"}[$__range])) by (span_name,service_name))", + "format": "table", + "hide": false, + "instant": true, + "interval": "", + "legendFormat": "", + "refId": "Error Rate" + } + ], + "title": "Top 7 span_names and Errors (APM Table)", + "transformations": [ + { + "id": "seriesToColumns", + "options": { + "byField": "span_name" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time 1": true, + "Time 2": true + }, + "indexByName": {}, + "renameByName": { + "Value #Error Rate": "Error Rate", + "Value #Rate": "Rate", + "service_name 1": "Rate in Service", + "service_name 2": "Error Rate in Service" + } + } + }, + { + "id": "calculateField", + "options": { + "alias": "bRate", + "mode": "reduceRow", + "reduce": { + "include": [ + "Rate" + ], + "reducer": "sum" + } + } + }, + { + "id": "calculateField", + "options": { + "alias": "eRate", + "mode": "reduceRow", + "reduce": { + "include": [ + "Error Rate" + ], + "reducer": "sum" + } + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Error Rate": true, + "Rate": true, + "bRate": false + }, + "indexByName": { + "Error Rate": 4, + "Error Rate in Service": 6, + "Rate": 1, + "Rate in Service": 5, + "bRate": 2, + "eRate": 3, + "span_name": 0 + }, + "renameByName": { + "Rate in Service": "Service", + "bRate": "Rate", + "eRate": "Error Rate", + "span_name": "span_name Name" + } + } + }, + { + "id": "sortBy", + "options": { + "fields": {}, + "sort": [ + { + "desc": true, + "field": "Rate" + } + ] + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 35 + }, + "id": 20, + "panels": [], + "title": "span_name Level - Latencies", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-BlYlRd" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue" + }, + { + "color": "green", + "value": 2 + }, + { + "color": "#EAB839", + "value": 64 + }, + { + "color": "orange", + "value": 128 + }, + { + "color": "red", + "value": 256 + } + ] + }, + "unit": "ms" + }, + "overrides": [] + }, + "gridPos": { + "h": 13, + "w": 12, + "x": 0, + "y": 36 + }, + "id": 25, + "interval": "5m", + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(7,histogram_quantile(0.50, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval])) by (le,service_name)))", + "format": "time_series", + "hide": true, + "instant": false, + "interval": "", + "legendFormat": "{{service_name}}-quantile_0.50", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(7,histogram_quantile(0.95, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__range])) by (le,span_name)))", + "hide": false, + "instant": true, + "interval": "", + "legendFormat": "{{span_name}}", + "range": false, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "histogram_quantile(0.99, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval])) by (le,service_name))", + "hide": true, + "interval": "", + "legendFormat": "quantile99", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "histogram_quantile(0.999, sum(rate(traces_span_metrics_duration_milliseconds_bucket{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval])) by (le,service_name))", + "hide": true, + "interval": "", + "legendFormat": "quantile999", + "range": true, + "refId": "D" + } + ], + "title": "Top 3x3 - span_name Latency - quantile95", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-BlYlRd" + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms" + }, + "overrides": [] + }, + "gridPos": { + "h": 13, + "w": 12, + "x": 12, + "y": 36 + }, + "id": 10, + "interval": "5m", + "options": { + "displayMode": "lcd", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 10, + "minVizWidth": 0, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk(7, sum by (span_name,service_name)(increase(traces_span_metrics_duration_milliseconds_sum{service_name=~\"${service}\", span_name=~\"$span_name\"}[5m]) / increase(traces_span_metrics_duration_milliseconds_count{service_name=~\"${service}\",span_name=~\"$span_name\"}[5m\n])))", + "instant": true, + "interval": "", + "legendFormat": "{{span_name}} [{{service_name}}]", + "range": false, + "refId": "A" + } + ], + "title": "Top 7 Highest Endpoint Latencies Mean Over Range ", + "type": "bargauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms" + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 24, + "x": 0, + "y": 49 + }, + "id": 16, + "interval": "5m", + "options": { + "legend": { + "calcs": [ + "mean", + "logmin", + "max", + "delta" + ], + "displayMode": "table", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "editorMode": "code", + "exemplar": true, + "expr": "topk(7,sum by (span_name,service_name)(increase(traces_span_metrics_duration_milliseconds_sum{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval]) / increase(traces_span_metrics_duration_milliseconds_count{service_name=~\"$service\", span_name=~\"$span_name\"}[$__rate_interval])))", + "instant": false, + "interval": "", + "legendFormat": "[{{service_name}}] {{span_name}}", + "range": true, + "refId": "A" + } + ], + "title": "Top 7 Latencies Over Range ", + "type": "timeseries" + } + ], + "preload": false, + "refresh": "5m", + "schemaVersion": 40, + "tags": [], + "templating": { + "list": [ + { + "allValue": ".*", + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "definition": "query_result(count by (service_name)(count_over_time(traces_span_metrics_calls_total[$__range])))", + "includeAll": true, + "multi": true, + "name": "service", + "options": [], + "query": { + "query": "query_result(count by (service_name)(count_over_time(traces_span_metrics_calls_total[$__range])))", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "/.*service_name=\"(.*)\".*/", + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "current": { + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "definition": "query_result(sum ({__name__=~\".*traces_span_metrics_calls_total\",service_name=~\"$service\"}) by (span_name))", + "includeAll": true, + "multi": true, + "name": "span_name", + "options": [], + "query": { + "query": "query_result(sum ({__name__=~\".*traces_span_metrics_calls_total\",service_name=~\"$service\"}) by (span_name))", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "/.*span_name=\"(.*)\".*/", + "type": "query" + } + ] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Spanmetrics Demo Dashboard", + "uid": "W2gX2zHVk48", + "version": 2, + "weekStart": "" + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-datasources + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_datasource: "1" +data: + + default.yaml: | + # Copyright The OpenTelemetry Authors + # SPDX-License-Identifier: Apache-2.0 + + + apiVersion: 1 + + datasources: + - name: Prometheus + uid: webstore-metrics + type: prometheus + url: http://prometheus:9090 + editable: true + isDefault: true + jsonData: + # Align Prometheus data source time interval with the OTel SDKs' export interval (see OTEL_METRIC_EXPORT_INTERVAL) + timeInterval: "60s" + exemplarTraceIdDestinations: + - datasourceUid: webstore-traces + name: trace_id + + - url: http://localhost:8080/jaeger/ui/trace/$${__value.raw} + name: trace_id + urlDisplayLabel: View in Jaeger UI + jaeger.yaml: | + # Copyright The OpenTelemetry Authors + # SPDX-License-Identifier: Apache-2.0 + + + apiVersion: 1 + + datasources: + - name: Jaeger + uid: webstore-traces + type: jaeger + url: http://jaeger:16686/jaeger/ui + editable: true + isDefault: false + jsonData: + tracesToLogsV2: + datasourceUid: webstore-logs + spanStartTimeShift: "-20m" + spanEndTimeShift: "20m" + filterByTraceID: true + filterBySpanID: true + customQuery: true + query: traceId:"$${__trace.traceId}" AND spanId:"$${__span.spanId}" + opensearch.yaml: | + # Copyright The OpenTelemetry Authors + # SPDX-License-Identifier: Apache-2.0 + + apiVersion: 1 + + datasources: + - name: OpenSearch + uid: webstore-logs + type: grafana-opensearch-datasource + url: http://opensearch:9200/ + access: proxy + editable: true + isDefault: false + jsonData: + database: otel-logs-* + flavor: opensearch + logLevelField: severity.text.keyword + logMessageField: body + pplEnabled: true + timeField: observedTimestamp + version: 3.2.0 +--- +# Source: opentelemetry-demo/templates/product-catalog-products.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: product-catalog-products + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +data: + + products.json: | + { + "products": [ + { + "id": "OLJCESPC7Z", + "name": "National Park Foundation Explorascope", + "description": "The National Park Foundation’s (NPF) Explorascope 60AZ is a manual alt-azimuth, refractor telescope perfect for celestial viewing on the go. The NPF Explorascope 60 can view the planets, moon, star clusters and brighter deep sky objects like the Orion Nebula and Andromeda Galaxy.", + "picture": "NationalParkFoundationExplorascope.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 101, + "nanos": 960000000 + }, + "categories": [ + "telescopes" + ] + }, + { + "id": "66VCHSJNUP", + "name": "Starsense Explorer Refractor Telescope", + "description": "The first telescope that uses your smartphone to analyze the night sky and calculate its position in real time. StarSense Explorer is ideal for beginners thanks to the app’s user-friendly interface and detailed tutorials. It’s like having your own personal tour guide of the night sky", + "picture": "StarsenseExplorer.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 349, + "nanos": 950000000 + }, + "categories": [ + "telescopes" + ] + }, + { + "id": "1YMWWN1N4O", + "name": "Eclipsmart Travel Refractor Telescope", + "description": "Dedicated white-light solar scope for the observer on the go. The 50mm refracting solar scope uses Solar Safe, ISO compliant, full-aperture glass filter material to ensure the safest view of solar events. The kit comes complete with everything you need, including the dedicated travel solar scope, a Solar Safe finderscope, tripod, a high quality 20mm (18x) Kellner eyepiece and a nylon backpack to carry everything in. This Travel Solar Scope makes it easy to share the Sun as well as partial and total solar eclipses with the whole family and offers much higher magnifications than you would otherwise get using handheld solar viewers or binoculars.", + "picture": "EclipsmartTravelRefractorTelescope.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 129, + "nanos": 950000000 + }, + "categories": [ + "telescopes", + "travel" + ] + }, + { + "id": "L9ECAV7KIM", + "name": "Lens Cleaning Kit", + "description": "Wipe away dust, dirt, fingerprints and other particles on your lenses to see clearly with the Lens Cleaning Kit. This cleaning kit works on all glass and optical surfaces, including telescopes, binoculars, spotting scopes, monoculars, microscopes, and even your camera lenses, computer screens, and mobile devices. The kit comes complete with a retractable lens brush to remove dust particles and dirt and two options to clean smudges and fingerprints off of your optics, pre-moistened lens wipes and a bottled lens cleaning fluid with soft cloth.", + "picture": "LensCleaningKit.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 21, + "nanos": 950000000 + }, + "categories": [ + "accessories" + ] + }, + { + "id": "2ZYFJ3GM2N", + "name": "Roof Binoculars", + "description": "This versatile, all-around binocular is a great choice for the trail, the stadium, the arena, or just about anywhere you want a close-up view of the action without sacrificing brightness or detail. It’s an especially great companion for nature observation and bird watching, with ED glass that helps you spot the subtlest field markings and a close focus of just 6.5 feet.", + "picture": "RoofBinoculars.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 209, + "nanos": 950000000 + }, + "categories": [ + "binoculars" + ] + }, + { + "id": "0PUK6V6EV0", + "name": "Solar System Color Imager", + "description": "You have your new telescope and have observed Saturn and Jupiter. Now you're ready to take the next step and start imaging them. But where do you begin? The NexImage 10 Solar System Imager is the perfect solution.", + "picture": "SolarSystemColorImager.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 175, + "nanos": 0 + }, + "categories": [ + "accessories", + "telescopes" + ] + }, + { + "id": "LS4PSXUNUM", + "name": "Red Flashlight", + "description": "This 3-in-1 device features a 3-mode red flashlight, a hand warmer, and a portable power bank for recharging your personal electronics on the go. Whether you use it to light the way at an astronomy star party, a night walk, or wildlife research, ThermoTorch 3 Astro Red’s rugged, IPX4-rated design will withstand your everyday activities.", + "picture": "RedFlashlight.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 57, + "nanos": 80000000 + }, + "categories": [ + "accessories", + "flashlights" + ] + }, + { + "id": "9SIQT8TOJO", + "name": "Optical Tube Assembly", + "description": "Capturing impressive deep-sky astroimages is easier than ever with Rowe-Ackermann Schmidt Astrograph (RASA) V2, the perfect companion to today’s top DSLR or astronomical CCD cameras. This fast, wide-field f/2.2 system allows for shorter exposure times compared to traditional f/10 astroimaging, without sacrificing resolution. Because shorter sub-exposure times are possible, your equatorial mount won’t need to accurately track over extended periods. The short focal length also lessens equatorial tracking demands. In many cases, autoguiding will not be required.", + "picture": "OpticalTubeAssembly.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 3599, + "nanos": 0 + }, + "categories": [ + "accessories", + "telescopes", + "assembly" + ] + }, + { + "id": "6E92ZMYYFZ", + "name": "Solar Filter", + "description": "Enhance your viewing experience with EclipSmart Solar Filter for 8” telescopes. With two Velcro straps and four self-adhesive Velcro pads for added safety, you can be assured that the solar filter cannot be accidentally knocked off and will provide Solar Safe, ISO compliant viewing.", + "picture": "SolarFilter.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 69, + "nanos": 950000000 + }, + "categories": [ + "accessories", + "telescopes" + ] + }, + { + "id": "HQTGWGPNH4", + "name": "The Comet Book", + "description": "A 16th-century treatise on comets, created anonymously in Flanders (now northern France) and now held at the Universitätsbibliothek Kassel. Commonly known as The Comet Book (or Kometenbuch in German), its full title translates as “Comets and their General and Particular Meanings, According to Ptolomeé, Albumasar, Haly, Aliquind and other Astrologers”. The image is from https://publicdomainreview.org/collection/the-comet-book, made available by the Universitätsbibliothek Kassel under a CC-BY SA 4.0 license (https://creativecommons.org/licenses/by-sa/4.0/)", + "picture": "TheCometBook.jpg", + "priceUsd": { + "currencyCode": "USD", + "units": 0, + "nanos": 990000000 + }, + "categories": [ + "books" + ] + } + ] + } +--- +# Source: opentelemetry-demo/charts/grafana/templates/clusterrole.yaml +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" + name: grafana-clusterrole +rules: + - apiGroups: [""] # "" indicates the core API group + resources: ["configmaps", "secrets"] + verbs: ["get", "watch", "list"] +--- +# Source: opentelemetry-demo/charts/opentelemetry-collector/templates/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: otel-collector + labels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "0.135.0" + app.kubernetes.io/part-of: opentelemetry-collector + app.kubernetes.io/component: standalone-collector +rules: + - apiGroups: [""] + resources: ["pods", "namespaces"] + verbs: ["get", "watch", "list"] + - apiGroups: ["apps"] + resources: ["replicasets"] + verbs: ["get", "list", "watch"] + - apiGroups: ["extensions"] + resources: ["replicasets"] + verbs: ["get", "list", "watch"] +--- +# Source: opentelemetry-demo/charts/prometheus/templates/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: v3.6.0 + app.kubernetes.io/part-of: prometheus + name: prometheus +rules: + - apiGroups: + - "" + resources: + - nodes + - nodes/proxy + - nodes/metrics + - services + - endpoints + - pods + - ingresses + - configmaps + verbs: + - get + - list + - watch + - apiGroups: + - "networking.k8s.io" + resources: + - ingresses/status + - ingresses + verbs: + - get + - list + - watch + - apiGroups: + - "discovery.k8s.io" + resources: + - endpointslices + verbs: + - get + - list + - watch + - nonResourceURLs: + - "/metrics" + verbs: + - get +--- +# Source: opentelemetry-demo/charts/grafana/templates/clusterrolebinding.yaml +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: grafana-clusterrolebinding + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" +subjects: + - kind: ServiceAccount + name: grafana + namespace: otel-demo +roleRef: + kind: ClusterRole + name: grafana-clusterrole + apiGroup: rbac.authorization.k8s.io +--- +# Source: opentelemetry-demo/charts/opentelemetry-collector/templates/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: otel-collector + labels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "0.135.0" + app.kubernetes.io/part-of: opentelemetry-collector + app.kubernetes.io/component: standalone-collector +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: otel-collector +subjects: +- kind: ServiceAccount + name: otel-collector + namespace: otel-demo +--- +# Source: opentelemetry-demo/charts/prometheus/templates/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: v3.6.0 + app.kubernetes.io/part-of: prometheus + name: prometheus +subjects: + - kind: ServiceAccount + name: prometheus + namespace: otel-demo +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: prometheus +--- +# Source: opentelemetry-demo/charts/grafana/templates/role.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: grafana + namespace: otel-demo + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" +rules: [] +--- +# Source: opentelemetry-demo/charts/grafana/templates/rolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: grafana + namespace: otel-demo + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: grafana +subjects: +- kind: ServiceAccount + name: grafana + namespace: otel-demo +--- +# Source: opentelemetry-demo/charts/grafana/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: grafana + namespace: otel-demo + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" +spec: + type: ClusterIP + ports: + - name: service + port: 80 + protocol: TCP + targetPort: grafana + selector: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo +--- +# Source: opentelemetry-demo/charts/jaeger/templates/allinone-agent-svc.yaml +apiVersion: v1 +kind: Service +metadata: + name: jaeger-agent + labels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "1.53.0" + app.kubernetes.io/component: service-agent +spec: + clusterIP: None + ports: + - name: zk-compact-trft + port: 5775 + protocol: UDP + targetPort: 0 + - name: config-rest + port: 5778 + targetPort: 0 + - name: jg-compact-trft + port: 6831 + protocol: UDP + targetPort: 0 + - name: jg-binary-trft + port: 6832 + protocol: UDP + targetPort: 0 + selector: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/component: all-in-one +--- +# Source: opentelemetry-demo/charts/jaeger/templates/allinone-collector-svc.yaml +apiVersion: v1 +kind: Service +metadata: + name: jaeger-collector + labels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "1.53.0" + app.kubernetes.io/component: service-collector +spec: + clusterIP: None + ports: + - name: http-zipkin + port: 9411 + targetPort: 0 + appProtocol: http + - name: grpc-http + port: 14250 + targetPort: 0 + appProtocol: grpc + - name: c-tchan-trft + port: 14267 + targetPort: 0 + - name: http-c-binary-trft + port: 14268 + targetPort: 0 + appProtocol: http + - name: otlp-grpc + port: 4317 + targetPort: 0 + appProtocol: grpc + - name: otlp-http + port: 4318 + targetPort: 0 + appProtocol: http + selector: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/component: all-in-one +--- +# Source: opentelemetry-demo/charts/jaeger/templates/allinone-query-svc.yaml +apiVersion: v1 +kind: Service +metadata: + name: jaeger-query + labels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "1.53.0" + app.kubernetes.io/component: service-query +spec: + clusterIP: None + ports: + - name: http-query + port: 16686 + targetPort: 16686 + - name: grpc-query + port: 16685 + targetPort: 16685 + selector: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/component: all-in-one +--- +# Source: opentelemetry-demo/charts/opensearch/templates/service.yaml +kind: Service +apiVersion: v1 +metadata: + name: opensearch + labels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "3.2.0" + app.kubernetes.io/component: opensearch + annotations: + {} +spec: + type: ClusterIP + selector: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + ports: + - name: http + protocol: TCP + port: 9200 + - name: transport + protocol: TCP + port: 9300 + - name: metrics + protocol: TCP + port: 9600 +--- +# Source: opentelemetry-demo/charts/opensearch/templates/service.yaml +kind: Service +apiVersion: v1 +metadata: + name: opensearch-headless + labels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "3.2.0" + app.kubernetes.io/component: opensearch + annotations: + service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" +spec: + clusterIP: None # This is needed for statefulset hostnames like opensearch-0 to resolve + # Create endpoints also if the related pod isn't ready + publishNotReadyAddresses: true + selector: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + ports: + - name: http + port: 9200 + - name: transport + port: 9300 + - name: metrics + port: 9600 +--- +# Source: opentelemetry-demo/charts/opentelemetry-collector/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: otel-collector + namespace: otel-demo + labels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "0.135.0" + app.kubernetes.io/part-of: opentelemetry-collector + app.kubernetes.io/component: standalone-collector + component: standalone-collector +spec: + type: ClusterIP + ports: + + - name: jaeger-compact + port: 6831 + targetPort: 6831 + protocol: UDP + - name: jaeger-grpc + port: 14250 + targetPort: 14250 + protocol: TCP + - name: jaeger-thrift + port: 14268 + targetPort: 14268 + protocol: TCP + - name: metrics + port: 8888 + targetPort: 8888 + protocol: TCP + - name: otlp + port: 4317 + targetPort: 4317 + protocol: TCP + appProtocol: grpc + - name: otlp-http + port: 4318 + targetPort: 4318 + protocol: TCP + - name: zipkin + port: 9411 + targetPort: 9411 + protocol: TCP + selector: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + component: standalone-collector + internalTrafficPolicy: Cluster +--- +# Source: opentelemetry-demo/charts/prometheus/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: v3.6.0 + app.kubernetes.io/part-of: prometheus + name: prometheus + namespace: otel-demo +spec: + ports: + - name: http + port: 9090 + protocol: TCP + targetPort: 9090 + selector: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + sessionAffinity: None + type: "ClusterIP" +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: ad + labels: + + opentelemetry.io/name: ad + + app.kubernetes.io/component: ad + app.kubernetes.io/name: ad + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + + opentelemetry.io/name: ad +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: cart + labels: + + opentelemetry.io/name: cart + + app.kubernetes.io/component: cart + app.kubernetes.io/name: cart + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + + opentelemetry.io/name: cart +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: checkout + labels: + + opentelemetry.io/name: checkout + + app.kubernetes.io/component: checkout + app.kubernetes.io/name: checkout + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + + opentelemetry.io/name: checkout +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: currency + labels: + + opentelemetry.io/name: currency + + app.kubernetes.io/component: currency + app.kubernetes.io/name: currency + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + + opentelemetry.io/name: currency +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: email + labels: + + opentelemetry.io/name: email + + app.kubernetes.io/component: email + app.kubernetes.io/name: email + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + + opentelemetry.io/name: email +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: flagd + labels: + + opentelemetry.io/name: flagd + + app.kubernetes.io/component: flagd + app.kubernetes.io/name: flagd + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8013 + name: rpc + targetPort: 8013 + - port: 8016 + name: ofrep + targetPort: 8016 + - port: 4000 + name: tcp-service-0 + targetPort: 4000 + selector: + + opentelemetry.io/name: flagd +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: frontend + labels: + + opentelemetry.io/name: frontend + + app.kubernetes.io/component: frontend + app.kubernetes.io/name: frontend + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + + opentelemetry.io/name: frontend +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: frontend-proxy + labels: + + opentelemetry.io/name: frontend-proxy + + app.kubernetes.io/component: frontend-proxy + app.kubernetes.io/name: frontend-proxy + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + + opentelemetry.io/name: frontend-proxy +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: image-provider + labels: + + opentelemetry.io/name: image-provider + + app.kubernetes.io/component: image-provider + app.kubernetes.io/name: image-provider + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8081 + name: tcp-service + targetPort: 8081 + selector: + + opentelemetry.io/name: image-provider +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: kafka + labels: + + opentelemetry.io/name: kafka + + app.kubernetes.io/component: kafka + app.kubernetes.io/name: kafka + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 9092 + name: plaintext + targetPort: 9092 + - port: 9093 + name: controller + targetPort: 9093 + selector: + + opentelemetry.io/name: kafka +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: load-generator + labels: + + opentelemetry.io/name: load-generator + + app.kubernetes.io/component: load-generator + app.kubernetes.io/name: load-generator + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8089 + name: tcp-service + targetPort: 8089 + selector: + + opentelemetry.io/name: load-generator +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: payment + labels: + + opentelemetry.io/name: payment + + app.kubernetes.io/component: payment + app.kubernetes.io/name: payment + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + + opentelemetry.io/name: payment +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: postgresql + labels: + + opentelemetry.io/name: postgresql + + app.kubernetes.io/component: postgresql + app.kubernetes.io/name: postgresql + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 5432 + name: tcp-service + targetPort: 5432 + selector: + + opentelemetry.io/name: postgresql +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: product-catalog + labels: + + opentelemetry.io/name: product-catalog + + app.kubernetes.io/component: product-catalog + app.kubernetes.io/name: product-catalog + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + + opentelemetry.io/name: product-catalog +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: quote + labels: + + opentelemetry.io/name: quote + + app.kubernetes.io/component: quote + app.kubernetes.io/name: quote + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + + opentelemetry.io/name: quote +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: recommendation + labels: + + opentelemetry.io/name: recommendation + + app.kubernetes.io/component: recommendation + app.kubernetes.io/name: recommendation + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + + opentelemetry.io/name: recommendation +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: shipping + labels: + + opentelemetry.io/name: shipping + + app.kubernetes.io/component: shipping + app.kubernetes.io/name: shipping + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 8080 + name: tcp-service + targetPort: 8080 + selector: + + opentelemetry.io/name: shipping +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: v1 +kind: Service +metadata: + name: valkey-cart + labels: + + opentelemetry.io/name: valkey-cart + + app.kubernetes.io/component: valkey-cart + app.kubernetes.io/name: valkey-cart + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + type: ClusterIP + ports: + - port: 6379 + name: valkey-cart + targetPort: 6379 + selector: + + opentelemetry.io/name: valkey-cart +--- +# Source: opentelemetry-demo/charts/grafana/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: grafana + namespace: otel-demo + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + strategy: + type: RollingUpdate + template: + metadata: + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" + annotations: + checksum/config: 3aef97dc43bb7f320b3d3f00d79efff7580bf83005ec5574a0619b42268584cf + checksum/sc-dashboard-provider-config: e70bf6a851099d385178a76de9757bb0bef8299da6d8443602590e44f05fdf24 + checksum/secret: bed677784356b2af7fb0d87455db21f077853059b594101a4f6532bfbd962a7f + kubectl.kubernetes.io/default-container: grafana + spec: + + serviceAccountName: grafana + automountServiceAccountToken: true + shareProcessNamespace: false + securityContext: + fsGroup: 472 + runAsGroup: 472 + runAsNonRoot: true + runAsUser: 472 + enableServiceLinks: true + containers: + - name: grafana-sc-alerts + image: "quay.io/kiwigrid/k8s-sidecar:1.30.10" + imagePullPolicy: IfNotPresent + env: + - name: METHOD + value: WATCH + - name: LABEL + value: "grafana_alert" + - name: FOLDER + value: "/etc/grafana/provisioning/alerting" + - name: RESOURCE + value: "both" + - name: REQ_USERNAME + valueFrom: + secretKeyRef: + name: grafana + key: admin-user + - name: REQ_PASSWORD + valueFrom: + secretKeyRef: + name: grafana + key: admin-password + - name: REQ_URL + value: http://localhost:3000/api/admin/provisioning/alerting/reload + - name: REQ_METHOD + value: POST + resources: + limits: + cpu: 100m + memory: 100Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault + volumeMounts: + - name: sc-alerts-volume + mountPath: "/etc/grafana/provisioning/alerting" + - name: grafana-sc-dashboard + image: "quay.io/kiwigrid/k8s-sidecar:1.30.10" + imagePullPolicy: IfNotPresent + env: + - name: METHOD + value: WATCH + - name: LABEL + value: "grafana_dashboard" + - name: FOLDER + value: "/tmp/dashboards" + - name: RESOURCE + value: "both" + - name: REQ_USERNAME + valueFrom: + secretKeyRef: + name: grafana + key: admin-user + - name: REQ_PASSWORD + valueFrom: + secretKeyRef: + name: grafana + key: admin-password + - name: REQ_URL + value: http://localhost:3000/api/admin/provisioning/dashboards/reload + - name: REQ_METHOD + value: POST + resources: + limits: + cpu: 100m + memory: 100Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault + volumeMounts: + - name: sc-dashboard-volume + mountPath: "/tmp/dashboards" + - name: grafana-sc-datasources + image: "quay.io/kiwigrid/k8s-sidecar:1.30.10" + imagePullPolicy: IfNotPresent + env: + - name: METHOD + value: WATCH + - name: LABEL + value: "grafana_datasource" + - name: FOLDER + value: "/etc/grafana/provisioning/datasources" + - name: RESOURCE + value: "both" + - name: REQ_USERNAME + valueFrom: + secretKeyRef: + name: grafana + key: admin-user + - name: REQ_PASSWORD + valueFrom: + secretKeyRef: + name: grafana + key: admin-password + - name: REQ_URL + value: http://localhost:3000/api/admin/provisioning/datasources/reload + - name: REQ_METHOD + value: POST + resources: + limits: + cpu: 100m + memory: 100Mi + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault + volumeMounts: + - name: sc-datasources-volume + mountPath: "/etc/grafana/provisioning/datasources" + - name: grafana + image: "docker.io/grafana/grafana:12.1.1" + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + seccompProfile: + type: RuntimeDefault + volumeMounts: + - name: config + mountPath: "/etc/grafana/grafana.ini" + subPath: grafana.ini + - name: storage + mountPath: "/var/lib/grafana" + - name: sc-alerts-volume + mountPath: "/etc/grafana/provisioning/alerting" + - name: sc-dashboard-volume + mountPath: "/tmp/dashboards" + - name: sc-dashboard-provider + mountPath: "/etc/grafana/provisioning/dashboards/sc-dashboardproviders.yaml" + subPath: provider.yaml + - name: sc-datasources-volume + mountPath: "/etc/grafana/provisioning/datasources" + ports: + - name: grafana + containerPort: 3000 + protocol: TCP + - name: gossip-tcp + containerPort: 9094 + protocol: TCP + - name: gossip-udp + containerPort: 9094 + protocol: UDP + - name: profiling + containerPort: 6060 + protocol: TCP + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: GF_SECURITY_ADMIN_USER + valueFrom: + secretKeyRef: + name: grafana + key: admin-user + - name: GF_SECURITY_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: grafana + key: admin-password + - name: GF_INSTALL_PLUGINS + valueFrom: + configMapKeyRef: + name: grafana + key: plugins + - name: GF_PATHS_DATA + value: /var/lib/grafana/ + - name: GF_PATHS_LOGS + value: /var/log/grafana + - name: GF_PATHS_PLUGINS + value: /var/lib/grafana/plugins + - name: GF_PATHS_PROVISIONING + value: /etc/grafana/provisioning + - name: GOMEMLIMIT + valueFrom: + resourceFieldRef: + divisor: "1" + resource: limits.memory + livenessProbe: + failureThreshold: 10 + httpGet: + path: /api/health + port: 3000 + initialDelaySeconds: 60 + timeoutSeconds: 30 + readinessProbe: + httpGet: + path: /api/health + port: 3000 + resources: + limits: + memory: 150Mi + volumes: + - name: config + configMap: + name: grafana + - name: storage + emptyDir: {} + - name: sc-alerts-volume + emptyDir: {} + - name: sc-dashboard-volume + emptyDir: {} + - name: sc-dashboard-provider + configMap: + name: grafana-config-dashboards + - name: sc-datasources-volume + emptyDir: {} +--- +# Source: opentelemetry-demo/charts/jaeger/templates/allinone-deploy.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: jaeger + labels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "1.53.0" + app.kubernetes.io/component: all-in-one + prometheus.io/port: "14269" + prometheus.io/scrape: "true" +spec: + replicas: 1 + strategy: + type: Recreate + selector: + matchLabels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/component: all-in-one + template: + metadata: + labels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/component: all-in-one + annotations: + prometheus.io/port: "14269" + prometheus.io/scrape: "true" + spec: + + containers: + - env: + - name: METRICS_STORAGE_TYPE + value: prometheus + - name: COLLECTOR_OTLP_GRPC_HOST_PORT + value: 0.0.0.0:4317 + - name: COLLECTOR_OTLP_HTTP_HOST_PORT + value: 0.0.0.0:4318 + - name: SPAN_STORAGE_TYPE + value: memory + + - name: COLLECTOR_ZIPKIN_HOST_PORT + value: :9411 + - name: JAEGER_DISABLED + value: "false" + - name: COLLECTOR_OTLP_ENABLED + value: "true" + securityContext: + {} + image: jaegertracing/all-in-one:1.53.0 + imagePullPolicy: IfNotPresent + name: jaeger + args: + - "--memory.max-traces=5000" + - "--query.base-path=/jaeger/ui" + - "--prometheus.server-url=http://prometheus:9090" + - "--prometheus.query.normalize-calls=true" + - "--prometheus.query.normalize-duration=true" + ports: + - containerPort: 5775 + protocol: UDP + - containerPort: 6831 + protocol: UDP + - containerPort: 6832 + protocol: UDP + - containerPort: 5778 + protocol: TCP + - containerPort: 16686 + protocol: TCP + - containerPort: 16685 + protocol: TCP + - containerPort: 9411 + protocol: TCP + - containerPort: 4317 + protocol: TCP + - containerPort: 4318 + protocol: TCP + livenessProbe: + failureThreshold: 5 + httpGet: + path: / + port: 14269 + scheme: HTTP + initialDelaySeconds: 5 + periodSeconds: 15 + successThreshold: 1 + timeoutSeconds: 1 + readinessProbe: + failureThreshold: 3 + httpGet: + path: / + port: 14269 + scheme: HTTP + initialDelaySeconds: 1 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: + limits: + memory: 400Mi + volumeMounts: + securityContext: + fsGroup: 10001 + runAsGroup: 10001 + runAsUser: 10001 + serviceAccountName: jaeger + volumes: +--- +# Source: opentelemetry-demo/charts/opentelemetry-collector/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: otel-collector + namespace: otel-demo + labels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "0.135.0" + app.kubernetes.io/part-of: opentelemetry-collector + app.kubernetes.io/component: standalone-collector +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + component: standalone-collector + strategy: + type: RollingUpdate + template: + metadata: + annotations: + checksum/config: b23c30f9b89a34910edbfdafc7072ff305d9e8bb93ca26ffaed9ac1a8872cefb + opentelemetry_community_demo: "true" + prometheus.io/scrape: "true" + labels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + component: standalone-collector + + spec: + + serviceAccountName: otel-collector + automountServiceAccountToken: true + securityContext: + {} + containers: + - name: opentelemetry-collector + args: + - --config=/conf/relay.yaml + securityContext: + {} + image: "otel/opentelemetry-collector-contrib:0.135.0" + imagePullPolicy: IfNotPresent + ports: + + - name: jaeger-compact + containerPort: 6831 + protocol: UDP + - name: jaeger-grpc + containerPort: 14250 + protocol: TCP + - name: jaeger-thrift + containerPort: 14268 + protocol: TCP + - name: metrics + containerPort: 8888 + protocol: TCP + - name: otlp + containerPort: 4317 + protocol: TCP + - name: otlp-http + containerPort: 4318 + protocol: TCP + - name: zipkin + containerPort: 9411 + protocol: TCP + env: + - name: MY_POD_IP + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: status.podIP + - name: GOMEMLIMIT + value: "160MiB" + livenessProbe: + httpGet: + path: / + port: 13133 + readinessProbe: + httpGet: + path: / + port: 13133 + resources: + limits: + memory: 200Mi + volumeMounts: + - mountPath: /conf + name: opentelemetry-collector-configmap + volumes: + - name: opentelemetry-collector-configmap + configMap: + name: otel-collector + items: + - key: relay + path: relay.yaml + hostNetwork: false +--- +# Source: opentelemetry-demo/charts/prometheus/templates/deploy.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: v3.6.0 + app.kubernetes.io/part-of: prometheus + name: prometheus + namespace: otel-demo +spec: + strategy: + type: Recreate + rollingUpdate: null + selector: + matchLabels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + replicas: 1 + revisionHistoryLimit: 10 + template: + metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: v3.6.0 + app.kubernetes.io/part-of: prometheus + spec: + enableServiceLinks: true + serviceAccountName: prometheus + containers: + + - name: prometheus-server + image: "quay.io/prometheus/prometheus:v3.6.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 + - --enable-feature=exemplar-storage + - --web.enable-otlp-receiver + ports: + - containerPort: 9090 + readinessProbe: + httpGet: + path: /-/ready + port: 9090 + scheme: HTTP + initialDelaySeconds: 30 + periodSeconds: 5 + timeoutSeconds: 4 + failureThreshold: 3 + successThreshold: 1 + livenessProbe: + httpGet: + path: /-/healthy + port: 9090 + scheme: HTTP + initialDelaySeconds: 30 + periodSeconds: 15 + timeoutSeconds: 10 + failureThreshold: 3 + successThreshold: 1 + resources: + limits: + memory: 300Mi + volumeMounts: + - name: config-volume + mountPath: /etc/config + - name: storage-volume + mountPath: /data + subPath: "" + dnsPolicy: ClusterFirst + securityContext: + fsGroup: 65534 + runAsGroup: 65534 + runAsNonRoot: true + runAsUser: 65534 + terminationGracePeriodSeconds: 300 + volumes: + - name: config-volume + configMap: + name: prometheus + - name: storage-volume + emptyDir: + {} +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: accounting + labels: + + opentelemetry.io/name: accounting + + app.kubernetes.io/component: accounting + app.kubernetes.io/name: accounting + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: accounting + template: + metadata: + labels: + + opentelemetry.io/name: accounting + + app.kubernetes.io/component: accounting + app.kubernetes.io/name: accounting + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: accounting + image: 'ghcr.io/open-telemetry/demo:2.1.3-accounting' + imagePullPolicy: IfNotPresent + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: KAFKA_ADDR + value: kafka:9092 + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4318 + - name: DB_CONNECTION_STRING + value: Host=postgresql;Username=otelu;Password=otelp;Database=otel + - name: OTEL_DOTNET_AUTO_TRACES_ENTITYFRAMEWORKCORE_INSTRUMENTATION_ENABLED + value: "false" + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 120Mi + volumeMounts: + initContainers: + - command: + - sh + - -c + - until nc -z -v -w30 kafka 9092; do echo waiting for kafka; sleep 2; done; + image: busybox:latest + name: wait-for-kafka + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: ad + labels: + + opentelemetry.io/name: ad + + app.kubernetes.io/component: ad + app.kubernetes.io/name: ad + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: ad + template: + metadata: + labels: + + opentelemetry.io/name: ad + + app.kubernetes.io/component: ad + app.kubernetes.io/name: ad + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: ad + image: 'ghcr.io/open-telemetry/demo:2.1.3-ad' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: AD_PORT + value: "8080" + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4318 + - name: OTEL_LOGS_EXPORTER + value: otlp + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 300Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: cart + labels: + + opentelemetry.io/name: cart + + app.kubernetes.io/component: cart + app.kubernetes.io/name: cart + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: cart + template: + metadata: + labels: + + opentelemetry.io/name: cart + + app.kubernetes.io/component: cart + app.kubernetes.io/name: cart + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: cart + image: 'ghcr.io/open-telemetry/demo:2.1.3-cart' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: CART_PORT + value: "8080" + - name: ASPNETCORE_URLS + value: http://*:$(CART_PORT) + - name: VALKEY_ADDR + value: valkey-cart:6379 + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 160Mi + volumeMounts: + initContainers: + - command: + - sh + - -c + - until nc -z -v -w30 valkey-cart 6379; do echo waiting for valkey-cart; sleep 2; + done; + image: busybox:latest + name: wait-for-valkey-cart + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: checkout + labels: + + opentelemetry.io/name: checkout + + app.kubernetes.io/component: checkout + app.kubernetes.io/name: checkout + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: checkout + template: + metadata: + labels: + + opentelemetry.io/name: checkout + + app.kubernetes.io/component: checkout + app.kubernetes.io/name: checkout + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: checkout + image: 'ghcr.io/open-telemetry/demo:2.1.3-checkout' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: CHECKOUT_PORT + value: "8080" + - name: CART_ADDR + value: cart:8080 + - name: CURRENCY_ADDR + value: currency:8080 + - name: EMAIL_ADDR + value: http://email:8080 + - name: PAYMENT_ADDR + value: payment:8080 + - name: PRODUCT_CATALOG_ADDR + value: product-catalog:8080 + - name: SHIPPING_ADDR + value: http://shipping:8080 + - name: KAFKA_ADDR + value: kafka:9092 + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: GOMEMLIMIT + value: 16MiB + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 20Mi + volumeMounts: + initContainers: + - command: + - sh + - -c + - until nc -z -v -w30 kafka 9092; do echo waiting for kafka; sleep 2; done; + image: busybox:latest + name: wait-for-kafka + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: currency + labels: + + opentelemetry.io/name: currency + + app.kubernetes.io/component: currency + app.kubernetes.io/name: currency + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: currency + template: + metadata: + labels: + + opentelemetry.io/name: currency + + app.kubernetes.io/component: currency + app.kubernetes.io/name: currency + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: currency + image: 'ghcr.io/open-telemetry/demo:2.1.3-currency' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: CURRENCY_PORT + value: "8080" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: VERSION + value: '2.1.3' + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 20Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: email + labels: + + opentelemetry.io/name: email + + app.kubernetes.io/component: email + app.kubernetes.io/name: email + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: email + template: + metadata: + labels: + + opentelemetry.io/name: email + + app.kubernetes.io/component: email + app.kubernetes.io/name: email + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: email + image: 'ghcr.io/open-telemetry/demo:2.1.3-email' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: EMAIL_PORT + value: "8080" + - name: APP_ENV + value: production + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4318 + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 100Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: flagd + labels: + + opentelemetry.io/name: flagd + + app.kubernetes.io/component: flagd + app.kubernetes.io/name: flagd + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: flagd + template: + metadata: + labels: + + opentelemetry.io/name: flagd + + app.kubernetes.io/component: flagd + app.kubernetes.io/name: flagd + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: flagd + image: 'ghcr.io/open-feature/flagd:v0.12.8' + imagePullPolicy: IfNotPresent + command: + - /flagd-build + - start + - --port + - "8013" + - --ofrep-port + - "8016" + - --uri + - file:./etc/flagd/demo.flagd.json + ports: + + - containerPort: 8013 + name: rpc + - containerPort: 8016 + name: ofrep + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: FLAGD_METRICS_EXPORTER + value: otel + - name: FLAGD_OTEL_COLLECTOR_URI + value: $(OTEL_COLLECTOR_NAME):4317 + - name: GOMEMLIMIT + value: 60MiB + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 75Mi + volumeMounts: + - name: config-rw + mountPath: /etc/flagd + - name: flagd-ui + image: 'ghcr.io/open-telemetry/demo:2.1.3-flagd-ui' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 4000 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: FLAGD_METRICS_EXPORTER + value: otel + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4318 + - name: FLAGD_UI_PORT + value: "4000" + - name: SECRET_KEY_BASE + value: yYrECL4qbNwleYInGJYvVnSkwJuSQJ4ijPTx5tirGUXrbznFIBFVJdPl5t6O9ASw + - name: PHX_HOST + value: localhost + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 250Mi + volumeMounts: + - mountPath: /app/data + name: config-rw + initContainers: + - command: + - sh + - -c + - cp /config-ro/demo.flagd.json /config-rw/demo.flagd.json && cat /config-rw/demo.flagd.json + image: busybox + name: init-config + volumeMounts: + - mountPath: /config-ro + name: config-ro + - mountPath: /config-rw + name: config-rw + volumes: + - name: config-rw + emptyDir: {} + - configMap: + name: flagd-config + name: config-ro +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: fraud-detection + labels: + + opentelemetry.io/name: fraud-detection + + app.kubernetes.io/component: fraud-detection + app.kubernetes.io/name: fraud-detection + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: fraud-detection + template: + metadata: + labels: + + opentelemetry.io/name: fraud-detection + + app.kubernetes.io/component: fraud-detection + app.kubernetes.io/name: fraud-detection + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: fraud-detection + image: 'ghcr.io/open-telemetry/demo:2.1.3-fraud-detection' + imagePullPolicy: IfNotPresent + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: KAFKA_ADDR + value: kafka:9092 + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4318 + - name: OTEL_INSTRUMENTATION_KAFKA_EXPERIMENTAL_SPAN_ATTRIBUTES + value: "true" + - name: OTEL_INSTRUMENTATION_MESSAGING_EXPERIMENTAL_RECEIVE_TELEMETRY_ENABLED + value: "true" + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 300Mi + volumeMounts: + initContainers: + - command: + - sh + - -c + - until nc -z -v -w30 kafka 9092; do echo waiting for kafka; sleep 2; done; + image: busybox:latest + name: wait-for-kafka + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend + labels: + + opentelemetry.io/name: frontend + + app.kubernetes.io/component: frontend + app.kubernetes.io/name: frontend + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: frontend + template: + metadata: + labels: + + opentelemetry.io/name: frontend + + app.kubernetes.io/component: frontend + app.kubernetes.io/name: frontend + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: frontend + image: 'ghcr.io/open-telemetry/demo:2.1.3-frontend' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: FRONTEND_PORT + value: "8080" + - name: PORT + value: $(FRONTEND_PORT) + - name: FRONTEND_ADDR + value: :8080 + - name: AD_ADDR + value: ad:8080 + - name: CART_ADDR + value: cart:8080 + - name: CHECKOUT_ADDR + value: checkout:8080 + - name: CURRENCY_ADDR + value: currency:8080 + - name: PRODUCT_CATALOG_ADDR + value: product-catalog:8080 + - name: RECOMMENDATION_ADDR + value: recommendation:8080 + - name: SHIPPING_ADDR + value: http://shipping:8080 + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: ENV_PLATFORM + value: kubernetes + - name: OTEL_COLLECTOR_HOST + value: $(OTEL_COLLECTOR_NAME) + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: WEB_OTEL_SERVICE_NAME + value: frontend-web + - name: PUBLIC_OTEL_EXPORTER_OTLP_TRACES_ENDPOINT + value: http://localhost:8080/otlp-http/v1/traces + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 250Mi + securityContext: + runAsGroup: 1001 + runAsNonRoot: true + runAsUser: 1001 + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: frontend-proxy + labels: + + opentelemetry.io/name: frontend-proxy + + app.kubernetes.io/component: frontend-proxy + app.kubernetes.io/name: frontend-proxy + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: frontend-proxy + template: + metadata: + labels: + + opentelemetry.io/name: frontend-proxy + + app.kubernetes.io/component: frontend-proxy + app.kubernetes.io/name: frontend-proxy + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: frontend-proxy + image: 'ghcr.io/open-telemetry/demo:2.1.3-frontend-proxy' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: ENVOY_PORT + value: "8080" + - name: ENVOY_ADMIN_PORT + value: "10000" + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: FLAGD_UI_HOST + value: flagd-ui + - name: FLAGD_UI_PORT + value: "4000" + - name: FRONTEND_HOST + value: frontend + - name: FRONTEND_PORT + value: "8080" + - name: GRAFANA_HOST + value: grafana + - name: GRAFANA_PORT + value: "80" + - name: IMAGE_PROVIDER_HOST + value: image-provider + - name: IMAGE_PROVIDER_PORT + value: "8081" + - name: JAEGER_HOST + value: jaeger-query + - name: JAEGER_UI_PORT + value: "16686" + - name: LOCUST_WEB_HOST + value: load-generator + - name: LOCUST_WEB_PORT + value: "8089" + - name: OTEL_COLLECTOR_HOST + value: $(OTEL_COLLECTOR_NAME) + - name: OTEL_COLLECTOR_PORT_GRPC + value: "4317" + - name: OTEL_COLLECTOR_PORT_HTTP + value: "4318" + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 65Mi + securityContext: + runAsGroup: 101 + runAsNonRoot: true + runAsUser: 101 + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: image-provider + labels: + + opentelemetry.io/name: image-provider + + app.kubernetes.io/component: image-provider + app.kubernetes.io/name: image-provider + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: image-provider + template: + metadata: + labels: + + opentelemetry.io/name: image-provider + + app.kubernetes.io/component: image-provider + app.kubernetes.io/name: image-provider + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: image-provider + image: 'ghcr.io/open-telemetry/demo:2.1.3-image-provider' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8081 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: IMAGE_PROVIDER_PORT + value: "8081" + - name: OTEL_COLLECTOR_PORT_GRPC + value: "4317" + - name: OTEL_COLLECTOR_HOST + value: $(OTEL_COLLECTOR_NAME) + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 50Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: kafka + labels: + + opentelemetry.io/name: kafka + + app.kubernetes.io/component: kafka + app.kubernetes.io/name: kafka + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: kafka + template: + metadata: + labels: + + opentelemetry.io/name: kafka + + app.kubernetes.io/component: kafka + app.kubernetes.io/name: kafka + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: kafka + image: 'ghcr.io/open-telemetry/demo:2.1.3-kafka' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 9092 + name: plaintext + - containerPort: 9093 + name: controller + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: KAFKA_ADVERTISED_LISTENERS + value: PLAINTEXT://kafka:9092 + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4318 + - name: KAFKA_HEAP_OPTS + value: -Xmx400M -Xms400M + - name: KAFKA_LISTENERS + value: PLAINTEXT://:9092,CONTROLLER://:9093 + - name: KAFKA_CONTROLLER_LISTENER_NAMES + value: CONTROLLER + - name: KAFKA_CONTROLLER_QUORUM_VOTERS + value: 1@kafka:9093 + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 600Mi + securityContext: + runAsGroup: 1000 + runAsNonRoot: true + runAsUser: 1000 + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: load-generator + labels: + + opentelemetry.io/name: load-generator + + app.kubernetes.io/component: load-generator + app.kubernetes.io/name: load-generator + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: load-generator + template: + metadata: + labels: + + opentelemetry.io/name: load-generator + + app.kubernetes.io/component: load-generator + app.kubernetes.io/name: load-generator + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: load-generator + image: 'ghcr.io/open-telemetry/demo:2.1.3-load-generator' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8089 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: LOCUST_WEB_HOST + value: 0.0.0.0 + - name: LOCUST_WEB_PORT + value: "8089" + - name: LOCUST_USERS + value: "10" + - name: LOCUST_SPAWN_RATE + value: "1" + - name: LOCUST_HOST + value: http://frontend-proxy:8080 + - name: LOCUST_HEADLESS + value: "false" + - name: LOCUST_AUTOSTART + value: "true" + - name: LOCUST_BROWSER_TRAFFIC_ENABLED + value: "true" + - name: PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION + value: python + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: FLAGD_OFREP_PORT + value: "8016" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 1500Mi + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: payment + labels: + + opentelemetry.io/name: payment + + app.kubernetes.io/component: payment + app.kubernetes.io/name: payment + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + + opentelemetry.io/name: payment + template: + metadata: + labels: + + opentelemetry.io/name: payment + + app.kubernetes.io/component: payment + app.kubernetes.io/name: payment + spec: + serviceAccountName: opentelemetry-demo + containers: + - name: payment + image: 'ghcr.io/open-telemetry/demo:2.1.3-payment' + imagePullPolicy: IfNotPresent + ports: + + - containerPort: 8080 + name: service + env: + - name: OTEL_SERVICE_NAME + valueFrom: + fieldRef: + apiVersion: v1 + fieldPath: metadata.labels['app.kubernetes.io/component'] + - name: OTEL_COLLECTOR_NAME + value: otel-collector + - name: OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE + value: cumulative + - name: PAYMENT_PORT + value: "8080" + - name: FLAGD_HOST + value: flagd + - name: FLAGD_PORT + value: "8013" + - name: OTEL_EXPORTER_OTLP_ENDPOINT + value: http://$(OTEL_COLLECTOR_NAME):4317 + - name: OTEL_RESOURCE_ATTRIBUTES + value: service.name=$(OTEL_SERVICE_NAME),service.namespace=opentelemetry-demo,service.version=2.1.3 + resources: + limits: + memory: 120Mi + securityContext: + runAsGroup: 1000 + runAsNonRoot: true + runAsUser: 1000 + volumeMounts: + volumes: +--- +# Source: opentelemetry-demo/templates/component.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: postgresql + labels: + + opentelemetry.io/name: postgresql + + app.kubernetes.io/component: postgresql app.kubernetes.io/name: postgresql app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo @@ -19591,12 +39750,15 @@ spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: + matchLabels: + opentelemetry.io/name: postgresql template: metadata: - labels: - opentelemetry.io/name: postgresql + labels: + + opentelemetry.io/name: postgresql + app.kubernetes.io/component: postgresql app.kubernetes.io/name: postgresql spec: @@ -19638,23 +39800,27 @@ apiVersion: apps/v1 kind: Deployment metadata: name: product-catalog - labels: - opentelemetry.io/name: product-catalog + labels: + + opentelemetry.io/name: product-catalog + app.kubernetes.io/component: product-catalog app.kubernetes.io/name: product-catalog app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: python spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: + matchLabels: + opentelemetry.io/name: product-catalog template: metadata: - labels: - opentelemetry.io/name: product-catalog + labels: + + opentelemetry.io/name: product-catalog + app.kubernetes.io/component: product-catalog app.kubernetes.io/name: product-catalog spec: @@ -19707,23 +39873,27 @@ apiVersion: apps/v1 kind: Deployment metadata: name: quote - labels: - opentelemetry.io/name: quote + labels: + + opentelemetry.io/name: quote + app.kubernetes.io/component: quote app.kubernetes.io/name: quote app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: php spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: + matchLabels: + opentelemetry.io/name: quote template: metadata: - labels: - opentelemetry.io/name: quote + labels: + + opentelemetry.io/name: quote + app.kubernetes.io/component: quote app.kubernetes.io/name: quote spec: @@ -19771,23 +39941,27 @@ apiVersion: apps/v1 kind: Deployment metadata: name: recommendation - labels: - opentelemetry.io/name: recommendation + labels: + + opentelemetry.io/name: recommendation + app.kubernetes.io/component: recommendation app.kubernetes.io/name: recommendation app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: python spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: + matchLabels: + opentelemetry.io/name: recommendation template: metadata: - labels: - opentelemetry.io/name: recommendation + labels: + + opentelemetry.io/name: recommendation + app.kubernetes.io/component: recommendation app.kubernetes.io/name: recommendation spec: @@ -19796,7 +39970,8 @@ spec: - name: recommendation image: 'ghcr.io/open-telemetry/demo:2.1.3-recommendation' imagePullPolicy: IfNotPresent - ports: + ports: + - containerPort: 8080 name: service env: @@ -19836,23 +40011,27 @@ apiVersion: apps/v1 kind: Deployment metadata: name: shipping - labels: - opentelemetry.io/name: shipping + labels: + + opentelemetry.io/name: shipping + app.kubernetes.io/component: shipping app.kubernetes.io/name: shipping app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: java spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: + matchLabels: + opentelemetry.io/name: shipping template: metadata: - labels: - opentelemetry.io/name: shipping + labels: + + opentelemetry.io/name: shipping + app.kubernetes.io/component: shipping app.kubernetes.io/name: shipping spec: @@ -19861,7 +40040,8 @@ spec: - name: shipping image: 'ghcr.io/open-telemetry/demo:2.1.3-shipping' imagePullPolicy: IfNotPresent - ports: + ports: + - containerPort: 8080 name: service env: @@ -19893,23 +40073,27 @@ apiVersion: apps/v1 kind: Deployment metadata: name: valkey-cart - labels: - opentelemetry.io/name: valkey-cart + labels: + + opentelemetry.io/name: valkey-cart + app.kubernetes.io/component: valkey-cart app.kubernetes.io/name: valkey-cart app.kubernetes.io/version: "2.1.3" app.kubernetes.io/part-of: opentelemetry-demo - app.openshift.io/runtime: redis spec: replicas: 1 revisionHistoryLimit: 10 selector: - matchLabels: + matchLabels: + opentelemetry.io/name: valkey-cart template: metadata: - labels: - opentelemetry.io/name: valkey-cart + labels: + + opentelemetry.io/name: valkey-cart + app.kubernetes.io/component: valkey-cart app.kubernetes.io/name: valkey-cart spec: @@ -19918,7 +40102,8 @@ spec: - name: valkey-cart image: 'valkey/valkey:8.1.3-alpine' imagePullPolicy: IfNotPresent - ports: + ports: + - containerPort: 6379 name: valkey-cart env: @@ -19953,7 +40138,6 @@ metadata: app.kubernetes.io/instance: opentelemetry-demo app.kubernetes.io/version: "3.2.0" app.kubernetes.io/component: opensearch - app.openshift.io/runtime: java annotations: majorVersion: "3" spec: @@ -20092,42 +40276,16 @@ spec: volumeMounts: - name: config-emptydir mountPath: /usr/share/opensearch/config/opensearch.yml - subPath: opensearch.yml ---- -apiVersion: route.openshift.io/v1 -kind: Route -metadata: - name: frontend-proxy - namespace: otel-demo - labels: - app.kubernetes.io/name: frontend-proxy - app.kubernetes.io/part-of: opentelemetry-demo -spec: - path: / - to: - kind: Service - name: frontend-proxy - port: - targetPort: tcp-service - tls: - termination: edge - insecureEdgeTerminationPolicy: Redirect ---- -apiVersion: route.openshift.io/v1 -kind: Route -metadata: - name: jaeger-ui - namespace: otel-demo - labels: - app.kubernetes.io/name: jaeger - app.kubernetes.io/part-of: opentelemetry-demo -spec: - path: /jaeger/ui - to: - kind: Service - name: jaeger-query - port: - targetPort: 16686 - tls: - termination: edge - insecureEdgeTerminationPolicy: Redirect + subPath: opensearch.yml" + - name: discovery.type + value: "single-node" + - name: bootstrap.memory_lock + value: "true" + - name: DISABLE_INSTALL_DEMO_CONFIG + value: "true" + - name: DISABLE_SECURITY_PLUGIN + value: "true" + volumeMounts: + - name: config-emptydir + mountPath: /usr/share/opensearch/config/opensearch.yml + subPath: opensearch.yml \ No newline at end of file

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 Date: Mon, 10 Nov 2025 09:56:00 -0300 Subject: [PATCH 4/4] add opentelemetry-demo-openshift.yaml & rollback opentelemetry-demo.yaml --- kubernetes/opentelemetry-demo-openshift.yaml | 20133 ++++++++++++++++ kubernetes/opentelemetry-demo.yaml | 20740 ++++++++++++++++- 2 files changed, 40582 insertions(+), 291 deletions(-) create mode 100644 kubernetes/opentelemetry-demo-openshift.yaml diff --git a/kubernetes/opentelemetry-demo-openshift.yaml b/kubernetes/opentelemetry-demo-openshift.yaml new file mode 100644 index 0000000000..b543ac73fd --- /dev/null +++ b/kubernetes/opentelemetry-demo-openshift.yaml @@ -0,0 +1,20133 @@ +# Copyright The OpenTelemetry Authors +# SPDX-License-Identifier: Apache-2.0 +# This file is generated by 'make generate-kubernetes-manifests' +--- +apiVersion: v1 +kind: Namespace +metadata: + name: otel-demo +--- +# Source: opentelemetry-demo/charts/opensearch/templates/poddisruptionbudget.yaml +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: "opensearch-pdb" + labels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "3.2.0" + app.kubernetes.io/component: opensearch +spec: + maxUnavailable: 1 + selector: + matchLabels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo +--- +# Source: opentelemetry-demo/charts/grafana/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +automountServiceAccountToken: false +metadata: + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" + name: grafana + namespace: otel-demo +--- +# Source: opentelemetry-demo/charts/jaeger/templates/allinone-sa.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: jaeger + labels: + app.kubernetes.io/name: jaeger + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "1.53.0" + app.kubernetes.io/component: all-in-one +automountServiceAccountToken: true +--- +# Source: opentelemetry-demo/charts/opentelemetry-collector/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: otel-collector + namespace: otel-demo + labels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "0.135.0" + app.kubernetes.io/part-of: opentelemetry-collector + app.kubernetes.io/component: standalone-collector +--- +# Source: opentelemetry-demo/charts/prometheus/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: v3.6.0 + app.kubernetes.io/part-of: prometheus + name: prometheus + namespace: otel-demo + annotations: + {} +--- +# Source: opentelemetry-demo/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: opentelemetry-demo + labels: + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +--- +# 1. La SCC personalizada que permite un UID específico Y el perfil seccomp +apiVersion: security.openshift.io/v1 +kind: SecurityContextConstraints +metadata: + name: otel-demo-scc +allowHostDirVolumePlugin: false +allowHostIPC: false +allowHostNetwork: false +allowHostPID: false +allowHostPorts: false +allowPrivilegeEscalation: false +allowPrivilegedContainer: false +allowedCapabilities: [] +defaultAddCapabilities: [] +fsGroup: + type: RunAsAny +groups: [] +priority: 10 +readOnlyRootFilesystem: false +requiredDropCapabilities: +- KILL +- MKNOD +- SETUID +- SETGID +runAsUser: + type: RunAsAny +seLinuxContext: + type: MustRunAs +# Esta es la línea clave que faltaba en 'anyuid' +seccompProfiles: +- runtime/default +supplementalGroups: + type: RunAsAny +users: [] +volumes: +- configMap +- downwardAPI +- emptyDir +- persistentVolumeClaim +- projected +- secret +--- +# 2. El Role que da permiso para "usar" la nueva SCC +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: otel-demo-scc-role + namespace: otel-demo +rules: +- apiGroups: ["security.openshift.io"] + resourceNames: ["otel-demo-scc"] + resources: ["securitycontextconstraints"] + verbs: ["use"] +--- +# 3. El RoleBinding que conecta TODAS las SAs al nuevo Role +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: otel-demo-scc-binding + namespace: otel-demo +subjects: +- kind: ServiceAccount + name: grafana + namespace: otel-demo +- kind: ServiceAccount + name: jaeger + namespace: otel-demo +- kind: ServiceAccount + name: otel-collector + namespace: otel-demo +- kind: ServiceAccount + name: prometheus + namespace: otel-demo +- kind: ServiceAccount + name: opentelemetry-demo + namespace: otel-demo +- kind: ServiceAccount + name: default + namespace: otel-demo +roleRef: + kind: Role + name: otel-demo-scc-role + apiGroup: rbac.authorization.k8s.io +--- +# Source: opentelemetry-demo/charts/grafana/templates/secret.yaml +apiVersion: v1 +kind: Secret +metadata: + name: grafana + namespace: otel-demo + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" +type: Opaque +data: + + admin-user: "YWRtaW4=" + admin-password: "YWRtaW4=" + ldap-toml: "" +--- +# Source: opentelemetry-demo/charts/grafana/templates/configmap-dashboard-provider.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" + name: grafana-config-dashboards + namespace: otel-demo +data: + provider.yaml: |- + apiVersion: 1 + providers: + - name: 'sidecarProvider' + orgId: 1 + folder: '' + folderUid: '' + type: file + disableDeletion: false + allowUiUpdates: false + updateIntervalSeconds: 30 + options: + foldersFromFilesStructure: false + path: /tmp/dashboards +--- +# Source: opentelemetry-demo/charts/grafana/templates/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana + namespace: otel-demo + labels: + app.kubernetes.io/name: grafana + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "12.1.1" +data: + + plugins: grafana-opensearch-datasource + grafana.ini: | + [analytics] + check_for_updates = true + [auth] + disable_login_form = true + [auth.anonymous] + enabled = true + org_name = Main Org. + org_role = Admin + [grafana_net] + url = https://grafana.net + [log] + mode = console + [paths] + data = /var/lib/grafana/ + logs = /var/log/grafana + plugins = /var/lib/grafana/plugins + provisioning = /etc/grafana/provisioning + [server] + domain = '' + root_url = %(protocol)s://%(domain)s:%(http_port)s/grafana + serve_from_sub_path = true +--- +# Source: opentelemetry-demo/charts/opensearch/templates/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: opensearch-config + labels: + app.kubernetes.io/name: opensearch + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "3.2.0" + app.kubernetes.io/component: opensearch +data: + opensearch.yml: | + cluster.name: opensearch-cluster + + # Bind to all interfaces because we don't know what IP address Docker will assign to us. + network.host: 0.0.0.0 + + # Setting network.host to a non-loopback address enables the annoying bootstrap checks. "Single-node" mode disables them again. + # Implicitly done if ".singleNode" is set to "true". + # discovery.type: single-node + + # Start OpenSearch Security Demo Configuration + # WARNING: revise all the lines below before you go into production + # plugins: + # security: + # ssl: + # transport: + # pemcert_filepath: esnode.pem + # pemkey_filepath: esnode-key.pem + # pemtrustedcas_filepath: root-ca.pem + # enforce_hostname_verification: false + # http: + # enabled: true + # pemcert_filepath: esnode.pem + # pemkey_filepath: esnode-key.pem + # pemtrustedcas_filepath: root-ca.pem + # allow_unsafe_democertificates: true + # allow_default_init_securityindex: true + # authcz: + # admin_dn: + # - CN=kirk,OU=client,O=client,L=test,C=de + # audit.type: internal_opensearch + # enable_snapshot_restore_privilege: true + # check_snapshot_restore_write_privileges: true + # restapi: + # roles_enabled: ["all_access", "security_rest_api_access"] + # system_indices: + # enabled: true + # indices: + # [ + # ".opendistro-alerting-config", + # ".opendistro-alerting-alert*", + # ".opendistro-anomaly-results*", + # ".opendistro-anomaly-detector*", + # ".opendistro-anomaly-checkpoints", + # ".opendistro-anomaly-detection-state", + # ".opendistro-reports-*", + # ".opendistro-notifications-*", + # ".opendistro-notebooks", + # ".opendistro-asynchronous-search-response*", + # ] + ######## End OpenSearch Security Demo Configuration ######## +--- +# Source: opentelemetry-demo/charts/opentelemetry-collector/templates/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: otel-collector + namespace: otel-demo + labels: + app.kubernetes.io/name: opentelemetry-collector + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: "0.135.0" + app.kubernetes.io/part-of: opentelemetry-collector + app.kubernetes.io/component: standalone-collector +data: + relay: | + connectors: + spanmetrics: {} + exporters: + debug: {} + opensearch: + http: + endpoint: http://opensearch:9200 + tls: + insecure: true + logs_index: otel-logs + logs_index_time_format: yyyy-MM-dd + otlp: + endpoint: jaeger-collector:4317 + tls: + insecure: true + otlphttp/prometheus: + endpoint: http://prometheus:9090/api/v1/otlp + tls: + insecure: true + extensions: + health_check: + endpoint: ${env:MY_POD_IP}:13133 + processors: + batch: {} + k8sattributes: + extract: + metadata: + - k8s.namespace.name + - k8s.deployment.name + - k8s.statefulset.name + - k8s.daemonset.name + - k8s.cronjob.name + - k8s.job.name + - k8s.node.name + - k8s.pod.name + - k8s.pod.uid + - k8s.pod.start_time + passthrough: false + pod_association: + - sources: + - from: resource_attribute + name: k8s.pod.ip + - sources: + - from: resource_attribute + name: k8s.pod.uid + - sources: + - from: connection + memory_limiter: + check_interval: 5s + limit_percentage: 80 + spike_limit_percentage: 25 + resource: + attributes: + - action: insert + from_attribute: k8s.pod.uid + key: service.instance.id + resourcedetection: + detectors: + - env + - system + transform: + error_mode: ignore + trace_statements: + - context: span + statements: + - replace_pattern(name, "\\?.*", "") + - replace_match(name, "GET /api/products/*", "GET /api/products/{productId}") + receivers: + httpcheck/frontend-proxy: + targets: + - endpoint: http://frontend-proxy:8080 + jaeger: + protocols: + grpc: + endpoint: ${env:MY_POD_IP}:14250 + thrift_compact: + endpoint: ${env:MY_POD_IP}:6831 + thrift_http: + endpoint: ${env:MY_POD_IP}:14268 + nginx: + collection_interval: 10s + endpoint: http://image-provider:8081/status + otlp: + protocols: + grpc: + endpoint: ${env:MY_POD_IP}:4317 + http: + cors: + allowed_origins: + - http://* + - https://* + endpoint: ${env:MY_POD_IP}:4318 + postgresql: + endpoint: postgresql:5432 + metrics: + postgresql.blks_hit: + enabled: true + postgresql.blks_read: + enabled: true + postgresql.deadlocks: + enabled: true + postgresql.tup_deleted: + enabled: true + postgresql.tup_fetched: + enabled: true + postgresql.tup_inserted: + enabled: true + postgresql.tup_returned: + enabled: true + postgresql.tup_updated: + enabled: true + password: otel + tls: + insecure: true + username: root + prometheus: + config: + scrape_configs: + - job_name: opentelemetry-collector + scrape_interval: 10s + static_configs: + - targets: + - ${env:MY_POD_IP}:8888 + redis: + collection_interval: 10s + endpoint: valkey-cart:6379 + username: valkey + zipkin: + endpoint: ${env:MY_POD_IP}:9411 + service: + extensions: + - health_check + pipelines: + logs: + exporters: + - opensearch + - debug + processors: + - k8sattributes + - memory_limiter + - resourcedetection + - resource + - batch + receivers: + - otlp + metrics: + exporters: + - otlphttp/prometheus + - debug + processors: + - k8sattributes + - memory_limiter + - resourcedetection + - resource + - batch + receivers: + - httpcheck/frontend-proxy + - nginx + - otlp + - postgresql + - redis + - spanmetrics + traces: + exporters: + - otlp + - debug + - spanmetrics + processors: + - k8sattributes + - memory_limiter + - resourcedetection + - resource + - transform + - batch + receivers: + - otlp + - jaeger + - zipkin + telemetry: + metrics: + level: detailed + readers: + - periodic: + exporter: + otlp: + endpoint: otel-collector:4318 + protocol: http/protobuf + interval: 10000 + timeout: 5000 +--- +# Source: opentelemetry-demo/charts/prometheus/templates/cm.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/component: server + app.kubernetes.io/name: prometheus + app.kubernetes.io/instance: opentelemetry-demo + app.kubernetes.io/version: v3.6.0 + app.kubernetes.io/part-of: prometheus + name: prometheus + namespace: otel-demo +data: + allow-snippet-annotations: "false" + alerting_rules.yml: | + {} + alerts: | + {} + prometheus.yml: | + global: + evaluation_interval: 1m + scrape_interval: 1m + scrape_timeout: 10s + storage: + tsdb: + out_of_order_time_window: 30m + otlp: + keep_identifying_resource_attributes: true + promote_resource_attributes: + - service.instance.id + - service.name + - service.namespace + - service.version + - cloud.availability_zone + - cloud.region + - deployment.environment.name + - k8s.cluster.name + - k8s.container.name + - k8s.cronjob.name + - k8s.daemonset.name + - k8s.deployment.name + - k8s.job.name + - k8s.namespace.name + - k8s.node.name + - k8s.pod.name + - k8s.replicaset.name + - k8s.statefulset.name + - container.name + - host.name + - postgresql.database.name + - postgresql.schema.name + - postgresql.table.name + - postgresql.index.name + 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 + - 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 + - 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 + - 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 + - honor_labels: 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: drop + 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_annotation_prometheus_io_param_(.+) + replacement: __param_$1 + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - action: replace + source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - action: replace + source_labels: + - __meta_kubernetes_service_name + target_label: service + - action: replace + source_labels: + - __meta_kubernetes_pod_node_name + target_label: node + - honor_labels: true + 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_annotation_prometheus_io_param_(.+) + replacement: __param_$1 + - action: labelmap + regex: __meta_kubernetes_service_label_(.+) + - action: replace + source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - action: replace + source_labels: + - __meta_kubernetes_service_name + target_label: service + - action: replace + source_labels: + - __meta_kubernetes_pod_node_name + target_label: 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 + - honor_labels: true + 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: namespace + - source_labels: + - __meta_kubernetes_service_name + target_label: service + - honor_labels: true + 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: drop + 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+);(([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}) + replacement: '[$2]:$1' + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_port + - __meta_kubernetes_pod_ip + target_label: __address__ + - action: replace + regex: (\d+);((([0-9]+?)(\.|$)){4}) + replacement: $2:$1 + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_port + - __meta_kubernetes_pod_ip + target_label: __address__ + - action: labelmap + regex: __meta_kubernetes_pod_annotation_prometheus_io_param_(.+) + replacement: __param_$1 + - action: labelmap + regex: __meta_kubernetes_pod_label_(.+) + - action: replace + source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - action: replace + source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - action: drop + regex: Pending|Succeeded|Failed|Completed + source_labels: + - __meta_kubernetes_pod_phase + - action: replace + source_labels: + - __meta_kubernetes_pod_node_name + target_label: node + - honor_labels: true + 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+);(([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}) + replacement: '[$2]:$1' + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_port + - __meta_kubernetes_pod_ip + target_label: __address__ + - action: replace + regex: (\d+);((([0-9]+?)(\.|$)){4}) + replacement: $2:$1 + source_labels: + - __meta_kubernetes_pod_annotation_prometheus_io_port + - __meta_kubernetes_pod_ip + target_label: __address__ + - action: labelmap + regex: __meta_kubernetes_pod_annotation_prometheus_io_param_(.+) + replacement: __param_$1 + - action: labelmap + regex: __meta_kubernetes_pod_label_(.+) + - action: replace + source_labels: + - __meta_kubernetes_namespace + target_label: namespace + - action: replace + source_labels: + - __meta_kubernetes_pod_name + target_label: pod + - action: drop + regex: Pending|Succeeded|Failed|Completed + source_labels: + - __meta_kubernetes_pod_phase + - action: replace + source_labels: + - __meta_kubernetes_pod_node_name + target_label: node + scrape_interval: 5m + scrape_timeout: 30s + recording_rules.yml: | + {} + rules: | + {} +--- +# Source: opentelemetry-demo/templates/flagd-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: flagd-config + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo +data: + + demo.flagd.json: | + { + "$schema": "https://flagd.dev/schema/v0/flags.json", + "flags": { + "productCatalogFailure": { + "description": "Fail product catalog service on a specific product", + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off" + }, + "recommendationCacheFailure": { + "description": "Fail recommendation service cache", + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off" + }, + "adManualGc": { + "description": "Triggers full manual garbage collections in the ad service", + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off" + }, + "adHighCpu": { + "description": "Triggers high cpu load in the ad service", + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off" + }, + "adFailure": { + "description": "Fail ad service", + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off" + }, + "kafkaQueueProblems": { + "description": "Overloads Kafka queue while simultaneously introducing a consumer side delay leading to a lag spike", + "state": "ENABLED", + "variants": { + "on": 100, + "off": 0 + }, + "defaultVariant": "off" + }, + "cartFailure": { + "description": "Fail cart service", + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off" + }, + "paymentFailure": { + "description": "Fail payment service charge requests n%", + "state": "ENABLED", + "variants": { + "100%": 1, + "90%": 0.95, + "75%": 0.75, + "50%": 0.5, + "25%": 0.25, + "10%": 0.1, + "off": 0 + }, + "defaultVariant": "off" + }, + "paymentUnreachable": { + "description": "Payment service is unavailable", + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "off" + }, + "loadGeneratorFloodHomepage": { + "description": "Flood the frontend with a large amount of requests.", + "state": "ENABLED", + "variants": { + "on": 100, + "off": 0 + }, + "defaultVariant": "off" + }, + "imageSlowLoad": { + "description": "slow loading images in the frontend", + "state": "ENABLED", + "variants": { + "10sec": 10000, + "5sec": 5000, + "off": 0 + }, + "defaultVariant": "off" + } + } + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-alerting + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_alert: "1" +data: + + {} +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-nginx-metrics + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + NGINX-metrics.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 6, + "links": [], + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "The total number of accepted client connections", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 5, + "x": 0, + "y": 0 + }, + "id": 1, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_connections_accepted_total", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Accepted connections", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "The total number of handled connections", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 5, + "x": 5, + "y": 0 + }, + "id": 3, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_connections_handled_total", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "{{__name__}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Connections handled", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "The total number of client requests", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 9, + "x": 10, + "y": 0 + }, + "id": 4, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_requests_total", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "{{__name__}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Total number of client requests", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "webstore-metrics" + }, + "description": "The current number of nginx connections by state", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 19, + "x": 0, + "y": 8 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "12.0.2", + "targets": [ + { + "disableTextWrap": false, + "editorMode": "builder", + "expr": "nginx_connections_current", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "{{state}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Number of connections by state", + "type": "timeseries" + } + ], + "preload": false, + "schemaVersion": 41, + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "[Image-Provider] NGINX Metrics", + "uid": "6fb665e0-cb81-40a5-bd21-a9485c5477b4", + "version": 1 + } +--- +# Source: opentelemetry-demo/templates/grafana-config.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: grafana-dashboard-apm-dashboard + namespace: otel-demo + labels: + + + app.kubernetes.io/version: "2.1.3" + app.kubernetes.io/part-of: opentelemetry-demo + grafana_dashboard: "1" +data: + apm-dashboard.json: |- + { + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "APM dashboard for monitoring OpenTelemetry-based services. \n\nInstrument your applications using OpenTelemetry SDKs and send traces, metrics, and logs to Jaeger for traces, a Prometheus-compatible database for metrics, and OpenSearch for logs. This dashboard provides a centralized view of your application's health and performance. ", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": 5, + "links": [], + "panels": [ + { + "description": "service.namespace=${service_namespace}, service.name=${service_name}, deployment.environment.name=${deployment_environment_name}", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 10, + "x": 0, + "y": 0 + }, + "id": 20, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "