Skip to content

Commit 71dbfe3

Browse files
Merge pull request #12 from zhaoamong/master
Add 2 metric tags for metric total.build.time
2 parents 0bb696b + a5f8123 commit 71dbfe3

File tree

7 files changed

+149
-41
lines changed

7 files changed

+149
-41
lines changed

pom.xml

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
33
<modelVersion>4.0.0</modelVersion>
4-
54
<parent>
6-
<groupId>org.jenkins-ci.plugins</groupId>
7-
<artifactId>plugin</artifactId>
8-
<version>2.11</version>
9-
<relativePath />
5+
<groupId>org.jenkins-ci.plugins</groupId>
6+
<artifactId>plugin</artifactId>
7+
<version>3.43</version>
8+
<relativePath />
109
</parent>
1110

1211
<artifactId>argus-notifier</artifactId>
@@ -15,13 +14,13 @@
1514

1615
<properties>
1716
<!-- Baseline Jenkins version you use to build the plugin. Users must have this version or newer to run. -->
18-
<jenkins.version>2.60</jenkins.version>
17+
<jenkins.version>2.164.2</jenkins.version>
1918
<!-- Java Level to use. Java 7 required when using core >= 1.612 -->
2019
<java.level>8</java.level>
2120
<java.version>1.8</java.version>
2221
<!-- Jenkins Test Harness version you use to test the plugin. -->
2322
<!-- For Jenkins version >= 1.580.1 use JTH 2.x or higher. -->
24-
<jenkins-test-harness.version>2.13</jenkins-test-harness.version>
23+
<jenkins-test-harness.version>2.49</jenkins-test-harness.version>
2524
<!-- Other properties you may want to use:
2625
~ hpi-plugin.version: The HPI Maven Plugin version used by the plugin..
2726
~ stapler-plugin.version: The Stapler Maven plugin version required by the plugin.
@@ -38,7 +37,7 @@
3837
<maven-compiler-plugin.version>3.6.1</maven-compiler-plugin.version>
3938
<metrics.version>3.1.2.9</metrics.version>
4039
<structs.version>1.10</structs.version>
41-
<jackson2-api.version>2.5.4</jackson2-api.version>
40+
<jackson2-api.version>2.9.8</jackson2-api.version>
4241
</properties>
4342

4443
<name>Argus Notifier Plugin</name>

