各个指标信息的详细描述:
| 序号 | 参数 | 参数说明 | 是否监控 | 监控手段 | 重要度 |
| — | — | — | — | — | — |
| JVM | | | | | |
| 1 | jvm.memory.max | JVM 最大内存 | | | |
| 2 | jvm.memory.committed | JVM 可用内存 | 是 | 展示并监控堆内存和 Metaspace | 重要 |
| 3 | jvm.memory.used | JVM 已用内存 | 是 | 展示并监控堆内存和 Metaspace | 重要 |
| 4 | jvm.buffer.memory.used | JVM 缓冲区已用内存 | | | |
| 5 | jvm.buffer.count | 当前缓冲区数 | | | |
| 6 | jvm.threads.daemon | JVM 守护线程数 | 是 | 显示在监控页面 | |
| 7 | jvm.threads.live | JVM 当前活跃线程数 | 是 | 显示在监控页面;监控达到阈值时报警 | 重要 |
| 8 | jvm.threads.peak | JVM 峰值线程数 | 是 | 显示在监控页面 | |
| 9 | jvm.classes.loaded | 加载 classes 数 | | | |
| 10 | jvm.classes.unloaded | 未加载的 classes 数 | | | |
| 11 | jvm.gc.memory.allocated | GC 时,年轻代分配的内存空间 | | | |
| 12 | jvm.gc.memory.promoted | GC 时,老年代分配的内存空间 | | | |
| 13 | jvm.gc.max.data.size | GC 时,老年代的最大内存空间 | | | |
| 14 | jvm.gc.live.data.size | FullGC 时,老年代的内存空间 | | | |
| 15 | jvm.gc.pause | GC 耗时 | 是 | 显示在监控页面 | |
| TOMCAT | | | | | |
| 16 | tomcat.sessions.created | tomcat 已创建 session 数 | | | |
| 17 | tomcat.sessions.expired | tomcat 已过期 session 数 | | | |
| 18 | tomcat.sessions.active.current | tomcat 活跃 session 数 | | | |
| 19 | tomcat.sessions.active.max | tomcat 最多活跃 session 数 | 是 | 显示在监控页面,超过阈值可报警或者进行动态扩容 | 重要 |
| 20 | tomcat.sessions.alive.max.second | tomcat 最多活跃 session 数持续时间 | | | |
| 21 | tomcat.sessions.rejected | 超过 session 最大配置后,拒绝的 session 个数 | 是 | 显示在监控页面,方便分析问题 | |
| 22 | tomcat.global.error | 错误总数 | 是 | 显示在监控页面,方便分析问题 | |
| 23 | tomcat.global.sent | 发送的字节数 | | | |
| 24 | tomcat.global.request.max | request 最长时间 | | | |
| 25 | tomcat.global.request | 全局 request 次数和时间 | | | |
| 26 | tomcat.global.received | 全局 received 次数和时间 | | | |
| 27 | tomcat.servlet.request | servlet 的请求次数和时间 | | | |
| 28 | tomcat.servlet.error | servlet 发生错误总数 | | | |
| 29 | tomcat.servlet.request.max | servlet 请求最长时间 | | | |
| 30 | tomcat.threads.busy | tomcat 繁忙线程 | 是 | 显示在监控页面,据此检查是否有线程夯住 | |
| 31 | tomcat.threads.current | tomcat 当前线程数(包括守护线程) | 是 | 显示在监控页面 | 重要 |
| 32 | tomcat.threads.config.max | tomcat 配置的线程最大数 | 是 | 显示在监控页面 | 重要 |
| 33 | tomcat.cache.access | tomcat 读取缓存次数 | | | |
| 34 | tomcat.cache.hit | tomcat 缓存命中次数 | | | |
| CPU | | | | | |
| 35 | system.cpu.count | CPU 数量 | | | |
| 36 | system.load.average.1m | load average | 是 | 超过阈值报警 | 重要 |
| 37 | system.cpu.usage | 系统 CPU 使用率 | | | |
| 38 | process.cpu.usage | 当前进程 CPU 使用率 | 是 | 超过阈值报警 | |
| 39 | http.server.requests | http 请求调用情况 | 是 | 显示 10 个请求量最大,耗时最长的 URL;统计非 200 的请求量 | 重要 |
| 40 | process.uptime | 应用已运行时间 | 是 | 显示在监控页面 | |
| 41 | process.files.max | 允许最大句柄数 | 是 | 配合当前打开句柄数使用 | |
| 42 | process.start.time | 应用启动时间点 | 是 | 显示在监控页面 | |
| 43 | process.files.open | 当前打开句柄数 | 是 | 监控文件句柄使用率,超过阈值后报警 | 重要 |
如果要查看具体的度量信息的话,直接在访问地址后面加上度量信息即可:
http://localhost:8080/actuator/metrics/jvm.buffer.memory.used
添加自定义的统计指标
除了使用metrics端点默认的这些统计指标外,我们还可以实现自定义统计指标,metrics提供了4中基本的度量类型:
-
gauge 计量器,最简单的度量类型,只有一个简单的返回值,他用来记录一些对象或者事物的瞬时值。
-
Counter 计数器 简单理解就是一种只增不减的计数器,它通常用于记录服务的请求数量,完成的任务数量,错误的发生数量
-
Timer 计时器 可以同时测量一个特定的代码逻辑块的调用(执行)速度和它的时间分布。简单来说,就是在调用结束的时间点记录整个调用块执行的总时间,适用于测量短时间执行的事件的耗时分布,例如消息队列消息的消费速率。
-
Summary 摘要)用于跟踪事件的分布。它类似于一个计时器,但更一般的情况是,它的大小并不一定是一段时间的测量值。在 micrometer 中,对应的类是 DistributionSummary,它的用法有点像 Timer,但是记录的值是需要直接指定,而不是通过测量一个任务的执行时间。
测试:
@RestController
public class UserController {
static final Counter userCounter = Metrics.counter(“user.counter.total”,“services”,“bobo”);
private Timer timer = Metrics.timer(“user.test.timer”,“timer”,“timersample”);
private DistributionSummary summary = Metrics.summary(“user.test.summary”,“summary”,“summarysample”);
@GetMapping(“/hello”)
public String hello(){
// Gauge
Metrics.gauge(“user.test.gauge”,8);
// Counter
userCounter.increment(1);
// timer
timer.record(()->{
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
summary.record(2);
summary.record(3);
summary.record(4);
return “Hello”;
}
}
访问 http://localhost:8080/hello 这个请求后在看 metrics 信息
多出了我们自定义的度量信息。
3.3 loggers
loggers是用来查看当前项目每个包的日志级别的。
默认的是info级别。
修改日志级别:
发送POST请求到 http://localhost:8080/actuator/loggers/[包路径]
请求参数为
{
“configuredLevel”:“DEBUG”
}
通过POSTMAN来发送消息
然后再查看日志级别发现已经变动了
控制台也可以看到
3.4 info
显示任意的应用信息。我们可以在 properties 中来定义
访问:http://localhost:8080/actuator/info
如果我们需要扩展Endpoint,这时我们可以自定义实现,我们可以在类的头部定义如下的注解
@Endpoint
@WebEndpoint
@ControllerEndpoint
@RestControllerEndpoint
@ServletEndpoint
再给方法添加@ReadOperation,@ WritOperation或@DeleteOperation注释后,该方法将通过JMX自动公开,并且在Web应用程序中也通过HTTP公开。
于方法的注解有以下三种,分别对应get post delete 请求
| Operation | HTTP method |
| — | — |
| @ReadOperation | GET |
| @WriteOperation | POST |
| @DeleteOperation | DELETE |
案例:
/**
- 自定义Endpoint
*/
@Component
@Endpoint(id = “sessions”)
public class MyHealthEndPoint {
/**
- @Selector 获取传递的参数
*/
@ReadOperation
public Info get(@Selector String name){
return new Info(name,“18”);
}
}
-
http
-
jmx [Java Management Extensions] Java管理扩展
放开jmx
放开 jmx 的 endpoint
management.endpoints.jmx.exposure.include=*
spring.jmx.enabled=true
通过jdk中提供的jconsole来查看
SpringBoot可以收集监控数据,但是查看不是很方便,这时我们可以选择开源的监控系统来解决,比如Prometheus
-
数据采集
-
数据存储
-
可视化
Prometheus在可视化方面效果不是很好,可以使用grafana来实现
6.1 Prometheus
先来安装Prometheus:官网:https://prometheus.io/download/ 然后通过wget命令来直接下载
wget https://github.com/prometheus/prometheus/releases/download/v2.28.1/prometheus-2.28.1.linux-amd64.tar.gz
然后配置Prometheus。
- job_name: ‘Prometheus’
static_configs:
metrics_path: ‘/actuator/prometheus’
scrape_interval: 5s
- targets: [‘192.168.127.1:8080’]
labels:
instance: Prometheus
-
job_name:任务名称
-
metrics_path: 指标路径
-
targets:实例地址/项目地址,可配置多个
-
scrape_interval: 多久采集一次
-
scrape_timeout: 采集超时时间
执行脚本启动应用
./prometheus --config.file=prometheus.yml
访问应用: http://ip:9090
然后在我们的SpringBoot服务中添加 Prometheus的端点,先添加必要的依赖
io.micrometer
micrometer-registry-prometheus
然后就会有该端点信息
Prometheus服务器可以周期性的爬取这个endpoint来获取metrics数据,然后可以看到
6.2 Grafana
可视化工具:https://grafana.com/grafana/download
通过wget命令下载
wget https://dl.grafana.com/oss/release/grafana-8.0.6-1.x86_64.rpm
sudo yum install grafana-8.0.6-1.x86_64.rpm
启动命令
sudo service grafana-server start
sudo service grafana-server status
访问的地址是 http://ip:3000 默认的帐号密码 admin/admin
登录进来后的页面
添加数据源:
添加Dashboards https://grafana.com/grafana/dashboards 搜索SpringBoot的 Dashboards
找到Dashboards的ID
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/3ee176e2fe52729357fe9d7c659ac860.jpeg)
最后
最后,强调几点:
- 1. 一定要谨慎对待写在简历上的东西,一定要对简历上的东西非常熟悉。因为一般情况下,面试官都是会根据你的简历来问的; 能有一个上得了台面的项目也非常重要,这很可能是面试官会大量发问的地方,所以在面试之前好好回顾一下自己所做的项目;
- 2. 和面试官聊基础知识比如设计模式的使用、多线程的使用等等,可以结合具体的项目场景或者是自己在平时是如何使用的;
- 3. 注意自己开源的Github项目,面试官可能会挖你的Github项目提问;
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。
面试答案
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
g" alt=“img” style=“zoom: 33%;” />
最后
最后,强调几点:
- 1. 一定要谨慎对待写在简历上的东西,一定要对简历上的东西非常熟悉。因为一般情况下,面试官都是会根据你的简历来问的; 能有一个上得了台面的项目也非常重要,这很可能是面试官会大量发问的地方,所以在面试之前好好回顾一下自己所做的项目;
- 2. 和面试官聊基础知识比如设计模式的使用、多线程的使用等等,可以结合具体的项目场景或者是自己在平时是如何使用的;
- 3. 注意自己开源的Github项目,面试官可能会挖你的Github项目提问;
我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油!
以上面试专题的答小编案整理成面试文档了,文档里有答案详解,以及其他一些大厂面试题目。
面试答案
[外链图片转存中…(img-AOhGT7mU-1713411012126)]
[外链图片转存中…(img-wEIW17Eo-1713411012126)]
[外链图片转存中…(img-gtcM2WIa-1713411012126)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!