/
JMX.java
134 lines (120 loc) · 4.71 KB
/
JMX.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package jrds.probe;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.rmi.RemoteException;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import org.apache.log4j.Level;
import jrds.ConnectedProbe;
import jrds.ProbeConnected;
import jrds.ProbeDesc;
import jrds.factories.ProbeMeta;
import jrds.probe.jmx.JmxAbstractDataSource;
import jrds.probe.jmx.JmxDiscoverAgent;
/**
*
* @author Fabrice Bacchella
*/
@ProbeMeta(
discoverAgent=JmxDiscoverAgent.class,
topStarter=JmxSocketFactory.class
)
public class JMX extends ProbeConnected<String, Double, JMXConnection> implements ConnectedProbe, SSLProbe {
private Map<String, String> collectKeys = null;
public JMX() {
super(JMXConnection.class.getName());
}
@Override
public Boolean configure() {
collectKeys = new HashMap<String, String>();
for(Map.Entry<String, String> e: getPd().getCollectStrings().entrySet()) {
String dsName = e.getValue();
String solved = jrds.Util.parseTemplate(e.getKey(), this);
collectKeys.put(solved, dsName);
}
return super.configure();
}
@Override
public Map<String, Double> getNewSampleValuesConnected(JMXConnection cnx) {
JmxAbstractDataSource<?> mbean = cnx.getConnection();
try {
Set<String> collectKeys = getCollectMapping().keySet();
Map<String, Double> retValues = new HashMap<String, Double>(collectKeys.size());
log(Level.DEBUG, "will collect: %s", collectKeys);
for(String collect: collectKeys) {
int attrSplit = collect.indexOf(':');
attrSplit = collect.indexOf('/', attrSplit);
ObjectName mbeanName = new ObjectName(collect.substring(0, attrSplit));
String[] jmxPath = collect.substring(attrSplit + 1).split("/");
String attributeName = jmxPath[0];
log(Level.TRACE, "mbean name = %s, attributeName = %s", mbeanName, attributeName);
try {
Number v = mbean.getValue(mbeanName, attributeName, jmxPath);
log(Level.TRACE, "JMX Path: %s = %s", collect, v);
if (v != null) {
retValues.put(collect, v.doubleValue());
}
} catch (InvocationTargetException e) {
if (e.getCause() != null) {
try {
throw e.getCause();
} catch (RemoteException e1) {
log(Level.ERROR, e1, "JMX remote exception: %s", e1.getMessage());
} catch (AttributeNotFoundException e1) {
log(Level.ERROR, e1, "Invalide JMX attribue %s", attributeName);
} catch (InstanceNotFoundException e1) {
Level l = Level.ERROR;
if(isOptional(collect)) {
l = Level.DEBUG;
}
log(l, "JMX instance not found: %s", e1.getMessage());
} catch (MBeanException e1) {
log(Level.ERROR, e1, "JMX MBeanException: %s", e1.getMessage());
} catch (ReflectionException e1) {
log(Level.ERROR, e1, "JMX reflection error: %s", e1.getMessage());
} catch (IOException e1) {
log(Level.ERROR, e1, "JMX IO error: %s", e1.getMessage());
} catch (Throwable e1) {
}
}
}
}
return retValues;
} catch (MalformedObjectNameException e) {
log(Level.ERROR, e, "JMX name error: %s", e);
} catch (NullPointerException e) {
log(Level.ERROR, e, "JMX error: %s", e);
}
return null;
}
@Override
public String getSourceType() {
return "JMX";
}
/*
* (non-Javadoc)
*
* @see jrds.Probe#setPd(jrds.ProbeDesc)
*/
@Override
public void setPd(ProbeDesc pd) {
super.setPd(pd);
collectKeys = getPd().getCollectStrings();
}
/*
* (non-Javadoc)
*
* @see jrds.Probe#getCollectkeys()
*/
@Override
public Map<String, String> getCollectMapping() {
return collectKeys;
}
}