SpringBoot Metrics 监控系统(4)——使用指标
一、前言
在上一章节,我们已经完成了 SpringBoot Metrics 程序的框架搭建。在本章节中,我们将在程序中进行 Metrics 埋点,并能够被 Prometheus 采集到,且最终在 Grafana 中展示出来。
二、Metrics 埋点
2.1 Counter
先来介绍下最简单的 Counter 类型,它是不断递增的一种数据结构,你可以将其理解为计数器。
假设我们想要统计两部视频的阅读量,首先我们需要在 MetricsEnum 中注册下:
12READ_COUNT_1("read_count", new String[]{"video_name", "法外狂徒张三"}, "阅读量统计", COUNTER),READ_COUNT_2("read_count", new String[]{"video_name", "不讲武德年轻人"}, "阅读量统计", COUNTER) ...
SpringBoot Metrics 监控系统(3)——搭建框架
一、前言
本章节开始将为大家展示如何在 SpringBoot 应用中去使用 Metrics 监控。本系列使用的 SpringBoot 版本为笔者当前的最新 RELAESE 版本 2.4.0,整个 SpringBoot 2 关于这边都是大同小异,所以大家不用担心版本问题。
二、依赖包
除了常规开发 SpringBoot Web 所需要的两个包外:
123456789<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency> ...
SpringBoot Metrics 监控系统(2)——快速起步
一、Docker
首先需要安装 Docker,已经安装的朋友直接跳过该节即可。
Docker 最近新出了 Docker Desktop,可以对容器和镜像可视化管理,还是很不错的。访问官网
下载即可,这里我使用 Windows 平台进行安装。【最好采用科学上网,否则速度会很感人】
如果安装完毕后打开报下图的错,需要在更新下 WSL2,点此下载。
启动成功后如下图所示:
二、Prometheus + Grafana
打开 PowerShell 或其他命令行工具,下载镜像:
1docker pull prom/prometheus
下载完毕后,提前准备好配置文件,新建配置文件 prometheus.yml,内容如下。将其保存到任一位置即可,并记录下它的绝对路径。我这里把它放置在了桌面,因此它的绝对路径是:C:\Users\Jitwxs\Desktop\prometheus.yml。
12345678910global: scrape_interval: 60s evaluation_interval: 60s scrape_configs: - job_name: p ...
SpringBoot Metrics 监控系统(1)——技术介绍
一、前言
本系列将为大家介绍如何对我们的 SpringBoot 应用程序进行监控和告警,使用的技术为 Prometheus + Grafana。二者均采用 Docker 进行安装部署,实际工作中自己在生产环境搭建的可能性不大,因此我们关注的重点放在如何使用就好了。
二、Prometheus
Prometheus 是 Soundcloud 开发的一款开源的监控工具,其本质是一个时间序列数据库(TSDB),采用 Go 语言开发。
它具有以下特点:
多维度:我们可以给指标数据添加多组标 Label,在展示时候可以作为筛选条件灵活选择。
拉模式:Prometheus 采用 Pull 模式,我们的指标数据生成后,Prometheus 会主动来消费,我们不需要做额外操作。
白盒&黑盒监控均支持:无论什么维度的指标数据,都可以采集到,对 DevOps 友好。
Metrics & Alert:Prometheus 采集的是 Metrics 指标,而不是 logging 和 tracing。
社区生态丰富:支持各种语言的客户端,并且有各种各样的 exporters,来实现黑盒监控 ...
使用 Fiddler 进行模拟器抓包
Fiddler 是一款比较常用的网络抓包工具,本文记录下使用其完成对模拟器中请求进行抓包的过程。
点击链接 官网下载 Fiddler,可能需要翻墙。下载完毕后,常规安装并登录后打开应用。
点击右上角⚙图标,进入设置页面
选择 HTTPS 选项卡,点击 Trust root certficarte ,获取 root 权限。获取完毕后,勾选下方复选框,以支持对 HTTPS 协议的请求。
展开 Advanced Settings,将 .crt 证书导出至桌面,后续需要在模拟器中安装。
选择 Connections 选项卡,可以指定监听端口,直接使用默认的 8866 即可。
勾选下方 Allow remote computers to connect,我们的模拟器才能连接上来。
至此完成 Fiddler 侧设置,下面安装模拟器。随便选择一家模拟器即可,我这里使用夜神模拟器进行演示。
确认模拟器开启了 root,我这里默认就已经是开启状态了。
进入系统 WLAN 设置中,鼠标左键长按已连接的 wifi,在弹出菜单中选择 修改网络。
展开 高级选项,将 代理 设置为 ...
如何优雅的统计代码耗时
一、前言
代码耗时统计在日常开发中算是一个十分常见的需求,特别是在需要找出代码性能瓶颈时。
可能也是受限于 Java 的语言特性,总觉得代码写起来不够优雅,大量的耗时统计代码,干扰了业务逻辑。特别是开发功能的时候,有个感受就是刚刚开发完代码很清爽优雅,结果加了一大堆辅助代码后,整个代码就变得臃肿了,自己看着都挺难受。因此总想着能不能把这块写的更优雅一点,今天本文就尝试探讨下“代码耗时统计”这一块。
在开始正文前,先说下前提,“代码耗时统计”的并不是某个方法的耗时,而是任意代码段之间的耗时。这个代码段,可能是一个方法中的几行代码,也有可能是从这个方法的某一行到另一个被调用方法的某一行,因此通过 AOP 方式是不能实现这个需求的。
二、常规方法
2.1 时间差统计
这种方式是最简单的方法,记录下开始时间,再记录下结束时间,计算时间差即可。
12345678910111213public class TimeDiffTest { public static void main(String[] args) throws InterruptedException ...
Mac 安装 brew
一、前言
brew 是 Mac 和 Linux 下的包管理器,但是需要手动安装,在国内操蛋的网络环境下,想要不翻墙安装,还得花点功夫。本文记录在非翻墙情况下,如何安装 brew。
二、安装流程
2.1 官方步骤
1/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
以上为官方推荐的安装步骤,但是如果你没有开翻墙的话,大概率是会失败的。
2.2 国内镜像-1
可以使用以下命令,傻瓜操作。但是很遗憾我的电脑用不了,一直提示没有文件权限。
1/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
2.3 国内镜像-2
这个方法在本机上能够成功安装、
1/usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo ...
Java 浅拷贝性能比较
一、前言
实际开发中,经常会遇到对象拷贝的需求,本文就结合日常开发过程中,使用到的浅拷贝技术,进行性能比较,看看谁更强。
重要: 下面将会花大量篇幅,列出各种类型浅拷贝的代码,你可以直接拖到文章末尾,看性能对比结果。然后再根据你中意的对象回过头来看它的代码,避免疲劳。
首先创建一个用于拷贝的 Bean,如下所示:
1234567891011121314151617181920212223242526272829303132333435363738394041import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import org.apache.commons.lang3.RandomStringUtils;import org.apache.commons.lang3.RandomUtils;import java.util.Date;@Data@Builderpublic class User { private long id; private int age; ...
Lombok 子类如何使用 @Builder
一、前言
业务开发中,子类父类还算是经常用到,Lombok 的 @builder 提供的链式调用帮助我们更轻松的创建对象。但是实验后却发现子类的 @Builder 是不会包含父类的属性。
假设存在父类 A:
1234567@Data@Builderpublic class A { private String aName; private String aAge;}
存在子类 B:
12345678@Builder@Data@EqualsAndHashCode(callSuper = true)public class B extends A { private String bName; private String bAge;}
使用 builder 进行初始化时,类 A 可以正常创建,类 B 仅可以初始化自己的属性,父类属性无法初始化。
二、解决:构造方法
查阅网络后,一种解决方法是利用构造方法:
父类生成全参构造方法
子类手动声明全参构造方法
将子类 @builder 注解移动全参构造方法上,并设置 bui ...
Java Fail-Fast 与 Fail-Safe 特性
一、前言
在 Java 的集合结构中,如果我们同时进行遍历(for-each, iterator)和集合修改(add, set, remove…)操作时,就有可能发生异常。例如,线程 T1 在对集合进行遍历,而此时线程 T2 对集合进行添加元素;亦或者线程 T1 在对集合进行遍历的过程中,进行删除元素操作。
不同的集合在遇到上述这种情况时,会有不同的处理。按照处理的不同,划分为 Fail-Fast 和 Non-Fail-Fast(下文统称为 Fail-Safe)两类。前者不允许在迭代的过程中对集合进行增删操作,否则抛出 ConcurrentModificationException 异常;后者则允许这种操作,不会抛出异常。
注:本处的“对集合进行增删操作”指的是对集合自身的操作,而非借助 iterator 的操作。
二、Fail-Fast
Fail-Fast 类型的数据结构,在进行迭代时如果检测到集合对象发生了结构性修改会立即抛出 ConcurrentModificationException,结构性修改指的是对该集合对象进行添加、删除或更新元素的操作。ArrayList, H ...