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

【SkyWalking】OAP服务的接口整理(链路数据部分) SkyWalking-OAP接口 阅读详情

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},
…
}

Grafana+Skywalking实战:如何用GraphQL查询Trace并生成聚合图表(附完整配置) 本文详细介绍了如何通过Grafana与Skywalking的GraphQL接口构建智能Trace分析系统,实现Trace数据的精准查询和聚合图表生成。文章包含完整的配置步骤、查询优化技巧以及可视化方案,帮助开发者提升分布式系统监控效率,特别适用于需要深度分析Trace数据的业务场景。 阅读详情

相关推荐

SkyWalking指标体系实战解读:CPM、SLA、P99与JVM监控指南

APM(应用性能监控)是现代微服务架构的必备工具,SkyWalking 作为主流开源方案,其指标模型围绕服务、实例、端点三层抽象构建。数据由探针采集,OAP Server 按分钟聚合,形成以 CPM、响应时间、SLA 为核心的业务指标序列。这些指标不仅反映请求流量和成功率,其百分位响应时间(如P99)能精准暴露尾部延迟,SLA结合CPM可避免低流量误报,而JVM GC和内存指标则揭示资源瓶颈。在告警配置和故障排查中,通过从服务到端点再到实例的逐层下钻,可快速定位代码或环境问题。掌握这套指标体系,就能高效利用

weixin_34175509的博客 427

微服务链路追踪SkyWalking第十课 GraphQL详解

第27讲:实战入门 GraphQL,如何将 REST API 换成 GraphQL 从本节开始将深入介绍 query-graphql-plugin 插件,我们会启动 SkyWalking Rocketbot 来查询 Trace 数据和 JVM 监控数据,这些用户查询请求最终都会路由到 query-graphql-plugin 插件中进行处理。 GraphQL 简介 GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时。GraphQL 并没有和任何特定数据库或者存储引

fegus的博客 4241

接口面试全解析:从HTTP协议到高并发设计,构建后端核心能力

在软件工程中,接口作为系统间交互的契约,是实现模块解耦和抽象的关键技术。其核心原理在于定义清晰的通信协议与数据格式,从而隐藏内部实现细节,提升系统的可维护性和可扩展性。从技术价值看,良好的接口设计是保障分布式系统高效协作、确保数据一致性与安全性的基石。在应用场景上,无论是微服务架构中的服务调用,还是面向客户端的Web API,接口都扮演着至关重要的角色。本文聚焦于技术面试中的高频考点,深入剖析HTTP协议细节、RESTful设计精髓、接口安全防线以及高并发场景下的性能优化策略,并结合JWT认证、缓存穿透等热

weixin_34006965的博客 323

Skywalking-10:Skywalking查询协议——GraphQL

GraphQL GraphQL 基础 参照Getting started with GraphQL Java and Spring Boot这篇文章学习即可 PS:可以使用 brew install --cask graphql-playground 安装 graphql for mac 客户端。 IDEA 怎么调试 GraphQL 应用 安装 JS GraphQL 插件 点击JS GraphQL安装插件 GraphQL 定义 schem

Switch的博客 2469

【信息科学与工程学】计算机科学与自动化——第一百九十八篇 高并发高可用的知识点01

以上补充约 110 行,涵盖分布式协调、服务网格细节、数据库高级特性、性能分析工具、混沌工程、安全渗透、合规审计、研发效能、新兴技术、架构模式、实用工具及经典论文。涵盖数据库索引与锁、NoSQL、前端性能、安全攻防、压测工具深入、监控深入、云原生存储、服务治理扩展、代码质量、DevOps 文化、行业标准、软技能及未来趋势。好的,继续补充更多高并发、高可用、高可靠的知识与技术,涵盖更深层的数据库内部机制、分布式事务、服务治理、运维自动化、安全与前沿技术等领域。

weixin_49199313的博客 734

graphql-client:用于Java的graphql客户端

