在SonarQube中对度量进行分类

时间:2015-03-02 13:18:00

标签: sonarqube measures

我想对SonarQube中的特定指标进行分类,以满足我的需求。

详细说明:我为SonarQube构建了一个Gatling插件,可以读取Gatling写入的数据并将其放入SonarQube Metrics中。

现在我想根据我对加特林的要求对我的措施进行分类。所以,例如我有Gatling的全球统计数据(10,000个请求,每个请求50毫秒等)和我还有请求的数据(对于请求1,有1,000个请求,每个请求40ms等)。

如何将请求分配给Sonar中的度量?

我能想到的一个可能的解决方案是将措施与声纳中的特定情境联系起来。因此,我将在特殊上下文中保存请求的度量,同时将全局统计信息保存在全局上下文中。

但是:如何在Ruby模板中访问我的度量以及选择哪个好的上下文?

更新 我尝试使用请求名称多次保存相同的度量作为Measure.data参数但导致错误。

我也试过更改资源 - 上下文Sonar保存了这个小节。但是我没有成功在小部件中查询这些小节后,它们似乎已经消失了。

3 个答案:

答案 0 :(得分:1)

我尝试用sonarQube 6.1做同样的事情。

(作为概念证明,我在插件项目的java文件中添加了一些静态措施。)

目前我编写了一个带有传感器和公制的插件。但我无法在sonarQube网络界面中看到我的措施。

我使用

进行部署
mvn package org.codehaus.sonar:sonar-dev-maven-plugin::upload -DsonarHome=...

并使用

进行测试
mvn sonar:sonar

两者都很好。

如果代码中有失败,有人可以看到吗?

传感器:

import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.sensor.Sensor;
import org.sonar.api.batch.sensor.SensorDescriptor;

public class SampleSensor implements Sensor {

  public void describe(SensorDescriptor sensorDescriptor) {
    sensorDescriptor.name("Sensor for Gatling Log files");
  }

  public void execute(org.sonar.api.batch.sensor.SensorContext ctx) {
    for (InputFile inputFile : ctx.fileSystem().inputFiles(ctx.fileSystem().predicates().hasLanguage("java"))) {
      ctx.<Float>newMeasure().forMetric(SampleMetrics.THROUGHPUT).on(inputFile).withValue(10.5).save();
    }
  }
}

指标

import org.sonar.api.measures.*;    
import java.util.Arrays;
import java.util.List;

public class SampleMetrics implements Metrics {

  static final Metric THROUGHPUT = new Metric.Builder("throughput", "Request Throughput", Metric.ValueType.FLOAT)
      .setDescription("Requests per second").setQualitative(false).setDomain(CoreMetrics.DOMAIN_RELIABILITY).create();

  public List<Metric> getMetrics() {
    return Arrays.asList(THROUGHPUT);
  }
}

插件

import org.sonar.api.*;

public class SamplePlugin implements Plugin {
  public void define(Context context) {
    context.addExtension(SampleMetrics.class);
    context.addExtension(SampleSensor.class);
  }
}

答案 1 :(得分:0)

尝试使用Resource后,我能够保存这些措施并按照我从Gatling文件中获得的请求对它们进行分组。

我需要做很多尝试和错误,SonarQube的文档在逆向工程方面很糟糕。

我不得不使用弃用的方法来索引我的资源(SensorContext.index(Resource resource)),因为我不知道其他任何方式。

例如:虽然有一个新的插件API(在SonarQube的4.5.1版本中声明为@Beta),但在官方插件文档中没有提到它,你必须搜索源文件找到它。但是,我继续使用旧的API。

为了在.html.erb-Template中检索以后的度量,我在我的小部件中使用了以下代码:

m = measure('your_metric_name')
ProjectMeasure.find(:all,
                :from => ['project_measures as p, snapshots as s'],
                :conditions => ['p.metric_id=? AND s.id = p.snapshot_id 
                AND s.parent_snapshot_id = ?', m.metric.id, m.snapshot_id]

这将返回您对此项目所做的所有测量(确保您的资源的getParent()方法返回您使用SonarQube分析的项目)。我通过Java中的measure.setData("category")保存了类别,并且能够通过这个技巧将它们分类到小部件中。

如果有人也被困在这里,我会添加额外的代码(特别是如何创建新资源以保存多个措施)。请评论一下。

答案 2 :(得分:0)

我会尝试总结一下。

如果您想为声纳分析提供额外的措施,Markus Schwarz(见上文)的方法应该是正确的方法。在完全重启sonarqube服务器后,代码应该可以工作。

似乎热部署还不足以部署&#34;一个新的自定义指标。虽然新指标可通过指标搜索API(http://localhost:9000/api/metrics/search?ps=500)获得,但该指标的新度量不会在数据库中保存完全重启。

然后你应该在分析后看到你对项目的衡量标准:

http://localhost:9000/api/measures/component_tree?metricKeys=[YOUR_METRIC_KEY]&baseComponentKey=[YOUR_COMPONENT_TREE]

这种插​​件的一个很好的例子是非常新的pitest插件: https://github.com/SonarQubeCommunity/sonar-pitest

对于小部件,应该足以通过上面显示的api获取度量。这应该解决kummerer94的问题。 pitest插件也是创建小部件或仪表板的良好起点。参见

https://github.com/SonarQubeCommunity/sonar-pitest/blob/master/src/main/resources/org/sonar/plugins/pitest/pitest_dashboard_widget.html.erb

了解详情。