public void collect()

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);
        }
    }