SpringBoot + Prometheus + Grafana 实现自定义监控

1、Spring Boot 工程集成 Micrometer

 我们一般说 Spring Boot 集成 Micrometer 指的是 Spring 2.x 版本,因为在该版本 spring-boot-actuator 使用了 Micrometer 来实现监控,而在 Spring Boot 1.5x 中是可以通过micrometer-spring-legacy 来使用 micrometer。显然在 2.x 版本中有更高的集成度,使用起来也非常方便了。首先添加依赖如下:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--micrometer桥接prometheus-->
<dependency>
  <groupId>io.micrometer</groupId>
  <artifactId>micrometer-registry-prometheus</artifactId>
<!--            <version>1.1.4</version>-->
</dependency>

 这里引入了 io.micrometermicrometer-registry-prometheus 依赖以及 spring-boot-starter-actuator 依赖,因为该包对 Prometheus 进行了封装,可以很方便的集成到 Spring Boot 工程中。

 其次在 application.properties 中配置如下:

spring.application.name=metricsLocalTestApp
server.port=9000

management.server.port=9001
management.endpoints.web.exposure.include=*
management.endpoint.metrics.enabled=true
management.endpoint.prometheus.enabled=true

management.metrics.export.prometheus.enabled=true
management.metrics.tags.application=${spring.application.name}
  • 这里 management.endpoints.web.exposure.include=* 配置为开启 Actuator 服务,因为Spring Boot Actuator 会自动配置一个 URL 为 /actuator/Prometheus 的 HTTP 服务来供 Prometheus 抓取数据,不过默认该服务是关闭的,该配置将打开所有的 Actuator 服务。

  • management.metrics.tags.application 配置会将该工程应用名称添加到计量器注册表的 tag 中去,方便后边 Prometheus 根据应用名称来区分不同的服务。

 然后在工程启动主类中添加 Bean 如下来监控 JVM 性能指标信息:

@SpringBootApplication
public class GatewayDatumApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayDatumApplication.class, args);
    }

    @Bean
    MeterRegistryCustomizer<MeterRegistry> configurer(
            @Value("${spring.application.name}") String applicationName) {
        return (registry) -> registry.config().commonTags("application", applicationName);
    }

}

 最后,我们再启动服务,然后在浏览器访问 http://127.0.0.1:9001/actuator/prometheus ,就可以看到服务的一系列不同类型 metrics 信息,例如 http_server_requests_seconds summaryjvm_memory_used_bytes gaugejvm_gc_memory_promoted_bytes_total counter 等等。

在这里插入图片描述

 到此,Spring Boot 工程集成 Micrometer 就已经完成,接下里就要与 Prometheus 进行集成了。


2、集成 Prometheus

 修改 Prometheus 的配置文件 prometheus.yml ,添加上边启动的服务地址来执行监控。这里使用的Prometheus版本是2.26.0

 Mac下安装 Prometheus + grafana,可参照:Mac部署Prometheus + Grafana监控

vim /usr/local/etc/prometheus.yml

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: "prometheus"
    static_configs:
    - targets: ["localhost:9090"]
  - job_name: "metricsLocalTest"
    metrics_path: "/actuator/prometheus"
    static_configs:
    - targets: ["localhost:9001"]

static_configs为静态配置方式,也可以采用 file_sd_configs 方式动态服务发现的方式,如:

scrape_configs:
  - job_name: "metricsLocalTest"
    metrics_path: "/actuator/prometheus"
    file_sd_configs:
      - files: ['/usr/local/*[自己电脑上的路径]*/*.json']

metricsLocalApplication.json 文件如下:

$ vim /usr/local/*[自己电脑上的路径]*/*.json
[
    {
        "targets": [
            "localhost:9001"
        ],
        // 可填可不填
        "labels": {
            "instance": "metricsLocalTest-instance",
            "service": "metricsLocalTest-service"
        }
    }
]

 这里 localhost:9001 就是上边本地启动的服务地址,也就是 Prometheus 要监控的服务地址。同时可以添加一些与应用相关的标签,方便后期执行 PromSQL 查询语句区分。最后重启 Prometheus 服务,查看 Prometheus UI 界面确认 Target 是否添加成功。

 Status=》Targets

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3NQwQpn9-1624960144747)(/Users/heguitang/Library/Application Support/typora-user-images/image-20210623172051224.png)]

