Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
javalover123888
SkyWalking
提交
d655c23c
S
SkyWalking
项目概览
javalover123888
/
SkyWalking
与 Fork 源项目一致
Fork自
山不在高_有仙则灵 / SkyWalking
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
SkyWalking
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d655c23c
编写于
8月 03, 2016
作者:
A
ascrutae
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
处理JDBC插件
上级
61d79760
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
38 addition
and
85 deletion
+38
-85
skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/JDBCPluginDefine.java
...com/ai/cloud/skywalking/plugin/jdbc/JDBCPluginDefine.java
+18
-16
skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/TracingDriver.java
...va/com/ai/cloud/skywalking/plugin/jdbc/TracingDriver.java
+20
-69
未找到文件。
skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/JDBCPluginDefine.java
浏览文件 @
d655c23c
package
com.ai.cloud.skywalking.plugin.jdbc
;
import
java.lang.reflect.Constructor
;
import
java.lang.reflect.Field
;
import
java.sql.DriverManager
;
import
java.util.concurrent.CopyOnWriteArrayList
;
import
com.ai.cloud.skywalking.logging.LogManager
;
import
com.ai.cloud.skywalking.logging.Logger
;
import
com.ai.cloud.skywalking.plugin.boot.BootException
;
import
com.ai.cloud.skywalking.plugin.boot.IBootPluginDefine
;
import
java.lang.reflect.Constructor
;
import
java.lang.reflect.Field
;
import
java.sql.DriverManager
;
import
java.util.concurrent.CopyOnWriteArrayList
;
public
class
JDBCPluginDefine
implements
IBootPluginDefine
{
private
static
Logger
logger
=
LogManager
.
getLogger
(
JDBCPluginDefine
.
class
);
...
...
@@ -20,24 +20,26 @@ public class JDBCPluginDefine implements IBootPluginDefine {
Object
traceDriverInfo
=
newDriverInfoInstance
(
classes
);
Field
field
=
DriverManager
.
class
.
getDeclaredField
(
"registeredDrivers"
);
field
.
setAccessible
(
true
);
@SuppressWarnings
(
"unchecked"
)
CopyOnWriteArrayList
<
Object
>
copyOnWriteArrayList
=
(
CopyOnWriteArrayList
<
Object
>)
field
.
get
(
DriverManager
.
class
);
@SuppressWarnings
(
"unchecked"
)
CopyOnWriteArrayList
<
Object
>
copyOnWriteArrayList
=
(
CopyOnWriteArrayList
<
Object
>)
field
.
get
(
DriverManager
.
class
);
copyOnWriteArrayList
.
add
(
0
,
traceDriverInfo
);
}
catch
(
Throwable
e
)
{
// 开启补偿机制
logger
.
error
(
"Failed to inject TracingDriver to the top of registered Drivers. Need to alter jdbc url to trace."
,
e
);
TracingDriver
.
registerDriver
();
}
}
// 开启补偿机制
logger
.
error
(
"Failed to inject TracingDriver to the top of registered Drivers. Need to alter jdbc url to trace."
,
e
);
TracingDriver
.
registerDriver
();
}
}
private
Object
newDriverInfoInstance
(
Class
<?>
classes
)
throws
NoSuchMethodException
,
InstantiationException
,
IllegalAccessException
,
java
.
lang
.
reflect
.
InvocationTargetException
{
private
Object
newDriverInfoInstance
(
Class
<?>
classes
)
throws
NoSuchMethodException
,
InstantiationException
,
IllegalAccessException
,
java
.
lang
.
reflect
.
InvocationTargetException
{
//DriverInfo 只有一个构造函数
Constructor
constructor
=
classes
.
getDeclaredConstructors
()[
0
];
constructor
.
setAccessible
(
true
);
// JDK 1.7 DriverInfo 只有一个Driver入参构造函数
if
(
constructor
.
getParameterTypes
().
length
==
1
){
if
(
constructor
.
getParameterTypes
().
length
==
1
)
{
return
constructor
.
newInstance
(
new
TracingDriver
());
}
// JDK1.8 DriverInfo 有两个入参的构造函数(Driver, DriverAction)
...
...
skywalking-collector/skywalking-sdk-plugin/jdbc-plugin/src/main/java/com/ai/cloud/skywalking/plugin/jdbc/TracingDriver.java
浏览文件 @
d655c23c
...
...
@@ -4,13 +4,8 @@ import com.ai.cloud.skywalking.conf.AuthDesc;
import
com.ai.cloud.skywalking.logging.LogManager
;
import
com.ai.cloud.skywalking.logging.Logger
;
import
java.io.BufferedReader
;
import
java.io.IOException
;
import
java.io.InputStreamReader
;
import
java.sql.*
;
import
java.util.HashMap
;
import
java.util.Iterator
;
import
java.util.Map
;
import
java.util.Enumeration
;
import
java.util.Properties
;
public
class
TracingDriver
implements
Driver
{
...
...
@@ -35,9 +30,9 @@ public class TracingDriver implements Driver {
}
public
java
.
sql
.
Connection
connect
(
String
url
,
Properties
info
)
throws
SQLException
{
Driver
driver
=
DriverChooser
.
choose
(
convertConnectURLIfNecessary
(
url
));
Driver
driver
=
chooseActualDriver
(
convertConnectURLIfNecessary
(
url
));
if
(
driver
==
null
)
{
throw
new
SQLException
(
"Failed to choose driver by url[{}]."
,
convertConnectURLIfNecessary
(
url
));
throw
new
SQLException
(
"Failed to choose
ActualDriver
driver by url[{}]."
,
convertConnectURLIfNecessary
(
url
));
}
java
.
sql
.
Connection
conn
=
driver
.
...
...
@@ -51,7 +46,7 @@ public class TracingDriver implements Driver {
}
public
boolean
acceptsURL
(
String
url
)
throws
SQLException
{
Driver
driver
=
DriverChooser
.
choose
(
convertConnectURLIfNecessary
(
url
));
Driver
driver
=
chooseActualDriver
(
convertConnectURLIfNecessary
(
url
));
if
(
driver
==
null
)
{
return
false
;
}
...
...
@@ -60,7 +55,7 @@ public class TracingDriver implements Driver {
}
public
DriverPropertyInfo
[]
getPropertyInfo
(
String
url
,
Properties
info
)
throws
SQLException
{
return
DriverChooser
.
choose
(
convertConnectURLIfNecessary
(
url
)).
return
chooseActualDriver
(
convertConnectURLIfNecessary
(
url
)).
getPropertyInfo
(
convertConnectURLIfNecessary
(
url
),
info
);
}
...
...
@@ -80,70 +75,26 @@ public class TracingDriver implements Driver {
return
null
;
}
static
class
DriverChooser
{
private
static
Logger
logger
=
LogManager
.
getLogger
(
DriverChooser
.
class
);
private
static
Map
<
String
,
String
>
urlDriverMapping
=
new
HashMap
<
String
,
String
>();
static
{
fetchUrlDriverMapping
();
}
public
static
Driver
choose
(
String
url
)
{
String
driverClassStr
=
chooseDriverClass
(
url
);
Driver
driver
=
null
;
try
{
Class
<?>
driverClass
=
Class
.
forName
(
driverClassStr
);
driver
=
(
Driver
)
driverClass
.
newInstance
();
}
catch
(
Exception
e
)
{
logger
.
error
(
"Failed to initial Driver class {}."
,
new
Object
[]
{
driverClassStr
},
e
);
}
return
driver
;
}
private
static
String
chooseDriverClass
(
String
url
)
{
Iterator
<
String
>
mapping
=
urlDriverMapping
.
keySet
().
iterator
();
while
(
mapping
.
hasNext
())
{
String
urlPrefix
=
mapping
.
next
();
if
(
url
.
startsWith
(
urlPrefix
))
{
String
driverClassStr
=
urlDriverMapping
.
get
(
urlPrefix
);
logger
.
debug
(
"Success choose the driver class [{}] by connection url[{}]"
,
driverClassStr
,
url
);
return
driverClassStr
;
private
static
Driver
chooseActualDriver
(
String
url
)
throws
SQLException
{
try
{
Driver
result
=
null
;
for
(
Enumeration
<
Driver
>
drivers
=
DriverManager
.
getDrivers
();
drivers
.
hasMoreElements
();
)
{
Driver
driver
=
drivers
.
nextElement
();
if
(
driver
instanceof
TracingDriver
)
{
continue
;
}
}
logger
.
warn
(
"Cannot match the driver class by connection url [{}]."
,
url
);
return
null
;
}
private
static
void
fetchUrlDriverMapping
()
{
BufferedReader
bufferedReader
=
null
;
try
{
bufferedReader
=
new
BufferedReader
(
new
InputStreamReader
(
DriverChooser
.
class
.
getResourceAsStream
(
"/driver-mapping-url.def"
)));
String
mappingString
=
null
;
while
((
mappingString
=
bufferedReader
.
readLine
())
!=
null
)
{
fillMapping
(
mappingString
);
}
}
catch
(
Exception
e
)
{
logger
.
error
(
"Failed to load driver-mapping-url.def."
);
}
finally
{
if
(
bufferedReader
!=
null
)
{
try
{
bufferedReader
.
close
();
}
catch
(
IOException
e
)
{
logger
.
error
(
"Failed to close driver-mapping-url.def."
,
e
);
}
if
(
driver
.
acceptsURL
(
url
))
{
result
=
driver
;
}
}
}
private
static
void
fillMapping
(
String
mappingString
)
{
String
[]
tmpMapping
=
mappingString
.
split
(
"="
);
if
(
tmpMapping
.
length
==
2
)
{
urlDriverMapping
.
put
(
tmpMapping
[
0
],
tmpMapping
[
1
]);
}
return
result
;
}
catch
(
Exception
e
)
{
logger
.
error
(
"Failed to chooseActualDriver sql driver with url["
+
url
+
"]"
,
e
);
throw
new
SQLException
(
"Failed to chooseActualDriver sql driver with url["
+
url
+
"]"
,
e
);
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录