Simulate HTTP faults
This document describes how to simulate HTTP faults by creating HTTPChaos experiments in Chaos Mesh.
HTTPChaos introduction
HTTPChaos is a fault type provided by Chaos Mesh. By creating HTTPChaos experiments, you can simulate the fault scenarios of the HTTP server during the HTTP request and response processing. Currently, HTTPChaos supports simulating the following fault types:
- abort: interrupts server connection
- delay: injects latency into the target process
- replace: replaces part of content in HTTP request or response messages
- patch: adds additional content to HTTP request or response messages
HTTPChaos supports combinations of different fault types. If you have configured multiple HTTP fault types at the same time when creating HTTPChaos experiments, the order set to inject the faults when the experiments start running is abort -> delay -> replace -> patch. When the abort fault cause short circuits, the connection will be directly interrupted.
For the detailed description of HTTPChaos configuration, see Field description below.
Notes
Before injecting the faults supported by HTTPChaos, note the followings:
- There is no control manager of Chaos Mesh running on the target Pod.
- HTTPS accesses should be disabled, because injecting HTTPS connections is not supported currently.
- For HTTPChaos injection to take effect, the client should avoid reusing TCP socket. This is because HTTPChaos does not affect the HTTP requests that are sent via TCP socket before the fault injection.
- Use non-idempotent requests (such as most of the POST requests) with caution in production environments. If such requests are used, the target service may not return to normal status by repeating requests after the fault injection.
Create experiments using Chaos Dashboard
- Open Chaos Dashboard, and click NEW EXPERIMENT on the page to create a new experiment:  
- In the Choose a Target area, choose HTTP FAULT and select a specific behavior, such as - RESPONSE ABORT. Then fill out specific configurations. 
- Submit the experiment. - In the example above, you have configured injecting the "Response abort" fault into all requests of Port 80. 
Create experiments using YAML files
Chaos Mesh also supports using YAML configuration files to create HTTPChaos experiments. In a YAML file, you can simulate either one HTTP fault type or a combination of different HTTP fault types.
Example of abort
- Write the experimental configuration to the - http-abort-failure.yamlfile as the example below:- apiVersion: chaos-mesh.org/v1alpha1
 kind: HTTPChaos
 metadata:
 name: test-http-chaos
 spec:
 mode: all
 selector:
 labelSelectors:
 app: nginx
 target: Request
 port: 80
 method: GET
 path: /api
 abort: true
 duration: 5m- Based on this configuration example, Chaos Mesh will inject the - abortfault into the specified pod for 5 minutes. During the fault injection, the GET requests sent through port 80 in the- /apipath of the target Pod will be interrupted.
- After the configuration file is prepared, use - kubectlto create the experiment:- kubectl apply -f ./http-abort-failure.yaml
Example of fault combinations
- Write the experimental configuration to - http-failure.yamlfile as the example below:- apiVersion: chaos-mesh.org/v1alpha1
 kind: HTTPChaos
 metadata:
 name: test-http-chaos
 spec:
 mode: all
 selector:
 labelSelectors:
 app: nginx
 target: Request
 port: 80
 method: GET
 path: /api/*
 delay: 10s
 replace:
 path: /api/v2/
 method: DELETE
 patch:
 headers:
 - ['Token', '<one token>']
 - ['Token', '<another token>']
 body:
 type: JSON
 value: '{"foo": "bar"}'
 duration: 5m- Based on this configuration example, Chaos Mesh will inject the - delayfault,- replacefault, and- patchfault consecutively.
- After the configuration file is prepared, use - kubectlto create the experiment:- kubectl apply -f ./http-failure.yaml
Field description
Description for common fields
Common fields are meaningful when the target of fault injection is Request or Response.
| Parameter | Type | Description | Default value | Required | Example | 
|---|---|---|---|---|---|
| mode | string | Specifies the mode of the experiment. The mode options include one(selecting a random pod),all(selecting all eligible pods),fixed(selecting a specified number of eligible pods),fixed-percent(selecting a specified percentage of Pods from the eligible pods), andrandom-max-percent(selecting the maximum percentage of Pods from the eligible pods). | yes | one | |
| value | string | Provides parameters for the modeconfiguration depending on the value ofmode. | no | 1 | |
| target | string | Specifies whether the target of fault injuection is RequestorResponse. Thetarget-related fields should be configured at the same time. | yes | Request | |
| port | int32 | The TCP port that the target service listens on. | yes | 80 | |
| path | string | The URI path of the target request. Supports Matching wildcards. | Takes effect on all paths by default. | no | /api/* | 
| method | string | The HTTP method of the target request method. | Takes effect for all methods by default. | no | GET | 
| request_headers | map[string]string | Matches request headers to the target service. | Takes effect for all requests by default. | no | Content-Type: application/json | 
| abort | bool | Indicates whether to inject the fault that interrupts server connection. | false | no | true | 
| delay | string | Specifies the time for a latency fault. | 0 | no | 10s | 
| replace.headers | map[string]string | Specifies the key pair used to replace the request headers or response headers. | no | Content-Type: application/xml | |
| replace.body | []byte | Specifies request body or response body to replace the fault (Base64 encoded). | no | eyJmb28iOiAiYmFyIn0K | |
| patch.headers | [][]string | Specifies the attached key pair of the request headers or response headers with patch faults. | no | - [Set-Cookie, one cookie] | |
| patch.body.type | string | Specifies the type of patch faults of the request body or response body. Currently, it only supports JSON. | no | JSON | |
| patch.body.value | string | Specifies the fault of the request body or response body with patch faults. | no | "{"foo": "bar"}" | |
| duration | string | Specifies the duration of a specific experiment. | yes | 30s | |
| scheduler | string | Specifies the scheduling rules for the time of a specific experiment. | no | 5 * * * * | 
Description for target-related fields
Request-related fields
The Request field is a meaningful when the target set to Request during the fault injection.
| Parameter | Type | Description | Default value | Required | Example | 
|---|---|---|---|---|---|
| replace.path | string | Specifies the URI path used to replace content. | no | /api/v2/ | |
| replace.method | string | Specifies the replaced content of the HTTP request method. | no | DELETE | |
| replace.queries | map[string]string | Specifies the replaced key pair of the URI query. | no | foo: bar | |
| patch.queries | [][]string | Specifies the attached key pair of the URI query with patch faults. | no | - [foo, bar] | 
Respond-related fields
The Response is a meaningful when the target set to Response during the fault injection.
| Parameter | Type | Description | Default value | Required | Example | 
|---|---|---|---|---|---|
| code | int32 | Specifies the status code responded by target. | Takes effect for all status codes by default. | no | 200 | 
| response_heads | map[string]string | Matches request headers to target. | Takes effect for all responses by default. | no | Content-Type: application/json | 
| replace.code | int32 | Specifies the replaced content of the response status code. | no | 404 | 
Local debugging
If you are not sure of the effects of certain fault injections, you can also test the corresponding features locally using rs-tproxy. Chaos Mesh also provides HTTPChaos by using rs-tproxy.