src/main/java/org/jenkinsci/plugins/argusnotifier/BuildMetricFactory.java

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,18 @@ List<Metric> getBuildStatusMetrics() {
4343
statusTranslatedToNumberMetric.setMetric(BUILD_STATUS);
4444
// TODO: statusTranslatedToNumberMetric.setNamespace(projectName);
4545

46-
statusTranslatedToNumberMetric.setTags(TagFactory.buildStatusTags(jenkins,
47-
jenkinsRunFormatter.getProjectName()));
48-
Map<Long, Double> numericStatusDatapoints =
49-
ImmutableMap.<Long, Double>builder()
50-
.put(metricTimestamp, BuildResultsResolver.translateResultToNumber(run.getResult()))
51-
.build();
46+
statusTranslatedToNumberMetric
47+
.setTags(TagFactory.buildStatusTags(jenkins, jenkinsRunFormatter.getProjectName()));
48+
Map<Long, Double> numericStatusDatapoints = ImmutableMap.<Long, Double>builder()
49+
.put(metricTimestamp, BuildResultsResolver.translateResultToNumber(run.getResult())).build();
5250
statusTranslatedToNumberMetric.setDatapoints(numericStatusDatapoints);
5351
Metric buildStatusMetric = new Metric();
5452
buildStatusMetric.setScope(scope);
5553
buildStatusMetric.setDisplayName(getDisplayName(BuildResultsResolver.getResultString(run.getResult())));
5654
buildStatusMetric.setMetric(BuildResultsResolver.getMetricName(run.getResult()));
57-
buildStatusMetric.setTags(TagFactory.buildStatusTags(jenkins,
58-
jenkinsRunFormatter.getProjectName()));
59-
Map<Long, Double> buildStatusDatapoints =
60-
ImmutableMap.<Long, Double>builder()
61-
.put(metricTimestamp, 1.0)
62-
.build();
55+
buildStatusMetric.setTags(TagFactory.buildStatusTags(jenkins, jenkinsRunFormatter.getProjectName()));
56+
Map<Long, Double> buildStatusDatapoints = ImmutableMap.<Long, Double>builder().put(metricTimestamp, 1.0)
57+
.build();
6358
buildStatusMetric.setDatapoints(buildStatusDatapoints);
6459
return ImmutableList.of(statusTranslatedToNumberMetric, buildStatusMetric);
6560
}
@@ -76,8 +71,7 @@ List<Metric> getBuildTimeMetrics() {
7671
buildingDurationMillis = Math.max(0L, System.currentTimeMillis() - run.getStartTimeInMillis());
7772
totalDurationMillis = timeInQueueAction.getQueuingDurationMillis() + buildingDurationMillis;
7873
}
79-
return ImmutableList.of(
80-
getBuildTimeMetric(BUILD_TIME_LABEL, BUILD_TIME_METRIC, buildingDurationMillis),
74+
return ImmutableList.of(getBuildTimeMetric(BUILD_TIME_LABEL, BUILD_TIME_METRIC, buildingDurationMillis),
8175
getBuildTimeMetric(QUEUE_TIME_LABEL, QUEUE_TIME_METRIC, timeInQueueAction.getQueuingDurationMillis()),
8276
getBuildTimeMetric(TOTAL_BUILD_TIME_LABEL, TOTAL_BUILD_TIME_METRIC, totalDurationMillis));
8377
}
@@ -95,12 +89,11 @@ private Metric getBuildTimeMetric(String labelForDisplayName, String metricStrin
9589
// TODO: metric.setNamespace(projectName);
9690
double timeInSeconds = (double) timeInMillis / 1000.0;
9791

98-
metric.setTags(TagFactory.buildStatusTags(jenkins,
99-
jenkinsRunFormatter.getProjectName()));
100-
Map<Long, Double> datapoints =
101-
ImmutableMap.<Long, Double>builder()
102-
.put(metricTimestamp, timeInSeconds)
103-
.build();
92+
String gitCommitId = jenkinsRunFormatter.getGitCommit();
93+
String buildStatus = BuildResultsResolver.getResultString(run.getResult());
94+
metric.setTags(TagFactory.buildExtendedStatusTags(jenkins, jenkinsRunFormatter.getProjectName(),
95+
jenkinsRunFormatter.getBuildNumberString(), gitCommitId, buildStatus));
96+
Map<Long, Double> datapoints = ImmutableMap.<Long, Double>builder().put(metricTimestamp, timeInSeconds).build();
10497
metric.setDatapoints(datapoints);
10598
return metric;
10699
}

src/main/java/org/jenkinsci/plugins/argusnotifier/BuildResultsResolver.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.jenkinsci.plugins.argusnotifier;
22

33
import com.google.common.collect.ImmutableMap;
4-
import hudson.model.AbstractBuild;
54
import hudson.model.Result;
65
import hudson.model.Run;
76

src/main/java/org/jenkinsci/plugins/argusnotifier/JenkinsRunFormatter.java

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
package org.jenkinsci.plugins.argusnotifier;
22

3-
import hudson.model.AbstractBuild;
43
import hudson.model.Run;
4+
import hudson.util.LogTaskListener;
55
import jenkins.model.Jenkins;
6-
6+
import java.util.logging.Level;
77
import javax.annotation.Nonnull;
8+
import hudson.EnvVars;
9+
import java.io.IOException;
10+
import java.util.logging.Logger;
811

