Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions docs/metrics.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ This is a guide for the integration with the [Metrics plugin](https://plugins.je

## Metrics

The integration provides counters for each individual cause and category that you create. These counters will reset to zero when jenkins is restarted. The format for the metrics created is `jenkins_bfa_category_<category name>` for each category and `jenkins_bfa_cause_<cause name>` for each cause. The category and cause names will be escaped by the metrics api to replace any spaces with underscores.
The integration provides counters for each individual cause and category that you create, as well as each job build. These counters will reset to zero when jenkins is restarted. The format for the metrics created is `jenkins_bfa_category_<category name>` for each category, `jenkins_bfa_cause_<cause name>` for each cause, and `jenkins_bfa_job__<job_name>__number__<job_build_number>__cause__<cause name>` for each job build. The category, cause, and job names will be escaped by the metrics api to replace any spaces with underscores.

## Exporting

Expand All @@ -23,9 +23,21 @@ metric_relabel_configs:
regex: 'jenkins_bfa_cause_(.*)'
target_label: 'cause'
- source_labels: [__name__]
regex: 'jenkins_bfa_(.*)_(.*)'
regex: 'jenkins_bfa_job__(.*)__number__(.*)__cause__(.*)'
replacement: '$1'
target_label: 'jenkins_job'
- source_labels: [__name__]
regex: 'jenkins_bfa_job__(.*)__number__(.*)__cause__(.*)'
replacement: '$2'
target_label: 'build_number'
- source_labels: [__name__]
regex: 'jenkins_bfa_job__(.*)__number__(.*)__cause__(.*)'
replacement: '$3'
target_label: 'cause'
- source_labels: [__name__]
regex: 'jenkins_bfa_(.*)'
replacement: 'jenkins_bfa'
target_label: __name__
target_label: __name__
```

This will provide a metric called `jenkins_bfa` with labels for the category and specific cause.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

package com.sonyericsson.jenkins.plugins.bfa;

import static com.sonyericsson.jenkins.plugins.bfa.MetricsManager.addJobBuildCausesMetric;
import static com.sonyericsson.jenkins.plugins.bfa.MetricsManager.incCounters;
import static com.sonyericsson.jenkins.plugins.bfa.MetricsManager.UNKNOWNCAUSE;

Expand All @@ -34,6 +35,7 @@
import com.sonyericsson.jenkins.plugins.bfa.model.FailureCauseMatrixBuildAction;
import com.sonyericsson.jenkins.plugins.bfa.model.FailureReader;
import com.sonyericsson.jenkins.plugins.bfa.model.FoundFailureCause;
import com.sonyericsson.jenkins.plugins.bfa.model.IFailureCauseMetricData;
import com.sonyericsson.jenkins.plugins.bfa.model.ScannerJobProperty;
import com.sonyericsson.jenkins.plugins.bfa.model.indication.FoundIndication;
import com.sonyericsson.jenkins.plugins.bfa.model.indication.Indication;
Expand Down Expand Up @@ -219,13 +221,23 @@ public static void scan(Run build, PrintStream scanLog) {
}


/* Strip "job/" from beginning and "/build_number/" from end */
StringBuilder jobName = new StringBuilder(build.getUrl().replaceFirst("^job/", ""));
String jobNameString = jobName.reverse().toString().replaceFirst("^/\\d+/", "");
jobName = new StringBuilder(jobNameString).reverse();

if (!foundCauseList.isEmpty()) {
incCounters(foundCauseList, PluginImpl.getInstance().isMetricSquashingEnabled());
addJobBuildCausesMetric(jobName.toString(), build, foundCauseList);
} else {
ArrayList<IFailureCauseMetricData> unknownCauses = new ArrayList<>(
Collections.singletonList(UNKNOWNCAUSE)
);
incCounters(
new ArrayList<>(Collections.singletonList(UNKNOWNCAUSE)),
unknownCauses,
PluginImpl.getInstance().isMetricSquashingEnabled()
);
addJobBuildCausesMetric(jobName.toString(), build, unknownCauses);
}

FailureCauseBuildAction buildAction = new FailureCauseBuildAction(foundCauseList);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.codahale.metrics.MetricRegistry;
import com.sonyericsson.jenkins.plugins.bfa.model.FailureCause;
import com.sonyericsson.jenkins.plugins.bfa.model.IFailureCauseMetricData;
import hudson.model.Run;
import jenkins.metrics.api.Metrics;

import java.util.HashSet;
Expand Down Expand Up @@ -72,4 +73,27 @@ public static void incCounters(List<? extends IFailureCauseMetricData> causes, b
}
}
}

/**
* Add and increment counter metric for found failure causes in a build.
* @param job The name of the job where the failed build occurred
* @param build The build where failure causes occurred
* @param causes A list of found causes for a failed job build
*
*/
public static void addJobBuildCausesMetric(String job, Run build, List<? extends IFailureCauseMetricData> causes) {
MetricRegistry metricRegistry = Metrics.metricRegistry();
int buildNumber = build.getNumber();
for (IFailureCauseMetricData cause : causes) {
String causeName = cause.getName();
StringBuilder metricName = new StringBuilder();
metricName.append("jenkins_bfa.job.@")
.append(job)
.append("@.number.@")
.append(buildNumber)
.append("@.cause.@")
.append(causeName);
metricRegistry.counter(metricName.toString()).inc();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import com.sonyericsson.jenkins.plugins.bfa.model.IFailureCauseMetricData;
import com.sonyericsson.jenkins.plugins.bfa.model.indication.BuildLogIndication;
import com.sonyericsson.jenkins.plugins.bfa.model.indication.Indication;
import hudson.model.Run;
import jenkins.metrics.api.Metrics;

import org.junit.After;
Expand All @@ -22,6 +23,7 @@

import static com.sonyericsson.jenkins.plugins.bfa.MetricsManager.addMetric;
import static com.sonyericsson.jenkins.plugins.bfa.MetricsManager.incCounters;
import static com.sonyericsson.jenkins.plugins.bfa.MetricsManager.addJobBuildCausesMetric;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockStatic;
Expand All @@ -37,6 +39,8 @@ public class MetricsManagerTest {
private MetricRegistry metricRegistry;
private Counter counter;

private String mockedJobDisplayName;
private Run mockedJobBuild;
private FailureCause mockedCause;
private List<? extends IFailureCauseMetricData> mockedCauseList;
private MockedStatic<Metrics> metricsMockedStatic;
Expand All @@ -49,6 +53,8 @@ public void setUp() {
metricRegistry = mock(MetricRegistry.class);
counter = mock(Counter.class);
List<Indication> indications = new LinkedList<>();
mockedJobDisplayName = "myJob";
mockedJobBuild = mock(Run.class);
Indication indication = new BuildLogIndication("something");
indications.add(indication);
mockedCause = new FailureCause("id", "myFailureCause", "description", "comment", new Date(),
Expand All @@ -59,6 +65,7 @@ public void setUp() {
metricsMockedStatic.when(Metrics::metricRegistry).thenReturn(metricRegistry);

when(metricRegistry.counter(anyString())).thenReturn(counter);
when(mockedJobBuild.getNumber()).thenReturn(1);
}

/**
Expand Down Expand Up @@ -100,4 +107,13 @@ public void testIncCountersWithSquashingEnabled() {
verify(counter, times(mockedCauseList.size())).inc();
}

/**
* Test that a job counter is incremented for found failure causes in a build.
*/
@Test
public void testaddJobBuildCausesMetric() {
addJobBuildCausesMetric(mockedJobDisplayName, mockedJobBuild, mockedCauseList);

verify(metricRegistry, times(2)).counter("jenkins_bfa.job.@[email protected].@[email protected].@myFailureCause");
}
}