Показать пользовательский сонар мера по сравнению типа проекта
У меня есть метрики, которые сканируют файлы JSON. Но когда я анализирую проект Java, мои пользовательские метрики (которые изначально предназначены для файлов JSON) отображаются на веб-сайте сонара. Я заметил, что есть "setHidden", поэтому я попытался использовать это значение без успеха.
Я хотел бы понять, как вызывается CoreMetrics "FUNCTION", которая вычисляет количество функций в Java-файле. Потому что этот показатель не вызывается при сканировании файла JSON. Я оставляю вам пример моего кода ниже
Мой датчик, который получает файлы, анализирует каждый файл и сохраняет метрики со значением:
public class SwaggerMetricsSensor implements Sensor {
Logger logger = Loggers.get(SwaggerMetricsSensor.class);
@Override
public void describe(SensorDescriptor descriptor) {
descriptor.name("Get Metrics");
}
@Override public void execute(SensorContext context) {
SwaggerParser parser = new SwaggerParser();
FileSystem fs = context.fileSystem();
Iterable<InputFile> files = fs.inputFiles(fs.predicates().hasType(InputFile.Type.MAIN));
for (InputFile file : files) {
if (file.toString().endsWith(".json")){
try {
Swagger swagger = parser.parse(
IOUtils.toString(file.inputStream(),
Charset.defaultCharset())
);
SwaggerMetricsAnalyzer analyzer = new SwaggerMetricsAnalyzer();
if (swagger != null){
analyzer.analyze(swagger);
save(context, file, DESCRIBED_OBJECT_COUNT, false, analyzer.getMethodCount());
save(context, file, METHODS_COUNT, false, analyzer.getDescribedObjectCount());
save(context, file, OBJECT_COUNT, false, analyzer.getObjectCount());
}
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("FILE" + file.toString());
save(context, file, DESCRIBED_OBJECT_COUNT, true, 0);
save(context, file, METHODS_COUNT, true, 0);
save(context, file, OBJECT_COUNT, true, 0);
}
}
}
private <T extends Serializable> void save(SensorContext context, InputFile file, Metric<T> metric, Boolean hidden, T value) {
System.out.println("SAVE : " + metric.setHidden(hidden));
context.<T>newMeasure().forMetric(metric.setHidden(hidden)).on(file).withValue(value).save();
}
Мои swaggerMetrics, которые объявляют мои метрики:
public class SwaggerMetrics implements Metrics {
public static final Metric<Integer> METHODS_COUNT = new Metric.Builder("method_count", "Methods count", Metric.ValueType.INT)
.setDescription("Methods count")
.setDirection(Metric.DIRECTION_BETTER)
.setQualitative(false)
.setHidden(false)
.setDomain(CoreMetrics.DOMAIN_SIZE)
.create();
public static final Metric<Integer> DESCRIBED_OBJECT_COUNT = new Metric.Builder("described_object_count", "Described object count", Metric.ValueType.INT)
.setDescription("Described object count")
.setDirection(Metric.DIRECTION_BETTER)
.setQualitative(false)
.setHidden(false)
.setDomain(CoreMetrics.DOMAIN_SIZE)
.create();
public static final Metric<Integer> OBJECT_COUNT = new Metric.Builder("object_count", "Object count", Metric.ValueType.INT)
.setDescription("Object count")
.setDirection(Metric.DIRECTION_BETTER)
.setQualitative(false)
.setHidden(false)
.setDomain(CoreMetrics.DOMAIN_SIZE)
.create();
/**
*
* @return metrics list
*/
@Override
public List<Metric> getMetrics() {
System.out.println("getMetrics : " + METHODS_COUNT.isHidden());
System.out.println("FUNCTIONS : " + CoreMetrics.FUNCTIONS.isHidden());
return asList(METHODS_COUNT, DESCRIBED_OBJECT_COUNT, OBJECT_COUNT);
}
И пример MeasureComputer:
public class ComputeObjectCount implements MeasureComputer {
@Override
public MeasureComputerDefinition define(MeasureComputerDefinitionContext defContext) {
return defContext.newDefinitionBuilder()
.setOutputMetrics(OBJECT_COUNT.key())
.build();
}
@Override
public void compute(MeasureComputerContext context) {
if (context.getComponent().getType() != Component.Type.FILE){
int sum = 0;
for (Measure child : context.getChildrenMeasures(OBJECT_COUNT.getKey())){
sum += child.getIntValue();
}
context.addMeasure(OBJECT_COUNT.getKey(), sum);
}
}