天天看點

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();
    }
}
           

複制

效果如下

springmvc老舊系統prometheus 暴漏端點改造