public void collect()

in hertzbeat-collector/hertzbeat-collector-basic/src/main/java/org/apache/hertzbeat/collector/collect/script/ScriptCollectImpl.java [74:157]


    public void collect(CollectRep.MetricsData.Builder builder, Metrics metrics) {
        ScriptProtocol scriptProtocol = metrics.getScript();
        long startTime = System.currentTimeMillis();
        ProcessBuilder processBuilder;
        // use command
        if (StringUtils.hasText(scriptProtocol.getScriptCommand())) {
            switch (scriptProtocol.getScriptTool()) {
                case BASH -> processBuilder = new ProcessBuilder(BASH, BASH_C, scriptProtocol.getScriptCommand().trim());
                case CMD -> processBuilder = new ProcessBuilder(CMD, CMD_C, scriptProtocol.getScriptCommand().trim());
                case POWERSHELL -> processBuilder = new ProcessBuilder("powershell.exe", POWERSHELL_C, scriptProtocol.getScriptCommand().trim());
                default -> {
                    builder.setCode(CollectRep.Code.FAIL);
                    builder.setMsg("Not support script tool:" + scriptProtocol.getScriptTool());
                    return;
                }
            }
        // use command file
        } else if (StringUtils.hasText((scriptProtocol.getScriptPath()))) {
            switch (scriptProtocol.getScriptTool()) {
                case BASH -> processBuilder = new ProcessBuilder(BASH, scriptProtocol.getScriptPath().trim());
                case CMD -> processBuilder = new ProcessBuilder(CMD,  scriptProtocol.getScriptPath().trim());
                case POWERSHELL -> processBuilder = new ProcessBuilder(POWERSHELL, POWERSHELL_FILE, scriptProtocol.getScriptPath().trim());
                default -> {
                    builder.setCode(CollectRep.Code.FAIL);
                    builder.setMsg("Not support script tool:" + scriptProtocol.getScriptTool());
                    return;
                }
            }
        } else {
            builder.setCode(CollectRep.Code.FAIL);
            builder.setMsg("At least one script command or script path is required.");
            return;
        }
        // set work directory
        String workDirectory = scriptProtocol.getWorkDirectory();
        if (StringUtils.hasText(workDirectory)) {
            processBuilder.directory(new File(workDirectory));
        }
        // execute command
        try {
            Process process = processBuilder.start();
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.forName(scriptProtocol.getCharset())));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                if (StringUtils.hasText(line)) {
                    response.append(line).append("\n");
                }
            }
            process.waitFor();
            Long responseTime = System.currentTimeMillis() - startTime;
            String result = String.valueOf(response);
            if (!StringUtils.hasText(result)) {
                builder.setCode(CollectRep.Code.FAIL);
                builder.setMsg("Script response data is null");
                return;
            }
            switch (scriptProtocol.getParseType()) {
                case PARSE_TYPE_LOG -> parseResponseDataByLog(result, metrics.getAliasFields(), builder, responseTime);
                case PARSE_TYPE_NETCAT -> parseResponseDataByNetcat(result, metrics.getAliasFields(), builder, responseTime);
                case PARSE_TYPE_ONE_ROW -> parseResponseDataByOne(result, metrics.getAliasFields(), builder, responseTime);
                case PARSE_TYPE_MULTI_ROW -> parseResponseDataByMulti(result, metrics.getAliasFields(), builder, responseTime);
                default -> {
                    builder.setCode(CollectRep.Code.FAIL);
                    builder.setMsg("Script collect not support this parse type: " + scriptProtocol.getParseType());
                }
            }
        } catch (IOException ioException) {
            String errorMsg = CommonUtil.getMessageFromThrowable(ioException);
            log.warn(errorMsg);
            builder.setCode(CollectRep.Code.FAIL);
            builder.setMsg("Peer io failed: " + errorMsg);
        } catch (InterruptedException interruptedException){
            String errorMsg = CommonUtil.getMessageFromThrowable(interruptedException);
            log.warn(errorMsg);
            builder.setCode(CollectRep.Code.FAIL);
            builder.setMsg("Peer interrupt this script: " + errorMsg);
        } catch (Exception exception) {
            String errorMsg = CommonUtil.getMessageFromThrowable(exception);
            log.warn(errorMsg);
            builder.setCode(CollectRep.Code.FAIL);
            builder.setMsg(errorMsg);
        }
    }