亿级流量点赞系统-第八章

1. 前期回顾

项目源码地址:https://github.com/ruogu-coder/ruogu-like

在上一期进行压力测试,但是目前的系统难以实时检测系统的状态,比如点赞的请求量,响应时间等

2. 本期目标

通过 Prometheus + Grafana 构建可观测性解决方案

3. 开发实现

3.1. 重启 TiDB

禁用 TiDB 默认启动的 Prometheus 和 Grafana。

java
复制代码
tiup playground --tag thumb --host 0.0.0.0 --db.host 0.0.0.0 --without-monitor

3.2. 添加依赖

xml
复制代码
<!-- 整合 Prometheus + Grafana --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>

修改 application-local.yml 文件 新增配置:

yaml
复制代码
# 整合 Prometheus + Grafana management: endpoints: web: exposure: include: health, prometheus metrics: distribution: percentiles: http: server: requests: 0.5, 0.75, 0.9, 0.95, 0.99

3.3. 添加计数器

在 ThumbController 集成计数器指标

Counter import io.micrometer.core.instrument.Counter;

java
复制代码
private final Counter successCounter; private final Counter failureCounter; public ThumbController(MeterRegistry registry) { this.successCounter = Counter.builder("thumb.success.count") .description("Total successful thumb") .register(registry); this.failureCounter = Counter.builder("thumb.failure.count") .description("Total failed thumb") .register(registry); }

统计失败和成功数量

java
复制代码
@PostMapping("/do") @Operation(summary = "点赞") public CommonResult<Boolean> doThumb(@RequestBody ThumbLikeOrUnLikeDTO thumbLikeOrUnLikeDTO) { Boolean success; try { success = thumbService.doThumb(thumbLikeOrUnLikeDTO); if (success) { successCounter.increment(); } else { failureCounter.increment(); } } catch (Exception e) { failureCounter.increment(); throw e; } return CommonResult.success(success); }

3.4. Redis 监控指标

虚拟机安装 redis

java
复制代码
docker run --name redis -p 6379:6379 -d redis

添加 Redis Exproter 无密码可以删除最后一行

java
复制代码
docker run --name redis-exporter \ -p 9121:9121 \ oliver006/redis_exporter \ --redis.addr=redis://host.docker.internal:6379 \ --redis.password=xxx

3.5. Prometheus 配置

在当前目录下创建 Prometheus.yml 文件

java
复制代码
global: # 默认情况下,每15秒抓取一次目标数据。 scrape_interval: 15s # 在与外部系统(如联邦、远程存储、Alertmanager)通信时,将这些标签附加到任何时间序列或警报上。 external_labels: monitor: 'codelab-monitor' # 一个包含一个抓取端点的抓取配置:这里是 Prometheus 自身。 scrape_configs: # 作业名称作为标签 `job=<job_name>` 添加到从此配置抓取的任何时间序列中。 - job_name: 'prometheus' # 覆盖全局默认值,每5秒从该作业抓取目标数据。 scrape_interval: 5s static_configs: # 目标地址为 Prometheus 自身,在本地主机的9090端口上运行。 - targets: ['localhost:9090'] - job_name: 'biz' # 覆盖全局默认值,每5秒从该作业抓取目标数据。 scrape_interval: 5s # 指标路径,用于从业务服务中获取 Prometheus 指标数据。 metrics_path: '/api/actuator/prometheus' static_configs: # 目标地址为宿主机上运行的业务服务,端口为9199。 - targets: ['192.168.31.247:8080'] labels: # 为该目标添加一个额外的标签,用于标识其所属的组。 group: 'thumb' - job_name: 'redis' # 覆盖全局默认值,每5秒从该作业抓取目标数据。 scrape_interval: 5s static_configs: # 目标地址为宿主机上运行的 Redis Exporter,端口为9121。 - targets: ['host.docker.internal:9121']

启动命令 注意要将路径映射对应

java
复制代码
docker run -d \ --name prometheus \ -p 9090:9090 \ -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus

3.6. Grafana 仪表盘配置

java
复制代码
docker run -d \ --name grafana \ -p 3000:3000 \ grafana/grafana-enterprise

访问虚拟机 IP:3000 端口 默认账号密码 admin

第一次登录 需要重新修改密码

配置 Promotheus 数据源

报错:

java
复制代码
firewall-cmd --query-port=9090/tcp # 查看端口是否开放 firewall-cmd --zone=public --add-port=9090/tcp --permanent # 开放端口 firewall-cmd --reload # 重启防火墙使配置生效

java
复制代码
sum(rate(http_server_requests_seconds_count[1m]))

java
复制代码
sum(rate(http_server_requests_seconds_count[1m]))by (uri)

  1. 近一分钟点赞成功率计算公式
java
复制代码
rate(thumb_.success_.count_.total[1m])/(rate(thumb._success_count,_total[1m])+rate(thumb_failure_count_total[1m]))
  1. 近5分钟缓存命中率计算公式:
java
复制代码
rate(redis_keyspace_hits_total[5m])/(rate(redis_keyspace_hits_total[5m])+ rate(redis keyspace misses total[5m]))

我们认为,如果请求的响应状态码不是2xx,即是请求失败,所以可得近3小时请求失败的总数计算公式:

java
复制代码
increase(http_server_requests_seconds_count{status!~"2.."}[3h])

我这里就简单放一下

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP