在 SonarQube 中对度量进行分类

Categorize measures in SonarQube

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

详细说明:我为 SonarQube 构建了一个 Gatling 插件,它读取 Gatling 写入的统计数据并将它们放入 SonarQube Metrics。

现在我想根据我用 Gatling 执行的请求对我的措施进行分类。 因此,例如我有 Gatling 的全局统计信息(10,000 个请求,每个请求 50 毫秒,等),我也有请求的数据(请求 1 有 1,000 个请求,每个请求 40 毫秒,等等)。

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

我能想到的一个可能的解决方案是 link Sonar 中针对特定上下文的度量。因此,我将在特殊上下文中保存请求的度量,同时将全局统计信息保存在全局上下文中。

但是:之后如何在 Ruby-Template 中访问我的度量值以及选择什么是一个好的上下文?

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

我也试过改resources-Context Sonar把measure保存在里面,但是后来在widget里面查询measures没有成功,好像消失了。

在尝试使用 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]

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

如果有人也卡在这里,我会添加额外的代码(特别是关于如何创建新资源来保存您的多项措施)。请评论。

我尝试用 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);
  }
}

我会尽量总结一下。

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

热部署似乎不足以 "deploy" 新的自定义指标。尽管可以通过指标搜索获得新指标 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

了解详情。