springmvc老旧系统prometheus 暴漏端点改造

springmvc 老破旧系统如何更好的接入prometheus+grafana的怀抱呢

依赖引入

        <properties>
            <io.prometheus.version>0.8.0</io.prometheus.version>
        </properties>
        
        <!-- The client -->
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient</artifactId>
            <version>${io.prometheus.version}</version>
        </dependency>
        <!-- Hotspot JVM metrics-->
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient_hotspot</artifactId>
            <version>${io.prometheus.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.prometheus/simpleclient_servlet -->
        <dependency>
            <groupId>io.prometheus</groupId>
            <artifactId>simpleclient_servlet</artifactId>
            <version>${io.prometheus.version}</version>
        </dependency>

映射配置

    <servlet>
        <servlet-name>metrics</servlet-name>
        <servlet-class>io.prometheus.client.exporter.MetricsServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>metrics</servlet-name>
        <url-pattern>/metrics</url-pattern>
    </servlet-mapping>

代码示例

import io.prometheus.client.Counter;
import io.prometheus.client.Histogram;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.math.RandomUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.common.base.BaseAction;

@Controller
public class SampleController  extends BaseAction{
	//计数器 有标签
	 static final Counter requests = Counter.build()
		     .name("sales_requests_total").labelNames("bizName").help("Total requests.").register();
	//计数器 无标签
	 static final Counter unSalesRequests = Counter.build()
		     .name("unSales_requests_total").help("Total requests.").register();
	//平均响应时间
	 static final Histogram requestLatency = Histogram.build()
		     .name("requests_latency_seconds").help("Request latency in seconds.").register();


    /**
     * sales累加值
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value="/sales")
    public @ResponseBody String sales(HttpServletRequest request, HttpServletResponse response){
    	requests.labels("sales").inc();
		return "ok";
    }
    /**
     * unSales累加值
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value="/unSales")
    public @ResponseBody String unSales(HttpServletRequest request, HttpServletResponse response){
    	unSalesRequests.inc();
		return "ok";
    }
    /**
     * 平均响应时间
     * @param request
     * @param response
     * @return
     * @throws InterruptedException 
     */
    @RequestMapping(value="/time")
    public @ResponseBody String time(HttpServletRequest request, HttpServletResponse response) throws InterruptedException{
    	Histogram.Timer start =requestLatency.startTimer();
    	long sleepTime=RandomUtils.nextInt(200);
    	System.out.println(sleepTime);
    	Thread.sleep(sleepTime);
    	start.observeDuration();
		return "ok";
    }
}

启动类暴漏默认端点

import io.prometheus.client.hotspot.DefaultExports;

import javax.annotation.PostConstruct;

import org.springframework.stereotype.Component;

@Component
public class Init {
    @PostConstruct
    public void init() {
        //输出JVM信息
        DefaultExports.initialize();
    }
}

效果如下

相关文章

这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原...
今天小编给大家分享的是一文解析spring中事务的传播机制,相...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓...