Sonar Web客户端使用ResourceQuery及指标30天方差查询(原API已废弃)
1. 如何在Sonar Web客户端中使用ResourceQuery?
首先得明确一点:Sonar的Web UI本身并没有专门的界面让你直接输入ResourceQuery参数,但咱们可以分新旧版本通过不同方式实现类似的查询效果:
旧版SonarQube(7.x及更早):
旧版的api/resources接口还可用,你可以直接在浏览器地址栏拼接参数来模拟ResourceQuery的功能。比如想查询某个项目的代码行数和覆盖率,就构造这样的URL:http://你的Sonar实例地址/api/resources?resource=com.你的公司:你的项目&metrics=ncloc,coverage&scope=PRJ替换成你自己的项目键和目标指标后,在浏览器打开这个URL就能得到对应资源数据——这其实就是在Web客户端里用ResourceQuery的核心逻辑:通过URL参数传递查询条件。
新版SonarQube(8.x及以后):
因为api/resources已被废弃,Web UI里的资源查询已经做成了可视化功能。你直接在顶部搜索栏输入项目名称、关键字就能快速定位资源;或者进入「项目」页面后,用侧边栏的筛选器(比如按开发语言、质量门状态)缩小范围,这就是ResourceQuery在新版UI里的替代实现。如果需要更精准的查询,也可以用新版的api/components接口构造URL,比如:http://你的Sonar实例地址/api/components/search?qualifiers=TRK&q=你的项目名称这个接口会返回符合条件的项目列表,和旧版ResourceQuery的资源定位效果一致。
2. 废弃api/resources和ResourceQuery后,如何查询指标近30天的方差?
旧接口废弃后,咱们得用新版的时间序列API获取数据,再自行计算方差(Sonar本身不直接提供方差指标),具体步骤如下:
第一步:用api/measures/search_history获取近30天的指标数据
这个接口是新版Sonar拉取指标历史趋势的核心接口,不管用Sonar WS Client还是直接HTTP调用都可以。关键参数包括:
component:你的项目键(比如com.你的公司:你的项目)metrics:要查询的指标名称(比如coverage、ncloc)from:30天前的日期,格式为yyyy-MM-ddto:当前日期
举个Java WS Client的代码示例:
SonarClient client = SonarClient.create("http://你的Sonar实例地址"); MeasureHistoryHistoryResponse response = client.measures().searchHistory() .setComponent("com.你的公司:你的项目") .setMetrics("coverage") .setFrom(LocalDate.now().minusDays(30).toString()) .setTo(LocalDate.now().toString()) .execute();
调用后会拿到该指标近30天的所有历史记录,每条记录包含日期和对应数值。
第二步:自行计算方差
Sonar不会帮你计算方差,所以得自己处理数据:
- 把所有历史记录里的指标数值提取出来,放到一个列表中
- 先计算这些数值的平均值
- 计算每个数值与平均值的差的平方,求和后除以数据点数量(总体方差)或者数量减一(样本方差)
给你一段伪代码参考:
values = [record.value for record in response.measures] mean = sum(values) / len(values) # 计算总体方差 population_variance = sum((x - mean) ** 2 for x in values) / len(values) # 计算样本方差(若数据为抽样则用这个) sample_variance = sum((x - mean) ** 2 for x in values) / (len(values) - 1)
小提醒
- 确保你的Sonar版本是8.x及以上,这个接口才支持
- 要查询多个指标的话,
metrics参数用逗号分隔即可,比如metrics=coverage,ncloc - 部分指标可能不是每日都有数据,需要根据你的Sonar分析频率调整时间范围
内容的提问来源于stack exchange,提问作者rathna

