【问题标题】:Categorize measures in SonarQube在 SonarQube 中对度量进行分类
【发布时间】:2015-03-02 13:18:00
【问题描述】:

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

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

现在我想根据我对 Gatling 所做的请求对我的度量进行分类。 例如,我有 Gatling 的全局统计数据(10,000 个请求,每个请求 50 毫秒等),我还有请求的数据(请求 1 有 1,000 个请求,每个请求 40 毫秒等)。

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

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

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

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

我也尝试更改资源-Context Sonar 将度量保存在其中。但是我之后在小部件中查询度量没有成功,它们似乎已经消失了。

【问题讨论】:

    标签: sonarqube measures


    【解决方案1】:

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

    (作为概念证明,我在插件项目的 java-Files 上放置了一些静态措施。)

    目前我编写了一个带有传感器和指标的插件。但我在 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);
      }
    }
    

    【讨论】:

      【解决方案2】:

      在尝试使用 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") 保存了类别,并且能够通过这个技巧在小部件中对它们进行分类。

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

      【讨论】:

        【解决方案3】:

        我会试着总结一下。

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

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

        了解详情。

        【讨论】:

          猜你喜欢
          • 2022-12-29
          • 1970-01-01
          • 1970-01-01
          • 2016-05-13
          • 2017-10-19
          • 2013-02-10
          • 1970-01-01
          • 2014-03-23
          • 1970-01-01
          相关资源
          最近更新 更多