到目前为止,各种日志收集,统计监控开源组件数不胜数,即便如此还是会有很多人只是tail -f查看一下日志文件。随着容器化技术的成熟,日志和metrics度量统计已经不能仅仅靠tail -f来查看了,你甚至都不能进入部署的机器。因此,日志收集和metrics统计就必不可少。日志可以通过logstash或者filebeat收集到ES中用来查阅。对于各种统计指标,springboot提供了actuator组件,可以对cpu, 内存,线程,request等各种指标进行统计,并收集起来。本文将粗略的集成influxdb来实现数据收集,以及使用Grafana来展示。

最终dashboard模板: https://github.com/Ryan-Miao/boot-metrics-exporter/blob/master/grafana/grafana-dashboard-template.json

最终获得如下统计报表:

对于redis cache命中率的统计:

对于单独重要request的统计

基于health check的alert



安装influxdb和Grafana

安装influxdb:

https://www.cnblogs.com/woshimrf/p/docker-influxdb.html

安装Grafana:

https://www.cnblogs.com/woshimrf/p/docker-grafana.html

Springboot配置

可以直接使用封装好的starter:

https://github.com/Ryan-Miao/boot-metrics-exporter

或者:

引入依赖

        <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-influx</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

定义MeterConfig, 用来统一设置一些tag,比如instance id

@Component
public class MeterConfig implements MeterRegistryCustomizer { private static final Logger LOGGER = LoggerFactory.getLogger(MeterConfig.class); @Override
public void customize(MeterRegistry registry) {
try {
String hostAddress = InetAddress.getLocalHost().getHostAddress();
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("设置metrics实例id为ip:" + hostAddress);
}
registry.config().commonTags("instance-id", hostAddress);
} catch (UnknownHostException e) {
String uuid = UUID.randomUUID().toString();
registry.config().commonTags("instance-id", uuid);
LOGGER.error("获取实例ip失败,设置实例id为uuid:" + uuid, e);
}
}
}

添加对应的配置:

management:
metrics:
export:
influx:
db: my-db
uri: http://192.168.5.9:8086
user-name: admin
password: admin
enabled: true
web:
server:
auto-time-requests: true
tags:
app: ${spring.application.name}

这里选择将metric export到influxdb,还有很多其他存储方案可选。

网络配置

grafana和influxdb可能部署在某个vpc,比如monitor集群。而需要收集的业务系统则遍布在各个业务线的vpc内,因此需要业务集群打通访问influxdb的网络和端口。

自定义Metrics

Springboot actuator暴露的health接口只有up/down的选择,在grafana如何使用这个来判断阈值,我还没找到,于是转换成了数字。

自定义MeterBinder

import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.binder.MeterBinder;
import lombok.Data; @Data
public class HealthMetrics implements MeterBinder { /**
* 100 up
* 0 down
* 0 unknown
*/
private Integer health = 100; @Override
public void bindTo(MeterRegistry registry) {
Gauge.builder("health", () -> health)
.register(registry);
}
}

定义每30s更新一下状态:

public abstract class AbstractHealthCheckStatusSetter {
private final HealthMetrics healthMetrics; protected AbstractHealthCheckStatusSetter(HealthMetrics healthMetrics) {
this.healthMetrics = healthMetrics;
} /**
* 修改health的状态定义。修改HealthMetrics.health的value。
*/
public abstract void setHealthStatus(HealthMetrics h); /**
* 定时更新health统计.
*/
@PostConstruct
void doSet() {
ScheduledExecutorService scheduledExecutorService = new ScheduledThreadPoolExecutor(1);
scheduledExecutorService.scheduleWithFixedDelay(
() -> setHealthStatus(healthMetrics), 30L, 30L, TimeUnit.SECONDS);
} }

实现类

public class HealthCheckStatusSetter extends AbstractHealthCheckStatusSetter {
private final HealthEndpoint healthEndpoint; public HealthCheckStatusSetter(HealthMetrics healthMetrics, HealthEndpoint healthEndpoint) {
super(healthMetrics);
this.healthEndpoint = healthEndpoint;
} @Override
public void setHealthStatus(HealthMetrics healthMetrics) {
Health health = healthEndpoint.health();
if (health != null) {
Status status = health.getStatus();
switch (status.getCode()) {
case "UP": {
healthMetrics.setHealth(100);
break;
}
case "DOWN":
;
case "UNKNOWN":
;
default: {
healthMetrics.setHealth(0);
break;
} }
} } }

