disscusshelp wanted
Description
- 目前Arthas的功能都是基于 命令行 的
Command思路实现的,大部分交互都是在 terminal 窗口 - 这种cli的交互导致Arthas 的功能不能很好的以 API 方式暴露,尽管之前实现过一版 HTTP API 的支持,但并不是很友好 https://arthas.aliyun.com/doc/http-api.html
- 基于命令行
Command实现,导致很多功能被限制了,并且实现比较复杂
抛开之前的实现来思考,Arthas本身内部的功能大致可以分为两类:
- 一次性执行,比如
sysenv,jvm等,这种是比较简单的。 - 可交互的长时间执行,比如像 watch/trace
重点是类watch/trace的任务
- 执行中可能修改任务的配置,比如 watch 监听的 结果表达式, 条件表达式 ,可以支持动态更新。这样子用户不需要重新执行一次 watch
- 增强的类可以持续增加,比如像 trace,可以更容易实现 动态trace 功能 https://arthas.aliyun.com/doc/trace.html#%E5%8A%A8%E6%80%81-trace
- 这类任务需要支持 持续接收 输入,也有持续的结果输出。这个和 gRPC 的双向Stream功能很像
- 为了简化实现,和支持 gRPC Web(gRPC Web目前只支持 server stream) ,尽量只考虑 gRPC server stream ,不考虑 client stream ,client stream 可能考虑通过传入 jobId 的方式解决
- 为了更好的适配,在arthas内部不会直接使用 gRPC 的API,而是提供类似
io.grpc.stub.StreamObserver的接口,后面再转接到 gRPC 上
下面是一种sysprop 命令的对应 servcie 的定义
message StringKey {
string key = 1;
}
message StringValue {
string value = 1;
}
message Properties {
map<string, string> properties = 1;
}
service SystemProperty {
rpc get(google.protobuf.Empty) returns (Properties);
rpc getByKey(StringKey) returns (StringValue);
rpc update(Properties) returns (Properties);
}
- watch/trace 这种需要持续交互的命令定义还需要实践尝试。
关联Issue: