项目中看到了有埋点监控、报表、日志分析,有点兴趣想慢慢捣鼓一下

1. 数据埋点

监控机器环境的性能和业务流程或逻辑等各项数据,并根据这些数据生成对应的指标,那么我们就称为数据埋点。比如我们想知道某个接口调用的 TPS、机器 CPU 的使用率,这些都可以用到数据埋点

2. Micrometer

Micrometer 为流行的各种监控系统提供了一个简单的门面(类似于日志门面) —— 提供了与供应商无关的接口(counters,timers,gauges等),这些接口称为 meter 接口,其由 MeterRegistry 创建并保存,可理解为 MeterRegistry 是个集合里面存储了各种 meter 的度量数据,下面展示最简单的 counter 接口的使用

2.1 简单使用

其还有 timers、gauges 等接口,自行查阅

// 创建一个 meter 注册中心
MeterRegistry registry = new SimpleMeterRegistry(); // 创建一个名为 test 度量
Counter counter = meterRegistry.counter("test"); // 让这个度量的计数加 1
counter.increment();

就是如此简单,比如在调用指定接口的时候,可以使用 counter 接口来度量调用的次数,频率等等

2.2 命名规范

Micrometer 命名用 . 分隔小写单词字符,在接入其他监控系统时会自动将命名转成其适应的格式(或者可重写一个 NamingConvention 转换器来覆盖默认命名转换)。而且还支持多标签来量化,即有了多维度的度量,使统计更加丰富。下面简单地举例命名规范:

# 表示 http 请求
Counter counter = meterRegistry.counter("http.server.requests"); # 表示 http 请求中,请求 user 模块
Counter counter = meterRegistry.counter("http.server.requests", "user"); # 表示 http 请求中,请求 user 模块中,请求 login 登录方法
Counter counter = meterRegistry.counter("http.server.requests", "user", "login");

3. SpringBoot Actuator

SpringBoot Actuator 其底层使用了 Mircometer ,可度量 SpringBoot 应用和获取它的各项指标,可通过 HTTP 或 JMX 来调用 Actuator 暴露的各种端点,然后就可以获取一个正在运行中的应用的内部状态

当然内部指标并不是所有都可以向外暴露的,所以我们得有选择的开放,或者加入权限校验之后才能获取如下内容:

  • 有那些可配置的属性
  • 各依赖包的日志级别
  • 占用了多少内存
  • HTTP 埋点被请求了多少次
  • 应用本身以及协作的外部服务的健康状态
  • ......

3.1 添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.4.3</version>
</dependency>

3.2 基础配置

management:
server:
port: 9090 # 一般启动独立端口(默认和应用端口一致),启用后源端口不可查
endpoints:
web:
base-path: /actuator # 默认前缀路径,可修改
exposure:
include: health,info,metrics # 向外暴露的端点,可用通配符('*',需要单引号)
exclude: env,heapdump # 排除暴露的端点

3.3 查看可消费的端点

可先用 HTTP 访问 localhost:9090/actuator 来获取 HATEOAS(可简单理解为暴露的端点文档),它是所有可暴露端点的地图,可通过属性对应的地址来获取的指标,内容如下:

{
"_links": {
"self": {
"href": "http://localhost:9090/actuator",
"templated": false
},
"health-path": {
"href": "http://localhost:9090/actuator/health/{*path}",
"templated": true
},
"health": {
"href": "http://localhost:9090/actuator/health",
"templated": false
},
"info": {
"href": "http://localhost:9090/actuator/info",
"templated": false
}
}
}

3.4 获取应用的基本信息

消费对应的指标,就在地址后面加上名字即可。应用的基本信息是需要自己配置的,没有默认值,所以首次访问 可访问 localhost:9090/actuator/info 是一个空 json。

可配置 info 开头的属性,比如联系方式,应用的作用等等,其配置和消费结果如下:

info:
contact:
email: support@howl.com
phone: 123456789
description: actuator test application # 消费结果
{
"contact": {
"email": "support@howl.com",
"phone": 123456789
},
"description": "actuator test application"
}

3.5 健康指标

首先尝试访问 localhost:9090/actuator/health,就可以获取指标内容了

{
"status": "UP"
}

这里显示的是一个或多个健康指示器的聚合状态,即当前应用和与之交互的外部系统(数据库,消息队列,Eureka等等)的健康状态的聚合状态。我们可以添加如下配置来获取健康指示器的内聚状态

management:
endpoint:
health:
show-details: always # 消费结果
{
"status": "UP",
"components": {
"diskSpace": {
"status": "UP",
"details": {
"total": 493516484608,
"free": 436332154880,
"threshold": 10485760,
"exists": true
}
},
"ping": {
"status": "UP"
}
}
}

SpringBoot 的自动配置功能可以确保只有与应用交互的组件才会显示到 health 里面

3.6 指标端点 metrics

可访问如下地址来获取 Actuator 提供的开箱即用的指标分类,包括了内存、处理器、垃圾收集、HTTP请求等指标

http://localhost:9090/actuator/metrics

# 消费结果
{
"names": [
"http.server.requests",
"jvm.buffer.count",
"jvm.buffer.memory.used",
"jvm.buffer.total.capacity",
"jvm.classes.loaded",
"jvm.classes.unloaded",
"jvm.gc.live.data.size",
"jvm.gc.max.data.size",
"jvm.gc.memory.allocated",
"jvm.gc.memory.promoted",
"jvm.gc.pause",
"jvm.memory.committed",
"jvm.memory.max",
"jvm.memory.used",
"jvm.threads.daemon",
"jvm.threads.live",
"jvm.threads.peak",
"jvm.threads.states",
"logback.events",
"process.cpu.usage",
"process.start.time",
"process.uptime",
"system.cpu.count",
"system.cpu.usage",
"tomcat.sessions.active.current",
"tomcat.sessions.active.max",
"tomcat.sessions.alive.max",
"tomcat.sessions.created",
"tomcat.sessions.expired",
"tomcat.sessions.rejected"
]
} # 可用标准地址 + 指标端点名字 来消费某个指标端点
http://localhost:9090/actuator/metrics/http.server.requests

4. 实例

统计 /user/login 接口被调用的次数,meterRegistry 注册中心在自动配置中加入容器可直接使用

4.1 测试接口

启动应用,然后多次访问这个接口

@RestController
@RequestMapping("/user")
public class UserController { @Autowired
SimpleMeterRegistry meterRegistry; @GetMapping("/login")
public String userLogin() {
Counter counter = meterRegistry.counter("http.server.requests", "uri", "/user/login");
counter.increment();
return "登录成功";
}
}

4.2 消费指标端点

访问如下地址即可消费端点

http://localhost:9090/actuator/metrics/http.server.requests?tag=uri:/user/login

# 消费结果
# 可以看到这个接口度量(COUNT)了 18次 访问(数据做了部分清除)
{
"name": "http.server.requests",
"baseUnit": "seconds",
"measurements": [
{
"statistic": "COUNT",
"value": 18.0
}
],
"availableTags": [
{
"tag": "method",
"values": [
"GET"
]
}
]
}

5. SpringBoot Admin

使用上面的地址访问指标很不友好,不可能看一堆这样的数据,得使用一些美化的 UI 界面,SpringBoot Admin 就提供了这样的框架

SpringBoot Admin 作为简单的监控,分为 服务器端 和 客户端

5.1 Admin 服务器端

作为监控的服务端一般是在另外一台服务器上部署的,然后这台服务器会定时去配置好的地址里面拉取监控的指标数据

5.1.1 启用功能、添加依赖

在初始化应用的时候在 Spring Initializr 也可以选择

@EnableAdminServer
@SpringBootApplication
public class AdminApplication {
public static void main(String[] args) {
SpringApplication.run(AdminApplication.class, args);
}
}
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.4.3</version>
</dependency>

5.1.2 选择一个端口

server:
port: 10000

5.1.3 访问

直接访问 10000 端口即可,当然现在没有东西可以监控,主页面是空白没应用的

5.2 Client 客户端

5.2.1 添加依赖

<!--  actuator  -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.4.3</version>
</dependency> <!-- admin-client -->
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.4.3</version>
</dependency>

5.2.2添加配置

# 服务端用客户端的主机名来通信,但在虚拟机上客户端主机名会解析不正确,导致实例一直下线状态
# 此时需要如下配置 spring:
application:
name: actuatorApplicaton
boot:
admin:
client:
url: http://admin-serve-ip:10000 # 向服务端定时发送请求
instance:
service-url: http://admin-client-ip:8080 # 主页
management-base-url: http://admin-client-ip:9090 # 各类指标的基础地址

5.2.3 访问 admin-serve

访问即可发现有个应用的指标被获取了,然后里面可以看各种已经暴露的端点指标

5.3 Eureka 服务器发现

上面每启动一个客户端都要手动进行配置监控的 IP 地址很是麻烦,既然微服务架构有服务发现机制的,那么我们可以在监控的服务端上配置 Eureka 的地址,那么 Admin-Server 就会去注册中心获取地址再去拉取指标

5.3.1 加依赖

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.4.3</version>
</dependency>

5.3.2 添加配置

eureka:
client:
service-url:
defaultZone: http://xxx.xxx.xxx.xxx:xxx/eureka/

6 缺点

笔者个人觉得个人小型项目用这个组合来监控埋点已经足够了,加上警告处理都是很不错的选择,但是 SpringBoot Admin 只能监控短时间内的应用信息,如果需要各时间段的监控那么就需要有时序数据库的支持(比如查看这个月内的统计信息),这些就显得无能为力了。

当然还是有代替方案的:

  • Actuator:埋点操作
  • Promethus:定期去 actuator 拉取数据并以时序的形式存储(内部有时序数据库)
  • Granfan:用户友好的 UI 数据展示,展示 Promethus 的数据

