将变量传递给方面

时间:2015-10-13 16:18:11

标签: java spring aop statsd

我正在尝试使用AOP和statsd的组合来衡量代码中的指标。特别是,我希望开发人员能够通过向方法添加注释并指定其名称和标记来创建计时器,如下所示:

@Timed(name="executeHistoryDataSet", tags={dataSetInfo.getLabel()})
@Override
public String executeHistoryDataSet(DataSet dataSetInfo) throws DataServiceException {
    String results = executeDataSet(dataSetInfo);
    return results;
}

这将包含有关参数作为标签的信息。但是,这会显示attribute value must be constant错误,因为注释的参数不能是变量,dataSetInfo.getLabel()肯定不是。

开发人员最好能够创建一个新的计时器,而无需创建新的方面和建议(@Timed将是所有计时器的注释),所以我有什么方法可以拥有这个功能,我将tags之类的内容传递给了建议,但这可能不是常数,因方法不同而不同?

这是注释本身:

public @interface Timed {
    String name();
    String[] tags();
}

其方面:

@Aspect
public class MetricsAspects {

    private static final StatsDClient statsd = new NonBlockingStatsDClient(
        "my.prefix",                    //prefix to any stats
        "statsd-host",                  //often "localhost"
        8125,                           //port
        "tag", "another tag"            //tags always applied to stats
    );

    @Around ("execution(* *(..) && @annotation(timed)")
    public Object timeAround(ProceedingJoinPoint point, Timed timed) throws Throwable {

        String metricName = timed.name();
        String[] metricTags = timed.tags();
        long start = System.currentTimeMillis();
        Object result = point.proceed();
        long duration = System.currentTimeMillis() - start;
        statsd.recordExecutionTime(metricName, duration, metricTags);
        return result;
    }
}

1 个答案:

答案 0 :(得分:0)

注释需要在编译时知道其参数。因为在编译时不知道哪个Dataset对象在执行时被赋予该函数,所以编译器会抛出错误。