編寫。
- 本文僅僅是一個示例項目,後續加入springcloud等環境,將對其進行二次開發。
- 項目具體實施:
- 新建一個springboot項目,名稱爲prometheus-service
- 添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<!--自動重啓 -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
- 配置application.yml
server:
port: 9090
spring:
application:
name: prometheus-service
management:
endpoint:
metrics:
enabled: true
prometheus:
enabled: true
endpoints:
web:
exposure:
include: '*'
metrics:
export:
prometheus:
enabled: true
tags:
application: ${spring.application.name}
- 新建一個包com.yuji.job,新建JobMetrics類,完整代碼如下:
package com.yuji.job;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Component;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.binder.MeterBinder;
@Component
public class JobMetrics implements MeterBinder {
public Counter job1Counter;
public Counter job2Counter;
public Map<String, Double> map;
JobMetrics() {
map = new HashMap<>();
}
@Override
public void bindTo(MeterRegistry meterRegistry) {
this.job1Counter = Counter.builder("counter_builder_job_counter1")
.tags(new String[]{"name", "tag_job_counter1"})
.description("description-Job counter1 execute count").register(meterRegistry);
this.job2Counter = Counter.builder("counter_builder_job_counter2")
.tags(new String[]{"name", "tag_job_counter2"})
.description("description-Job counter2 execute count ").register(meterRegistry);
Gauge.builder("gauge_builder_job_gauge", map, x -> x.get("x"))
.tags("name", "tag_job_gauge")
.description("description-Job gauge")
.register(meterRegistry);
}
}
- 在該包裏模擬job任務,新建MyJob類,完整內容如下:
package com.yuji.job;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@EnableScheduling
public class MyJob {
private Integer count1 = 0;
private Integer count2 = 0;
@Autowired
private JobMetrics jobMetrics;
@Async("main")
@Scheduled(fixedDelay = 1000)
public void doSomething() {
count1++;
jobMetrics.job1Counter.increment();
jobMetrics.map.put("x", Double.valueOf(count1));
System.out.println("task1 count:" + count1);
if(count1%2==0){
System.out.println("%5==0");
jobMetrics.map.put("x", Double.valueOf(1));
}
}
@Async
@Scheduled(fixedDelay = 10000)
public void doSomethingOther() {
count2++;
jobMetrics.job2Counter.increment();
System.out.println("task2 count:" + count2);
}
}
- 新建一個controller包,新建CounterController類,代碼如下:
package com.yuji.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.yuji.job.JobMetrics;
@RestController
public class CounterController {
@Autowired
private JobMetrics jobMetrics;
@RequestMapping(value = "/counter1", method = RequestMethod.GET)
public void counter1() {
jobMetrics.job2Counter.increment();
}
@RequestMapping(value = "/counter2", method = RequestMethod.GET)
public void counter2() {
jobMetrics.job2Counter.increment();
}
@RequestMapping(value = "/gauge", method = RequestMethod.GET)
public void gauge(@RequestParam(value = "x") String x) {
System.out.println("gauge controller x" + x);
jobMetrics.map.put("x", Double.valueOf(x));
}
}
- 啓動項目,在瀏覽器輸入:http://localhost:9090/actuator/prometheus,如果執行成功,則springboot與prometheus集成成功。
- 將其放置於prometheus監控環境下實現grafana圖表顯示。
- prometheus環境搭建參考:
https://blog.csdn.net/qq_25337221/article/details/106206042
- 在prometheus配置該應用
# vim /etc/prometheus/prometheus.yml
添加如下代碼:
- job_name: 'springboot'
scrape_interval: 5s
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['ip:9090']
執行:
# ps -aux | grep prome
#kill -HUP 進程號
然後登陸前端prometheus查看prometheus界面,springboot是否添加成功。
- 使用grafana模板顯示springboot
- 下載https://grafana.com/grafana/dashboards/6756模板,
- 在grafana中添加數據源(之前的文檔已經添加,未添加可以參考下面的參考文檔或者本文摘要中提到的上一個文檔)。
- 導入模板
- 根據自己需要修改變量名,參照模板裏的教程。
至此,springboot與prometheus入門示例完畢。
本文文本材料:https://download.csdn.net/download/qq_25337221/12445404
- 參考鏈接:
- Prometheus+Grafana可視化監控SpringBoot項目 https://www.jianshu.com/p/762fa72ffe79
2. 爲springboot中自定義prometheus:https://www.cnblogs.com/xidianzxm/p/11542135.html
3. prometheus在java裏的基礎知識:https://www.cnblogs.com/xiezhengcai/p/prometheus.html
本內容由安康學院“雨季”原創。