业务场景:
业务做的是Java-agent监控的项目,某top2中间件团队。
需要给用户的spring-data-mongodb里面的org.springframework.data.mongodb.core.MongoTemplate这个类做埋点,监控其他Java应用项目调用该类的增删改查方法的链路。
其中业务要求做到兼容某顶级客户的低版本1.x和市面上常见的3.x这两种。
监控代码中需要调用2两个版本里面的hostport数据。
如果直接用 xx.get方法时肯定会遇到飘红,3.x包下的方法可以用,1.x的引用不了。这个时候我们都使用反射去取hostport就不存在业务飘红的情况,就解决了该冲突。由于内部代码具有一定的机密性,现贴出一小段抛砖引玉:` Object mongoTemplateObject = ((MongoTemplate) target);DB db = (DB)methodGetDb.invoke(mongoTemplateObject);
Method methodMongo = db.getClass().getMethod("getMongo");
Mongo mongo = (Mongo)methodMongo.invoke(db);
Field clusterField = mongo.getClass().getSuperclass().getDeclaredField("cluster");
clusterField.setAccessible(true);
Cluster cluster = (Cluster) clusterField.get(mongo);
ClusterSettings settings = cluster.getSettings();`
在Java-agent监控项目中,针对top2中间件团队,需要为spring-data-mongodb的MongoTemplate类做埋点,监控其CRUD操作。为兼容1.x和3.x版本,采用了反射方式获取hostport数据,避免了因方法不兼容导致的错误。通过反射调用各个版本的方法,成功获取到MongoTemplate内部的ClusterSettings,实现了版本兼容的链路监控。
981

被折叠的 条评论
为什么被折叠?



