备忘: java使用graphql client,通过SkyWalking GraphQL数据接口查询Trace信息(复杂查询)

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

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

bash 复制代码
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定义,包括

bash 复制代码
public enum STEP {
        SECOND, MINUTE,HOUR,DAY,MONTH
    }

    public enum TraceState {
        ALL,ERROR,SUCCESS
    }

    public enum QueryOrder {
        BY_DURATION,BY_START_TIME
    }

具体代码如下:

bash 复制代码
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},

...

}

相关推荐
魔道不误砍柴功1 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2341 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨1 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
测开小菜鸟3 小时前
使用python向钉钉群聊发送消息
java·python·钉钉
P.H. Infinity4 小时前
【RabbitMQ】04-发送者可靠性
java·rabbitmq·java-rabbitmq
生命几十年3万天4 小时前
java的threadlocal为何内存泄漏
java
caridle4 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
^velpro^4 小时前
数据库连接池的创建
java·开发语言·数据库
苹果醋34 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
秋の花4 小时前
【JAVA基础】Java集合基础
java·开发语言·windows