You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
348 lines
11 KiB
348 lines
11 KiB
syntax = "proto3"; |
|
|
|
import "google/api/annotations.proto"; |
|
import "github.com/gogo/protobuf/gogoproto/gogo.proto"; |
|
|
|
package dapper.query.v1; |
|
|
|
option go_package = "v1"; |
|
|
|
message ListServiceNameReq {} |
|
|
|
message ListServiceNameReply { |
|
repeated string service_names = 1; |
|
} |
|
|
|
message ListOperationNameReq { |
|
string service_name = 1 [(gogoproto.moretags) = "form:\"service_name\" validate:\"required\""]; |
|
} |
|
|
|
message ListOperationNameReply { |
|
repeated string operation_names = 1; |
|
} |
|
|
|
message ListSpanReq { |
|
string service_name = 1 [(gogoproto.moretags) = "form:\"service_name\" validate:\"required\""]; |
|
string operation_name = 2 [(gogoproto.moretags) = "form:\"operation_name\" validate:\"required\""]; |
|
int64 start = 3 [(gogoproto.moretags) = "form:\"start\""]; |
|
int64 end = 4 [(gogoproto.moretags) = "form:\"end\""]; |
|
// 目前支持的 order |
|
// time:desc time:asc 按时间排序 |
|
// duration:desc duration:asc 按耗时排序 |
|
string order = 5 [(gogoproto.moretags) = "form:\"order\""]; |
|
// 只显示 error 的 span |
|
bool only_error = 6 [(gogoproto.moretags) = "form:\"only_error\""]; |
|
int32 offset = 7 [(gogoproto.moretags) = "form:\"offset\""]; |
|
int32 limit = 8 [(gogoproto.moretags) = "form:\"limit\""]; |
|
} |
|
|
|
message SpanListItem { |
|
string trace_id = 1; |
|
string span_id = 2; |
|
string parent_id = 3; |
|
string service_name = 4; |
|
string operation_name = 5; |
|
string start_time = 6; // span 开始时间 |
|
string duration = 7; // span 耗时 |
|
map<string, TagValue> tags = 12; |
|
// Deprecated: use tags |
|
bool is_error = 8; // 是否发生错误 |
|
string container_ip = 9; |
|
string region_zone = 10; |
|
string mark = 11; |
|
} |
|
|
|
message TraceReq { |
|
string trace_id = 1 [(gogoproto.moretags) = "form:\"trace_id\" validate:\"required\""]; |
|
string span_id = 2 [(gogoproto.moretags) = "form:\"span_id\""]; |
|
} |
|
|
|
message RawTraceReq { |
|
string trace_id = 1 [(gogoproto.moretags) = "form:\"trace_id\" validate:\"required\""]; |
|
}; |
|
|
|
message RawTraceReply { |
|
repeated Span items = 1; |
|
} |
|
|
|
message TagValue { |
|
oneof value { |
|
string string_value = 2; |
|
int64 int64_value = 3; |
|
bool bool_value = 4; |
|
float float_value = 5; |
|
} |
|
} |
|
|
|
message Field { |
|
string key = 1; |
|
string value = 2; |
|
} |
|
|
|
message Log { |
|
int64 timestamp = 1; |
|
repeated Field fields = 2; |
|
} |
|
|
|
message Span { |
|
string service_name = 1; |
|
string operation_name = 2; |
|
string trace_id = 3; |
|
string span_id = 4; |
|
string parent_id = 5; |
|
int64 start_time = 6; |
|
int64 duration = 7; |
|
map<string, TagValue> tags = 8; |
|
repeated Log logs = 9; |
|
int32 level = 10; |
|
repeated Span childs = 11; |
|
} |
|
|
|
message TraceReply { |
|
int32 service_count = 1; |
|
int32 span_count = 2; |
|
int32 max_level = 3; |
|
Span root = 4; |
|
} |
|
|
|
|
|
message ListSpanReply { |
|
repeated SpanListItem items = 2; |
|
} |
|
|
|
message OperationNameRankReq { |
|
string service_name = 1 [(gogoproto.moretags) = "form:\"service_name\" validate:\"required\""]; |
|
int64 start = 2 [(gogoproto.moretags) = "form:\"start\""]; |
|
int64 end = 3 [(gogoproto.moretags) = "form:\"end\""]; |
|
// 排序类型 max_duration 最大耗时, min_duration 最小耗时, avg_duration 平均耗时, errors 错误数 |
|
string rank_type = 4 [(gogoproto.moretags) = "form:\"rank_type\""]; |
|
} |
|
|
|
message RankItem { |
|
string service_name = 1; |
|
string operation_name = 2; |
|
// 当 rank type 是 max_duration, min_duration, avg_duration 时 value 是纳秒 |
|
// 当 rank type 是 errors 是 value 是错误数 |
|
double value = 3; |
|
} |
|
|
|
message OperationNameRankReply { |
|
string rank_type = 1; |
|
repeated RankItem items = 2; |
|
} |
|
|
|
message DependsRankReq { |
|
string service_name = 1 [(gogoproto.moretags) = "form:\"service_name\" validate:\"required\""]; |
|
int64 start = 3 [(gogoproto.moretags) = "form:\"start\""]; |
|
int64 end = 4 [(gogoproto.moretags) = "form:\"end\""]; |
|
// 排序类型 max_duration 最大耗时, min_duration 最小耗时, avg_duration 平均耗时, errors 错误数 |
|
string rank_type = 5 [(gogoproto.moretags) = "form:\"rank_type\""]; |
|
} |
|
|
|
message DependsRankReply { |
|
string rank_type = 1; |
|
repeated RankItem items = 2; |
|
} |
|
|
|
message SpanSeriesReq { |
|
string service_name = 1 [(gogoproto.moretags) = "form:\"service_name\" validate:\"required\""]; |
|
string operation_name = 2 [(gogoproto.moretags) = "form:\"operation_name\" validate:\"required\""]; |
|
int64 start = 3 [(gogoproto.moretags) = "form:\"start\""]; |
|
int64 end = 4 [(gogoproto.moretags) = "form:\"end\""]; |
|
// 可选的 fields 有 max_duration, min_duration, avg_duration, errors |
|
// 其中除 errors 返回的是一段时间内的总数 其他返回的都是平均数 |
|
// fields 是个数组可以通过 fields=max_duration,min_duration,avg_duration 逗号分隔 |
|
string fields = 6 [(gogoproto.moretags) = "form:\"fields\""]; |
|
} |
|
|
|
message SeriesItem { |
|
// 名称一般是请求的 field+{count|mean} |
|
string field = 1; |
|
repeated int64 values = 2 [(gogoproto.customtype) = "*int64"]; |
|
} |
|
|
|
message SpanSeriesReply { |
|
// 返回点的间隔 |
|
int64 interval = 5; |
|
repeated string times = 1; |
|
repeated SeriesItem items = 2; |
|
} |
|
|
|
message CltStatusReq {} |
|
|
|
message Client { |
|
string addr = 1; |
|
int64 err_count = 2; |
|
int64 rate = 3; |
|
int64 up_time = 4; |
|
} |
|
|
|
message CltNode { |
|
string node = 1; |
|
int64 queue_len = 2; |
|
repeated Client clients = 3; |
|
} |
|
|
|
message CltStatusReply { |
|
repeated CltNode nodes = 1; |
|
} |
|
|
|
message SamplePointReq { |
|
string service_name = 1 [(gogoproto.moretags) = "form:\"service_name\" validate:\"required\""]; |
|
string operation_name = 2 [(gogoproto.moretags) = "form:\"operation_name\" validate:\"required\""]; |
|
// only_error 在 errors 那个图可以指定为 true |
|
bool only_error = 3 [(gogoproto.moretags) = "form:\"only_error\""]; |
|
// interval 使用 span-series 返回的 interval 即可 |
|
int64 interval = 5 [(gogoproto.moretags) = "form:\"interval\" validate:\"required\""]; |
|
// time 使用 time-series 返回的时间即可,相同格式型如 2006-01-02T15:04:05 |
|
string time = 6 [(gogoproto.moretags) = "form:\"time\" validate:\"required\""]; |
|
} |
|
|
|
message SamplePointItem { |
|
string trace_id = 1; |
|
string span_id = 2; |
|
int64 duration = 3; |
|
bool is_error = 4; |
|
} |
|
|
|
message SamplePointReply { |
|
repeated SamplePointItem items = 1; |
|
} |
|
|
|
message DependsTopologyReq {} |
|
|
|
message DependsTopologyItem { |
|
string service_name = 1; |
|
string depend_on = 2; |
|
} |
|
|
|
message DependsTopologyReply { |
|
repeated DependsTopologyItem items = 1; |
|
} |
|
|
|
message OpsLogReq { |
|
string trace_id = 1 [(gogoproto.moretags) = "form:\"trace_id\" validate:\"required\""]; |
|
string span_id = 2 [(gogoproto.moretags) = "form:\"span_id\""]; |
|
string trace_field = 3 [(gogoproto.moretags) = "form:\"trace_field\""]; |
|
string service_name = 4 [(gogoproto.moretags) = "form:\"service_name\""]; |
|
string operation_name = 5 [(gogoproto.moretags) = "form:\"operation_name\""]; |
|
// 开始时间 |
|
int64 start = 6 [(gogoproto.moretags) = "form:\"start\""]; |
|
// 结束时间 |
|
int64 end = 7[(gogoproto.moretags) = "form:\"end\""]; |
|
} |
|
|
|
message OpsLogRecord { |
|
string time = 1; |
|
map<string, TagValue> fields = 2; |
|
string level = 3; |
|
string message = 4; |
|
} |
|
|
|
message OpsLogReply { |
|
repeated OpsLogRecord records = 1; |
|
} |
|
|
|
message ServiceDependReq { |
|
// service_name 不解释! |
|
string service_name = 1 [(gogoproto.moretags) = "form:\"service_name\" validate:\"required\""]; |
|
// operation_name 当 operation_name 为空时查询所有 operation_name 然后 merge 结果 |
|
string operation_name = 2 [(gogoproto.moretags) = "form:\"operation_name\""]; |
|
} |
|
|
|
message ServiceDependReply { |
|
repeated ServiceDependItem items = 1; |
|
} |
|
|
|
message ServiceDependItem { |
|
// service_name 依赖服务名称, service 为 AppID 其他为组件名 mysql, redis, http 等 |
|
string service_name = 1; |
|
// component, 通讯组件 e.g. net/http, goRPC, gRPC |
|
string component = 2; |
|
// operation_names 被依赖服务的 operation_names, mysql, redis 等为空 |
|
repeated string operation_names = 3; |
|
} |
|
|
|
// DapperQuery dapper 查询服务 |
|
service DapperQuery { |
|
// ListServiceName 列出所有 service |
|
rpc ListServiceName(ListServiceNameReq) returns (ListServiceNameReply) { |
|
option (google.api.http) = { |
|
get: "/x/internal/dapper/service-names"; |
|
}; |
|
} |
|
// ListOperationName 列出某一 service 下所有 operation_name 仅 span.kind 为 server 的 operation_name |
|
rpc ListOperationName(ListOperationNameReq) returns (ListOperationNameReply) { |
|
option (google.api.http) = { |
|
get: "/x/internal/dapper/operation-names"; |
|
}; |
|
} |
|
// ListSpan 列出一个 service_name 某一 operation_name 所有采样到 Span |
|
rpc ListSpan(ListSpanReq) returns (ListSpanReply) { |
|
option (google.api.http) = { |
|
get: "/x/internal/dapper/list-span"; |
|
}; |
|
} |
|
// Trace 查询一个 Trace |
|
rpc Trace(TraceReq) returns (TraceReply) { |
|
option (google.api.http) = { |
|
get: "/x/internal/dapper/trace"; |
|
}; |
|
} |
|
// RawTrace 原始 Trace 数据 |
|
rpc RawTrace(RawTraceReq) returns (RawTraceReply) { |
|
option (google.api.http) = { |
|
get: "/x/internal/dapper/raw-trace"; |
|
}; |
|
} |
|
// OperationNameRank 查询 OperationName 排名列表 |
|
rpc OperationNameRank(OperationNameRankReq) returns(OperationNameRankReply) { |
|
option (google.api.http) = { |
|
get: "/x/internal/dapper/operation-names-rank"; |
|
}; |
|
} |
|
// DependsRank 查询某一个 service_name:operation_name 下所有依赖组件排名 |
|
rpc DependsRank(DependsRankReq) returns(DependsRankReply) { |
|
option (google.api.http) = { |
|
get: "/x/internal/dapper/depends-rank"; |
|
}; |
|
} |
|
// SpanSeries 获取 span 的时间序列数据 |
|
rpc SpanSeries(SpanSeriesReq) returns (SpanSeriesReply) { |
|
option (google.api.http) = { |
|
get: "/x/internal/dapper/span-series"; |
|
}; |
|
} |
|
// SamplePoint 获取采样点数据 |
|
rpc SamplePoint(SamplePointReq) returns(SamplePointReply) { |
|
option (google.api.http) = { |
|
get: "/x/internal/dapper/sample-point"; |
|
}; |
|
} |
|
// CltStatus 获取 collector 信息 |
|
rpc CltStatus(CltStatusReq) returns(CltStatusReply) { |
|
option (google.api.http) = { |
|
get: "/x/internal/dapper/clt-status"; |
|
}; |
|
} |
|
// DependsTopology 获取依赖拓扑图 |
|
rpc DependsTopology(DependsTopologyReq) returns (DependsTopologyReply) { |
|
option (google.api.http) = { |
|
get: "/x/internal/dapper/depends-topology"; |
|
}; |
|
} |
|
// OpsLog 获取 通过 trace-id 获取 opslog 记录 |
|
// 如果请求的 trace-id 没有被记录到, 则需要提供 service_name operation_name 和 timestamp 进行模糊查询 |
|
rpc OpsLog(OpsLogReq) returns (OpsLogReply) { |
|
option (google.api.http) = { |
|
get: "/x/internal/dapper/ops-log"; |
|
}; |
|
} |
|
// ServiceDepend 查询服务的直接依赖 |
|
// TODO: 通过最近收集的到3 个 span 实时计算的,在当前查询的服务出现不正常的时候,查询结果可能不准确 |
|
rpc ServiceDepend(ServiceDependReq) returns (ServiceDependReply) { |
|
option (google.api.http) = { |
|
get: "/x/internal/dapper/service-depend"; |
|
}; |
|
} |
|
}
|
|
|