From f01a5120ade0547fb99481aca63ad0dde528735e Mon Sep 17 00:00:00 2001
From: Suhyen Im
Date: Sun, 1 Sep 2024 22:17:59 +0900
Subject: [PATCH] feat: add otel-demo tutorial
Co-authored-by: Suhyen Im
Co-authored-by: Jaeyeon Park
Signed-off-by: Suhyen Im
Signed-off-by: Jaeyeon Park
---
monitoring/README.md | 4 +
monitoring/tutorials/README.md | 8 +
monitoring/tutorials/otel-demo/README.md | 101 +++
.../otel-demo/cart-service/README.md | 25 +
.../cart-service-pod-network-latency.yml | 315 +++++++++
.../otel-demo/chaos-exporter-dashboard.json | 647 ++++++++++++++++++
.../otel-demo/custom_otel_demo_values.yml | 79 +++
.../recommendation-service/README.md | 25 +
.../recommendation-service-pod-delete.yml | 286 ++++++++
.../screenshots/cartservice_spanmetrics.png | Bin 0 -> 187696 bytes
.../chaos-experiments-dashboard-1.png | Bin 0 -> 745627 bytes
.../chaos-experiments-dashboard-2.png | Bin 0 -> 941649 bytes
.../screenshots/frontend_spanmetrics.png | Bin 0 -> 270156 bytes
13 files changed, 1490 insertions(+)
create mode 100644 monitoring/tutorials/README.md
create mode 100644 monitoring/tutorials/otel-demo/README.md
create mode 100644 monitoring/tutorials/otel-demo/cart-service/README.md
create mode 100644 monitoring/tutorials/otel-demo/cart-service/cart-service-pod-network-latency.yml
create mode 100644 monitoring/tutorials/otel-demo/chaos-exporter-dashboard.json
create mode 100644 monitoring/tutorials/otel-demo/custom_otel_demo_values.yml
create mode 100644 monitoring/tutorials/otel-demo/recommendation-service/README.md
create mode 100644 monitoring/tutorials/otel-demo/recommendation-service/recommendation-service-pod-delete.yml
create mode 100644 monitoring/tutorials/otel-demo/screenshots/cartservice_spanmetrics.png
create mode 100644 monitoring/tutorials/otel-demo/screenshots/chaos-experiments-dashboard-1.png
create mode 100644 monitoring/tutorials/otel-demo/screenshots/chaos-experiments-dashboard-2.png
create mode 100644 monitoring/tutorials/otel-demo/screenshots/frontend_spanmetrics.png
diff --git a/monitoring/README.md b/monitoring/README.md
index ee0c5e5301a..1af64dd45ca 100644
--- a/monitoring/README.md
+++ b/monitoring/README.md
@@ -12,6 +12,10 @@ This directory contains chaos interleaved grafana dashboards along with the util
> Contains utilities required to setup monitoring infrastructure on a kubernetes cluster.
+- [Tutorials](./tutorials)
+
+ > Contains tutorials on monitoring target applications under chaos using various tools.
+
## Setup the LitmusChaos Infrastructure
- Install the litmus chaos operator and CRDs
diff --git a/monitoring/tutorials/README.md b/monitoring/tutorials/README.md
new file mode 100644
index 00000000000..21d0c49aade
--- /dev/null
+++ b/monitoring/tutorials/README.md
@@ -0,0 +1,8 @@
+# Tutorials
+
+This directory contains tutorials on monitoring target applications under chaos using various tools.
+
+- [Otel-demo](./otel-demo)
+
+ > Contains a tutorial on setting up and using OpenTelemetry for monitoring target applications under chaos.
+
diff --git a/monitoring/tutorials/otel-demo/README.md b/monitoring/tutorials/otel-demo/README.md
new file mode 100644
index 00000000000..b87b929584f
--- /dev/null
+++ b/monitoring/tutorials/otel-demo/README.md
@@ -0,0 +1,101 @@
+# Otel-demo
+
+This tutorial provides instructions on setting up and using OpenTelemetry for monitoring target applications under chaos.
+
+## Setups
+
+### 0. Prerequisites
+- Kubernetes 1.24+
+- 6 GB of free RAM for the application
+- Helm 3.9+
+
+### 1. Install Litmus
+1. Create the Litmus namespace:
+ ```bash
+ kubectl create ns litmus
+ ```
+2. Add the Litmus Helm repository:
+ ```bash
+ helm repo add litmuschaos https://litmuschaos.github.io/litmus-helm/
+ ```
+3. Install Litmus using Helm:
+ ```bash
+ helm install chaos litmuschaos/litmus \
+ --namespace=litmus \
+ --set portal.frontend.service.type=NodePort \
+ --set mongodb.image.registry=ghcr.io/zcube \
+ --set mongodb.image.repository=bitnami-compat/mongodb \
+ --set mongodb.image.tag=6.0.5
+ ```
+4. Verify the installation:
+ ```bash
+ kubectl get all -n litmus
+ ```
+5. Forward the Litmus frontend service port:
+ ```bash
+ kubectl port-forward svc/chaos-litmus-frontend-service 9091:9091 -n litmus
+ ```
+ Access the Litmus frontend at [http://localhost:9091](http://localhost:9091) and log in with `admin` / `litmus`.
+
+### 2. Set Up Litmus Environments
+1. Create a new environment:
+ - Environment Name: `local`
+ - Environment Type: `Production`
+2. Enable Chaos:
+ - Name: `local`
+ - Chaos Components Installation: `Cluster-wide access`
+ - Installation Location (Namespace): `litmus`
+ - Service Account Name: `litmus`
+ - Kubernetes Setup Instructions: Download
+3. Deploy your infrastructure:
+ ```bash
+ cd ~/Downloads
+ kubectl apply -f local-litmus-chaos-enable.yml
+ ```
+ Wait until the status shows `CONNECTED`.
+
+### 3. Install Target Applications & OpenTelemetry
+1. Create the `otel-demo` namespace:
+ ```bash
+ kubectl create ns otel-demo
+ ```
+2. Add the OpenTelemetry Helm repository:
+ ```bash
+ helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
+ ```
+3. Install the OpenTelemetry demo chart:
+ ```bash
+ cd litmus/monitoring/tutorials/otel-demo
+ helm install my-otel-demo open-telemetry/opentelemetry-demo --namespace otel-demo --values custom_otel_demo_values.yml
+ ```
+4. Verify the installation:
+ ```bash
+ kubectl get all -n otel-demo
+ ```
+5. Forward the OpenTelemetry frontend proxy port:
+ ```bash
+ kubectl port-forward svc/my-otel-demo-frontendproxy 8080:8080 -n otel-demo
+ ```
+6. Access the following services:
+ - Web store: [http://localhost:8080/](http://localhost:8080/)
+ - Grafana: [http://localhost:8080/grafana/](http://localhost:8080/grafana/)
+ - Load Generator UI: [http://localhost:8080/loadgen/](http://localhost:8080/loadgen/)
+ - Jaeger UI: [http://localhost:8080/jaeger/ui/](http://localhost:8080/jaeger/ui/)
+
+### 4. Add Grafana Panel
+Import the `chaos-experiments-dashboard.json` file into Grafana to visualize the results of chaos experiments.
+![chaos-experiments-dashboard-1.png](./screenshots/chaos-experiments-dashboard-1.png)
+![chaos-experiments-dashboard-2.png](./screenshots/chaos-experiments-dashboard-2.png)
+
+### 5. Experiments on Target Applications
+Explore the following experiments to test and observe chaos in target applications:
+
+- [Pod Delete](https://github.com/litmuschaos/litmus/blob/master/monitoring/tutorials/otel-demo/recommendation-service)
+ > Performs a Pod delete experiment on the recommendation service.
+
+- [Pod Network Latency](https://github.com/litmuschaos/litmus/blob/master/monitoring/tutorials/otel-demo/cart-service)
+ > Conducts a network latency experiment on the cart service.
+
+---
+
+Feel free to adjust any details as needed!
\ No newline at end of file
diff --git a/monitoring/tutorials/otel-demo/cart-service/README.md b/monitoring/tutorials/otel-demo/cart-service/README.md
new file mode 100644
index 00000000000..6598abb5f0d
--- /dev/null
+++ b/monitoring/tutorials/otel-demo/cart-service/README.md
@@ -0,0 +1,25 @@
+# cart service pod network latency
+## Description
+- This experiment injects network latency to the cart service pod.
+- The Probe checks Prometheus metrics Latency of cart service requests.
+## Steps
+### 1. Probe Settings
+- probe type: `Prometheus Probe`
+- name: `cart-service-pod-network-latency-probe`
+- timeout: 3s
+- interval: 3s
+- prometheus endpoint: `http://my-otel-demo-prometheus-server.otel-demo:9090`
+- prometheus query: `histogram_quantile(0.99, sum(rate(duration_milliseconds_bucket{service_name=\"cartservice\"}[5m])) by (le))/1000`
+- Data Comparison:
+ - Type: Float
+ - Criteria: `<`
+ - Value: `3.0`
+### 2. Make Experiment
+1. New Experimnet
+2. Complete Overview
+3. Start off by Upload YML(cart-service-pod-network-latency.yml)
+### 3. Run Experiment
+1. Click on the `Run` button
+2. Check Experiment Status and Logs
+3. Check the Resilience Score
+4. Check cart service Spanmetrics Metrics using Grafana ![cartservice_spanmetrics.png](../screenshots/cartservice_spanmetrics.png)
\ No newline at end of file
diff --git a/monitoring/tutorials/otel-demo/cart-service/cart-service-pod-network-latency.yml b/monitoring/tutorials/otel-demo/cart-service/cart-service-pod-network-latency.yml
new file mode 100644
index 00000000000..5aa913a3356
--- /dev/null
+++ b/monitoring/tutorials/otel-demo/cart-service/cart-service-pod-network-latency.yml
@@ -0,0 +1,315 @@
+kind: Workflow
+apiVersion: argoproj.io/v1alpha1
+metadata:
+ name: cart-service-pod-network-latency
+ namespace: litmus
+ creationTimestamp: null
+ labels:
+ infra_id: 5b9be872-6396-4ad1-b64a-ed4b25edd516
+ revision_id: bd738dca-14f0-4145-8f67-afb3d8c17991
+ workflow_id: 1912f522-5197-4bd5-8854-732ccf1882bb
+ workflows.argoproj.io/controller-instanceid: 5b9be872-6396-4ad1-b64a-ed4b25edd516
+spec:
+ templates:
+ - name: test
+ inputs: {}
+ outputs: {}
+ metadata: {}
+ steps:
+ - - name: install-chaos-faults
+ template: install-chaos-faults
+ arguments: {}
+ - - name: pod-network-latency-pok
+ template: pod-network-latency-pok
+ arguments: {}
+ - - name: cleanup-chaos-resources
+ template: cleanup-chaos-resources
+ arguments: {}
+ - name: install-chaos-faults
+ inputs:
+ artifacts:
+ - name: pod-network-latency-pok
+ path: /tmp/pod-network-latency-pok.yaml
+ raw:
+ data: >
+ apiVersion: litmuschaos.io/v1alpha1
+
+ description:
+ message: |
+ Injects network latency on pods belonging to an app deployment
+ kind: ChaosExperiment
+
+ metadata:
+ name: pod-network-latency
+ labels:
+ name: pod-network-latency
+ app.kubernetes.io/part-of: litmus
+ app.kubernetes.io/component: chaosexperiment
+ app.kubernetes.io/version: ci
+ spec:
+ definition:
+ scope: Namespaced
+ permissions:
+ - apiGroups:
+ - ""
+ resources:
+ - pods
+ verbs:
+ - create
+ - delete
+ - get
+ - list
+ - patch
+ - update
+ - deletecollection
+ - apiGroups:
+ - ""
+ resources:
+ - events
+ verbs:
+ - create
+ - get
+ - list
+ - patch
+ - update
+ - apiGroups:
+ - ""
+ resources:
+ - configmaps
+ verbs:
+ - get
+ - list
+ - apiGroups:
+ - ""
+ resources:
+ - pods/log
+ verbs:
+ - get
+ - list
+ - watch
+ - apiGroups:
+ - ""
+ resources:
+ - pods/exec
+ verbs:
+ - get
+ - list
+ - create
+ - apiGroups:
+ - apps
+ resources:
+ - deployments
+ - statefulsets
+ - replicasets
+ - daemonsets
+ verbs:
+ - list
+ - get
+ - apiGroups:
+ - apps.openshift.io
+ resources:
+ - deploymentconfigs
+ verbs:
+ - list
+ - get
+ - apiGroups:
+ - ""
+ resources:
+ - replicationcontrollers
+ verbs:
+ - get
+ - list
+ - apiGroups:
+ - argoproj.io
+ resources:
+ - rollouts
+ verbs:
+ - list
+ - get
+ - apiGroups:
+ - batch
+ resources:
+ - jobs
+ verbs:
+ - create
+ - list
+ - get
+ - delete
+ - deletecollection
+ - apiGroups:
+ - litmuschaos.io
+ resources:
+ - chaosengines
+ - chaosexperiments
+ - chaosresults
+ verbs:
+ - create
+ - list
+ - get
+ - patch
+ - update
+ - delete
+ image: docker.io/litmuschaos/go-runner:latest
+ imagePullPolicy: Always
+ args:
+ - -c
+ - ./experiments -name pod-network-latency
+ command:
+ - /bin/bash
+ env:
+ - name: TARGET_CONTAINER
+ value: ""
+ - name: NETWORK_INTERFACE
+ value: eth0
+ - name: LIB_IMAGE
+ value: docker.io/litmuschaos/go-runner:latest
+ - name: TC_IMAGE
+ value: gaiadocker/iproute2
+ - name: NETWORK_LATENCY
+ value: "2000"
+ - name: TOTAL_CHAOS_DURATION
+ value: "60"
+ - name: RAMP_TIME
+ value: ""
+ - name: JITTER
+ value: "0"
+ - name: PODS_AFFECTED_PERC
+ value: ""
+ - name: TARGET_PODS
+ value: ""
+ - name: CONTAINER_RUNTIME
+ value: containerd
+ - name: DEFAULT_HEALTH_CHECK
+ value: "false"
+ - name: DESTINATION_IPS
+ value: ""
+ - name: DESTINATION_HOSTS
+ value: ""
+ - name: SOCKET_PATH
+ value: /run/containerd/containerd.sock
+ - name: NODE_LABEL
+ value: ""
+ - name: SEQUENCE
+ value: parallel
+ labels:
+ name: pod-network-latency
+ app.kubernetes.io/part-of: litmus
+ app.kubernetes.io/component: experiment-job
+ app.kubernetes.io/runtime-api-usage: "true"
+ app.kubernetes.io/version: ci
+ outputs: {}
+ metadata: {}
+ container:
+ name: ""
+ image: litmuschaos/k8s:2.11.0
+ command:
+ - sh
+ - -c
+ args:
+ - kubectl apply -f /tmp/ -n {{workflow.parameters.adminModeNamespace}}
+ && sleep 30
+ resources: {}
+ - name: cleanup-chaos-resources
+ inputs: {}
+ outputs: {}
+ metadata: {}
+ container:
+ name: ""
+ image: litmuschaos/k8s:2.11.0
+ command:
+ - sh
+ - -c
+ args:
+ - kubectl delete chaosengine -l workflow_run_id={{workflow.uid}} -n
+ {{workflow.parameters.adminModeNamespace}}
+ resources: {}
+ - name: pod-network-latency-pok
+ inputs:
+ artifacts:
+ - name: pod-network-latency-pok
+ path: /tmp/chaosengine-pod-network-latency-pok.yaml
+ raw:
+ data: >
+ apiVersion: litmuschaos.io/v1alpha1
+
+ kind: ChaosEngine
+
+ metadata:
+ namespace: "{{workflow.parameters.adminModeNamespace}}"
+ labels:
+ workflow_run_id: "{{ workflow.uid }}"
+ workflow_name: cart-service-pod-network-latency
+ annotations:
+ probeRef: '[{"name":"cart-service-pod-network-latency-probe","mode":"EOT"}]'
+ generateName: pod-network-latency-pok
+ spec:
+ engineState: active
+ appinfo:
+ appns: otel-demo
+ applabel: app.kubernetes.io/component=cartservice
+ appkind: deployment
+ chaosServiceAccount: litmus-admin
+ experiments:
+ - name: pod-network-latency
+ spec:
+ components:
+ env:
+ - name: TARGET_CONTAINER
+ value: ""
+ - name: NETWORK_INTERFACE
+ value: eth0
+ - name: LIB_IMAGE
+ value: docker.io/litmuschaos/go-runner:latest
+ - name: TC_IMAGE
+ value: gaiadocker/iproute2
+ - name: NETWORK_LATENCY
+ value: "2000"
+ - name: TOTAL_CHAOS_DURATION
+ value: "150"
+ - name: RAMP_TIME
+ value: ""
+ - name: JITTER
+ value: "0"
+ - name: PODS_AFFECTED_PERC
+ value: ""
+ - name: TARGET_PODS
+ value: ""
+ - name: CONTAINER_RUNTIME
+ value: containerd
+ - name: DEFAULT_HEALTH_CHECK
+ value: "false"
+ - name: DESTINATION_IPS
+ value: ""
+ - name: DESTINATION_HOSTS
+ value: ""
+ - name: SOCKET_PATH
+ value: /run/containerd/containerd.sock
+ - name: NODE_LABEL
+ value: ""
+ - name: SEQUENCE
+ value: parallel
+ outputs: {}
+ metadata:
+ labels:
+ weight: "10"
+ container:
+ name: ""
+ image: docker.io/litmuschaos/litmus-checker:2.11.0
+ args:
+ - -file=/tmp/chaosengine-pod-network-latency-pok.yaml
+ - -saveName=/tmp/engine-name
+ resources: {}
+ entrypoint: test
+ arguments:
+ parameters:
+ - name: adminModeNamespace
+ value: litmus
+ serviceAccountName: argo-chaos
+ podGC:
+ strategy: OnWorkflowCompletion
+ securityContext:
+ runAsUser: 1000
+ runAsNonRoot: true
+status:
+ startedAt: null
+ finishedAt: null
diff --git a/monitoring/tutorials/otel-demo/chaos-exporter-dashboard.json b/monitoring/tutorials/otel-demo/chaos-exporter-dashboard.json
new file mode 100644
index 00000000000..0586abffe08
--- /dev/null
+++ b/monitoring/tutorials/otel-demo/chaos-exporter-dashboard.json
@@ -0,0 +1,647 @@
+{
+ "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": 5,
+ "links": [],
+ "panels": [
+ {
+ "collapsed": false,
+ "gridPos": {
+ "h": 1,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 8,
+ "panels": [],
+ "title": "Chaos Exporter Dashboard",
+ "type": "row"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "webstore-metrics"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "fillOpacity": 50,
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineWidth": 0,
+ "spanNulls": false
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "transparent",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "gridPos": {
+ "h": 7,
+ "w": 20,
+ "x": 0,
+ "y": 1
+ },
+ "id": 1,
+ "options": {
+ "alignValue": "center",
+ "legend": {
+ "displayMode": "list",
+ "placement": "bottom",
+ "showLegend": false
+ },
+ "mergeValues": true,
+ "rowHeight": 0.7,
+ "showValue": "auto",
+ "tooltip": {
+ "mode": "single",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "10.4.1",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "webstore-metrics"
+ },
+ "disableTextWrap": false,
+ "editorMode": "builder",
+ "expr": "litmuschaos_experiment_total_duration",
+ "format": "time_series",
+ "fullMetaSearch": false,
+ "includeNullMetadata": true,
+ "legendFormat": "{{chaosengine_name}}",
+ "range": true,
+ "refId": "A",
+ "useBackend": false
+ }
+ ],
+ "title": "Chaos Experiments Duration",
+ "type": "state-timeline"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "webstore-metrics"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "format": "short",
+ "gridPos": {
+ "h": 6,
+ "w": 5,
+ "x": 0,
+ "y": 8
+ },
+ "id": 2,
+ "max": 100,
+ "min": 0,
+ "options": {
+ "minVizHeight": 75,
+ "minVizWidth": 75,
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true,
+ "sizing": "auto"
+ },
+ "pluginVersion": "11.1.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "webstore-metrics"
+ },
+ "disableTextWrap": false,
+ "editorMode": "builder",
+ "expr": "litmuschaos_cluster_scoped_experiments_installed_count",
+ "format": "time_series",
+ "fullMetaSearch": false,
+ "includeNullMetadata": true,
+ "legendFormat": "Total Experiments",
+ "range": true,
+ "refId": "A",
+ "useBackend": false
+ }
+ ],
+ "thresholds": "0,50,100",
+ "title": "Total Experiments",
+ "type": "gauge",
+ "valueMaps": [
+ {
+ "text": "No Data",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "webstore-metrics"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "dark-yellow",
+ "mode": "fixed"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "format": "short",
+ "gridPos": {
+ "h": 6,
+ "w": 5,
+ "x": 5,
+ "y": 8
+ },
+ "id": 5,
+ "max": 100,
+ "min": 0,
+ "options": {
+ "minVizHeight": 75,
+ "minVizWidth": 75,
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true,
+ "sizing": "auto"
+ },
+ "pluginVersion": "11.1.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "webstore-metrics"
+ },
+ "disableTextWrap": false,
+ "editorMode": "code",
+ "expr": "sum(litmuschaos_awaited_experiments)",
+ "format": "time_series",
+ "fullMetaSearch": false,
+ "includeNullMetadata": true,
+ "legendFormat": "Queued Experiments",
+ "range": true,
+ "refId": "A",
+ "useBackend": false
+ }
+ ],
+ "thresholds": "0,50,100",
+ "title": "Awaited Experiments",
+ "type": "gauge",
+ "valueMaps": [
+ {
+ "text": "No Data",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "alert": {
+ "alertRuleTags": {},
+ "conditions": [
+ {
+ "evaluator": {
+ "params": [
+ 0.99
+ ],
+ "type": "gt"
+ },
+ "operator": {
+ "type": "and"
+ },
+ "query": {
+ "params": [
+ "A",
+ "5s",
+ "now"
+ ]
+ },
+ "reducer": {
+ "params": [],
+ "type": "max"
+ },
+ "type": "query"
+ }
+ ],
+ "executionErrorState": "alerting",
+ "for": "1s",
+ "frequency": "1s",
+ "handler": 1,
+ "message": "Chaos Probe Failed !!!\n\n
\nChaos Details:-
\n
\n- Verdict: ${chaosresult_verdict}\n
- Probe Success %: ${probe_success_percentage}\n
\n
\nApp Details:-
\n
\n- Engine Context: ${chaosengine_context}\n
- Label: ${app_label}\n
- Kind: ${app_kind}\n
- Namespace: ${app_namespace}\n
\n",
+ "name": "Chaos Experiment Probe Failure Alerts alert",
+ "noDataState": "no_data",
+ "notifications": []
+ },
+ "datasource": {
+ "type": "prometheus",
+ "uid": "webstore-metrics"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "palette-classic"
+ },
+ "custom": {
+ "axisBorderShow": false,
+ "axisCenteredZero": false,
+ "axisColorMode": "text",
+ "axisLabel": "Probes failed",
+ "axisPlacement": "auto",
+ "barAlignment": 0,
+ "drawStyle": "line",
+ "fillOpacity": 50,
+ "gradientMode": "opacity",
+ "hideFrom": {
+ "legend": false,
+ "tooltip": false,
+ "viz": false
+ },
+ "insertNulls": false,
+ "lineInterpolation": "stepAfter",
+ "lineWidth": 1,
+ "pointSize": 5,
+ "scaleDistribution": {
+ "log": 2,
+ "type": "log"
+ },
+ "showPoints": "never",
+ "spanNulls": false,
+ "stacking": {
+ "group": "A",
+ "mode": "none"
+ },
+ "thresholdsStyle": {
+ "mode": "line+area"
+ }
+ },
+ "mappings": [],
+ "max": 1,
+ "min": 0,
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "transparent",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 0.99
+ }
+ ]
+ },
+ "unit": "none"
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/.*Fail/"
+ },
+ "properties": [
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "#E02F44",
+ "mode": "fixed"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byValue",
+ "options": {
+ "op": "gte",
+ "reducer": "allIsZero",
+ "value": 0
+ }
+ },
+ "properties": [
+ {
+ "id": "custom.hideFrom",
+ "value": {
+ "legend": true,
+ "tooltip": true,
+ "viz": false
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byValue",
+ "options": {
+ "op": "gte",
+ "reducer": "allIsNull",
+ "value": 0
+ }
+ },
+ "properties": [
+ {
+ "id": "custom.hideFrom",
+ "value": {
+ "legend": true,
+ "tooltip": true,
+ "viz": false
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 12,
+ "w": 10,
+ "x": 10,
+ "y": 8
+ },
+ "id": 9,
+ "options": {
+ "legend": {
+ "calcs": [],
+ "displayMode": "table",
+ "placement": "bottom",
+ "showLegend": true
+ },
+ "tooltip": {
+ "mode": "multi",
+ "sort": "none"
+ }
+ },
+ "pluginVersion": "7.5.5",
+ "targets": [
+ {
+ "datasource": {
+ "uid": "DS_PROMETHEUS"
+ },
+ "editorMode": "code",
+ "exemplar": true,
+ "expr": "litmuschaos_experiment_verdict{probe_success_percentage!=\"100.000000\"}",
+ "format": "time_series",
+ "hide": false,
+ "instant": false,
+ "interval": "1s",
+ "legendFormat": "{{app_label}} - {{chaosresult_name}} - {{probe_success_percentage}}",
+ "refId": "A"
+ }
+ ],
+ "title": "Chaos Experiment Probe Failure Alerts",
+ "transparent": true,
+ "type": "timeseries"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "webstore-metrics"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "format": "short",
+ "gridPos": {
+ "h": 6,
+ "w": 5,
+ "x": 0,
+ "y": 14
+ },
+ "id": 3,
+ "max": 100,
+ "min": 0,
+ "options": {
+ "minVizHeight": 75,
+ "minVizWidth": 75,
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true,
+ "sizing": "auto"
+ },
+ "pluginVersion": "11.1.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "webstore-metrics"
+ },
+ "disableTextWrap": false,
+ "editorMode": "code",
+ "expr": "sum(litmuschaos_passed_experiments)",
+ "format": "time_series",
+ "fullMetaSearch": false,
+ "includeNullMetadata": true,
+ "legendFormat": "Passed Experiments",
+ "range": true,
+ "refId": "A",
+ "useBackend": false
+ }
+ ],
+ "thresholds": "0,50,100",
+ "title": "Passed Experiments",
+ "type": "gauge",
+ "valueMaps": [
+ {
+ "text": "No Data",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ },
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "webstore-metrics"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "fixedColor": "dark-red",
+ "mode": "fixed"
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": null
+ }
+ ]
+ }
+ },
+ "overrides": []
+ },
+ "format": "short",
+ "gridPos": {
+ "h": 6,
+ "w": 5,
+ "x": 5,
+ "y": 14
+ },
+ "id": 4,
+ "max": 100,
+ "min": 0,
+ "options": {
+ "minVizHeight": 75,
+ "minVizWidth": 75,
+ "orientation": "auto",
+ "reduceOptions": {
+ "calcs": [
+ "lastNotNull"
+ ],
+ "fields": "",
+ "values": false
+ },
+ "showThresholdLabels": false,
+ "showThresholdMarkers": true,
+ "sizing": "auto"
+ },
+ "pluginVersion": "11.1.0",
+ "targets": [
+ {
+ "datasource": {
+ "type": "prometheus",
+ "uid": "webstore-metrics"
+ },
+ "disableTextWrap": false,
+ "editorMode": "code",
+ "expr": "sum(litmuschaos_failed_experiments)",
+ "format": "time_series",
+ "fullMetaSearch": false,
+ "includeNullMetadata": true,
+ "legendFormat": "Failed Experiments",
+ "range": true,
+ "refId": "A",
+ "useBackend": false
+ }
+ ],
+ "thresholds": "0,50,100",
+ "title": "Failed Experiments",
+ "type": "gauge",
+ "valueMaps": [
+ {
+ "text": "No Data",
+ "value": "null"
+ }
+ ],
+ "valueName": "current"
+ }
+ ],
+ "refresh": "5m",
+ "schemaVersion": 39,
+ "tags": [],
+ "templating": {
+ "list": []
+ },
+ "time": {
+ "from": "now-6h",
+ "to": "now"
+ },
+ "timepicker": {},
+ "timezone": "browser",
+ "title": "Chaos Experiments Dashboard",
+ "uid": "chaos-experiments-dashboard",
+ "version": 3,
+ "weekStart": ""
+}
\ No newline at end of file
diff --git a/monitoring/tutorials/otel-demo/custom_otel_demo_values.yml b/monitoring/tutorials/otel-demo/custom_otel_demo_values.yml
new file mode 100644
index 00000000000..fc3c25d5152
--- /dev/null
+++ b/monitoring/tutorials/otel-demo/custom_otel_demo_values.yml
@@ -0,0 +1,79 @@
+opentelemetry-collector:
+ config:
+ receivers:
+ otlp:
+ protocols:
+ http:
+ # Since this collector needs to receive data from the web, enable cors for all origins
+ # `allowed_origins` can be refined for your deployment domain
+ cors:
+ allowed_origins:
+ - "http://*"
+ - "https://*"
+ prometheus:
+ config:
+ scrape_configs:
+ - job_name: 'chaos-exporter'
+ static_configs:
+ - targets: [ 'chaos-exporter.litmus.svc.cluster.local:8080' ]
+ relabel_configs:
+ - target_label: instance
+ replacement: 'chaos-exporter-service'
+ httpcheck/frontendproxy:
+ targets:
+ - endpoint: 'http://{{ include "otel-demo.name" . }}-frontendproxy:8080'
+ redis:
+ endpoint: "valkey-cart:6379"
+ collection_interval: 10s
+
+ exporters:
+ ## Create an exporter to Jaeger using the standard `otlp` export format
+ otlp:
+ endpoint: '{{ include "otel-demo.name" . }}-jaeger-collector:4317'
+ tls:
+ insecure: true
+ # Create an exporter to Prometheus (metrics)
+ otlphttp/prometheus:
+ endpoint: 'http://{{ include "otel-demo.name" . }}-prometheus-server:9090/api/v1/otlp'
+ tls:
+ insecure: true
+ opensearch:
+ logs_index: otel
+ http:
+ endpoint: "http://otel-demo-opensearch:9200"
+ tls:
+ insecure: true
+
+ processors:
+ # This processor is used to help limit high cardinality on next.js span names
+ # When this PR is merged (and released) we can remove this transform processor
+ # https://github.com/vercel/next.js/pull/64852
+ transform:
+ error_mode: ignore
+ trace_statements:
+ - context: span
+ statements:
+ # could be removed when https://github.com/vercel/next.js/pull/64852 is fixed upstream
+ - replace_pattern(name, "\\?.*", "")
+ - replace_match(name, "GET /api/products/*", "GET /api/products/{productId}")
+ resource:
+ attributes:
+ - key: service.instance.id
+ from_attribute: k8s.pod.uid
+ action: insert
+
+ connectors:
+ spanmetrics: {}
+
+ service:
+ pipelines:
+ traces:
+ processors: [memory_limiter, resource, transform, batch]
+ exporters: [otlp, debug, spanmetrics]
+ metrics:
+ receivers: [httpcheck/frontendproxy, redis, otlp, spanmetrics, prometheus]
+ processors: [memory_limiter, resource, batch]
+ exporters: [otlphttp/prometheus, debug]
+ logs:
+ processors: [memory_limiter, resource, batch]
+ exporters: [opensearch, debug]
\ No newline at end of file
diff --git a/monitoring/tutorials/otel-demo/recommendation-service/README.md b/monitoring/tutorials/otel-demo/recommendation-service/README.md
new file mode 100644
index 00000000000..009c71b2f21
--- /dev/null
+++ b/monitoring/tutorials/otel-demo/recommendation-service/README.md
@@ -0,0 +1,25 @@
+# recommendation service pod delete
+## Description
+- This experiment injects pod delete chaos to the recommendation service pod.
+- The Probe checks the Prometheus metrics for the error rate of the ListRecommendations span.
+## Steps
+### 1. Probe Settings
+- probe type: `Prometheus Probe`
+- name: `recommendation-service-pod-delete-probe`
+- timeout: 3s
+- interval: 3s
+- prometheus endpoint: `http://my-otel-demo-prometheus-server.otel-demo:9090`
+- prometheus query: `sum(rate(calls_total{status_code=\"STATUS_CODE_ERROR\", span_name=\"grpc.oteldemo.RecommendationService/ListRecommendations\"}[5m]))`
+- Data Comparison:
+ - Type: Float
+ - Criteria: `<`
+ - Value: `0.05`
+### 2. Make Experiment
+1. New Experimnet
+2. Complete Overview
+3. Start off by Upload YML(recommendation-service-pod-delete.yml)
+### 3. Run Experiment
+1. Click on the `Run` button
+2. Check Experiment Status and Logs
+3. Check the Resilience Score
+4. Check Error Rate for frontend using Grafana ![frontend_spanmetrics.png](../screenshots/frontend_spanmetrics.png)
\ No newline at end of file
diff --git a/monitoring/tutorials/otel-demo/recommendation-service/recommendation-service-pod-delete.yml b/monitoring/tutorials/otel-demo/recommendation-service/recommendation-service-pod-delete.yml
new file mode 100644
index 00000000000..8d4c38d3a2a
--- /dev/null
+++ b/monitoring/tutorials/otel-demo/recommendation-service/recommendation-service-pod-delete.yml
@@ -0,0 +1,286 @@
+kind: Workflow
+apiVersion: argoproj.io/v1alpha1
+metadata:
+ name: recommendation-service-pod-delete
+ namespace: litmus
+ creationTimestamp: null
+ labels:
+ infra_id: 5b9be872-6396-4ad1-b64a-ed4b25edd516
+ revision_id: fb9618ec-40fa-4a4d-a8b3-a3451da85d06
+ workflow_id: cf6dead4-944d-4c86-ba82-b5576ec0ceaf
+ workflows.argoproj.io/controller-instanceid: 5b9be872-6396-4ad1-b64a-ed4b25edd516
+spec:
+ templates:
+ - name: recommendationservice-pod-delete
+ inputs: {}
+ outputs: {}
+ metadata: {}
+ steps:
+ - - name: install-chaos-faults
+ template: install-chaos-faults
+ arguments: {}
+ - - name: pod-delete-zkg
+ template: pod-delete-zkg
+ arguments: {}
+ - - name: cleanup-chaos-resources
+ template: cleanup-chaos-resources
+ arguments: {}
+ - name: install-chaos-faults
+ inputs:
+ artifacts:
+ - name: pod-delete-zkg
+ path: /tmp/pod-delete-zkg.yaml
+ raw:
+ data: >
+ apiVersion: litmuschaos.io/v1alpha1
+
+ description:
+ message: |
+ Deletes a pod belonging to a deployment/statefulset/daemonset
+ kind: ChaosExperiment
+
+ metadata:
+ name: pod-delete
+ labels:
+ name: pod-delete
+ app.kubernetes.io/part-of: litmus
+ app.kubernetes.io/component: chaosexperiment
+ app.kubernetes.io/version: ci
+ spec:
+ definition:
+ scope: Namespaced
+ permissions:
+ - apiGroups:
+ - ""
+ resources:
+ - pods
+ verbs:
+ - create
+ - delete
+ - get
+ - list
+ - patch
+ - update
+ - deletecollection
+ - apiGroups:
+ - ""
+ resources:
+ - events
+ verbs:
+ - create
+ - get
+ - list
+ - patch
+ - update
+ - apiGroups:
+ - ""
+ resources:
+ - configmaps
+ verbs:
+ - get
+ - list
+ - apiGroups:
+ - ""
+ resources:
+ - pods/log
+ verbs:
+ - get
+ - list
+ - watch
+ - apiGroups:
+ - ""
+ resources:
+ - pods/exec
+ verbs:
+ - get
+ - list
+ - create
+ - apiGroups:
+ - apps
+ resources:
+ - deployments
+ - statefulsets
+ - replicasets
+ - daemonsets
+ verbs:
+ - list
+ - get
+ - apiGroups:
+ - apps.openshift.io
+ resources:
+ - deploymentconfigs
+ verbs:
+ - list
+ - get
+ - apiGroups:
+ - ""
+ resources:
+ - replicationcontrollers
+ verbs:
+ - get
+ - list
+ - apiGroups:
+ - argoproj.io
+ resources:
+ - rollouts
+ verbs:
+ - list
+ - get
+ - apiGroups:
+ - batch
+ resources:
+ - jobs
+ verbs:
+ - create
+ - list
+ - get
+ - delete
+ - deletecollection
+ - apiGroups:
+ - litmuschaos.io
+ resources:
+ - chaosengines
+ - chaosexperiments
+ - chaosresults
+ verbs:
+ - create
+ - list
+ - get
+ - patch
+ - update
+ - delete
+ image: docker.io/litmuschaos/go-runner:latest
+ imagePullPolicy: Always
+ args:
+ - -c
+ - ./experiments -name pod-delete
+ command:
+ - /bin/bash
+ env:
+ - name: TOTAL_CHAOS_DURATION
+ value: "15"
+ - name: RAMP_TIME
+ value: ""
+ - name: FORCE
+ value: "true"
+ - name: CHAOS_INTERVAL
+ value: "5"
+ - name: PODS_AFFECTED_PERC
+ value: ""
+ - name: TARGET_CONTAINER
+ value: ""
+ - name: TARGET_PODS
+ value: ""
+ - name: DEFAULT_HEALTH_CHECK
+ value: "false"
+ - name: NODE_LABEL
+ value: ""
+ - name: SEQUENCE
+ value: parallel
+ labels:
+ name: pod-delete
+ app.kubernetes.io/part-of: litmus
+ app.kubernetes.io/component: experiment-job
+ app.kubernetes.io/version: ci
+ outputs: {}
+ metadata: {}
+ container:
+ name: ""
+ image: litmuschaos/k8s:2.11.0
+ command:
+ - sh
+ - -c
+ args:
+ - kubectl apply -f /tmp/ -n {{workflow.parameters.adminModeNamespace}}
+ && sleep 30
+ resources: {}
+ - name: cleanup-chaos-resources
+ inputs: {}
+ outputs: {}
+ metadata: {}
+ container:
+ name: ""
+ image: litmuschaos/k8s:2.11.0
+ command:
+ - sh
+ - -c
+ args:
+ - kubectl delete chaosengine -l workflow_run_id={{workflow.uid}} -n
+ {{workflow.parameters.adminModeNamespace}}
+ resources: {}
+ - name: pod-delete-zkg
+ inputs:
+ artifacts:
+ - name: pod-delete-zkg
+ path: /tmp/chaosengine-pod-delete-zkg.yaml
+ raw:
+ data: >
+ apiVersion: litmuschaos.io/v1alpha1
+
+ kind: ChaosEngine
+
+ metadata:
+ namespace: "{{workflow.parameters.adminModeNamespace}}"
+ labels:
+ workflow_run_id: "{{ workflow.uid }}"
+ workflow_name: recommendation-service-pod-delete
+ annotations:
+ probeRef: '[{"name":"recommendation-service-pod-delete-probe","mode":"EOT"}]'
+ generateName: pod-delete-zkg
+ spec:
+ appinfo:
+ appns: otel-demo
+ applabel: app.kubernetes.io/component=recommendationservice
+ appkind: deployment
+ engineState: active
+ chaosServiceAccount: litmus-admin
+ experiments:
+ - name: pod-delete
+ spec:
+ components:
+ env:
+ - name: TOTAL_CHAOS_DURATION
+ value: "120"
+ - name: RAMP_TIME
+ value: ""
+ - name: FORCE
+ value: "true"
+ - name: CHAOS_INTERVAL
+ value: "5"
+ - name: PODS_AFFECTED_PERC
+ value: ""
+ - name: TARGET_CONTAINER
+ value: ""
+ - name: TARGET_PODS
+ value: ""
+ - name: DEFAULT_HEALTH_CHECK
+ value: "false"
+ - name: NODE_LABEL
+ value: ""
+ - name: SEQUENCE
+ value: parallel
+ outputs: {}
+ metadata:
+ labels:
+ weight: "10"
+ container:
+ name: ""
+ image: docker.io/litmuschaos/litmus-checker:2.11.0
+ args:
+ - -file=/tmp/chaosengine-pod-delete-zkg.yaml
+ - -saveName=/tmp/engine-name
+ resources: {}
+ entrypoint: recommendationservice-pod-delete
+ arguments:
+ parameters:
+ - name: adminModeNamespace
+ value: litmus
+ serviceAccountName: argo-chaos
+ podGC:
+ strategy: OnWorkflowCompletion
+ securityContext:
+ runAsUser: 1000
+ runAsNonRoot: true
+status:
+ startedAt: null
+ finishedAt: null
diff --git a/monitoring/tutorials/otel-demo/screenshots/cartservice_spanmetrics.png b/monitoring/tutorials/otel-demo/screenshots/cartservice_spanmetrics.png
new file mode 100644
index 0000000000000000000000000000000000000000..5e1e2b97f9ffe6139cc352fa3f42b532990bbab7
GIT binary patch
literal 187696
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