mirror of
https://github.com/alibaba/arthas.git
synced 2024-04-21 10:21:39 +00:00
339 lines
8.5 KiB
Markdown
339 lines
8.5 KiB
Markdown
|
||
Users create and manage Arthas sessions, which are suitable for complex
|
||
interactive processes. The access process is as follows:
|
||
|
||
* Create a session
|
||
* Join the session (optional)
|
||
* Pull command results
|
||
* Execute a series of commands
|
||
* Interrupt command execution
|
||
* Close the session
|
||
|
||
#### Create session
|
||
|
||
Create session and save output into bash environment.
|
||
|
||
`session_data=$(curl -Ss -XPOST http://localhost:8563/api -d '
|
||
{
|
||
"action":"init_session"
|
||
}
|
||
')
|
||
echo $session_data | json_pp`{{execute T3}}
|
||
|
||
Note: The `json_pp` tool formats the output content as pretty json.
|
||
|
||
Response result:
|
||
|
||
```json
|
||
{
|
||
"sessionId" : "b09f1353-202c-407b-af24-701b744f971e",
|
||
"consumerId" : "5ae4e5fbab8b4e529ac404f260d4e2d1_1",
|
||
"state" : "SUCCEEDED"
|
||
}
|
||
```
|
||
|
||
extract session ID and consumer ID.
|
||
|
||
The new session ID is:
|
||
|
||
`session_id=$(echo $session_data | sed 's/.*"sessionId":"\([^"]*\)".*/\1/g')
|
||
echo $session_id`{{execute T3}}
|
||
|
||
`b09f1353-202c-407b-af24-701b744f971e`;
|
||
|
||
Please take a note of your session ID here, it will be entered in Terminal 4 in the following steps.
|
||
|
||
consumer ID is:
|
||
|
||
`consumer_id=$(echo $session_data | sed 's/.*"consumerId":"\([^"]*\)".*/\1/g')
|
||
echo $consumer_id`{{execute T3}}
|
||
|
||
`5ae4e5fbab8b4e529ac404f260d4e2d1_1`.
|
||
|
||
Please take a note of your consumer ID here, it will be entered in Terminal 4 in the following steps.
|
||
|
||
#### Join session
|
||
|
||
Specify the session ID to join, and the server will assign a new
|
||
consumer ID. Multiple consumers can receive the same command results of
|
||
target session. This interface is used to support multiple people
|
||
sharing the same session or refreshing the page to retrieve the session
|
||
history.
|
||
|
||
Join session and save output into bash environment.
|
||
|
||
`session_data=$(curl -Ss -XPOST http://localhost:8563/api -d '
|
||
{
|
||
"action":"join_session",
|
||
"sessionId" : "'"$session_id"'"
|
||
}
|
||
')
|
||
echo $session_data | json_pp`{{execute T3}}
|
||
|
||
Response result:
|
||
|
||
```json
|
||
{
|
||
"consumerId" : "8f7f6ad7bc2d4cb5aa57a530927a95cc_2",
|
||
"sessionId" : "b09f1353-202c-407b-af24-701b744f971e",
|
||
"state" : "SUCCEEDED"
|
||
}
|
||
```
|
||
|
||
extract new consumer ID.
|
||
|
||
The new consumer ID is
|
||
|
||
`consumer_id=$(echo $session_data | sed 's/.*"consumerId":"\([^"]*\)".*/\1/g')
|
||
echo $consumer_id`{{execute T3}}
|
||
|
||
`8f7f6ad7bc2d4cb5aa57a530927a95cc_2 ` .
|
||
|
||
#### Pull command results
|
||
|
||
The action of pulling the command result message is `pull_results`.
|
||
Please use the Http long-polling method to periodically pull the result
|
||
messages. The consumer's timeout period is 5 minutes. After the timeout,
|
||
you need to call `join_session` to allocate a new consumer.
|
||
|
||
Each consumer is allocated a cache queue separately, and the pull order
|
||
does not affect the content received by the consumer.
|
||
|
||
|
||
The request parameters require session ID and consumer ID:
|
||
|
||
`curl -Ss -XPOST http://localhost:8563/api -d '
|
||
{
|
||
"action":"pull_results",
|
||
"sessionId" : "'"$session_id"'",
|
||
"consumerId" : "'"$consumer_id"'"
|
||
}
|
||
' | json_pp`{{execute T3}}
|
||
|
||
Use Bash scripts to regularly pull results messages:
|
||
|
||
Please enter the sessionID from your Terminal 3 in Terminal 4, an example is here:
|
||
|
||
`b09f1353-202c-407b-af24-701b744f971e`
|
||
|
||
`echo -n "Enter your sessionId in T3:"
|
||
read session_id`{{execute T4}}
|
||
|
||
Also, Please enter the consumerID, an example is here:
|
||
|
||
`8f7f6ad7bc2d4cb5aa57a530927a95cc_2`
|
||
|
||
`echo -n "Enter your consumerId in T3:"
|
||
read consumer_id`{{execute T4}}
|
||
|
||
`while true; do curl -Ss -XPOST http://localhost:8563/api -d '
|
||
{
|
||
"action":"pull_results",
|
||
"sessionId" : "'"$session_id"'",
|
||
"consumerId" : "'"$consumer_id"'"
|
||
}
|
||
' | json_pp; sleep 2; done`{{execute T4}}
|
||
|
||
The response content is as follows:
|
||
|
||
```json
|
||
{
|
||
"body" : {
|
||
"results" : [
|
||
{
|
||
"inputStatus" : "DISABLED",
|
||
"jobId" : 0,
|
||
"type" : "input_status"
|
||
},
|
||
{
|
||
"type" : "message",
|
||
"jobId" : 0,
|
||
"message" : "Welcome to arthas!"
|
||
},
|
||
{
|
||
"tutorials" : "https://arthas.aliyun.com/doc/arthas-tutorials.html",
|
||
"time" : "2020-08-06 15:56:43",
|
||
"type" : "welcome",
|
||
"jobId" : 0,
|
||
"pid" : "7909",
|
||
"wiki" : "https://arthas.aliyun.com/doc",
|
||
"version" : "3.3.7"
|
||
},
|
||
{
|
||
"inputStatus" : "ALLOW_INPUT",
|
||
"type" : "input_status",
|
||
"jobId" : 0
|
||
}
|
||
]
|
||
},
|
||
"sessionId" : "b09f1353-202c-407b-af24-701b744f971e",
|
||
"consumerId" : "8f7f6ad7bc2d4cb5aa57a530927a95cc_2",
|
||
"state" : "SUCCEEDED"
|
||
}
|
||
|
||
```
|
||
|
||
|
||
#### Execute commands asynchronously
|
||
|
||
`curl -Ss -XPOST http://localhost:8563/api -d '''
|
||
{
|
||
"action":"async_exec",
|
||
"command":"watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" ",
|
||
"sessionId" : "'"$session_id"'"
|
||
}
|
||
''' | json_pp`{{execute T3}}
|
||
|
||
Response of `async_exec`:
|
||
|
||
```json
|
||
{
|
||
"sessionId" : "2b085b5d-883b-4914-ab35-b2c5c1d5aa2a",
|
||
"state" : "SCHEDULED",
|
||
"body" : {
|
||
"jobStatus" : "READY",
|
||
"jobId" : 3,
|
||
"command" : "watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" "
|
||
}
|
||
}
|
||
```
|
||
|
||
* `state` : The status of `SCHEDULED` means that the command has been
|
||
parsed and generated the job, but the execution has not started.
|
||
* `body.jobId` : The job id of command execution, filter the command
|
||
results output in `pull_results` according to this job ID.
|
||
* `body.jobStatus` : The job status `READY` means that execution has not started.
|
||
|
||
Switch to the shell output of the script that continuously pulls the result message (Terminal 4):
|
||
|
||
```json
|
||
{
|
||
"body" : {
|
||
"results" : [
|
||
{
|
||
"type" : "command",
|
||
"jobId" : 3,
|
||
"state" : "SCHEDULED",
|
||
"command" : "watch demo.MathGame primeFactors \"{params, returnObj, throwExp}\" "
|
||
},
|
||
{
|
||
"inputStatus" : "ALLOW_INTERRUPT",
|
||
"jobId" : 0,
|
||
"type" : "input_status"
|
||
},
|
||
{
|
||
"success" : true,
|
||
"jobId" : 3,
|
||
"effect" : {
|
||
"listenerId" : 3,
|
||
"cost" : 24,
|
||
"classCount" : 1,
|
||
"methodCount" : 1
|
||
},
|
||
"type" : "enhancer"
|
||
},
|
||
{
|
||
"sizeLimit" : 10485760,
|
||
"expand" : 1,
|
||
"jobId" : 3,
|
||
"type" : "watch",
|
||
"cost" : 0.071499,
|
||
"ts" : 1596703453237,
|
||
"value" : [
|
||
[
|
||
-170365
|
||
],
|
||
null,
|
||
{
|
||
"stackTrace" : [
|
||
{
|
||
"className" : "demo.MathGame",
|
||
"classLoaderName" : "app",
|
||
"methodName" : "primeFactors",
|
||
"nativeMethod" : false,
|
||
"lineNumber" : 46,
|
||
"fileName" : "MathGame.java"
|
||
},
|
||
...
|
||
],
|
||
"localizedMessage" : "number is: -170365, need >= 2",
|
||
"@type" : "java.lang.IllegalArgumentException",
|
||
"message" : "number is: -170365, need >= 2"
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"type" : "watch",
|
||
"cost" : 0.033375,
|
||
"jobId" : 3,
|
||
"ts" : 1596703454241,
|
||
"value" : [
|
||
[
|
||
1
|
||
],
|
||
[
|
||
2,
|
||
2,
|
||
2,
|
||
2,
|
||
13,
|
||
491
|
||
],
|
||
null
|
||
],
|
||
"sizeLimit" : 10485760,
|
||
"expand" : 1
|
||
}
|
||
]
|
||
},
|
||
"consumerId" : "8ecb9cb7c7804d5d92e258b23d5245cc_1",
|
||
"sessionId" : "2b085b5d-883b-4914-ab35-b2c5c1d5aa2a",
|
||
"state" : "SUCCEEDED"
|
||
}
|
||
```
|
||
|
||
|
||
The `value` of the watch command result is the value of watch-experss,
|
||
and the above command is `{params, returnObj, throwExp}`, so the value
|
||
of the watch result is an array of length 3, and each element
|
||
corresponds to the expression in the corresponding order.
|
||
|
||
Please refer to the section "Make watch command output a map object".
|
||
|
||
#### Interrupt command execution
|
||
|
||
Interrupt the running foreground job of the session:
|
||
|
||
`curl -Ss -XPOST http://localhost:8563/api -d '''
|
||
{
|
||
"action":"interrupt_job",
|
||
"sessionId" : "'"$session_id"'"
|
||
}
|
||
''' | json_pp`{{execute T3}}
|
||
|
||
```json
|
||
{
|
||
"state" : "SUCCEEDED",
|
||
"body" : {
|
||
"jobStatus" : "TERMINATED",
|
||
"jobId" : 3
|
||
}
|
||
}
|
||
```
|
||
|
||
#### Close session
|
||
|
||
Specify the session ID to close the session.
|
||
|
||
`curl -Ss -XPOST http://localhost:8563/api -d '''
|
||
{
|
||
"action":"close_session",
|
||
"sessionId" : "'"$session_id"'"
|
||
}
|
||
''' | json_pp`{{execute T3}}
|
||
|
||
```json
|
||
{
|
||
"state" : "SUCCEEDED"
|
||
}
|
||
``` |