当前位置: 首页 > news >正文

关于Skywalking Agent customize-enhance-trace对应用复杂参数类型取值

对于Skywalking Agent customize-enhance-trace 大家应该不陌生了,主要支持以非入侵的方式按用户自定义的Span跟踪对应的应用方法,并获取数据。 参考https://skywalking.apache.org/docs/skywalking-java/v9.0.0/en/setup/service-agent/java-agent/customize-enhance-trace/

规则如下:
在这里插入图片描述
但实际应用的时候会遇到,待拦截的方法,参数类型非常复杂,例如

<enhanced>
<class class_name="com.seckill.seckillentity.seckill.seckillServiceImpl">
...
<method method="updateStdOrder(com.seckill.seckillentity.std.StdOrderMsg)" operation_name="/updateStdOrder" static="false">
...
</method>
</class>
</enhanced>

表示订单信息com.seckill.seckillentity.std.StdOrderMsg 的类包含,订单号,关联的用户编号和商品信息,而商品信息实际上是一个Hashmap类型

package com.seckill.seckillentity.std;
import java.io.Serializable;public class StdOrderMsg implements Serializable{private String order_id;private Integer user_id;private LightFieldMap fields = new LightFieldMap();public String getOrder_id() {return order_id;}public void setOrder_id(String ordId){order_id=ordId;}public Integer getUser_id() {return user_id;}public void setUser_id(Integer userId) {user_id = userId;}public LightFieldMap getFields() {return this.fields;}public void setFields(LightFieldMap lightFields) {fields = lightFields;}public String toString() {...}

而HashMap 由嵌套一层 fields

public class LightFieldMap implements Serializable {private final Map<String, Object> fields = new HashMap();private final Map<String, List<LightFieldMap>> groups = new HashMap();public LightFieldMap() {}...public Object getFieldValue(String fName) {return this.fields.get(fName);}public void setFieldValue(String fName, Object value) {this.fields.put(fName, value);}...

但需求是要拦截到商品信息具体数据,商品编号、价格、购买量,等等…
也就是说,要获取Hashmap内部fields具体域对应的据,该如何定义Tag表达式呢?

起初,按SW提供用户手册尝试,例如获取价格
arg[0].getFields().[‘price’]
但拦截的结果 price=null
然后尝试把Hashmap类用toString方法打印出来
arg[0].getFields().toString()
发现可以获取清晰包信息:
在这里插入图片描述
观察该对象的结构,就很容易想到按以下方式获取

<tag key="pid">arg[0].getFields().fields.pid</tag>
<tag key="price">arg[0].getFields().fields.buy_price</tag>
<tag key="stock">arg[0].getFields().fields.buy_count</tag>

测试成功
在这里插入图片描述

总结: 对于复杂类,需要研究应用具体数据结构,如果是结构体嵌套,可以用A.B.C… 以此类推,但如果中间套了一层类似于HashMap对象,那就需要用类对应方法把该对象获取,然后再按结构体处理A.fun().B.C…,如果没有把握可以通过A.fun(),toString()把数据集拦截出来,然后再根据实际情况处理。

http://www.lryc.cn/news/195168.html

相关文章:

  • 手机路径、Windows路径知识及delphiXE跨设备APP自动下载和升级
  • GitLab 502问题解决方案
  • selenium打开火狐浏览器
  • 多标签分类论文笔记 | ML-Decoder: Scalable and Versatile Classification Head
  • 修改http_charfinder.py使能在python311环境中运行
  • 蓝桥杯(跳跃 C++)
  • 08 | Jackson 注解在实体里面如何应用?常见的死循环问题如何解决?
  • JavaScript—获取当前时间 并转化为yyyy-MM-dd hh:mm:ss格式
  • OpenHarmony创新赛丨报名倒计时,超强秘籍带你直通大奖!
  • Linux高性能服务器编程 学习笔记 第十四章 进程池和线程池
  • 微信小程序/vue3/uview-plus form兜底校验
  • Photoshop 2024正式发布!内置最新PS AI,创意填充等功能无限制使用!
  • 芯片学习记录TLP184
  • C++ 重载运算符和重载函数
  • Linux:mongodb数据库基础操作(3.4版本)
  • nginx实现灰度上线(InsCode AI 创作助手)
  • 记:apifox 返回 invalid header token 的问题排查思路
  • 【00】神经网络之初始化参数
  • 代码随想录Day20 回溯算法 LeetCode77 组合问题
  • 免费获取天气预报的API接口(Json格式)
  • 安卓程序执行入口
  • 消息队列(中间件)
  • Java|学习|异常
  • nextjs项目修改启动端口号,以及开发启动后自动打开浏览器
  • 微服务架构 | 超时管理
  • Qt 样式表大全整理
  • k8s-10 cni 网络
  • IDEA中.gitignore配置不生效的解决方案
  • SparkContext 与 SparkContext 之间的区别是什么
  • lv8 嵌入式开发-网络编程开发 17 套接字属性设置