首页 > 其他分享 >数据统计埋点需求

数据统计埋点需求

时间:2024-02-27 23:55:21浏览次数:26  
标签:需求 代码 joinPoint CountInvokeTimes error 埋点 redisUtil public 统计

背景

随着公司代码的迭代,有一些垃圾代码逻辑冗余在项目中,导致消耗了资源又不好维护。为了保险,需要在线上统计代码使用的频率,剔除无用代码。

描述

方法便可分为如下几种:

  1. 对于确定没用的代码,可以先注释掉,并替换为error日志,保证遇到问题及时发现。
  2. 对疑似无用代码,可以使用统计方法调用次数,运行一段时间,判断去留。

设计

第一种方法就是,注释代码添加日志,所以我们着重描述第二种情况:

使用 spring aop 进行拦截,注意只能拦截被 ioc 管理的对象

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CountInvokeTimes {
}
@Aspect
@Slf4j
@Component
public class CountInvokedTimesAspect {
    private final RedisUtils redisUtil;

    public CountInvokedTimesAspect(RedisUtils redisUtil) {
        this.redisUtil = redisUtil;
    }

    @Pointcut("@within(com.tao.annotation.CountInvokeTimes) || @annotation(com.tao.annotation.CountInvokeTimes)")
    public void countInvokeTimes() {
    }

    @Around(value = "countInvokeTimes()")
    public Object doAround(ProceedingJoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        Class<?>[] argTypes = new Class[args.length];
        for (int i = 0; i < args.length; i++) {
            argTypes[i] = args[i].getClass();
        }
        try {
            String methodName = joinPoint.getSignature().getName();
            Method method = joinPoint.getTarget().getClass().getMethod(methodName, argTypes);
            Class<?> aClass = joinPoint.getTarget().getClass();
            String className  = aClass.getName();
            boolean isClassAnnotationPresent = aClass.isAnnotationPresent(CountInvokeTimes.class);
            boolean isMethodAnnotationPresent = method.isAnnotationPresent(CountInvokeTimes.class);
            if (isClassAnnotationPresent || isMethodAnnotationPresent) {
                // 此处也可以发送mq消息给统计服务
                redisUtil.getRedisTemplate().opsForZSet().incrementScore(RedisConstant.METHOD_STATISTICS, className + "." + methodName, 1);
            }
        } catch (Exception e) {
            log.error("CountInvokedTimesAspect error", e);
        }

        Object object = null;
        try {
            object = joinPoint.proceed();
        } catch (Throwable throwable) {
            log.error("CountInvokedTimesAspect error", throwable);
        }
        return object;
    }
}
 
    @RequestMapping("/getMethodStatistics")
    public String getMethodStatistics() {
        Set<ZSetOperations.TypedTuple<String>> typedTuples = redisUtils.getRedisTemplate().opsForZSet().rangeWithScores(RedisConstant.METHOD_STATISTICS, 0, -1);
        return JSON.toJSONString(typedTuples);
    }

标签:需求,代码,joinPoint,CountInvokeTimes,error,埋点,redisUtil,public,统计
From: https://www.cnblogs.com/handsometaoa/p/18038798

相关文章

  • 《产品需求分析与管理》(深圳2024年3月22-23日)
    【课程背景】客户的需求不断变化,如何快速高效地推出满足客户需求、具有差异化优势和竞争优势的产品,并最终获得市场的成功,是企业的核心问题。目前国内许多科技型企业在产品需求管理方面存在如下问题:产品开发没有实现市场驱动,是“闭门造车”,关注技术而不关心客户;产品开发出来后......
  • Python|statistics 数学统计函数模块
    方法描述statistics.harmonic_mean()计算给定数据集的调和平均值。是总体内各个变量值倒数1/x的算术平均数的倒数。statistics.mean()计算数据集的平均值statistics.median()计算数据集的中位数statistics.median_grouped()计算给定分组数据集的分组中位数......
  • 需求结构化:数据定义
    1背景前文以实例的形式讨论了用例生成、需求检查等功能。这些功能可行的前提,是需求逻辑能够被计算机程序正确的识别、计算。所谓需求结构化,是将非结构化需求转换为结构化需求的过程。而所谓结构化需求,是指基于明确语法表达的需求。结构化需求是半形式化的(semi-formal),可以转换为......
  • 盘点一个Python自动化办公Excel数据处理的需求
    大家好,我是Python进阶者。一、前言前几天在Python白银交流群【干锅牛蛙】问了一个Python处理Excel数据的问题。问题如下:有两个问题哈:1、表头有合并单元格识别不出来,如何处理类似下图2、遇到单元格有公式自动识别成了0,如何处理,保留计算后的值,类似下图附上他自己的代码如下:目......
  • 前端埋点数据上传方式
    数据埋点数据采集领域的术语,指的是针对用户行为或特定事件进行捕获、处理和发送的相关技术及其实施过程,是对特定事件或者用户行为的数据监控和数据上传。数据类型我们从三个维度出发去监控一个项目,即系统所面向的某一个主体,系统单个局部面向使用不同使用主体的差异的情况监......
  • 片段代码练习之【水仙花,三角形,字符统计】
    #统计字符个数方法defcount_char(char,string):count=0forcinstring:ifc==char:count+=1returncountchar='l'string='helloworld'count=count_char(char,string)print('{0}字符个数为:{1}'.format(cha......
  • linux统计字符串出现次数(linux查询关键字出现的个数了解)
     使用脚本统计字符串出现次数#!/bin/bash#获取要监控的本地服务器IP地址IP=`ifconfig|grepinet|grep-vE'inet6|127.0.0.1'|awk'{print$2}'`echo"IP地址:"$IP#获取cpu总核数cpu_num=`grep-c"modelname"/proc/cpuinfo`echo"cpu总核数:&q......
  • 个位数统计
    importjava.util.Map;importjava.util.Scanner;importjava.util.TreeMap;publicclassDemo03{publicstaticvoidmain(String[]args){intnum;Stringstr="";Scannerscanner=newScanner(System.in);System......
  • 统计学的重要概念
    统计学是一门研究数据收集、分析、解释和推断的学科,其核心概念包括但不限于以下几点:总体与样本:总体(Population):研究对象的全部集合,是所有可能观测值的集合。样本(Sample):从总体中抽取的一部分观察单位,用于估计或推断总体特征。统计量与参数:统计量(Statistic):基于样本数据计......
  • 视频智能分析平台智能边缘分析一体机视频汇聚智能算法分析园区客流统计算法检测
    在城市的脉动中,园区作为经济活动的重要载体,扮演着举足轻重的角色。无论是科技园区、商务园区还是文化创意园区,它们都是城市发展活力的缩影。然而,随着竞争的加剧和需求的多样化,传统的园区管理方式已经难以满足现代园区的发展需求。这时,智能边缘分析一体机园区客流统计技术应运而生......