Java 创建一个指标,显示SonarQube 5.6中特定规则的问题数量

Java 创建一个指标,显示SonarQube 5.6中特定规则的问题数量,java,plugins,sonarqube,Java,Plugins,Sonarqube,我正在使用Java插件API为SonarQube 5.6.6开发一个插件。我已经创建了一些自定义规则(检查),现在,我想创建一个自定义度量,显示一个项目有多少特定规则的问题,例如,规则MyCustomRule的问题数 我知道SonarQube用户可以访问页面问题并使用这些特定规则的名称进行过滤,这样他们就可以看到存在多少问题,但我希望页面上的数字可以衡量 我有一个类实现了MeasureComputer: public class MyMeasureComputer implements Meas

我正在使用Java插件API为SonarQube 5.6.6开发一个插件。我已经创建了一些自定义规则(检查),现在,我想创建一个自定义度量,显示一个项目有多少特定规则的问题,例如,规则
MyCustomRule
的问题数

我知道SonarQube用户可以访问页面问题并使用这些特定规则的名称进行过滤,这样他们就可以看到存在多少问题,但我希望页面上的数字可以衡量

我有一个类实现了
MeasureComputer

public class MyMeasureComputer implements MeasureComputer {

    @Override
    public MeasureComputerDefinition define(MeasureComputerDefinitionContext defContext) {
        return defContext.newDefinitionBuilder()
                .setOutputMetrics(MY_CUSTOM_METRIC.key())
                .build();
    }

    @Override
    public void compute(MeasureComputerContext context) {
        int totalSum = 0;
        for (Measure measure : context.getChildrenMeasures(MY_CUSTOM_METRIC.key())) {
            totalSum += measure.getIntValue();
        }

        context.addMeasure(MY_CUSTOM_METRIC.key(), totalSum);
    }
}
这个类定义了一个输出度量,它是我前面说过的问题数量。在方法
compute
中,它获取每个文件的度量值
MY\u CUSTOM\u METRIC
,并将它们相加。最后,它创建度量值
MY_CUSTOM_METRIC
,即问题数量

此时,我需要在每个文件中定义度量值
MY_CUSTOM_METRIC
,以便
MyMeasureComputer
可以计算它,但我不知道如何做。我想它应该在
传感器中

public class MySensor implements Sensor {

    @Override
    public void describe(SensorDescriptor descriptor) {
        descriptor.name("MySensor").onlyOnLanguage(Java.KEY);
    }

    @Override
    public void execute(SensorContext context) {
        final FileSystem fs = context.fileSystem();

        for (InputFile file : fs.inputFiles(fs.predicates().all())) {
            context.<Integer>newMeasure()
                .forMetric(MY_CUSTOM_METRIC)
                .on(file)
                .withValue(getNumCertainIssues(context, file))
                .save();
        }
    }

    private int getNumCertainIssues(SensorContext context, InputFile file) {
        return 10;   // TODO: how to get the number of issues?
    }

}
公共类MySensor实现传感器{
@凌驾
公共无效描述(传感器描述符){
descriptor.name(“MySensor”).onlyOnLanguage(Java.KEY);
}
@凌驾
public void execute(传感器上下文){
final FileSystem fs=context.FileSystem();
for(InputFile文件:fs.inputFiles(fs.predicates().all())){
context.newMeasure()
.FormMetric(我的自定义度量)
.on(文件)
.withValue(getNumCertainIssues(上下文、文件))
.save();
}
}
私有int getNumCertainIssues(传感器上下文,输入文件){
return 10;//TODO:如何获取发行数量?
}
}
在方法
execute
中,我可以用一个示例值(10)在每个文件中设置一个度量,并且它可以工作;我可以在SonarQube UI(第“测量”页)中看到它,以及每10个的总和:

我的问题是:

  • 如何获取特定规则的问题数

  • 是否应在类
    传感器中执行此操作

  • 有可能吗


谢谢。

一台测量计算机在每个组件上执行:文件、目录、模块和项目

  • 在文件(
    Component#getType#FILE
    )上,您可以获取问题(使用
    MeasureComputerContext#getIssues
    ),计算规则
    MyCustomRule
    中的问题数量,然后使用
    MeasureComputerContext\addMeasure
    保存它

  • 在“无文件”组件上,从子级计算度量值并保存它,这是您编写的代码

您的代码将如下所示: public class MyMeasureComputer implements MeasureComputer { @Override public MeasureComputerDefinition define(MeasureComputerDefinitionContext defContext) { return defContext.newDefinitionBuilder() .setOutputMetrics(MY_CUSTOM_METRIC.key()) .build(); }

   @Override
   public void compute(MeasureComputerContext context) {
        if (context.getComponent().getType() == FILE) {
           List<Issue> fileIssues = context.getIssues();
           // TODO get number of issues of type MyCustomRule
           context.addMeasure(MY_CUSTOM_METRIC.key(), sum);
        return;
    } 
    int totalSum = 0;
    for (Measure measure : context.getChildrenMeasures(MY_CUSTOM_METRIC.key())) {
        totalSum += measure.getIntValue();
    }

    context.addMeasure(MY_CUSTOM_METRIC.key(), totalSum);
}
公共类MyMeasureComputer实现MeasureComputer{ @凌驾 公共度量值计算机定义定义(度量值计算机定义上下文定义上下文){ 返回defContext.newDefinitionBuilder() .setOutputMetrics(MY_CUSTOM_METRIC.key()) .build(); }

@覆盖
公共void计算(MeasureComputerContext上下文){
if(context.getComponent().getType()==文件){
List fileIssues=context.getIssues();
//TODO获取MyCustomRule类型的问题数
addMeasure(MY_CUSTOM_METRIC.key(),sum);
返回;
} 
整数总和=0;
for(Measure-Measure:context.getChildrenMeasures(MY\u CUSTOM\u METRIC.key())){
totalSum+=measure.getIntValue();
}
addMeasure(MY_CUSTOM_METRIC.key(),totalSum);
}

谢谢你的及时回复,我可以实现我的目标!为了完成你的回答,我必须说我在《MySensor》课程中编写的代码不应该存在(而且,我删除了整个课程),因为您会因为为一个文件定义两次度量而出错。好消息!事实上,我忘了说应该创建no传感器。