springboot-micrometer潜在oom问题解决办法

发布时间 2023-12-13 13:46:20作者: 237237

在服务中起一个监听Prometheus 拉取的线程,在拉取完成之后清理调meterMap中内容比较多的tag,我这边是清理调gateway.requests.代码如下:

@Component
public class PrometheusMeterRegistryFactory {

    @Resource
    private PrometheusMeterRegistry prometheusMeterRegistry;


    @Value("${gatewayMeter.clearMinute:60}")
    private Integer clearMinute;


    @PostConstruct
    public void createHttpServer() {
        try {
            //创建一个Http服务
            HttpServer server = HttpServer.create(new InetSocketAddress(38888), 0);
            //服务设置一个针对/metrics路径请求的监听,并设置处理器HttpHandler
            server.createContext("/actuator/prometheus", httpExchange -> {
                //由PrometheusMeterRegistry抓取数据,它会将抓取的数据按Prometheus所需要的格式处理好
                String response = prometheusMeterRegistry.scrape();
                //接下来有httpExchange将数据返回给Prometheus服务器
                httpExchange.sendResponseHeaders(200, response.getBytes().length);
                try (OutputStream os = httpExchange.getResponseBody()) {
                    os.write(response.getBytes());
                }
                List<Meter> meters = prometheusMeterRegistry.getMeters();
                for (Meter meter : meters) {
                    if (meter.getId().getName().startsWith("gateway.requests")) {
                        prometheusMeterRegistry.remove(meter);
                    }
                }
            });
            //开启一个线程来处理Prometheus服务器抓取数据的请求
            new Thread(server::start).start();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}