java使用graphql client连接Skywalking GraphQL数据接口的简单查询,可以参考 备忘:python和 java graphql client连Sky walking Server查询数据的联通性

现在我们尝试完成复杂查询,通过schema.graphql定义的queryBasicTraces方法查询一段时间trace的信息,方法如下:

query {
    queryBasicTraces(
        condition: {
            serviceId: "Y3XXXXXXXX=.1"
            serviceInstanceId: ""
            endpointId: "Y3XXXXXXXX=.1_YYYYYY=="
            traceState: ALL
            traceId: ""
            queryDuration: {start: "2023-12-24 1140",end: "2023-12-24 1200", step: MINUTE}
            queryOrder: BY_START_TIME
            paging: {
                needTotal: true
                pageNum:1
                pageSize: 1000
            }
        }
    ){
        traces{
            traceIds
            duration
            endpointNames
            start

        }
    }
}

尝试应用java的graphql client的query方法实现,对比简单查询有几个难点
1 查询条件contidition是一个复杂的嵌套结构,不能简单用graphql client所定义的query.addParameter(Key,V)这种方式(addParameter没有嵌套功能),

2 查询条件所设定的值,类型繁多,不能简单都使用字符串

问题1的解法
根据下列材料java后端调用GraphQl接口获取结果

基本思路就是把contidition定义成一个HashMap嵌套结构,然后用addObjectParameter方法关联,因为只有一个参数condition
所以可以用 query.getRequestParameter().addObjectParameter(“condition”,conditions);把query和conditions关联,其中conditions是一个HashMap

问题2 : 涉及类型字符串、数值、布尔,以及枚举类型,其中枚举类型可以参考Sky walking Server schema.graphql定义,包括

public enum STEP {
        SECOND, MINUTE,HOUR,DAY,MONTH
    }

    public enum TraceState {
        ALL,ERROR,SUCCESS
    }

    public enum QueryOrder {
        BY_DURATION,BY_START_TIME
    }

具体代码如下:

public class GraphQLServiceImp {

    public enum STEP {
        SECOND, MINUTE,HOUR,DAY,MONTH
    }

    public enum TraceState {
        ALL,ERROR,SUCCESS
    }

    public enum QueryOrder {
        BY_DURATION,BY_START_TIME
    }

    GraphqlClient graphqlClient;
    ObjectMapper objectMapper = new ObjectMapper();


  
    public void initConnect(String url){
    //初始链接
        try{

            this.graphqlClient = GraphqlClient.buildGraphqlClient(url);

         
            String serviceName="demo3";
            String serviceId=queryServiceId(serviceName);
            System.out.println("serviceId::"+serviceId);

            String endpointName="demo.send";
            String re_epId=queryEndPointId(endpointName,serviceName);
            System.out.println("endpointId::"+re_epId);

        }catch (Exception e){
            e.printStackTrace();
        }

    }



    private JsonNode map2jsNode(Map result){
        JsonNode js_res = objectMapper.convertValue(result, JsonNode.class);
        return js_res;
    }

    public String queryServiceId(String ServiceName){
    //通过SeviceName查ServiceId 非重点,略
       ...
    }

    public String queryEndPointId(String endpointName,String serviceName){
    //通过SeviceName、endpointName查endpointId 非重点,略
       ...

       
    }

    public JsonNode getTotalTracesByEndPoint(String serviceId, String endpointId, String start_time, String end_time) {
        try{
            //生成query
            String queryMethodName = "queryBasicTraces"; // 指定graql的查询接口
            GraphqlQuery query = new DefaultGraphqlQuery(queryMethodName);
            //指定查询条件HasMap
            HashMap conditions=new HashMap();

            conditions.put("serviceId",serviceId);
            conditions.put("serviceInstanceId","");
            conditions.put("endpointId",endpointId);
            conditions.put("traceState",TraceState.ALL);
            conditions.put("traceId","");
            conditions.put("queryOrder",QueryOrder.BY_START_TIME);

            HashMap duration=new HashMap();
            duration.put("start",start_time);
            duration.put("end",end_time);
            duration.put("step",STEP.MINUTE);

            conditions.put("queryDuration",duration);

            HashMap paging=new HashMap();
            paging.put("pageNum",1);
            paging.put("needTotal",true);
            paging.put("pageSize",1000);

            conditions.put("paging",paging);

//关联conditions和query     query.getRequestParameter().addObjectParameter("condition",conditions);

            //指定查询结果
            ResultAttributtes traces = new ResultAttributtes("traces");

            traces.addResultAttributes("traceIds");
            traces.addResultAttributes("duration");
            traces.addResultAttributes("endpointNames");
            traces.addResultAttributes("start");
            query.addResultAttributes(traces);

            System.out.println("query::"+query.toString());


            GraphqlResponse response = this.graphqlClient.doQuery(query);
            System.out.println("res::"+response.toString());
            return map2jsNode(response.getData());
        }catch (Exception e){
            e.printStackTrace();
        }

        return null;
    }

测试代码

```bash
public class GraphQLTest {
    public static void main(String[] args) throws Exception {

        String serverUrl = "http://172.19.196.82:8029/graphql";
        GraphQLServiceImp graphQLService=new GraphQLServiceImp();
        graphQLService.initConnect(serverUrl);

        //GraphqlClient graphqlClient = GraphqlClient.buildGraphqlClient(serverUrl);

        String serviceName = "demo3";
        String endpointName="demo.send";

        String serviceId=graphQLService.queryServiceId(serviceName);
        System.out.println("serviceId::"+serviceId);
        String endpointId=graphQLService.queryEndPointId(endpointName,serviceName);
        System.out.println("endpointId::"+endpointId);

        String startTime="2023-12-24 1154";
        String endTime="2023-12-24 1200";
        JsonNode res_traces=graphQLService.getTotalTracesByEndPoint(serviceId,endpointId,startTime,endTime);

        System.out.println("result::"+res_traces.asText());

       
    }
}

执行结果

res::{data={queryBasicTraces={traces=[{traceIds=[bc83f7aa64364f31938c9f22ead14069.1311.17034873369950169], duration=7, endpointNames=[demo.send], start=1703487336995}, {traceIds=[bc83f7aa64364f31938c9f22ead14069.1311.17034873363060165], duration=7, endpointNames=[demo.send], start=1703487336306},

}

12-30 04:48