skywalking作为目前市面上最流行的分布式APM系统之一,有着优秀的全链路调用信息采集能力,但是由于skywalking-UI的图表局限性,导致无法系统的展现出单一服务下所有端点的详细调用情况,本文结合skywalking的能力,提供以下思路用于解决上述问题

一、graphQL的使用

graphQL是一种用于API的查询语言,对你的API中的数据提供了一套易于理解的完整描述,使得客户端能够准确地获得它需要的数据,减少数据的冗余。

  • 与 RESTful 不同,每一个的 GraphQL 服务其实对外只提供了一个用于调用内部接口的endpoint,所有的请求都访问这个暴露出来的唯一端点。
  • GraphQL 实际上将多个 HTTP 请求聚合成了一个请求,它只是将多个 RESTful 请求的资源变成了一个从根资源 ​​Post​​​ 访问其他资源的 ​​school​​​ 和 ​​teacher​​等资源的图,多个请求变成了一个请求的不同字段,从原有的分散式请求变成了集中式的请求。

1.graphQL端点

​http://{SKYWALKING_ADDRESS}/graphql​

2.请求方法

POST

3.请求参数

graphQL查询参数放置于请求体中,使用json格式。例子如下

{
"query":"{查询语句}"
"variables":"{参数和参数值}"
}

4.查询语句和对应参数

1)查询service

{
"query": "query queryServices($duration: Duration!,$keyword: String!) {\n services: getAllServices(duration: $duration, group: $keyword) {\n key: id\n label: name\n group\n }\n }"
"variables": {
"duration": {
"start": "2022-02-08 0534",
"end": "2022-02-08 0549",
"step": "MINUTE"},
"keyword": ""
}
}

2)查询instance

{
"query":"query queryServiceInstance($duration: Duration!, $serviceId: ID!)\n{\n instanceId: getServiceInstances(duration: $duration, serviceId: $serviceId) {\n key: id\n label: name\n }}",
"variables":{
"duration":{
"start":"2022-02-08 0534",
"end":"2022-02-08 0549",
"step":"MINUTE"},
"serviceId":"ZGF0YS1jb2xsZWN0aW9uLXNpbms=.1"}
}

3)查询追踪列表

{
"query":"query queryTraces($condition: TraceQueryCondition) {\n data: queryBasicTraces(condition: $condition) {\n traces {\n key: segmentId\n endpointNames\n duration\n start\n isError\n traceIds\n }\n total\n }}",
"variables":{
"condition":{
"queryDuration":{
"start":"2022-02-08 0534",
"end":"2022-02-08 0549",
"step":"MINUTE"},
"traceState":"ALL",
"paging":{
"pageNum":1,
"pageSize":15,
"needTotal":true},
"queryOrder":"BY_START_TIME",
"serviceId":"aGJvcy1kdGM=.1"
}
}
}

4)查询追踪详情

{
"query":"query queryTrace($traceId: ID!) {\n trace: queryTrace(traceId: $traceId) {\n spans {\n traceId\n segmentId\n spanId\n parentSpanId\n refs {\n traceId\n parentSegmentId\n parentSpanId\n type\n }\n serviceCode\n serviceInstanceName\n startTime\n endTime\n endpointName\n type\n peer\n component\n isError\n layer\n tags {\n key\n value\n }\n logs {\n time\n data {\n key\n value\n }\n }\n }\n }\n }",
"variables":{
"traceId":"12dbf0f5f72d40a58f4b27742c149413.264.16520813026010455"
}
}