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

skywalking-agent自定义插件 SkyWalking 插件的工作机制主要基于 Java Agent,它会在应用启动时自动附加到目标应用上。插件主要实现方法拦截(Method Intercept),即在指定的方法执行之前、之后或者发生异常时进行操作,以便收集监控数据。增强类定义(Enhancement Class):指定需要增强的目标类。方法拦截器(Method Interceptor):定义拦截的逻辑,比如调用链的开始、结束、异常捕获等。 阅读详情

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

SkyWalking方法级trace粒度实现 @Trace和apm-customize-enhance-plugin介绍 场景 在开发过程了,我们除了想知道链路的整体耗时以外,有的时候也想要知道某些方法的执行耗时。为了达到这个目的,我们需要做一些额外的配置。 今天就给大家介绍SkyWalking方法级trace的实现。 实现 SkyWalking方法级trace的实现具体分为侵入式和外部配置两种方式,各有优劣,可根据项目情况自行选择。首选给大家介绍侵入式实现方式。 侵入式实现 1、pom.xml依赖 <dependency> <groupId>org.apache.skywalking 阅读详情

相关推荐

SkyWalking链路追踪使用教程三:支持的插件及插件开发必看

0 安装Java agent 7.x版本中代理支持 JDK 8 - 14, 6.x版本支持JDK 1.6 - JDK 12NOTICE¹ 在SkyWalking发行包中找到agent文件夹 配置config/agent.config中的agent.service_name。可以是任意的英文字符串。 配置config/agent.config中的collector.backend_service。默认指向127.0.0.1:11800,表示仅作用于本地后端。 JVM参数中添加-javaagent:.

ice-wee的专栏 7472

服务调用追踪工具skywalking实践

skywalking在服务调用追踪方面的介绍与实践

toyangdon的博客 3131

SkyWalking自定义插件(Spring RabbitMQ)

SkyWalking 自定义插件(Spring RabbitMQ) 官方RabbitMQ插件问题 skywalking官方提供的RabbitMQ插件存在缺陷,其只针对RabbitMQ官方原生Client实现扩展,但我们在项目中一般不直接使用原生Client,而是使用Spring RabitMQ Client,因Spring RabitMQ Consumer中存在跨线程操作,导致跟踪ID断链。 具体分析过程 官方插件源码的拦截点是原生Consumer的handleDelivery方法,源码如下: Spri

Kenny的博客 2955

SkyWalking部署应该避免的坑

- skywalking logback日志插件 -->1、在8.70版本之前,目录里面会有ES版本和agent,成套使用即可。-- logback最低版本,不然agent日志会报错 -->skywalking和agent还有ES一定是配套的!-- skywalking链路追踪 -->搞定,基本就这些,其他的正常配置即可。2、上传监控日志(logback)

DJYDFT2831djydft的专栏 767

智能问数产品背后的Agent技术揭秘:从任务分解到工具调用的完整流程

本文深入解析智能问数产品背后的Agent技术,从任务分解到工具调用的完整流程。通过大模型驱动的语义理解和动态工具调度,Agent系统能高效处理复杂数据分析需求,显著提升响应速度和准确率。文章详细介绍了模块化架构、任务分解机制、动态工具调用及双通道记忆系统等核心技术,展示了大模型时代的新型数据分析范式。

weixin_30399821的博客 439

从零开始:MTK ISP调试中的ImagiqSimulator实战指南

本文详细介绍了MTK ISP调试中ImagiqSimulator的实战应用,从环境准备、参数加载到核心模块调整,提供全面的调试流程指南。重点讲解了DM模块参数优化技巧和常见问题解决方案,帮助工程师高效完成ISP调试工作,提升图像处理质量。

weixin_29168813的博客 490

skywalking自定义增强插件apm-customize-enhance-plugin

skywalking自定义增强插件apm-customize-enhance-plugin skywalking支持自定义增强插件,可在指定类中增强方法,但是需要在xml中将所有需要增强的方法都列出来,链接如下:https://github.com/apache/skywalking/blob/master/docs/en/setup/service-agent/java-agent/Custo...

weixin_40293343的博客 5550

给IC设计新人的Tessent Scan入门指南:从RTL到ATPG的完整DFT流程解析

本文为IC设计新手提供Tessent Scan的完整DFT流程指南,从RTL代码检查到ATPG测试向量生成,详细解析扫描链配置、插入及验证的关键步骤。通过实战案例和工具命令示例,帮助工程师快速掌握Tessent工具链的应用技巧,提升芯片可测试性设计的效率和质量。

weixin_32541663的博客 451

Skywalking:代码行级监控 apm-customize-enhance-plugin插件使用教程

