⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/SkyWalking/agent-plugin-mongodb/ 「芋道源码」欢迎转载,保留摘要,谢谢!

本文主要基于 SkyWalking 3.2.6 正式版


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

1. 概述

本文主要分享 SkyWalking Agent MongoDB 插件。涉及到的代码不多,如下图:

考虑到大多数团队目前使用的 MongoDB 3.X 版本,本文解析 mongodb-3.x-plugin 插件。

2. MongoDBInstrumentation

skywalking-plugin.def 里,定义了插件,如下图:


org.apache.skywalking.apm.plugin.mongodb.v3.define.MongoDBInstrumentation ,实现 ClassInstanceMethodsEnhancePluginDefine 抽象类,定义了方法切面,代码如下:

2.1 MongoDBMethodInterceptor

org.apache.skywalking.apm.plugin.mongodb.v3.MongoDBMethodInterceptor ,实现 InstanceMethodsAroundInterceptor 和 InstanceConstructorInterceptor 接口,MongoDBInstrumentation 的拦截器。代码如下:

  • DB_TYPE 静态属性,数据库类型。
  • MONGO_DB_OP_PREFIX 静态属性,操作前缀。
  • FILTER_LENGTH_LIMIT 静态属性,操作语句长度限制,256
    • EMPTY 静态属性,未知操作的参数。
    • 当开启 Config.Plugin.MongoDB.TRACE_PARAM = true 时,记录 MongoDB 操作语句。可以通过 agent.config 配置,如下图所示:
  • #onConstruct(objInst, allArguments) 方法,拼接拼接集群地址,设置集群地址到 Mongo 对象的私有变量( SkyWalking 自动生成 )。
  • #beforeMethod(...) 方法,创建 ExitSpan 对象。代码如下:
    • 第 171 行:调用 ContextManager#createExitSpan(...) 创建 ExitSpan 对象。其中,操作名使用 MONGO_DB_OP_PREFIX + Method#getName()
    • 第 174 行:设置 EntrySpan 对象的组件类型。
    • 第 177 行:设置 EntrySpan 对象的 db.type 标签键值对。
    • 第 180 行:设置 EntrySpan 对象的分层。
    • 第 183 至 185 行:当 Config.Plugin.MongoDB.TRACE_PARAM = true 开启时,设置操作语句到 EntrySpan 对象的 db.statement 标签键值对。其中,操作语句通过 #getTraceParam(Object) 方法生成。
  • #afterMethod(...) 方法,调用 ContextManager#stopSpan() 方法,完成 ExitSpan 对象。
  • #handleMethodException(...) 方法,处理异常。代码如下:
    • 第 199 行:标记 ExitSpan 发生异常。
    • 第 202 行:设置 EntrySpan 的日志。

666. 彩蛋

知识星球

算是本系列的小完结?偷懒下,后面在补充一些其他的。

呼呼,撒花!

胖友,分享一波朋友圈可好~

文章目录
  1. 1. 1. 概述
  2. 2. 2. MongoDBInstrumentation
    1. 2.1. 2.1 MongoDBMethodInterceptor
  3. 3. 666. 彩蛋