加入配置

    @Bean
@ConditionalOnMissingBean
public HealthMetrics healthMetrics() {
return new HealthMetrics();
} /**
* 这里采用healthEndpoint来判断系统的健康状况。如果有别的需要,可以实现AbstractHealthCheckStatusSetter,自己设置health.
*/
@Bean
@ConditionalOnMissingBean
@ConditionalOnBean(HealthEndpoint.class)
public AbstractHealthCheckStatusSetter healthCheckSchedule(HealthEndpoint healthEndpoint, HealthMetrics healthMetrics) {
return new HealthCheckStatusSetter(healthMetrics, healthEndpoint);
}

Redis cache命中率统计

整套metrics监控是基于Spring boot actuator来实现的,而actuator是通过io.micrometer来做统计的。那么就可以通过自定义micrometer metrics的方式来添加各种metric。比如我们常用redis作为缓存,那么缓存的命中率是我们所关注的。可以自己写一套counter来记录:命中hit+1,没命中miss+1.

也可以直接使用redisson。

我们使用RedissonCache来集成spring cache, 此时cache的命中统计指标就已经被收集好了。



Cache基本统计指标的定义:

然而,统计的结果是按行存储的:

怎么基于此计算命中率呢?

hit-rate= sum(hit)/sum(hit+miss)

因此,我手动对这个序列做了整合:

DROP CONTINUOUS QUERY cq_cache_hit ON my-db

DROP CONTINUOUS QUERY cq_cache_miss ON my-db

DROP measurement cache_hit_rate

CREATE CONTINUOUS QUERY "cq_cache_hit" ON "my-db" RESAMPLE EVERY 10m BEGIN SELECT sum("value") AS hit  INTO "cache_hit_rate"  FROM "rp_30days"."cache_gets" WHERE ( "result" = 'hit') GROUP BY time(10m),"app", "cache"  fill(0) END

CREATE CONTINUOUS QUERY "cq_cache_miss" ON "my-db" RESAMPLE EVERY 10m BEGIN SELECT sum("value") AS miss  INTO "cache_hit_rate"  FROM "rp_30days"."cache_gets" WHERE ( "result" = 'miss') GROUP BY time(10m),"app", "cache" fill(0) ENDD

监控告警

Grafana提供了alert功能,当查询的指标不满足阈值时,发出告警。

选择influxdb or Prometheus ?

关于收集metric指标的存储方案,大多数教程都是Prometheus, 生态比较完整。我当时之所以选择influxdb,仅仅是因为容器的网络问题。Prometheus需要访问实例来拉取数据,需要允许Prometheus访问业务网络,那我就得不停打通网络,而且,k8s集群不同的网络是不通的,没找到网络打通方案。而influx这种只要实例push数据。同样的,还可以选择es。

influxdb有单点局限性,以及数量大之后的稳定性等问题。需要合理的计算时间间隔的数据。比如,对于几天几个月等查询,提前汇总细粒度的统计。

还有一种据说可以无限扩展的方案就是OpenTSDB. 暂未研究。

会遇到的问题

当前demo是influxdb单点,极其脆弱,稍微长点的时间间隔查询就会挂掉,也只能用来做demo,或者只是查看最近15min这种简单的实时查看。对于近几个月,一年这种长时间聚合,只能提前做好聚合函数进行粗粒度的统计汇总。

参考