后面笔者还会写一篇 Promethus 监控的笔记

SpringBoot Actuator — 埋点和监控的更多相关文章

  1. SpringBoot Actuator & SpringBoot Admin

    SpringBoot Actuator提供了很多监控和管理你的spring boot应用的HTTP或者JMX端点,并且你可以有选择地开启和关闭部分功能. 当你的spring boot应用中引入依赖之后 ...

  2. SpringBoot入门教程(十)应用监控Actuator

    Actuator可能大家非常熟悉,它是springboot提供对应用自身监控,以及对应用系统配置查看等功能.spring-boot-starter-actuator模块的实现对于实施微服务的中小团队来 ...

  3. SpringBoot actuator 应用监控。

    前言 : 今天在阅读 <SpringCloud微服务实战>一书时看到了SpringBoot actuator相关知识,并且自己也本地调试实践.觉得SpringBoot这一套监控还是挺有意思 ...

  4. springcloud(九) springboot Actuator + admin 监控

    前一章讲的都是Feign项目(调用方)的监控.接下来讲的是服务提供方的监控 一.springboot actuator + springboot admin Spring Boot Admin 是一个 ...

  5. Springboot监控之一:SpringBoot四大神器之Actuator之3-springBoot的监控和管理--指标说明

    Spring Boot包含很多其他的特性,它们可以帮你监控和管理发布到生产环境的应用.你可以选择使用HTTP端点,JMX或远程shell(SSH或Telnet)来管理和监控应用.审计(Auditing ...

  6. SpringBoot Actuator监控【转】

    springboot actuator 监控 springboot1.5和springboot2.0 的actuator在启动日志上的差异就很大了. springboot1.5在启动时会打印很多/XX ...

  7. springboot actuator 配置安全

    springboot actuator监控是什么?类似php的phpinfor()函数,不过actuator更强大,可以查看的数据.状态更多.Actuator是Spring Boot提供的对应用系统的 ...

  8. 十五:SpringBoot-配置Actuator组件,实现系统监控

    SpringBoot-配置Actuator组件,实现系统监控 1.Actuator简介 1.1 监控组件作用 1.2 监控分类 2.SpringBoot整合Actuator 2.1 核心依赖Jar包 ...

  9. SpringBoot Actuator

    SpringBoot Actuator 提供了检查项目内部信息的一整套API,通常在项目启动时可以看到. 1.引入依赖包 <dependency> <groupId>org.s ...

随机推荐

  1. YbtOJ#643-机器决斗【贪心,李超树】

    正题 题目链接:https://www.ybtoj.com.cn/problem/643 题目大意 \(n\)个机器人,第\(i\)个攻击力为\(A_i\),防御为\(D_i\). 然后你每次可以对一 ...

  2. P3273-[SCOI2011]棘手的操作【线段树,并查集】

    正题 题目链接:https://www.luogu.com.cn/problem/P3273 题目大意 \(n\)个点有权值,要求支持操作 连接两个点 单点加权 联通块加权 全图加权 单点询问 联通块 ...

  3. .NET 排序 Array.Sort<T> 实现分析

    System.Array.Sort<T> 是.NET内置的排序方法, 灵活且高效, 大家都学过一些排序算法,比如冒泡排序,插入排序,堆排序等,不过你知道这个方法背后使用了什么排序算法吗? ...

  4. CSS 小技巧 | 一行代码实现头像与国旗的融合

    到国庆了,大家都急着给祖国母亲庆生. 每年每到此时,微信朋友圈就会流行起给头像装饰上国旗,而今年又流行这款: emm,很不错. 那么,将一张国旗图片与我们的头像,快速得到想要的头像,使用 CSS 如何 ...

  5. Http Only Cookie保护AccessToken

    前言 JWT认证方式目前已被广泛使用,一直以来我们将token放在请求头中的Authorization中,若通过此种方式,一旦token被恶意窃取,攻击者可肆意对用户可访问资源进行任意索取,我们大多都 ...

  6. The type name or alias SqlServer could not be resolved.Please check your configuration

    The type name or alias SqlServer could not be resolved.Please check your configuration file.... 检查一下 ...

  7. 题解「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set

    题目传送门 题目大意 给出一个长度为 \(n\) 的数组,选出一些数异或之和为 \(s1\),其余数异或之和为 \(s2\),求 \(s1+s2\) 最大时 \(s1\) 的最小值. 思路 你发现如果 ...

  8. Chrome 实时字幕

    Chrome 实时字幕

  9. TypeError: Restaurant() takes no arguments

    1. 错误描述 TypeError: Restaurant() takes no arguments 2. 原因:在编写__init__时,pycharm会自动添加关键字,有时会直接写称整型int, ...

  10. javascript-jquery的基本方法

    1.去除字符串中两端的空格$.trim(str) var str1=" 123 " $.trim(str1);//123 2.遍历对象的数据并进行操作$.each(obj,func ...