在 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),但该指标的新指标不会保存在数据库中,完全重启。
然后你应该在分析后看到你对项目的措施:
这种插件的一个很好的例子是相当新的 pitest 插件:
https://github.com/SonarQubeCommunity/sonar-pitest
对于小部件,通过上面显示的 api 获取度量值应该就足够了。这应该可以解决 kummerer94 的问题。 pitest 插件也是创建小部件或仪表板的良好起点。参见
了解详情。
我想对 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),但该指标的新指标不会保存在数据库中,完全重启。
然后你应该在分析后看到你对项目的措施:
这种插件的一个很好的例子是相当新的 pitest 插件: https://github.com/SonarQubeCommunity/sonar-pitest
对于小部件,通过上面显示的 api 获取度量值应该就足够了。这应该可以解决 kummerer94 的问题。 pitest 插件也是创建小部件或仪表板的良好起点。参见
了解详情。