Как Prometheus Metrics работает в Java Spring - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть проект 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();
}

}

...