У меня есть проект Java-Spring, в котором я хочу проверить счетчик http успешных / неуспешных ответов на панели инструментов Prometheus для определенного шаблона URL.Для этого я использую io.prometheus java liberary.Но я не знаю, как этого добиться.Я использую этот репозиторий: https://github.com/ankitsoni5/spring-prometheus.git
У меня есть класс ProductController, который показывает информацию о продукте.Итак, мне нужно проверить количество обращений http с кодом 200 и 500 на панели инструментов Prometheus для URL-адреса "/ products".Приложение работает в док-контейнере, а prometheus работает на centos7.Ниже упоминается файл Java.Я не знаю, как этого добиться.Нужна помощь.
package guru.springframework.controllers;
import guru.springframework.domain.Product;
import guru.springframework.services.ProductService;
import io.prometheus.client.CollectorRegistry;
import io.prometheus.client.Counter;
import io.prometheus.client.Gauge;
import io.prometheus.client.Histogram;
import io.prometheus.client.Summary;
import io.prometheus.client.exporter.HTTPServer;
import io.prometheus.client.exporter.common.TextFormat;
import java.io.IOException;
import java.io.Writer;
import java.net.InetSocketAddress;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.sun.net.httpserver.HttpServer;
@Controller
public class ProductController {
private ProductService productService;
public static Counter ProductRequestsTotal = Counter.build().namespace("java").name("my_counter").help("Total requests.").register();
public static Gauge gauge = Gauge.build().namespace("java").name("my_gauge").help("My gauge").register();
public static Histogram histogram = Histogram.build().namespace("java").name("my_histogram").help("My histogram").register();
public static Summary summary = Summary.build().namespace("java").name("my_summary").help("My summary").register();
public static Histogram requestHistogram = Histogram.build().namespace("java").name("request").help("Requets histogram").labelNames("statusCode").register();
private static double rand(double min, double max) {
return min + (Math.random() * (max - min));
}
@Autowired
public void setProductService(ProductService productService) {
this.productService = productService;
}
@RequestMapping(value = "/products", method = RequestMethod.GET)
public String list(Model model){
//ProductRequestsTotal.inc();
try {
new HTTPServer("0.0.0.0", 8080, true);
} catch (IOException e) {
e.printStackTrace();
}
try {
HttpServer server = HttpServer.create(new InetSocketAddress("0.0.0.0", 80), 1000);
server.createContext("/product-metric", httpExchange -> {
Date start = new Date();
int statusCode = 200;
if (!"GET".equalsIgnoreCase(httpExchange.getRequestMethod())) {
statusCode = 500;
}
httpExchange.sendResponseHeaders(statusCode, 0);
httpExchange.getResponseBody().close();
httpExchange.close();
long elapsedTime = (new Date()).getTime() - start.getTime();
requestHistogram.labels(String.valueOf(statusCode)).observe(elapsedTime);
});
Thread bgThread = new Thread(() -> {
while (true) {
try {
ProductRequestsTotal.inc();
gauge.set(rand(-5, 10));
histogram.observe(rand(0, 5));
summary.observe(rand(0, 5));
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
bgThread.start();
server.start();
} catch (IOException e) {
e.printStackTrace();
}
model.addAttribute("products", productService.listAllProducts());
System.out.println("Returning rpoducts:");
return "products";
}
@RequestMapping("product/{id}")
public String showProduct(@PathVariable Integer id, Model model){
model.addAttribute("product", productService.getProductById(id));
return "productshow";
}
@RequestMapping("product/edit/{id}")
public String edit(@PathVariable Integer id, Model model){
model.addAttribute("product", productService.getProductById(id));
return "productform";
}
@RequestMapping("product/new")
public String newProduct(Model model){
//newProductController.ProductRequestsNew.inc();
model.addAttribute("product", new Product());
return "productform";
}
@RequestMapping(value = "product", method = RequestMethod.POST)
public String saveProduct(Product product){
productService.saveProduct(product);
return "redirect:/product/" + product.getId();
}
@RequestMapping(path = "/product-metric")
public void metrics(Writer responseWriter) throws IOException {
TextFormat.write004(responseWriter, CollectorRegistry.defaultRegistry.metricFamilySamples());
responseWriter.close();
}
}