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();
}
}
複制
效果如下
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pn5GcuUjZiBjN0MTNhdzN3IWOzIWYmRzY0QzM4Q2YmBDOmFzMvwlN4MjNxITMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)