package net.geedge.confagent.controller; import cn.hutool.log.Log; import net.geedge.confagent.util.ConfagentUtil; import net.geedge.confagent.util.R; import net.geedge.confagent.util.RCode; import net.geedge.confagent.util.Tool; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import java.io.File; import java.util.*; @RestController @RequestMapping("/promtail") public class PromtailController extends BaseController{ private final static Log log = Log.get(); @Autowired private ConfagentUtil confagentUtil; @Value("${confagent.promtail.query.auth:true}") private Boolean queryAuth; @Value("${confagent.promtail.restart:systemctl restart promtail}") private String restartCmd; @Value("${confagent.versionFile:promtail.version}") private String versionFile; @Value("${confagent.promtail.startCmd:systemctl start promtail.service}") private String startCmd; @Value("${confagent.promtail.stopCmd:systemctl stop promtail.service}") private String stopCmd; private static String rootPath = Tool.WebPathUtil.getRootPath(); /** * @Description 获取promtail相关配置 * @Author rui * @Date 2021/3/24 */ @GetMapping("/config") public R queryConfig(){ Map cmdLine = ConfagentUtil.loadServiceConfigFile(promtailCmdLinePath); Map promtailConf = Tool.YamlUtil.readAsMap(promtailConfPath); String version = confagentUtil.readVersion(); Map result = new LinkedHashMap<>(); result.put("version",version); result.put("cmdline",cmdLine); result.put("config",promtailConf); return R.ok(result); } /** * @Description 写入promtail配置文件 * @Author rui * @Date 2021/3/25 */ @PostMapping("/config") public R overwriteConfig( @RequestBody Map configs){ Object version = configs.get("version"); File tf = Tool.FileUtil.file(rootPath, versionFile); log.debug("version file path : {}" ,tf.getAbsolutePath()); if(version==null){ return R.error(RCode.PROMTAIL_CONFIG_VERSION_ISNULL); }else { Tool.FileUtil.writeUtf8String(version.toString(), tf); } Map cmdLine =(Map) configs.get("cmdline"); Map promtailConf =(Map) configs.get("config"); if(!Tool.MapUtil.isEmpty(cmdLine)){ log.info("write promtail cmdLine conf:{}", Tool.JSONUtil.toJsonStr(cmdLine)); writeServiceConfigFile(cmdLine,promtailCmdLinePath); } if(!Tool.MapUtil.isEmpty(promtailConf)){ log.info("write promtail conf:{}", Tool.JSONUtil.toJsonStr(promtailConf)); Tool.YamlUtil.writeAsMap(promtailConf,promtailConfPath); } //重启服务promtail if(Tool.StrUtil.isNotBlank(stopCmd)) { log.info("stop cortex:"+stopCmd); try { Tool.RuntimeUtil.exec(stopCmd); }catch(Exception e) { log.error(e); return R.error(RCode.PROMTAIL_STOP_CMD_ERROR); } log.info("stop cortex:"+stopCmd+" end"); } Tool.ThreadUtil.sleep(1000); if(Tool.StrUtil.isNotBlank(startCmd)) { log.info("start cortex:"+startCmd); try { // String[] b={"sh","-c",startCmd}; // Tool.RuntimeUtil.exec(b); Tool.RuntimeUtil.exec(startCmd); }catch(Exception e) { log.error(e); return R.error(RCode.PROMTAIL_START_CMD_ERROR); } log.info("start cortex:"+startCmd+" end"); } return R.ok(); } /** * @Description 获取promtail相关配置版本 * @Author rui * @Date 2021/3/24 */ @GetMapping("/config/version") public R queryVersion(){ Map result = new HashMap<>(); String version = confagentUtil.readVersion(); result.put("version",version); return R.ok(result); } /** * @Description 写 promtail config.conf 启动参数配置文件 * @Author rui * @Date 2021/3/25 */ private void writeServiceConfigFile(Map conf,String path){ StringBuffer sb = new StringBuffer(); sb.append("OPTION=\""); for (Map.Entry entry:conf.entrySet()){ String key = entry.getKey(); String value = entry.getValue(); sb.append("--"+key+"="); sb.append("'"+value+"' "); } sb.append("\""); Tool.FileUtil.writeUtf8String(sb.toString(),path); } // private boolean reloadPromtail(){ // // UrlBuilder promtailReload = new UrlBuilder(); // int promtailPort = ConfagentUtil.getConfFilePort(promtailCmdLinePath, PROMTAIL_LISTEN_ADDR, DEFAULT_PROMTAIL_PORT); // promtailReload.setScheme("http").setHost(defaultPromtailIP).setPort(promtailPort).addPath("/-/reload"); // // String url = promtailReload.toString(); // HttpRequest post = Tool.HttpUtil.createPost(url); // HttpResponse response = post.execute(); // return 200 == response.getStatus(); // } }