in hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/jmx/JmxCollectImpl.java [94:157]
public void collect(CollectRep.MetricsData.Builder builder, Metrics metrics) {
ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(jmxClassLoader);
try {
JmxProtocol jmxProtocol = metrics.getJmx();
// Whether to use customized JMX
MbeanProcessor processor = null;
if (CustomizedJmxFactory.validate(builder.getApp(), jmxProtocol.getObjectName())) {
processor = CustomizedJmxFactory.getProcessor(builder.getApp(), jmxProtocol.getObjectName());
if (processor != null) {
processor.preProcess(builder, metrics);
if (processor.isCollectionComplete()) {
return;
}
}
}
// Create a jndi remote connection
JMXConnector jmxConnector = getConnectSession(jmxProtocol);
MBeanServerConnection serverConnection = jmxConnector.getMBeanServerConnection();
ObjectName objectName = new ObjectName(jmxProtocol.getObjectName());
Set<String> attributeNameSet = metrics.getAliasFields().stream()
.map(field -> field.split(SUB_ATTRIBUTE)[0]).collect(Collectors.toSet());
Set<ObjectInstance> objectInstanceSet = serverConnection.queryMBeans(objectName, null);
for (ObjectInstance objectInstance : objectInstanceSet) {
ObjectName currentObjectName = objectInstance.getObjectName();
MBeanInfo beanInfo = serverConnection.getMBeanInfo(currentObjectName);
MBeanAttributeInfo[] attrInfos = beanInfo.getAttributes();
String[] attributes = new String[attributeNameSet.size()];
attributes = Arrays.stream(attrInfos)
.filter(item -> item.isReadable() && attributeNameSet.contains(item.getName()))
.map(MBeanFeatureInfo::getName)
.toList().toArray(attributes);
AttributeList attributeList = serverConnection.getAttributes(currentObjectName, attributes);
Map<String, String> attributeValueMap = extractAttributeValue(attributeList);
CollectRep.ValueRow.Builder valueRowBuilder = CollectRep.ValueRow.newBuilder();
if (processor != null) {
processor.process(serverConnection, objectInstance, objectInstanceSet,
currentObjectName, attributeValueMap, valueRowBuilder);
}
for (String aliasField : metrics.getAliasFields()) {
String fieldValue = attributeValueMap.get(aliasField);
valueRowBuilder.addColumn(fieldValue != null ? fieldValue : CommonConstants.NULL_VALUE);
}
builder.addValueRow(valueRowBuilder.build());
if (processor != null && processor.isCollectionComplete()) {
return;
}
}
} catch (IOException exception) {
String errorMsg = CommonUtil.getMessageFromThrowable(exception);
log.error("JMX IOException :{}", errorMsg);
builder.setCode(CollectRep.Code.UN_CONNECTABLE);
builder.setMsg(errorMsg);
} catch (Exception e) {
String errorMsg = CommonUtil.getMessageFromThrowable(e);
log.error("JMX Error :{}", errorMsg);
builder.setCode(CollectRep.Code.FAIL);
builder.setMsg(errorMsg);
} finally {
Thread.currentThread().setContextClassLoader(currentClassLoader);
}
}