apm-customize-enhance-plugin插件作用:自定义增强任意类里的任意方法,从而实现对任意类里任意方法的监控。 举个例子,有一个类,定义如下: public class TestService1 { public static void staticMethod(String str0, int count, Map m, List l, Object[] os) { // 业务逻辑 } ... } 那么,想要对该方法进行监控,则可如下操作: 移动jar

简单随风的博客 4065

在Ansys Mechanical中对磨损进行建模

在有限元分析中,磨损是通过移动接触表面上的节点来复制材料侵蚀来建模的。仿真迭代更新几何,并在每次更新后重新计算平衡,使过程成为非线性的。Ansys使用将压力、相对运动和材料阻力与表面损失联系起来的经验定律来处理连续介质尺度的磨损。要在Ansys Mechanical中激活磨损建模,必须使用TB,WEAR命令定义专用材料模型。该命令与 TBDATA 相结合,允许用户输入与磨损相关的材料常数,以控制磨损的计算方式以及在接触表面上的应用方式。

jkh920184196的博客 2631

RNA-seq分析:Step4(比对)

预处理之后的fastq文件,可以使用HISAT2软件将reads比对至参考基因组上。HISAT2软件将reads比对至参考基因组上的步骤如下:1. 对参考基因组进行建索引。对参考基因组进行预处理,生成索引文件,包括基因组序列的FM索引和SA索引。2. 将原始的reads进行预处理。包括去除接头序列、去除低质量的碱基,以及进行过滤,得到质量较高的、可靠的reads。3. 利用建立的FM索引和SA索引,将处理后的reads与参考基因组进行比对。首先,通过FM索引,快速找到与reads匹配的可能位置;

沉香best的博客 2599

7.SpringCloud:Skywalking链路追踪和OpenTracing对接

可观测性包括: ​Metrics、Tracing、Logging。SkyWalking作为链路追踪的一款优秀APM。内容包括:Skywalking介绍 内部传输协议 Skywalking服务端 Skywalking客户端 调整agent自带插件 定制化 方式A(customize-enhance-trace插件+配置方式) 方式B(application-toolkit-trace注解方式) 方式C(application-toolkit-trace非注解方式) 方式D(opentracing源代码方式

zyplanke的专栏 8262

高级电机控制场景实例:基于Simulink的永磁同步电机基于Luenberger观测器的弱磁控制仿真

本文基于Simulink实现表贴式永磁同步电机(SPMSM)的Luenberger观测器弱磁控制仿真,通过构建“观测-弱磁-控制”协同逻辑,突破传统矢量控制的基速限制。利用线性化模型设计观测器实时估计电流与磁链,结合电压极限约束动态注入负d轴电流,实现转速扩展至12000rpm(4倍基速),弱磁区电流THD低于3%,动态响应时间小于5ms,验证了高速运行下系统稳定性与鲁棒性。附完整建模步骤、MATLAB函数代码及性能分析,适用于电动汽车、机床等高速驱动场景,为高级电机控制提供可复现的技术范式。

amy_mhd的博客 32

基于Skywalking开发分布式监控(二)

要对SW Agent插件做适当剪裁,原来包括customize插件在内SW 8.9有100多个插件,如果没有作用也就罢了,但是有些插件会产生大量trace和span数据,用处不大,但是会干扰需要聚焦的数据,例如一次最多查10000个trace,但有可能绝大部分都不是用户关注的,而用户关注的数据,又被淹没在无用数据中——因为运行中系统还在大量产生新的数据。另外需要注意,不同节点/服务所使用插件可以不同,但要注意衔接,例如dubbo,生成者服务和消费者服务都需要配置相关的有效SW Agent。

zhyuli的博客 1945

Multisim14.0仿真应用设计(三十九)74LS183 高速全加器应用仿真

74LS183是一种高速全加器,可以同时执行四位二进制数的加法运算。它的输入端包括两个4位二进制数和一个进位信号,输出端则为一个4位二进制数和一个进位信号。

zhusl6688的博客 3854

蓝牙协议栈详解(3)——BTstack

BTstack是一个轻量级蓝牙协议栈,支持经典蓝牙(BR/EDR)和低功耗蓝牙(BLE)。它采用事件驱动模型,可运行在MCU/CPU上,通过HCI接口与蓝牙控制器通信。协议栈包含完整的蓝牙协议层支持,如L2CAP、RFCOMM、ATT/GATT等,并提供丰富的示例代码。 主要特点包括模块化设计、开源授权、支持多种HCI传输方式(UART/USB)和操作系统适配。开发时需要关注事件驱动编程模型、内存配置优化、HCI传输稳定性等问题。典型应用场景包括SPP串口通信、BLE外设开发等。 使用建议从最小示例开始,逐

嵌入式软硬件叶玄 295

skywalking自己写插件,自定义插件

此分享基于8.5.0版本的源码 首先下载源码,导入idea,并且构建成功,如何构建见另一篇https://mp.youkuaiyun.com/editor/html/114141447 后边联调先不用管 找到apm-sdk-plugin 在下边新建module 项目 。 也可以单拉项目,这边我没有新建 直接在skywalking源码项目里建了个项目 方便提交。 pom.xml(根据你自己的项目起名即可) <?xml version="1.0"?> <!-- ~ Lice...

gejiangbo222的专栏 2209

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Skywalking的增强与拦截机制

字节增强条件匹配 在 skywalking 中实现很多基于 byte-buddy 的关于链式匹配查询的实现, 代码如下所示: public abstract class AbstractJunction<V> implements ElementMatcher.Junction<V> 其对应的类的类图关系如下所示: 除此之外, 为了便于更好的执...

bajiaoyan5785的博客 2740

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Skywalking自定义拓展线程池监控grpc线程池

背景 SkyWalking Java Agent 8.10.0 增加了对database连接池和tomcat线程池监控的plugin:skywalking.apache.org/events/rele… 如果我们自己想增加一些针对于自己业务的线程池的监控,Skywalking也是提供了拓展点的。 实现 客户端实现 这篇官方文档描述了客户端(也就是应用端)如何上传数据到SkyWalking服务端。 skywalking.apache.org/docs/skywal… 通过查看官方对tomca

cainiao1412的博客 2935

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

skywalking操作手册

EntrySpan代表服务提供商。它也是服务器端的端点。作为一个APM系统,我们的目标是 应用程序服务器。因此,几乎所有的服务和MQ消费者都是EntrySpan。LocalSpan 表示一种不涉及远程服务的普通 Java 方法。它既不是 MQ 生产者/消费者 也不是服务(例如 HTTP 服务)提供者/消费者。ExitSpan 表示服务的客户端或 MQ 生产者。它在SkyWalking的早期版本中被命名。例如,通过JDBC访问数据库和读取Redis/Memcached被归类为ExitSpan。

weixin_45172742的博客 3468

基于Skywalking开发分布式监控(一)

基于Skywalking开发分布式监控,聚焦Agent插件开发

zhyuli的博客 822

Skywalking自定义增强插件开发(顺便贡献了对源码的BUG修复)

前言 其实Skywalking已经有了这个自定义增强插件了,但是本人一开始没发现有着玩意,线上应用的特殊的非标节点和链路没识别出来,所以就亲自操刀写了一个宇宙无敌的自定义增强插件了(customize-enhance-plugin)。当然代码优雅度上应该是官方的占优,但是我因为了解业务场景的痛点,所以也有一定的可取之处吧。 好了,废话不多说,上代码! 配置先行 新建general-1.0-plugin模块 在resources文件夹下新建skywalking-plugin.def文件,内容如下: furio

战斗小火鸡 3011

skywalking04 - skywalking自定义链路追踪@Trace

skywalking04 - skywalking自定义链路追踪@Trace ​ 当我们工程中,有些重要的方法,没有添加在链路中,而我们又需要时,就可以添加自定义链路追踪的Span,同时,我们还可以向链路的Span中添加一些自定义的属性(Tag) 准备工程 ​ 工程我们采取上一章<skywalking03 - skywalking入门使用>使用到的demo工程,进行稍作改造.skywalking-plugin-example 准备需要自定义链路追踪的方法 private String tra

过了这个村没这个老王的博客 8321

Skywalking系列博客5-apm-customize-enhance-plugin插件使用教程

点击上方 IT牧场,选择置顶或者星标技术干货每日送达!插件作用:自定义增强任意类里的任意方法,从而实现对任意类里任意方法的监控。使用举个例子,有一个类,定义如下:public cla...

ITMuch的专栏 1350

Skywalking自定义指标

把Skywalking集成到自家系统时,想在原来的指标之外增加一些新指标。百度到了观测分析语言(Observability Analysis Language, OAL) (skyapm.github.io)。看完之后总算理解了指标是怎么计算的。但是我看源码里并没有这个oal文件,得编译之后才能生成。我就又搞不懂是怎么生成的了,现在只能在已经启动的服务中找到oal文件,在里面修修改改然后重启。 PS:刚开始还疑惑为啥我的cpm一直是0,后来看了下面的博客才知道跟选择的时间段有关,像我用的测试服务只要超过1

StarUranus的博客 2213

skywalking agent插件开发过程中各种拦截点的写法

本文主要总结了自己写SkyWalking agent端插件的时候常用的匹配方法,并对每一个方法写了一个demo以供参考(所有demo均来自社区插件中的具体类),希望能给想开发SkyWalking插件的小伙伴以帮助。

Startapi的博客 2117
上一篇: 搭建spring+dubbo环境踩坑小记
下一篇: python匿名函数多返回值处理的一个小技巧
zhyuli
博客等级 码龄10年 326粉丝 57原创
评论
成就一亿技术人!
拼手气红包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、付费专栏及课程。

余额充值