英语 Graphql客户端 该项目是用于Java的graphql客户端,支持自定义查询和变异。 当前版本仅支持发布请求 您需要java1.8和maven。 欢迎来到我的主页: 更新1.2注意 请求的参数支持自定义复杂类型和枚举类型。 使用你的项目 专家 <dependency> <groupId>org.mountcloud</groupId> <artifactId>graphql-client</artifactId> <version>1.2</version> </dependency> 安装项目 mvn install 演示版 做查询 // crate client GraphqlClient client = GraphqlClient . buildGraphqlClient( " http://localhost:8081/grap

SkyWalking 5.x 版本演进全解析:从 5.0.0-alpha 到 5.1.0 的关键能力与架构变迁

SkyWalking 5.x 是 Apache SkyWalking(当时仍以 incubator 名义开发)从原型走向生产可用的关键一代。这一系列版本围绕 Agent 插桩能力、Collector 聚合与存储、GraphQL 查询协议、UI 可视化四大块持续演进,先后引入了 TLS 加密、命名空间隔离、token 鉴权、跨线程追踪工具包、可选插件机制、Zipkin 接收器、拓扑推测、告警、Caf

gitblog_01049的博客 236

【实战指南】WinPE环境下360系统急救箱的病毒查杀全流程解析

本文详细解析了在WinPE环境下使用360系统急救箱进行病毒查杀的全流程。从制作WinPE启动盘到进入PE环境,再到360急救箱的深度使用和系统修复,提供了实用技巧和常见问题解决方案,帮助用户高效清除顽固病毒。

weixin_28568819的博客 537

Apache SkyWalking 5.x 版本演进解析:Agent 插件体系、Collector 平台化与协议变革的关键节点

