Git统计代码
查看git上的个人代码量:
1 | git log --author="username" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' - |
结果示例:(记得修改 username)
1 | added lines: 120745, removed lines: 71738, total lines: 49007 |
统计每个人增删行数
1 | git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done |
结果示例
1 | Max-laptop added lines: 1192, removed lines: 748, total lines: 444 |
查看仓库提交者排名前 5
1 | git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5 |
贡献值统计
1 | git log --pretty='%aN' | sort -u | wc -l |
提交数统计
1 | git log --oneline | wc -l |
添加或修改的代码行数:
1 | git log --stat|perl -ne 'END { print $c } $c += $1 if /(\d+) insertions/' |
使用gitstats
GitStats项目,用Python开发的一个工具,通过封装Git命令来实现统计出来代码情况并且生成可浏览的网页。官方文档可以参考这里。
使用方法
1 | git clone git://github.com/hoxu/gitstats.git |
可能会提示没有安装gnuplot画图程序,那么需要安装再执行:
1 | //mac osx |
使用cloc
1 | npm install -g cloc |
SpringBoot2.X性能监控Actuator
一、前言
SpringBoot Actuator 服务监控与管理**
其中包含了很多的服务,比如我们常用的amqp
、 JVM
、 cache
等等,下面是actuator
包下的目录
amqp,audit,beans,cache,cassandra,context,couchbase,elasticsearch,endpoint,env,flyway,health,influx,info,integration,jdbc,jms,ldap,liquibase,logging,mail,management,metrics,mongo,neo4j,redis,scheduling,security,session,solr,system,http,web
是不是感觉挺全面的。
2021-04-20 补充2.4.2 与之前版本的差异
二、服务监控与管理
Maven 依赖
1 |
|
主要配置
Spring Boot2.x中,默认只开放了info、health
两个端点,开放其他端点需要配置
1 | # 开启所有端点 |
监控状态
启动之后访问 http://localhost:8062/boot/actuator/health 就可以看到对应的项目监控状态。
访问 http://localhost:8062/boot/actuator 可以查看有那些监控。
健康指标 HealthIndicators 由 Spring Boot 自动配置,因此这里显示监控信息是由项目所使用的技术栈而决定的:
名称 | 描述 |
---|---|
CassandraHealthIndicator | 检查 Cassandra 数据库是否启动。 |
DiskSpaceHealthIndicator | 检查磁盘空间不足。 |
DataSourceHealthIndicator | 检查是否可以获得连接 DataSource。 |
ElasticsearchHealthIndicator | 检查 Elasticsearch 集群是否启动。 |
InfluxDbHealthIndicator | 检查 InfluxDB 服务器是否启动。 |
JmsHealthIndicator | 检查 JMS 代理是否启动。 |
MailHealthIndicator | 检查邮件服务器是否启动。 |
MongoHealthIndicator | 检查 Mongo 数据库是否启动。 |
Neo4jHealthIndicator | 检查 Neo4j 服务器是否启动。 |
RabbitHealthIndicator | 检查 Rabbit 服务器是否启动。 |
RedisHealthIndicator | 检查 Redis 服务器是否启动。 |
SolrHealthIndicator | 检查 Solr 服务器是否已启动。 |
常用端点
查看常用接口
http://localhost:8062/boot/actuator/
env 端点,应用获取环境信息,包括:环境变量、JVM属性、应用的配置配置、命令行中的参数等等。
localhost:8080/actuator/env
mapping 端点,url 与 控制器映射关系信息
localhost:8080/actuator/info
metrics 端点,引用度量指标端点,提供引用再运行时的信息,如内存使用情况、HTTP请求统计、外部资源指标等
查看所有度量指标 localhost:8080/actuator/metrics
查看度量指标详细信息 localhost:8080/actuator/metrics/jvm.gc.pause
loggers 端点,查看可配置 loggers 的列表及相关的等级信息
localhost:8080/actuator/loggers
查看特定的 logger 详细信息localhost:8080/actuator/loggers/{name}
健康检查
health 端点用于暴露程序运行的健康状态,暴露的信息的详细程度由 management.endpoint.health.show-details 来控制,它具有以下三个可选值:
名称 | 描述 |
---|---|
never | 细节永远不会显示。 |
when-authorized | 详细信息仅向授权用户显示。授权角色可以使用配置 management.endpoint.health.roles。 |
always | 详细信息显示给所有用户。 |
在 org.springframework.boot.actuate.health.ShowDetails
中有详细说明。
端点列表
info
显示应用的基本信息health
显示应用的健康状态metrics
显示应用多样的度量信息loggers
显示和修改配置的loggerslogfile
返回log file中的内容(如果logging.file或者logging.path被设置)httptrace
显示HTTP足迹,最近100个HTTP request/repsponseenv
显示当前的环境特性flyway
显示数据库迁移路径的详细信息liquidbase
显示Liquibase 数据库迁移的纤细信息shutdown
让你逐步关闭应用mappings
显示所有的@RequestMapping路径scheduledtasks
显示应用中的调度任务threaddump
执行一个线程dumpheapdump
返回一个GZip压缩的JVM堆dump
三、自定义健康检查
在启动类中加入
1 |
|
访问 http://localhost:8062/boot/actuator/health 的结果为:
这里我开启了redis
,数据库为mysql
1 | { |
当前details
中有一个检查status
为DOWN
时,Health
检查的status
就为DOWN
,否则为UP
。
如果把第一个FATAL
改为DOWN
,Health
检查结果同样为DOWN
。
下表显示了内置状态的默认映射:
Status | Mapping |
---|---|
DOWN | SERVICE_UNAVAILABLE (503) |
OUT_OF_SERVICE | SERVICE_UNAVAILABLE (503) |
UP | No mapping by default, so http status is 200 |
UNKNOWN | No mapping by default, so http status is 200 |
四、自定义端点
Spring Boot 支持使用 @Endpoint
来自定义端点暴露信息。
1 |
|
请求 http://localhost:8062/boot/actuator/customEndPoint 的结果为
1 | { |
可用的方法注解由 HTTP 操作所决定:
operation | HTTP 方法 |
---|---|
@ReadOperation | GET |
@WriteOperation | POST |
@DeleteOperation | DELETE |
五、监控指标
参数 | 参数说明 | 是否监控 | 监控手段 | 重要度 |
---|---|---|---|---|
–JVM– | ||||
jvm.memory.max | JVM最大内存 | |||
jvm.memory.committed | JVM可用内存 | 是 | 展示并监控堆内存和Metaspace | 重要 |
jvm.memory.used | JVM已用内存 | 是 | 展示并监控堆内存和Metaspace | 重要 |
jvm.buffer.memory.used | JVM缓冲区已用内存 | |||
jvm.buffer.count | 当前缓冲区数 | |||
jvm.threads.daemon | JVM守护线程数 | 是 | 显示在监控页面 | |
jvm.threads.live | JVM当前活跃线程数 | 是 | 显示在监控页面;监控达到阈值时报警 | 重要 |
jvm.threads.peak | JVM峰值线程数 | 是 | 显示在监控页面 | |
jvm.classes.loaded | 加载classes数 | |||
jvm.classes.unloaded | 未加载的classes数 | |||
jvm.gc.memory.allocated | GC时,年轻代分配的内存空间 | |||
jvm.gc.memory.promoted | GC时,老年代分配的内存空间 | |||
jvm.gc.max.data.size | GC时,老年代的最大内存空间 | |||
jvm.gc.live.data.size | FullGC时,老年代的内存空间 | |||
jvm.gc.pause | GC耗时 | 是 | 显示在监控页面 | |
–TOMCAT– | ||||
tomcat.sessions.created | tomcat已创建session数 | |||
tomcat.sessions.expired | tomcat已过期session数 | |||
tomcat.sessions.active.current | tomcat活跃session数 | |||
tomcat.sessions.active.max | tomcat最多活跃session数 | 是 | 显示在监控页面,超过阈值可报警或者进行动态扩容 | 重要 |
tomcat.sessions.alive.max.second | tomcat最多活跃session数持续时间 | |||
tomcat.sessions.rejected | 超过session最大配置后,拒绝的session个数 | 是 | 显示在监控页面,方便分析问题 | |
tomcat.global.error | 错误总数 | 是 | 显示在监控页面,方便分析问题 | |
tomcat.global.sent | 发送的字节数 | |||
tomcat.global.request.max | request最长时间 | |||
tomcat.global.request | 全局request次数和时间 | |||
tomcat.global.received | 全局received次数和时间 | |||
tomcat.servlet.request | servlet的请求次数和时间 | |||
tomcat.servlet.error | servlet发生错误总数 | |||
tomcat.servlet.request.max | servlet请求最长时间 | |||
tomcat.threads.busy | tomcat繁忙线程 | 是 | 显示在监控页面,据此检查是否有线程夯住 | |
tomcat.threads.current | tomcat当前线程数(包括守护线程) | 是 | 显示在监控页面 | 重要 |
tomcat.threads.config.max | tomcat配置的线程最大数 | 是 | 显示在监控页面 | 重要 |
tomcat.cache.access | tomcat读取缓存次数 | |||
tomcat.cache.hit | tomcat缓存命中次数 | |||
–CPU– | ||||
system.cpu.count | CPU数量 | |||
system.load.average.1m | load average | 是 | 超过阈值报警 | 重要 |
system.cpu.usage | 系统CPU使用率 | |||
process.cpu.usage | 当前进程CPU使用率 | 是 | 超过阈值报警 | |
http.server.requests | http请求调用情况 | 是 | 显示10个请求量最大,耗时最长的URL;统计非200的请求量 | 重要 |
process.uptime | 应用已运行时间 | 是 | 显示在监控页面 | |
process.files.max | 允许最大句柄数 | 是 | 配合当前打开句柄数使用 | |
process.start.time | 应用启动时间点 | 是 | 显示在监控页面 | |
process.files.open | 当前打开句柄数 | 是 | 监控文件句柄使用率,超过阈值后报警 | 重要 |
Springboot 2.4.2
jvm.gc.pause
1 | { |
httptrace
404解决
Springboot
已经不推荐使用 httptrace
。
1 | @Configuration |
ant-design-vue中的a-tree-select使用
a-tree-select
支持单选、多选的下拉树形选择
a-tree-select
示例:
1 | <a-tree-select |
标准结构(源码中都有,可以直接看到)
1 | /** |
treeData
数据格式
示例
1 | [ |
标准结构
1 | { |
ant-design-vue中的a-tree添加节点按钮
treeNode 添加自定义按钮
a-tree
中的节点需要添加自定义按钮,这里就直接展示:
示例:
1 | <a-tree @click="handleClick" |
$treeData
是定义的一个过滤树节点的方法,给每个节点添加参数
1 | scopedSlots: {title: 'custom'} |
tree 属性
1 | export declare class Tree extends AntdComponent { |
treeNode 属性
1 | /** |
SpringAop中的execution表达式
基本语法
execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)
返回类型模式、方法名模式和参数模式是必选的。
1 | // gt.maxzhao 包及其子包下的所有方法,任意返回类型 |
..
表示任务多个。
排除当前表达式范围中的更小范围
1 | // 扫描所有接口 |
ant-design-vue中的a-select设置只读
a-select
中是没有 readOnly
属性的,这时只能用disabled
示例:
1 | <a-select v-decorator="[ 'errorStatus', {}]" |
JDK-包装类
JAVA创建DataSource
为什么会用到 DataSource
?
在我读 oauth2
源码的时候,Spring
中提供了大量的测试代码,运行测试代码更方便自己理解,但是测试代码中使用的大多都是 Hsqldb
等等,我想连接我的开发库(MySql8
)进行测试。
传统的连接方式配置比较麻烦,这里使用 alibaba
的 druid
来获取 datasource
。
引入依赖
1 |
|
创建工具类
1 | /** |
引用工具类
这是在 JdbcClientDetailsServiceTests
中的一个初始化方法。
1 | // 原来的 |
到这里就结束了,配置很简单。
我这里使用的是 MySql8
的配置。
MySql5.x
与 MySql8
的区别要个别注意一下。
本文地址:JAVA创建DataSource
Linux创建swap交换分区
前言
当自己的内存不够用时,可以适当的添加 swap
分区。
比如 java
开发就很费内存,主要是idea
费内存,这时候会产生一个kswpd0
的进程,会把当前内存部分放入swap
分区,如果没有设置swap
分区,那么死机的几率就很大了。
首先确定有没有swap
分区
1 | free -m |
创建swap
分区
1、新增硬盘分区(明显不行了,没有新的硬盘了)
2、用文件作为 swap
分区
下面所有的操作都需要root
权限,需要谨慎
创建一个空的swap
文件
1 | sudo dd if=/dev/zero of=/swapfile count=8192 bs=1M |
其中 dd
命令的内容可以按自己的需求修改:
- if =输入文件(或设备名称)。
- of =输出文件(或设备名称)。
- ibs = bytes 一次读取bytes字节,即读入缓冲区的字节数。
- skip = blocks 跳过读入缓冲区开头的ibs*blocks块。
- obs = bytes 一次写入bytes字节,即写入缓冲区的字节数。
- bs = bytes 同时设置读/写缓冲区的字节数(等于设置ibs和obs)。
- cbs = byte 一次转换bytes字节。
- count=blocks 只拷贝输入的blocks块。
成功后的反馈
1 | 记录了8192+0 的读入 |
激活swap
分区
Swap
分区需要读写的权限,授权:
1 | sudo chmod 600 /swapfile |
查看授权:
1 | sudo ls -lh /swapfile |
成功提示:
1 | -rw------- 1 root root 8.0G 1月 14 17:42 /swapfile |
然后挂载Swap分区:
1 | sudo mkswap /swapfile |
成功提示:
1 | 正在设置交换空间版本 1,大小 = 8 GiB (8589930496 个字节) |
打开swap
1 | sudo swapon /swapfile |
查看
1 | free -m |
设置开机自启
1 | sudo vim /etc/fstab |
在末尾添加
1 | /swapfile none swap sw 0 0 |