912
/**
1013
* Formatter to consistently format Jenkins and Jenkins build info
1114
*/
1215
class JenkinsRunFormatter {
13-
16+
1417
private final String jenkinsUrl;
1518
private final Run run;
19+
private static final Logger logger = Logger.getLogger(JenkinsRunFormatter.class.getName());
1620

1721
public JenkinsRunFormatter(@Nonnull Jenkins jenkins, @Nonnull Run run) {
1822
this.jenkinsUrl = jenkins.getRootUrl();
@@ -32,12 +36,12 @@ String getProjectName() {
3236
}
3337

3438
/**
35-
* Will return either just the build URL "job/test/42/" if the Jenkins URL is null or
36-
* a full build URL.
39+
* Will return either just the build URL "job/test/42/" if the Jenkins URL is
40+
* null or a full build URL.
3741
*
3842
* @return full run URL if possible
3943
*/
40-
String getRunUrl() {
44+
String getRunUrl() {
4145
if (jenkinsUrl == null) {
4246
return run.getUrl();
4347
}
@@ -55,6 +59,34 @@ String getRunUrl() {
5559
public String getBuildNumberString() {
5660
return String.valueOf(run.getNumber());
5761
}
62+
63+
64+
/**
65+
* Get GIT_COMMIT environment variable if available.
66+
*
67+
*
68+
* @return GIT commit sha as String, return empty String if not available.
69+
*/
70+
public String getGitCommit() {
71+
72+
LogTaskListener listener = new LogTaskListener(logger, Level.INFO);
73+
74+
String commitVar = TagFactory.Tag.GIT_COMMIT.toString();
75+
try {
76+
EnvVars envVars = run.getEnvironment(listener);
77+
Object commitId = envVars.get(commitVar);
78+
if (commitId == null) {
79+
return "";
80+
} else {
81+
return (String) commitId;
82+
}
83+
}
84+
catch (IOException | InterruptedException e) {
85+
return "";
86+
}
87+
88+
89+
}
5890

5991
/**
6092
* Convenience method to get contextual build result

src/main/java/org/jenkinsci/plugins/argusnotifier/TagFactory.java

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.google.common.collect.ImmutableMap;
44
import jenkins.model.Jenkins;
5-
65
import java.util.Map;
76

87
import static org.jenkinsci.plugins.argusnotifier.TagFactory.Tag.*;
@@ -14,8 +13,7 @@
1413
*/
1514
class TagFactory {
1615
enum Tag {
17-
HOST,
18-
PROJECT;
16+
HOST, BUILD_NUMBER, GIT_COMMIT, BUILD_STATUS, PROJECT;
1917

2018
public String lower() {
2119
return name().toLowerCase();
@@ -38,11 +36,34 @@ static Map<String, String> buildStatusTags(Jenkins jenkins, String projectName)
3836
.putAll(hostTag(jenkins))
3937
.put(PROJECT.lower(), InvalidCharSwap.swapWithDash(projectName))
4038
.build();
39+
}
40+
41+
/**
42+
* Create immutable map of tags for a build time metric
43+
*
44+
* @param jenkins Jenkins instance
45+
* @param projectName build project name
46+
* @param buildNumber build number or id
47+
* @param commitId github commit sha associated with this build, set to empty if not applicable
48+
* @param status the build status, SUCCESS, FAILURE or UNSTABLE etc
49+
* @return
50+
*/
51+
static Map<String, String> buildExtendedStatusTags(Jenkins jenkins, String projectName, String buildNumber,
52+
String commitId, String status) {
53+
54+
ImmutableMap.Builder<String, String> mapBuilder = ImmutableMap.<String, String>builder()
55+
.putAll(hostTag(jenkins)).put(PROJECT.lower(), InvalidCharSwap.swapWithDash(projectName));
56+
mapBuilder.put(BUILD_NUMBER.lower(), buildNumber).put(BUILD_STATUS.lower(),status);
57+
58+
if (!commitId.isEmpty()) {
59+
mapBuilder.put(GIT_COMMIT.lower(), commitId);
60+
}
61+
62+
return mapBuilder.build();
63+
4164
}
4265

4366
static Map<String, String> hostTag(Jenkins jenkins) {
44-
return ImmutableMap.<String, String>builder()
45-
.put(HOST.lower(), JenkinsFormatter.getHostName(jenkins))
46-
.build();
67+
return ImmutableMap.<String, String>builder().put(HOST.lower(), JenkinsFormatter.getHostName(jenkins)).build();
4768
}
4869
}

src/test/java/org/jenkinsci/plugins/argusnotifier/BuildMetricFactoryTest.groovy

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.salesforce.dva.argus.sdk.entity.Metric
44
import hudson.model.ItemGroup
55
import hudson.model.Job
66
import hudson.model.Run
7+
import hudson.model.Result
78
import jenkins.model.Jenkins
89
import spock.lang.Specification
910
import spock.lang.Unroll
@@ -43,4 +44,38 @@ class BuildMetricFactoryTest extends Specification {
4344
"myfolder" | "myfolder." + FULL_JOB_NAME + ": " + BuildMetricFactory.NUMERIC_BUILD_STATUS_LABEL
4445
"" | FULL_JOB_NAME + ": " + BuildMetricFactory.NUMERIC_BUILD_STATUS_LABEL
4546
}
47+
48+
def 'Total build time metric with #commitId has git commit tag #expectedCommit'() {
49+
given:
50+
long metricTimestamp = 42L
51+
long totalDuration = 5L
52+
int buildNumber = 349506
53+
String scope = "testScope"
54+
String jobFolderName = "a_jobFolderName"
55+
folder.fullName >> jobFolderName
56+
String commitTag = TagFactory.Tag.GIT_COMMIT.toString()
57+
Map<String, String> envVars = [(commitTag): commitId]
58+
run.getEnvironment(_) >> envVars
59+
run.getNumber() >> buildNumber
60+
run.getResult() >> Result.SUCCESS
61+
62+
BuildMetricFactory metricFactory = new BuildMetricFactory(jenkins, run, metricTimestamp, scope)
63+
64+
when:
65+
Metric metricTotalTime = metricFactory.getBuildTimeMetric(BuildMetricFactory.TOTAL_BUILD_TIME_LABEL,
66+
BuildMetricFactory.TOTAL_BUILD_TIME_METRIC,totalDuration)
67+
68+
then:
69+
70+
metricTotalTime.tags[commitTag.toLowerCase()].equals(expectedCommit)
71+
metricTotalTime.tags[TagFactory.Tag.BUILD_NUMBER.lower()].equals(String.valueOf(buildNumber))
72+
metricTotalTime.tags[TagFactory.Tag.PROJECT.lower()].startsWith(jobFolderName)
73+
metricTotalTime.tags[TagFactory.Tag.BUILD_STATUS.lower()].equals(Result.SUCCESS.toString())
74+
75+
76+
where:
77+
commitId | expectedCommit
78+
"32ds34frg4534ff34fdcdds" | "32ds34frg4534ff34fdcdds"
79+
"" | null
80+
}
4681
}

src/test/java/org/jenkinsci/plugins/argusnotifier/JenkinsRunFormatterTest.groovy

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,35 @@ class JenkinsRunFormatterTest extends Specification {
7070
actualBuildNumberString == String.valueOf(buildNumber)
7171
}
7272

73+
def "test getGitCommit for #commitId returns commit sha #expectedGitCommit"() {
74+
given:
75+
build.getEnvironment(_) >> [(TagFactory.Tag.GIT_COMMIT.toString()): commitId]
76+
JenkinsRunFormatter jenkinsBuildFormatter = new JenkinsRunFormatter(jenkins, build)
77+
78+
when:
79+
String actualGitCommit = jenkinsBuildFormatter.getGitCommit()
80+
81+
then:
82+
actualGitCommit == expectedGitCommit
83+
84+
where:
85+
commitId | expectedGitCommit
86+
"0fc255bb26fcc4a0548c3ca14caec6a7d6de7c25" | "0fc255bb26fcc4a0548c3ca14caec6a7d6de7c25"
87+
"f6fd56be96ccb7f445c6d8058b76b4c2482a50a6" | "f6fd56be96ccb7f445c6d8058b76b4c2482a50a6"
88+
}
89+
90+
def "test getGitCommit no such env variable"() {
91+
given:
92+
build.getEnvironment(_) >> [:]
93+
JenkinsRunFormatter jenkinsBuildFormatter = new JenkinsRunFormatter(jenkins, build)
94+
95+
when:
96+
String actualGitCommit = jenkinsBuildFormatter.getGitCommit()
97+
98+
then:
99+
actualGitCommit == ""
100+
}
101+
73102
def "test getContextualResult properly returns FIXED"() {
74103
// No need to test all of the corner cases again
75104
given:

0 commit comments

Comments
 (0)