7-Ai辅助开发点赞系统笔记-可视化化监控系统
代码地址
Github地址:https://github.com/bbhhe/thumbs-backend.git
章节内容
- 完善系统的可观测性能力,实时了解系统的健康状况和性能指标
技术方案
本项目将构建一套基于 Prometheus 生态的可观测性解决方案,所以在此之前我们需要先熟悉下 Prometheus 和 Grafana。
- Prometheus:一个开源的监控系统,用于收集和存储时间序列数据。
- Grafana:一个开源的可视化工具,用于创建和共享仪表盘。
Prometheus 可以通过 HTTP 接口暴露指标数据,而 Grafana 可以通过 Prometheus 的 HTTP API 来获取数据并创建可视化图表。
开发内容
1. 重启TIDB
▼shell复制代码tiup playground --tag thumb --host 0.0.0.0 --without-monitor
2. Redis指标监控
▼shell复制代码docker run --name my-redis -d -p 6379:6379 redis:6.2.14 --requirepass bbhhe1 docker run --name redis-exporter \ -p 9121:9121 \ oliver006/redis_exporter \ --redis.addr=redis://192.168.234.130:6379 \ --redis.password=bbhhe1

3. 应用指标监控
3.1 引入pom依赖
▼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>
3.2 修改配置
▼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
▼java复制代码package com.bbhhe.thumbsbackend.controller; import com.bbhhe.thumbsbackend.common.BaseResponse; import com.bbhhe.thumbsbackend.common.ResultUtils; import com.bbhhe.thumbsbackend.model.dto.thumb.DoThumbRequest; import com.bbhhe.thumbsbackend.model.entity.User; import com.bbhhe.thumbsbackend.service.ThumbService; import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.MeterRegistry; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.web.bind.annotation.*; import org.springframework.beans.factory.annotation.Autowired; @RestController @RequestMapping("/thumb") public class ThumbController { @Autowired @Qualifier("thumbServiceMq") private ThumbService thumbService; 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); } @PostMapping("/do") public BaseResponse<Boolean> doThumb(@RequestBody DoThumbRequest request, HttpServletRequest servletRequest) throws InterruptedException { if (request == null || request.getBlogId() == null) { failureCounter.increment(); return ResultUtils.error(40000, "请求参数错误"); } HttpSession session = servletRequest.getSession(); User loginUser = (User) session.getAttribute("loginUser"); if (loginUser == null) { failureCounter.increment(); return ResultUtils.error(40100, "用户未登录"); } boolean result = thumbService.doThumb(request.getBlogId(), loginUser.getId()); if(result){ successCounter.increment(); }else { failureCounter.increment(); } return ResultUtils.success(result); } @PostMapping("/undo") public BaseResponse<Boolean> undoThumb(@RequestBody DoThumbRequest request, HttpServletRequest servletRequest) throws InterruptedException { if (request == null || request.getBlogId() == null) { failureCounter.increment(); return ResultUtils.error(40000, "请求参数错误"); } HttpSession session = servletRequest.getSession(); User loginUser = (User) session.getAttribute("loginUser"); if (loginUser == null) { failureCounter.increment(); return ResultUtils.error(40100, "用户未登录"); } boolean result = thumbService.undoThumb(request.getBlogId(), loginUser.getId()); if(result){ successCounter.increment(); }else { failureCounter.increment(); } return ResultUtils.success(result); } }
3.4 启动之后测试访问

4. 启动Prometheus
4.1 创建配置文件prometheus.yml
▼yaml复制代码global: scrape_interval: 15s # By default, scrape targets every 15 seconds. # Attach these labels to any time series or alerts when communicating with # external systems (federation, remote storage, Alertmanager). external_labels: monitor: 'codelab-monitor' # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # Override the global default and scrape targets from this job every 5 seconds. scrape_interval: 5s static_configs: - targets: ['localhost:9090'] - job_name: 'biz' # Override the global default and scrape targets from this job every 5 seconds. scrape_interval: 5s metrics_path: '/api/actuator/prometheus' static_configs: - targets: ['192.168.234.1:8080'] labels: group: 'thumb' - job_name: 'redis' scrape_interval: 5s metrics_path: '/metrics' static_configs: - targets: ['192.168.234.130:9121']
4.2 启动Prometheus
▼java复制代码docker run -d \ --name prometheus \ -p 9090:9090 \ -v /home/binbin/prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus
4.4 测试访问

5. 启动Grafana并配置
5.1 docker启动Grafana
▼shell复制代码docker run -d \ --name grafana \ -p 3000:3000 \ grafana/grafana-enterprise
5.2 配置系统QPS监控
▼text复制代码sum(rate(http_server_requests_seconds_count[1m])) sum(rate(http_server_requests_seconds_count[1m])) by (uri)

5.3 配置系统分位置监控
▼text复制代码avg(http_server_requests_seconds{group="thumb", quantile="0.5"})

5.4 配置系统点赞成功率监控
▼text复制代码rate(thumb_success_count_total[1m]) / (rate(thumb_success_count_total[1m]) + rate(thumb_failure_count_total[1m]))

5.5 配置系统缓存命中率监控
▼text复制代码rate(redis_cache_hits_total[1m]) / (rate(redis_cache_hits_total[1m]) + rate(redis_cache_misses_total[1m]))

5.6 把监控放到同一个视图下

6. 告警配置

总结
有了可视化界面,我们可以更加直观地了解系统的运行情况,实现对系统的监控和告警。这样可以及时发现系统的问题,避免系统出现故障。
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
