关于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/

规则如下:

但实际应用的时候会遇到,待拦截的方法,参数类型非常复杂,例如

bash 复制代码
<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类型

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

bash 复制代码
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()

发现可以获取清晰包信息:

观察该对象的结构,就很容易想到按以下方式获取

bash 复制代码
<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()把数据集拦截出来,然后再根据实际情况处理。

相关推荐
身如柳絮随风扬13 小时前
链路追踪SkyWalking 架构了解
架构·skywalking
洒满阳光的午后5 天前
我做了一个“能理解业务语义”的可观测性 MCP Server:统一接入 Prometheus、OpenObserve 和 SkyWalking
人工智能·ai·prometheus·skywalking·openobserve·mcp
梵得儿SHI5 天前
SpringCloud 实战落地:可观测性建设(SkyWalking + Prometheus + Grafana)从 0 到 1 生产级部署
grafana·prometheus·springcloud·skywalking·微服务可观测性·线上问题排查
Jinkxs6 天前
SkyWalking - Spring Cloud Alibaba 全链路追踪实战
skywalking
烛之武8 天前
Skywalking服务链路追踪与Jemeter压力测试
压力测试·skywalking
鬼先生_sir8 天前
Spring Cloud 微服务监控实战:SkyWalking + Prometheus+Grafana 全栈解决方案
运维·spring cloud·grafana·prometheus·skywalking
dgvri14 天前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
rOuN STAT14 天前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
危笑ioi14 天前
helm部署skywalking链路追踪 java
java·开发语言·skywalking
MmeD UCIZ16 天前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking