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