如何对不支持的同步框架做扩展配置

陈梦阳 发表于 2015年10月21日 16:51 最后修改于 2015年10月21日 16:52

Extension 可以针对 Java Agent 不支持的同步框架做扩展配置。比如目前 Java Agent 不支持 neo4j,就可以使用这种方式解决。

在 oneapm.jar 同级目录创建文件夹 extensions(注意:3.1.8及以后的探针不用自己建立,已经有了)

mkdir extensions
cd extensions  //在新建的目录下面创建文件
touch neo4j.xml    //创建扩展配置文件

配置完成后不用重启探针。

例1:

<?xml version="1.0" encoding="UTF-8"?>
    <extension
        xmlns="https://blueware.com/docs/java/xsd/v1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    name="graphdb.extension"
    version="1.8">
    <instrumentation>

<pointcut>
    <nameTransaction/>
    <interfaceName>org.neo4j.graphdb.Node</interfaceName>
   <method>
       <name>*</name>
   </method>
</pointcut>

</instrumentation>
</extension>

参数解释:

  1. name 是扩展的唯一标识,不可重复。

  2. version 高版本会覆盖低版本配置,如果 Java Agent 内部配有同名低版本extension,则会执行升级操作。

  3. Pointcut 定位有四种方式 annotationName、interfaceName、className、packageName,neo4j 的 Node 是一个 interface,所以此处配置为 interfaceName。

  4. method name 当前只支持通配*

 

配置完成后,重启 Java Agent 生效:

00156274add1a1c1b4aadf601b75908

也可以这样配置

例2:

<?xml version="1.0" encoding="UTF-8"?>
    <extension
        xmlns="https://blueware.com/docs/java/xsd/v1.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            name="org.webservice"
         version="1.8">
            <instrumentation>
                    <pointcut>
                   <nameTransaction/>

<className>com.etc.webbookshop.service.impl.BookServiceImpl</className>
     <method>
                  <name>*</name>
     </method>
          </pointcut>
          <pointcut>
             <nameTransaction/>
                  <interfaceName>com.etc.webbookshop.dao.BookDao</interfaceName>
          <method>
             <name>*</name>                           </method>
        </pointcut>
   </instrumentation>
</extension>

从 BookService 到 BookDao 是一个业务,这里采用 className 和 interfaceName 的方式配置扩展,达到业务配置的目的。(备注:在这里配置扩展,不一定会在 server 端看到它们的事务,响应时间达到要求才会显示) 

packageName 的配置要慎重,包下可能包含大量的 class。如果不想全部 class 都监控,可以定义模糊配置。


例3:

<?xml version="1.0" encoding="UTF-8"?>
    <extension
        xmlns="https://blueware.com/docs/java/xsd/v1.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            name="org.webservice"
            version="1.8">
            <instrumentation>
    <pointcut>
                       <nameTransaction/>
                       <packageName>com.etc.webbookshop.service.impl.*ServiceImpl</packageName>
                       <method>
                            <name>*</name>
                       </method>
                    </pointcut>
            </instrumentation>
</extension>

com.etc.webbookshop.service.impl 包下的以 ServiceImpl 结尾的 class

 

extension 功能帮助: 

只有 packageName 可以使用 *,使用规范,使用类名路径的一部分前缀一部分前缀+ * +后缀

使用时配置文件如果没有报错,说明 extension 的配置就成功了。配置文件报错会在 Agent 启动最开始打印在 oneapm.log 中。

 

排错方法:

如果以上都通过了,server 端没有收到配置的数据,检查匹配是否填写正确,配置的类是否会被调用,是否异步调用。

             

以上方法都用了,可以找研发协助。

附加功能:

1、将 custom 的后台任务转换成 Web 事务,在 pointcut 标签中增加 transactionType="web" 属性。

<?xml version="1.0" encoding="UTF-8"?>
    <extension
        xmlns="https://blueware.com/docs/java/xsd/v1.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            name="org.webservice"
            version="1.8">
            <instrumentation>
    <pointcut transactionType="web">
                   <nameTransaction/>
                       <packageName>com.etc.webbookshop.service.impl.*ServiceImpl</packageName>
                       <method>
                            <name>*</name>
                       </method>
                    </pointcut>
         </instrumentation>
</extension>

2、extension 功能的开启和关闭,在 extension 标签中增加 enabled="false" 属性可以关闭 extension。

<?xml version="1.0" encoding="UTF-8"?>
    <extension
        xmlns="https://blueware.com/docs/java/xsd/v1.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            name="org.webservice"
            version="1.8"
    enabled="false">
            <instrumentation>
    <pointcut>
                       <nameTransaction/>
                       <packageName>com.etc.webbookshop.service.impl.*ServiceImpl</packageName>
                       <method>
                            <name>*</name>
                       </method>
                    </pointcut>
            </instrumentation>
</extension>

3、改变生成的 metric type,在 instrumentation 中增加 metricPrefix="Customes" 属性

<?xml version="1.0" encoding="UTF-8"?>
    <extension
        xmlns="https://blueware.com/docs/java/xsd/v1.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          name="org.webservice"
            version="1.8">
            <instrumentation metricPrefix="Customes">
    <pointcut>
                       <nameTransaction/>
                       <packageName>com.etc.webbookshop.service.impl.*ServiceImpl</packageName>
                       <method>
                            <name>*</name>
                       </method>
                    </pointcut>
            </instrumentation>
</extension>

4、增加确定的方法,对 method 使用确定的方法和返回类型,目前只能在 className 中使用。

<?xml version="1.0" encoding="UTF-8"?>
    <extension
        xmlns="https://blueware.com/docs/java/xsd/v1.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            name="org.webservice"
            version="1.8">
            <instrumentation>
    <pointcut>
                       <nameTransaction/>
                       <className>com.etc.webbookshop.service.impl.UserServiceImpl</className>
                       <method>
               <name>getAllUser</name>
                <parameters>
                  <type>java.util.List</type>
               </parameters>
               </method>
                    </pointcut>
            </instrumentation>
</extension>

5、非常重要的一点,在后台任务中配置 extension,如果上下文中没有 transaction 或有异步调用会导致有些数据抓取不到,在 pointcut 标签中增加 transactionStartPoint="true" 属性。

<?xml version="1.0" encoding="UTF-8"?>
    <extension
        xmlns="https://blueware.com/docs/java/xsd/v1.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            name="org.webservice"
            version="1.8">
         <instrumentation>
    <pointcut transactionStartPoint="true">
                       <nameTransaction/>
                       <className>com.etc.webbookshop.service.impl.UserServiceImpl</className>
                       <method>
               <name>getAllUser</name>
                <parameters>
                  <type>java.util.List</type>
               </parameters>
               </method>
                    </pointcut>
            </instrumentation>
</extension>

 


回复

您需要登录后才可以回复