我们也可以在 Graph 页面执行一个简单的查询,也是获取 metricsLocalTest 服务的 JVM 性能指标值的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0HUPVeCG-1624960144748)(/Users/heguitang/Library/Application Support/typora-user-images/image-20210623172542302.png)]


3、使用 Grafana Dashboard 展示监控项

 Prometheus 现在已经可以正常监控到应用 JVM 信息了,我们可以配置 Grafana Dashboard 来优雅直观的展示出来这些监控值了。

 Mac下安装 Prometheus + grafana,可参照:Mac部署Prometheus + Grafana监控

配置数据源

 首先启动 Grafana,在浏览器中访问 http://localhost:3000 即可,首次登录需要使用默认账号密码 admin/admin进行登录。 登录完毕,我们就可以配置Prometheus数据源,数据源配置如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9YSeS7va-1624960144750)(/Users/heguitang/Library/Application Support/typora-user-images/image-20210623173856306.png)]

点击Add data source,搜索 Prometheus 数据源,然后填入 Prometheus 的访问地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rIwchKvO-1624960144751)(/Users/heguitang/Library/Application Support/typora-user-images/image-20210623174020202.png)]

在此,Prometheus 数据源配置就完成了。然后点击Save & Test,提示正常连接,就可以使用了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hqnflw0r-1624960144752)(/Users/heguitang/Library/Application Support/typora-user-images/image-20210623174113818.png)]

配置面板

 数据源配置完成后,就可以选择面板,来渲染数据。JVM 数据监控,有现成的面板,我们直接使用即可,模板编号为4701

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7svCgScw-1624960144753)(/Users/heguitang/Library/Application Support/typora-user-images/image-20210623174600443.png)]

导入对应的模板

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l3uRsquX-1624960144753)(/Users/heguitang/Library/Application Support/typora-user-images/image-20210623174728899.png)]

导入完毕后,就可以看到 JVM监控指标测试 各种类型指标监控图形化以后的页面。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gKhy2sTY-1624960144755)(/Users/heguitang/Library/Application Support/typora-user-images/image-20210623174905434.png)]
Application可以选择我们的应用。


4、自定义监控指标并展示到 Grafana

 上边是 spring-boot-actuator 集成了 Micrometer 来提供的默认监控项,覆盖 JVM 各个层间的监控,配合 Grafana Dashboard 模板基本可以满足我们日常对 Java 应用的监控。当然,它也支持自定义监控指标,实现各个方面的监控,例如统计访问某一个 API 接口的请求数,统计实时在线人数、统计实时接口响应时间等功能,而这些都可以通过使用Micrometer来实现。接下来,来演示下如何自定义监控指标并展示到 Grafana 上。

监控所有API请求次数

 监控请求次数可以使用 Counter 计数器来处理,这里是为测试,直接在Controller类中进行累计,项目中,可以使用一个AOP切面,通过切面注入可以做到统计所有请求记录。

Java 代码如下所示:

@RestController
@RequestMapping("/gateway/metrics")
public class GrafanaTestController {
    @Autowired
    private MeterRegistry meterRegistry;
    private Counter counter;

    @PostConstruct
    public void init() {
        Tags tags = Tags.of("common", "test");
        // 公共标签
        meterRegistry.config().commonTags(tags);
        counter = Counter.builder("metrics.request.common").register(meterRegistry);
    }

    /**
     * 订单请求测试
     */
    @GetMapping("/order/{appId}")
    public RestResponse<String> orderTest(@PathVariable("appId") String appId) {
        counter.increment();
        return RestResponse.ok(appId);
    }

    /**
     * 产品请求测试
     */
    @GetMapping("/product/{appId}")
    public RestResponse<String> productTest(@PathVariable("appId") String appId) {
        counter.increment();
        return RestResponse.ok(appId);
    }
}

 然后分别访问接口/order/{appId}8次,访问接口/product/{appId}6次,然后再去 Promtheus 中去查询数据,可以看到结果为14

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FOXYyJn0-1624960144755)(/Users/heguitang/Library/Application Support/typora-user-images/image-20210623180715779.png)]

