Simulate JVM Application Faults
- Throw custom exceptions
- Trigger garbage collection
- Increase method latency
- Modify return values of a method
- Trigger faults by setting Byteman configuration files
- Increase JVM pressure
This document describes how to use Chaos Mesh to create the above fault types of JVM experiments.
note
Your Linux kernel must be v4.1 or later.
Open Chaos Dashboard, and click NEW EXPERIMENT on the page to create a new experiment.
In the Choose a Target area, choose JVM FAULT, and select a specific behavior, such as
RETURN
. Then, fill out the detailed configurations.For information about how to fill out the configurations, refer to [Field Description] (#field-description).
Fill out the experiment information, and specify the experiment scope and the scheduled experiment duration.
The following example shows the usage and effects of JVMChaos. The example specifies the return values of a method. The YAML files referred to in the following steps can be found in examples/jvm. The default work directory for the following steps is also examples/jvm
. The default namespace where Chaos Mesh is installed is chaos-mesh
.
Helloworld is a simple Java application. In this section, this application is used as the target application that is to be tested. The target application is defined in example/jvm/app.yaml
as follows:
Create the namespace for the target application:
kubectl create namespace helloworld
Build the application Pod:
kubectl apply -f app.yaml
Execute
kubectl -n helloworld get pods
, and you are expected to find a pod namedhelloworld
in thehelloworld
namespace.kubectl -n helloworld get pods
The result is as follows:
After the
READY
column turns to1/1
, you can proceed to the next step.
Step 2. Observe application behaviors before injecting faults
You can observe the behavior of helloworld
application before injecting faults, for example:
kubectl -n helloworld logs -f helloworld
0. Hello World
1. Hello World
2. Hello World
3. Hello World
4. Hello World
5. Hello World
You can see that helloworld
outputs a line of Hello World
every second, and the number of each line increases in turn.
Step 3. Inject JVMChaos and check
The JVMChaos with a specified return value is as follows:
apiVersion: chaos-mesh.org/v1alpha1
kind: JVMChaos
metadata:
name: return
namespace: helloworld
spec:
action: return
value: '9999'
mode: all
selector:
namespaces:
- helloworld
JVMChaos changes the return value of the
getnum
method to the number9999
, which means that the number of each line in thehelloworld
output is set to9999
.Inject JVMChaos with a specified value:
Check the latest log of
helloworld
:kubectl -n helloworld logs -f helloworld
The log is as follows:
Rule.execute called for return_0:0
return execute
caught ReturnException
9999. Hello World
The meanings of the different action
values are as follows:
Value | Meaning |
---|---|
latency | Increase method latency |
return | Modify return values of a method |
exception | Throw custom exceptions |
stress | Increase CPU usage of Java process, or cause memory overflow (support heap overflow and stack overflow) |
gc | Trigger garbage collection |
Trigger faults by setting Byteman configuration files |
For different action
values, there are different configuration items that can be filled in.
Parameters for return
Parameter | Type | Description | Required | |
---|---|---|---|---|
class | string | The name of the Java class | Yes | |
method | string | The name of the method | Yes | |
value | string | Specifies the return value of the method | string type, required. Currently, the item can be numeric and string types. If the item (return value) is string, double quotes are required, like “chaos”. | Yes |
port | int | The port ID attached to the Java process agent. The faults are injected into the Java process through this ID. | No |
Parameters for exception
Parameter | Type | Description | Required |
---|---|---|---|
cpuCount | int | The number of CPU cores used for increasing CPU stress. You must configure one item between cpu-count and mem-type . | No |
memType | string | The type of OOM. Currently, both ‘stack’ and ‘heap’ OOM types are supported. You must configure one item between cpu-count and mem-type . | No |
port | int | The port ID attached to the Java process agent. The faults are injected into the Java process through this ID. | No |
Parameters for gc
Parameters for ruleData
Parameter | Type | Description | Required |
---|---|---|---|
ruleData | srting | Specifies the Byteman configuration data | Yes |
port | int | The port ID attached to the Java process agent. The faults are injected into the Java process through this ID. | No |
When you write the rule configuration file, take into account the specific Java program and the byteman-rule-language. For example:
RULE modify return value
CLASS Main
METHOD getnum
AT ENTRY
IF true
DO
ENDRULE