Springboot2 Metrics之actuator集成influxdb, Grafana提供监控和报警的更多相关文章

  1. Spring Boot 微服务应用集成Prometheus + Grafana 实现监控告警

    Spring Boot 微服务应用集成Prometheus + Grafana 实现监控告警 一.添加依赖 1.1 Actuator 的 /prometheus端点 二.Prometheus 配置 部 ...

  2. jmeter+influxdb+grafana性能测试监控

    背景: 话说Jmeter原生的监控确实太丑了,听大佬们在讨论Jmeter+InfluxDb+Grafana的监控,于是,为了有一个漂亮的测试报告,就手动开始进行部署. 安装步骤: 1.influxdb ...

  3. influxDB1.6版安装与配置(windows环境)、Jmeter+influxDB+Grafana性能监控

    influxDB1.6版安装与配置(windows环境).Jmeter+influxDB+Grafana性能监控 来源:https://blog.csdn.net/SwTesting/article/ ...

  4. 微服务监控之二:Metrics+influxdb+grafana构建监控平台

    系统开发到一定的阶段,线上的机器越来越多,就需要一些监控了,除了服务器的监控,业务方面也需要一些监控服务.Metrics作为一款监控指标的度量类库,提供了许多工具帮助开发者来完成自定义的监控工作. 使 ...

  5. 利用Metrics+influxdb+grafana构建监控平台(转)

    转自http://www.jianshu.com/p/fadcf4d92b0e 这里再配合Influxdb和Grafana可以构建一个非常漂亮的实时监控界面. Grafana监控界面 采集数据(Met ...

  6. influxdb + Grafana可视化监控平台

    在centos6.5上influxdb + Grafana监控平台配置: 1.RedHat and CentOS users can install the latest stable version ...

  7. 利用Metrics+influxdb+grafana构建监控平台

    https://blog.csdn.net/fishmai/article/details/51817429

  8. Spring Boot Actutaur + Telegraf + InFluxDB + Grafana 构建监控平台

    完成一套精准,漂亮图形化监控系统从这里开始第一步 Telegraf是收集和报告指标和数据的代理 它是TICK堆栈的一部分,是一个用于收集和报告指标的插件驱动的服务器代理.Telegraf拥有插件或集成 ...

  9. Spring Boot Actutaur + Telegraf + InFluxDB + Grafana 构建监控平台之应用数据分析

    本节将引入完美的granafa仪表板,在上节的基础上,并提出自己的一些监控数据的总结和看法 你可以有一个类似于这个的Dashboard,会引入监控Zimbra协作 本节环境采用的是centos7系统, ...

随机推荐

  1. FCN用卷积层代替FC层原因(转)

    原博客连接 : https://www.cnblogs.com/byteHuang/p/6959714.html CNN对于常见的分类任务,基本是一个鲁棒且有效的方法.例如,做物体分类的话,入门级别的 ...

  2. JVM GC系列 — GC算法

    一.前言 从本篇文章开始,将开始一个新的系列JVM.JVM是一个非常庞大且复制的技术体系,但是对于程序猿的升级,走向更高阶所必要经历的,曾经也下决心要好好学习一番,然而毅力不足都中途放弃. GC的作用 ...

  3. Java 生态圈知识汇总

    原文地址:github.com/aalansehaiy… 前言 有人认为编程是一门技术活,要有一定的天赋,非天资聪慧者不能及也.其实不然,笔者虽是计算机专业出身,但工作年限并不长,对于技术这碗饭有一些 ...

  4. SpringBoot(六) SpringBoot整合Swagger2(自动化生成接口文档)

    一:在上篇文章pom增加依赖: <dependency> <groupId>io.springfox</groupId> <artifactId>spr ...

  5. H5常用新特性

    html5新特性 [注意]这些新特性都有兼容性的问题,基本是IE9+以上版本的浏览器才支持,如果不考兼容性问题,可以大量使用这些新特性 html5新增的语义话标签 <header> :头部 ...

  6. RPM包安装——yum安装

    RPM包安装 yum安装 yum源文件解析 yum源文件保存在/etc/yum.repos.d/目录中,文件的扩展名一定是".repo",也就是说yum源文件配置只要是扩展名.re ...

  7. 升鲜宝V2.0_杭州生鲜配送行业,条码标签管理之批量打印标签与分配配送任务相关操作说明_升鲜宝生鲜配送系统_15382353715_余东升

       升鲜宝V2.0_杭州生鲜配送行业,条码标签管理之批量打印标签与分配配送任务相关操作说明_升鲜宝供应链管理生鲜配送系统    题外话,随着国家对食材安全这个行业重视性越来越强,最近国家又出具了一些 ...

  8. jQuery Migrate 插件用法

    jQuery Migrate是应用迁移辅助插件,是用于高级版本兼容低级版本辅助插件.例如jQuery版本用的是1.x,计划升级到3.x,就可以在页面删除1.x版本,换成3.x版本,如果有脚本错误,就引 ...

  9. [20190524]使用use_concat or_expand提示优化.txt

    [20190524]使用use_concat or_expand提示优化.txt --//上午看了链接https://connor-mcdonald.com/2019/05/22/being-gene ...

  10. 查看sybase IQ的执行计划

    在性能调优工作中,首要的事情是找出性能瓶颈.而针对数据库应用,由于商用数据库对上层应用来说是个黑盒,所以往往需要借助数据库的一些接口或工具来了解数据库的具体行为,并结合相关知识和业务进行调测.    ...