标签为我们打的公共标签。

 在这里简单解释一下带条件的查询语句,如:metrics_request_common_total{application="metricsLocalTestApp", common="test", instance="localhost:9001"},与上面使用的metrics_request_common_total等价,其中:

  • metrics_request_common_total 为上边代码中设置的 Counter 名称。
  • application 为初始化 registry 时设置的通用标签,标注应用名称,这样做好处就是可以根据应用名称区分不同的应用。
  • instance<local_dir>/metricsLocalApplication.json 中配置的 instance 实例名称,用来区分应用实例。
  • common 为上边代码中设置的 Counter 标签名称,可以用来区分不同的方法,这样就不用为每一个方法设置一个 Counter 了。

接下来,我们在 Grafana Dashboard 上添加一个新的 Panel 并添加 Query 查询,最后图形化展示出来。

 1、首先添加一个 Panel,并命名为 自定义监控指标,选择想要展示的图形,如:这些图、柱状图等。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z8XLWoeC-1624960144756)(/Users/heguitang/Library/Application Support/typora-user-images/image-20210629173022944.png)]

 2、然后增加一个新的 Query 查询,查询语句为上边的 PromSQL 语句,不过这里为了更好的扩展性,我们可以将 applicationinstance 两个参数赋值为变量,而这些变量可以直接从 Prometheus 上传递过来,最终的查询语句为 metrics_request_common_total,最后修改 Title 为 访问量测试,保存一下,返回首页就可以看到刚添加的 Dashboard 了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ByxUszso-1624960144757)(/Users/heguitang/Library/Application Support/typora-user-images/image-20210629174015898.png)]

分类监控API请求次数

 上边针对订单请求和产品请求,统计了接口调用的总次数,但是有时候,我们需要统计每个接口的调用次数,这个该如何实现呢?监控请求次数可以继续使用 Counter 计数器,不同的是,我们每个请求中的 Counter 的名称和标签不一样,和接口信息有关。

/**
 * 订单请求测试
 */
@GetMapping("/order/{appId}")
public RestResponse<String> orderTest(@PathVariable("appId") String appId) {
  counter.increment();
  Counter.builder("metrics.request.count").tags("appMark", appId, "apiCode", "order").register(meterRegistry).increment();
  return RestResponse.ok(appId);
}

/**
 * 产品请求测试
 */
@GetMapping("/product/{appId}")
public RestResponse<String> productTest(@PathVariable("appId") String appId) {
  counter.increment();
  Counter.builder("metrics.request.count").tags("appMark", appId, "apiCode", "product").register(meterRegistry).increment();
  return RestResponse.ok(appId);
}

 同样的,我们分别访问接口/order/{appId}8次,访问接口/product/{appId}6次,然后再去 Promtheus 中去查询数据,可以看到结果分别为8和6。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kD3OaLJy-1624960144757)(/Users/heguitang/Library/Application Support/typora-user-images/image-20210623180842420.png)]

 Grafana 的图形界面展示操作,和监控所有API请求次数一致。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jmeter,PrometheusGrafana是一些在Windows操作系统上常用的工具。这些工具都有着不同的功能和用途,可以帮助我们进行性能测试和监控。 首先是jmeter,它是一个开源的Java应用程序,用于对各种协议(如HTTP,FTP,JMS等)进行负载测试。通过使用jmeter,我们可以模拟大量用户同时对应用程序进行请求,以测试其性能和稳定性。在Windows上使用jmeter十分方便,只需要下载并安装Java Runtime Environment(JRE)即可。 另一个工具是Prometheus,它是一个开源的监控系统和时间序列数据库。Prometheus可以收集和存储应用程序的指标数据,并提供强大的查询和可视化功能。在Windows上使用Prometheus,我们可以通过下载二进制文件并启动Prometheus服务器,然后配置其监控对象,并通过其提供的API接口获取数据。 最后是Grafana,它是一个开源的可视化仪表板工具,可以与Prometheus集成,用于创建漂亮的监控和分析仪表板。通过Grafana,我们可以将Prometheus收集的数据进行可视化展示,并添加各种图表、报表、警报和过滤器等。在Windows上使用Grafana,我们需要下载并安装Grafana软件,并通过其提供的界面配置数据源连接和仪表板的创建。 总结来说,在Windows操作系统上,我们可以使用jmeter进行负载测试,Prometheus进行监控数据的收集和存储,以及Grafana进行数据的可视化展示。这些工具的组合可以帮助我们实现全面的性能测试和监控,提供更好的应用程序性能分析和问题排查能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值