在服务中起一个监听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);
}
}
}
标签:httpExchange,springboot,oom,micrometer,meter,server,Prometheus,new,prometheusMet
From: https://www.cnblogs.com/tyli/p/17898883.html