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();
}
}
效果如下