> 本文以 Apache SkyWalking 官方仓库中的 5.x 版本变更记录([docs/en/changes/changes-5.x.md](https://link.gitcode.com/i/1ca548f45e8eddc788f587a12525ad06))为骨架,逐版本梳理 5.0.0-alpha 至 5.1.0 之间 Agent、Collector、UI 三层的关键演进,并结合当

gitblog_00338的博客 355

OpenCV 开闭运算

开运算和闭运算是将腐蚀和膨胀按照一定的次序进行处理。 但这两者并不是可逆的,即先开后闭并不能得到原来的图像。 开运算 开运算是先腐蚀后膨胀,其作用是:分离物体,消除小区域。特点:消除噪点,去除小的干扰块,而不影响原来的图像。 闭运算 闭运算与开运算相反,是先膨胀后腐蚀,作用是消除/“闭合”物体里面的孔洞,特点:可以填充闭合区域。 cv.morphologyEx(img, op, kernel) img: 要处理的图像 op: 处理方式:若进行开运算,则设为cv.MORPH_OPEN,若进行闭

꧁༺ʚvv༒catɞ༻꧂的博客 949

FPGA以太网开发实战:YT8511 PHY芯片MDIO接口配置全流程(附Verilog代码)

本文详细介绍了FPGA以太网开发中YT8511 PHY芯片MDIO接口的配置全流程,包括MDIO接口技术解析、Verilog状态机设计、核心代码实现细节及实战调试经验。通过提供经过验证的Verilog代码和优化策略,帮助开发者快速掌握以太网PHY芯片配置技术,提升通信系统性能。

weixin_29184371的博客 233

Apache SkyWalking 9.6.0 版本变更全解析:MQE 增强、HTTP URI 识别重构与 Breaking Changes 指南

本文以 Apache SkyWalking 官方 9.6.0 版本变更日志([docs/en/changes/changes-9.6.0.md](https://link.gitcode.com/i/d5526eacfda289ed0f400f018e3d1cc2))为骨架,系统梳理该版本在 Project 构建、OAP Server 核心能力、UI 与文档四个维度的全部关键改动。读者将掌握 9.

gitblog_01124的博客 747

正交试验minitab

1.创建正交试验 2.根据自己的实验选择水平数和因子数,并选定一个正交表 3.得到正交表 4.填写实验结果 5.进行正交分析 点击结果,点击分析 6.得到分析结果 7.方差分析 选择响应变量与因子,点击确定 得到方差分析的结果 ...

a999999123的博客 1万+

无名杀:网页版三国杀开源项目快速上手指南

想在自己电脑上开一个随时能玩的三国杀网页端,又不想装客户端、找授权?打开浏览器、拉起一个本地服务,就是这种需求的答案。[noname](https://link.gitcode.com/i/522f689f74a2fd8f2e49483af20dacba)(无名杀)是开源的网页版三国杀项目:把武将、技能、卡牌、模式与音频组织成纯前端数据,浏览器直接运行,也支持 Docker 部署和联机对战。 #

gitblog_00516的博客 368

CUDA内核反汇编实战:用cuobjdump解锁SASS指令的奥秘

本文详细介绍了CUDA内核与SASS指令的关系,以及使用cuobjdump工具进行反汇编分析的方法。主要内容包括:1. CUDA内核的基本概念及其在GPU并行计算中的重要性;2. SASS指令作为底层汇编指令的关键作用;3. cuobjdump工具的安装配置和使用方法;4. 通过数组加法实例演示反汇编过程;5. 深入分析SASS指令格式、分类和执行流程;6. 两个实际案例展示性能优化和问题排查的应用。文章为开发者提供了深入理解CUDA程序底层执行机制的有效途径。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 439

把外部系统一键装进 SAP Build Work Zone:从零开始创建 HTML5 URL App

HTML5 URL App 是一种轻量级解决方案,可将外部网页或系统入口快速集成到SAP企业门户中。开发者只需在manifest.json中配置目标URL、导航模式等参数,无需开发完整前端应用。该方案利用SAP BTP的HTML5 Application Repository集中存储静态资源,通过HTML5 Apps Content Provider将应用暴露给子账号,最终在SAP Build Work Zone中以Fiori磁贴形式呈现。文章详细介绍了manifest.json的关键配置、三种基础设施组件

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 243

SkyWalking E2E 端到端测试完全指南:基于 e2e-v2 框架编写与运行集成用例

本篇技术指南系统讲解 Apache SkyWalking 的端到端(E2E)测试体系:它如何在真实环境中拉起 OAP、存储、协调器与被监控服务,并校验完整的数据流与查询结果。读者将掌握 e2e-v2 框架(`skywalking-infra-e2e` + `skywalking-cli`)的用例结构、`e2e.yaml` 配置编写、Go 模板期望文件的校验语义,以及本地运行与 CI 排障的完整实战

gitblog_00315的博客 660

第二大脑的觉醒:一个寄生在代码里的小生命,如何悄无声息地接管我的工作流

所有记忆都存在本地。

步子哥的博客 1064

Apache SkyWalking 虚拟消息队列(Virtual MQ)监控指南:Span 规范、服务识别与 OAP 指标实现

虚拟消息队列(Virtual MQ)是 SkyWalking 面向消息中间件监控提出的核心概念:OAP 后端并不直接采集 MQ 服务端的数据,而是通过各语言 [server agents 插件](https://link.gitcode.com/i/19252f1bcd5c6b3f74190356ec85f9db) 上报的客户端 Span,在拓扑图中"还原"出真实的 MQ 节点及其性能指标。阅读本

gitblog_00006的博客 443

WiFi基本概念(六)(L-STF,L-LTF)

L-STF它由10个OFDM symbol(1,0,1,0,1,0,1,0,1,0)构成,每个symbol是0.8us,GI是0.2us,总计10us。Symbol的长度是正常长度的1/4,因此称为Short training field,主要用于快速进行信号检测,信号同步,自动增益控制,接收天线选择(Diversity Selection)。 由于symbol长度是正常的1/4,子载波的宽度是正常的4倍,能进行初略的信道估计,其使用了-24, -20, -16, -12, -8, -4, 4, 8, 1

reekyli的专栏 6864

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SkyWalking 10.0.1 源码编译与安全攻防实践指南

应用性能监控(APM)系统是现代分布式架构可观测性的核心组件,其通过采集、处理和分析链路追踪数据,帮助开发者洞察系统性能瓶颈。理解其底层原理,尤其是数据采集、传输与存储机制,对于构建稳定、安全的微服务体系至关重要。从技术价值看,深入源码不仅能优化监控配置,更能主动识别和防御潜在安全风险。在应用场景上,APM系统广泛服务于微服务、云原生环境,其自身的安全性直接关系到业务数据的保密性与完整性。本文聚焦于Apache SkyWalking这一主流APM系统,通过手把手指导其10.0.1版本的源码编译,并基于此环境

weixin_30787531的博客 316

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Apache SkyWalking 9.6.0 版本更新解析:MQE 告警重构、HTTP URI 识别增强与全栈可观测性提升

Apache SkyWalking 9.6.0 是 OAP Server、UI 与项目基础设施的一次系统性版本升级,核心主线包括:以 MQE(Metrics Query Expression)统一指标查询与告警配置、强化基于 AI Pipeline 的 HTTP URI 模式识别、新增大量组件 ID 与监控能力,以及对 ElasticSearch 滚动查询、BanyanDB 客户端等存储层的深度打

gitblog_00033的博客 185

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

API安全攻防实战:40个漏洞模型与2026防御全景

API(应用程序编程接口)作为现代应用架构的核心通信枢纽,其安全性直接关系到整个系统的稳定与数据资产的安全。其工作原理在于定义了服务间数据交换的规范,但若设计或实现不当,便会成为攻击者突破的薄弱环节。从技术价值看,健全的API安全机制不仅能防止数据泄露、服务滥用,更是构建可信数字生态的基石。在微服务、移动应用和云原生等广泛场景中,API安全已成为保障业务连续性的关键。本文将聚焦JWT实现缺陷、OAuth授权劫持、水平越权(IDOR)及GraphQL查询攻击等高频热词,深入剖析API面临的核心威胁,并系统阐述

weixin_30813225的博客 450

Spring Boot与微服务实战:高频面试题深度解析

Spring Boot作为Java生态中主流的开发框架,其自动配置原理和微服务架构设计是面试中的重点考察内容。自动配置通过@EnableAutoConfiguration和条件注解实现组件动态加载,而微服务架构则涉及服务发现、负载均衡和容错处理等分布式系统核心概念。这些技术能显著提升系统可维护性和扩展性,广泛应用于电商、金融等高并发场景。本文结合大厂真实案例,详解Spring Boot自动装配实现、FeignClient调优策略等高频考点,特别针对微服务稳定性保障和慢SQL优化等热词场景提供可落地的解决方案

weixin_30455023的博客 507

MDC+TraceId落地实战:从零搭建分布式链路追踪日志体系

在微服务架构中,一次请求往往贯穿多个服务,而日志作为排查问题的主要依据,常因缺乏全局唯一标识而变得零散难读。分布式链路追踪的核心在于为每次请求分配一个唯一TraceId,并通过MDC(Mapped Diagnostic Context)机制自动注入日志,使所有日志行都能携带上下文信息。MDC基于线程绑定,通过Logback或Log4j2的占位符即可实现无侵入式输出,但线程池复用、跨服务传递等场景需要额外处理。合理运用MDC+TraceId能有效提升日志检索效率,快速定位性能瓶颈与异常根因,适用于微服务排障、

weixin_34166847的博客 261

【信息科学与工程学】计算机科学与技术——第七十七篇 系统架构设计101 系统架构评估102 云原架构演进与迁移整体评估框架 第2章 目标架构设计 2.1 (1)

目标架构文档中必须包含一个明确的"架构优先级声明"(Architecture Priority Statement),它定义了在不可兼得的情况下,哪些质量属性(Quality Attributes)具有更高的裁决权重。示例:某互联网支付平台的目标架构优先级声明数据一致性与安全性(权重40%):任何情况下不允许资金数据丢失或不一致高可用性(权重30%):系统可用性目标99.99%,年度不可用时间<52分钟合规可审计(权重15%):所有操作可追溯,满足PCI-DSS和等保三级弹性与成本效率。

weixin_49199313的博客 40
上一篇: 备忘: 通过java反射机制实现自动执行配置文件注册类
下一篇: 通过IDE和jar包运行时加载json配置文件
zhyuli
博客等级 码龄10年 326粉丝 57原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhyuli

您的鼓励是对我付出努力一种赞赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值