From 049a02314327f889fade2af7439493f39106b7c0 Mon Sep 17 00:00:00 2001 From: Josh Sinfield Date: Thu, 23 Jan 2014 23:35:46 +0000 Subject: [PATCH 01/10] Allow the plugin to build under Java 6 correct some missed off generics and changed the target/source within the pom. this allowed maven to succesfully install or package using java6u45 --- pom.xml | 66 +-- .../graphiteIntegrator/DescriptorImpl.java | 2 +- .../graphiteIntegrator/GraphitePublisher.java | 415 +++++++++--------- 3 files changed, 243 insertions(+), 240 deletions(-) diff --git a/pom.xml b/pom.xml index 58e327b..c28da01 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 org.jenkins-ci.plugins @@ -11,21 +12,21 @@ 1.2-SNAPSHOT hpi https://wiki.jenkins-ci.org/display/JENKINS/Graphite-plugin - + - joachim_rodrigues - joachim rodrigues - rodrigues.joachim@gmail.com + joachim_rodrigues + joachim rodrigues + rodrigues.joachim@gmail.com - + - scm:git:ssh://github.com/jenkinsci/graphite-plugin.git - scm:git:ssh://git@github.com/jenkinsci/graphite-plugin.git - https://github.com/jenkinsci/graphite-plugin - - + scm:git:ssh://github.com/jenkinsci/graphite-plugin.git + scm:git:ssh://git@github.com/jenkinsci/graphite-plugin.git + https://github.com/jenkinsci/graphite-plugin + + @@ -33,32 +34,33 @@ org.apache.maven.plugins maven-compiler-plugin + 2.3.2 - 1.7 - 1.7 + 1.6 + 1.6 - + maven-release-plugin - deploy + deploy - - repo.jenkins-ci.org - http://repo.jenkins-ci.org/public/ - - - - - repo.jenkins-ci.org - http://repo.jenkins-ci.org/public/ - - + + repo.jenkins-ci.org + http://repo.jenkins-ci.org/public/ + + + + + repo.jenkins-ci.org + http://repo.jenkins-ci.org/public/ + + @@ -69,14 +71,14 @@ - - maven.jenkins-ci.org - http://maven.jenkins-ci.org:8081/content/repositories/releases/ - - + + maven.jenkins-ci.org + http://maven.jenkins-ci.org:8081/content/repositories/releases/ + + - + 1.95 diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/DescriptorImpl.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/DescriptorImpl.java index 61f9f21..24ecc9b 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/DescriptorImpl.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/DescriptorImpl.java @@ -29,7 +29,7 @@ public final class DescriptorImpl extends BuildStepDescriptor impleme /** * */ - private final CopyOnWriteList servers = new CopyOnWriteList<>(); + private final CopyOnWriteList servers = new CopyOnWriteList(); /** * diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java index 8d3054d..8526b8d 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java @@ -18,8 +18,8 @@ import org.jenkinsci.plugins.graphiteIntegrator.metrics.AbstractMetric; import org.jenkinsci.plugins.graphiteIntegrator.metrics.BuildDurationMetric; -import org.jenkinsci.plugins.graphiteIntegrator.metrics.BuildFailedMetric; -import org.jenkinsci.plugins.graphiteIntegrator.metrics.BuildSuccessfulMetric; + + import org.jenkinsci.plugins.graphiteIntegrator.metrics.CoberturaCodeCoverageMetric; import org.jenkinsci.plugins.graphiteIntegrator.metrics.FailTestsMetric; import org.jenkinsci.plugins.graphiteIntegrator.metrics.SkipTestsMetric; @@ -33,240 +33,241 @@ */ public class GraphitePublisher extends Notifier { - /** + /** * */ - @Extension - public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl(); + @Extension + public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl(); - /** + /** * */ - private String selectedIp; + private String selectedIp; - /** + /** * */ - private String selectedMetric; - - /** - * - */ - private String protocol; - - /** + private String selectedMetric; + + /** * */ - private List metrics = new ArrayList<>(); - /** + + + + + private List metrics = new ArrayList(); + + /** * */ - public GraphitePublisher() { - } + public GraphitePublisher() { + } - /** + /** * */ - public GraphitePublisher(String ip, String metric, String protocol) { - this.selectedIp = ip; - this.selectedMetric = metric; - this.protocol = protocol; - System.out.println("IP: " + ip); - System.out.println("Protocol: " + protocol); - } - - /** + public GraphitePublisher(String ip, String metric, String protocol) { + this.selectedIp = ip; + this.selectedMetric = metric; + this.protocol = protocol; + System.out.println("IP: " + ip); + System.out.println("Protocol: " + protocol); + + } + + /** * */ - public List getMetrics() { - return metrics; - } + public List getMetrics() { + return metrics; + } - /** + /** * */ - public String getSelectedIp() { - String ipTemp = selectedIp; - if (ipTemp == null) { - Server[] servers = DESCRIPTOR.getServers(); - if (servers.length > 0) { - ipTemp = servers[0].getIp(); - } - } - return ipTemp; - } - - /** + public String getSelectedIp() { + String ipTemp = selectedIp; + if (ipTemp == null) { + Server[] servers = DESCRIPTOR.getServers(); + if (servers.length > 0) { + ipTemp = servers[0].getIp(); + } + } + return ipTemp; + } + + /** * */ - public String getSelectedMetric() { - String metricTemp = selectedMetric; - if (metricTemp == null) { - Metric[] metrics = DESCRIPTOR.getMetrics(); - if (metrics.length > 0) { - metricTemp = metrics[0].getName(); - } - } - return metricTemp; - } - - /** + public String getSelectedMetric() { + String metricTemp = selectedMetric; + if (metricTemp == null) { + Metric[] metrics = DESCRIPTOR.getMetrics(); + if (metrics.length > 0) { + metricTemp = metrics[0].getName(); + } + } + return metricTemp; + } + + /** * */ - public void setSelectedIp(String ip) { - this.selectedIp = ip; - } + public void setSelectedIp(String ip) { + this.selectedIp = ip; + } - /** + /** * */ - public void setSelectedMetric(String metric) { - this.selectedMetric = metric; - } + public void setSelectedMetric(String metric) { + this.selectedMetric = metric; + } - /** + /** * */ - public Server getServer() { - Server[] servers = DESCRIPTOR.getServers(); - if (selectedIp == null && servers.length > 0) { - return servers[0]; - } - for (Server server : servers) { - if (server.getIp().equals(selectedIp)) { - return server; - } - } - return null; - } - - /* - * (non-Javadoc) - * - * @see hudson.tasks.BuildStepCompatibilityLayer#prebuild(hudson.model.AbstractBuild, hudson.model.BuildListener) - */ - @Override - public boolean prebuild(AbstractBuild build, BuildListener listener) { - return true; - } - - /* - * (non-Javadoc) - * - * @see hudson.tasks.Publisher#needsToRunAfterFinalized() - */ - @Override - public boolean needsToRunAfterFinalized() { - return true; - } - - /* - * (non-Javadoc) - * - * @see hudson.tasks.BuildStep#getRequiredMonitorService() - */ - @Override - public BuildStepMonitor getRequiredMonitorService() { - return BuildStepMonitor.NONE; - } - - /* - * (non-Javadoc) - * - * @see hudson.tasks.Notifier#getDescriptor() - */ - @Override - public BuildStepDescriptor getDescriptor() { - return DESCRIPTOR; - } - - /* - * (non-Javadoc) - * - * @see hudson.tasks.BuildStepCompatibilityLayer#perform(hudson.model.AbstractBuild, hudson.Launcher, - * hudson.model.BuildListener) - */ - @Override - public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) - throws InterruptedException, IOException { - - // EDITED: We do not want to exit if build fails - if (build.getResult() == Result.ABORTED) { - return true; - } - - if (getServer() == null) { - return false; - } - - listener.getLogger().println("Connecting to " + getServer().getDescription()); - - GraphiteLogger graphiteLogger = new GraphiteLogger(listener.getLogger()); - - AbstractMetric metricSender = null; - - List coberturaMetrics = null; - - for (Metric metric : metrics) { - if (metric.name.equals(MetricsEnum.BUILD_DURATION.name())) { - metricSender = new BuildDurationMetric(build, listener.getLogger(), graphiteLogger); - metricSender.sendMetric(getServer(), metric); - } - if(metric.name.equals(MetricsEnum.BUILD_FAILED.name())){ - metricSender = new BuildFailedMetric(build, listener.getLogger(), graphiteLogger); - metricSender.sendMetric(getServer(), metric); - } - if(metric.name.equals(MetricsEnum.BUILD_SUCCESSFUL.name())){ - metricSender = new BuildSuccessfulMetric(build, listener.getLogger(), graphiteLogger); - metricSender.sendMetric(getServer(), metric); - } - if (isCoberturaMetric(metric)) { - if (!isCoberturaListInitialized(coberturaMetrics)) { - coberturaMetrics = new ArrayList<>(); - } - coberturaMetrics.add(metric); - } - if (metric.name.equals(MetricsEnum.FAIL_TESTS.name())) { - metricSender = new FailTestsMetric(build, listener.getLogger(), graphiteLogger); - metricSender.sendMetric(getServer(), metric); - } - if (metric.name.equals(MetricsEnum.SKIPED_TESTS.name())) { - metricSender = new SkipTestsMetric(build, listener.getLogger(), graphiteLogger); - metricSender.sendMetric(getServer(), metric); - } - if (metric.name.equals(MetricsEnum.TOTAL_TESTS.name())) { - metricSender = new TotalTestsMetric(build, listener.getLogger(), graphiteLogger); - metricSender.sendMetric(getServer(), metric); - } - } - if (isCoberturaListInitialized(coberturaMetrics)) { - metricSender = new CoberturaCodeCoverageMetric(build, listener.getLogger(), graphiteLogger); - metricSender.sendMetric(getServer(), coberturaMetrics.toArray(new Metric[coberturaMetrics.size()])); - } - - return true; - } - - /** - * @param coberturaMetrics - * @return - */ - private boolean isCoberturaListInitialized(List coberturaMetrics) { - return coberturaMetrics != null; - } - - /** - * @param metric - * @return - */ - private boolean isCoberturaMetric(Metric metric) { - return (// metric.name.equals(MetricsEnum.COBERTURA_PACKAGE_BRANCH_COVERAGE.name()) - // || metric.name.equals(MetricsEnum.COBERTURA_PACKAGE_LINE_COVERAGE.name()) - // || - metric.name.equals(MetricsEnum.COBERTURA_TOTAL_BRANCH_COVERAGE.name()) || metric.name - .equals(MetricsEnum.COBERTURA_TOTAL_LINE_COVERAGE.name()) - - ); - } + public Server getServer() { + Server[] servers = DESCRIPTOR.getServers(); + if (selectedIp == null && servers.length > 0) { + return servers[0]; + } + for (Server server : servers) { + if (server.getIp().equals(selectedIp)) { + return server; + } + } + return null; + } + + /* + * (non-Javadoc) + * + * @see hudson.tasks.BuildStepCompatibilityLayer#prebuild(hudson.model.AbstractBuild, hudson.model.BuildListener) + */ + @Override + public boolean prebuild(AbstractBuild build, BuildListener listener) { + return true; + } + + /* + * (non-Javadoc) + * + * @see hudson.tasks.Publisher#needsToRunAfterFinalized() + */ + @Override + public boolean needsToRunAfterFinalized() { + return true; + } + + /* + * (non-Javadoc) + * + * @see hudson.tasks.BuildStep#getRequiredMonitorService() + */ + @Override + public BuildStepMonitor getRequiredMonitorService() { + return BuildStepMonitor.NONE; + } + + /* + * (non-Javadoc) + * + * @see hudson.tasks.Notifier#getDescriptor() + */ + @Override + public BuildStepDescriptor getDescriptor() { + return DESCRIPTOR; + } + + /* + * (non-Javadoc) + * + * @see hudson.tasks.BuildStepCompatibilityLayer#perform(hudson.model.AbstractBuild, hudson.Launcher, + * hudson.model.BuildListener) + */ + @Override + public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) + throws InterruptedException, IOException { + + + if (build.getResult() == Result.ABORTED) { + return true; + } + + if (getServer() == null) { + return false; + } + + listener.getLogger().println("Connecting to " + getServer().getDescription()); + + GraphiteLogger graphiteLogger = new GraphiteLogger(listener.getLogger()); + + AbstractMetric metricSender = null; + + List coberturaMetrics = null; + + for (Metric metric : metrics) { + if (metric.name.equals(MetricsEnum.BUILD_DURATION.name())) { + metricSender = new BuildDurationMetric(build, listener.getLogger(), graphiteLogger); + metricSender.sendMetric(getServer(), metric); + } + if(metric.name.equals(MetricsEnum.BUILD_FAILED.name())){ + metricSender = new BuildFailedMetric(build, listener.getLogger(), graphiteLogger); + metricSender.sendMetric(getServer(), metric); + } + if(metric.name.equals(MetricsEnum.BUILD_SUCCESSFUL.name())){ + metricSender = new BuildSuccessfulMetric(build, listener.getLogger(), graphiteLogger); + metricSender.sendMetric(getServer(), metric); + } + if (isCoberturaMetric(metric)) { + if (!isCoberturaListInitialized(coberturaMetrics)) { + coberturaMetrics = new ArrayList(); + } + coberturaMetrics.add(metric); + } + if (metric.name.equals(MetricsEnum.FAIL_TESTS.name())) { + metricSender = new FailTestsMetric(build, listener.getLogger(), graphiteLogger); + metricSender.sendMetric(getServer(), metric); + } + if (metric.name.equals(MetricsEnum.SKIPED_TESTS.name())) { + metricSender = new SkipTestsMetric(build, listener.getLogger(), graphiteLogger); + metricSender.sendMetric(getServer(), metric); + } + if (metric.name.equals(MetricsEnum.TOTAL_TESTS.name())) { + metricSender = new TotalTestsMetric(build, listener.getLogger(), graphiteLogger); + metricSender.sendMetric(getServer(), metric); + } + } + if (isCoberturaListInitialized(coberturaMetrics)) { + metricSender = new CoberturaCodeCoverageMetric(build, listener.getLogger(), graphiteLogger); + metricSender.sendMetric(getServer(), coberturaMetrics.toArray(new Metric[coberturaMetrics.size()])); + } + + return true; + } + + /** + * @param coberturaMetrics + * @return + */ + private boolean isCoberturaListInitialized(List coberturaMetrics) { + return coberturaMetrics != null; + } + + /** + * @param metric + * @return + */ + private boolean isCoberturaMetric(Metric metric) { + return (// metric.name.equals(MetricsEnum.COBERTURA_PACKAGE_BRANCH_COVERAGE.name()) + // || metric.name.equals(MetricsEnum.COBERTURA_PACKAGE_LINE_COVERAGE.name()) + // || + metric.name.equals(MetricsEnum.COBERTURA_TOTAL_BRANCH_COVERAGE.name()) || metric.name + .equals(MetricsEnum.COBERTURA_TOTAL_LINE_COVERAGE.name()) + + ); + } } From 4c2ac75e8a702d35c9b4c9a6d224ea3ba10d1401 Mon Sep 17 00:00:00 2001 From: Josh Sinfield Date: Fri, 24 Jan 2014 00:01:44 +0000 Subject: [PATCH 02/10] update project file and classpath --- .gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index 37e641d..e00fd33 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,3 @@ target/ -.classpath -.project .settings/ From c7d97520646ed2776d8c612dd29583a5ce0efefc Mon Sep 17 00:00:00 2001 From: Josh Sinfield Date: Fri, 24 Jan 2014 12:49:19 +0000 Subject: [PATCH 03/10] up the plugin parent version to get it working with 1.532.1 the plugin wasn't showing up in Manage Jenkins or in the Post Build Action menu on 1.532.1 when the parent set to 1.509.1. Updated the version and it now shows up and works. Change-Id: Idbd9902a9ab7aa712402225db07c07699f42d791 --- .gitignore | 7 ++++--- pom.xml | 3 +-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index e00fd33..257ac83 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ -target/ -.settings/ - +target/ +.settings/ + +/work diff --git a/pom.xml b/pom.xml index c28da01..6e4c724 100644 --- a/pom.xml +++ b/pom.xml @@ -4,10 +4,9 @@ org.jenkins-ci.plugins plugin - 1.509.1 - graphiteIntegrator 1.2-SNAPSHOT hpi From f627fd99ab0e7f8a84fe263cdda6e8423af5bb4d Mon Sep 17 00:00:00 2001 From: Josh Sinfield Date: Fri, 24 Jan 2014 16:34:17 +0000 Subject: [PATCH 04/10] updated logging, how the queue name is made up, added epoch time into the data to send also updated the readme with the text which was in the description of the repository. Change-Id: Ie5cb6921ebc17bb5b98dacad7423590f3b8e92d4 --- README.md | 4 ++++ .../graphiteIntegrator/GraphitePublisher.java | 3 +++ .../jenkinsci/plugins/graphiteIntegrator/Metric.java | 5 +++++ .../graphiteIntegrator/loggers/GraphiteLogger.java | 2 +- .../graphiteIntegrator/metrics/AbstractMetric.java | 12 +++++------- 5 files changed, 18 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index e69de29..43115d2 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,4 @@ +This plugin allows you to send the following metrics to one or more graphite servers: number of tests, tests skipped, tests failed, build duration, cobertura total line coverage and cobertura total branch coverage. + + +If you don't have a graphite server you can use : https://www.hostedgraphite.com to test. \ No newline at end of file diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java index 8526b8d..d599fda 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java @@ -193,10 +193,12 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen throws InterruptedException, IOException { + if (build.getResult() == Result.ABORTED) { return true; } + if (getServer() == null) { return false; } @@ -220,6 +222,7 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen } if(metric.name.equals(MetricsEnum.BUILD_SUCCESSFUL.name())){ metricSender = new BuildSuccessfulMetric(build, listener.getLogger(), graphiteLogger); + listener.getLogger().println("lala: " + metric.getName() + " " + metric.getFullQueueAndName() + " " + metric.getQueueName()); metricSender.sendMetric(getServer(), metric); } if (isCoberturaMetric(metric)) { diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/Metric.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/Metric.java index 4ef8dd7..f9bcb43 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/Metric.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/Metric.java @@ -4,6 +4,7 @@ */ package org.jenkinsci.plugins.graphiteIntegrator; + /** * * @author joachimrodrigues @@ -41,4 +42,8 @@ public void setQueueName(String queueName) { this.queueName = queueName; } + public String getFullQueueAndName(){ + return queueName.concat(".").concat(name); + } + } diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/loggers/GraphiteLogger.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/loggers/GraphiteLogger.java index f17deb0..f36112f 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/loggers/GraphiteLogger.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/loggers/GraphiteLogger.java @@ -70,7 +70,7 @@ private void logToGraphiteTCP(String graphiteHost, String graphitePort, String q Socket conn = new Socket(graphiteHost, Integer.parseInt(graphitePort)); DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); - String data = queue + " " + metric + "\n"; + String data = queue + " " + metric + " " + (System.currentTimeMillis()/1000) + "\n"; dos.writeBytes(data); conn.close(); } diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/AbstractMetric.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/AbstractMetric.java index eed2238..01e32c6 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/AbstractMetric.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/AbstractMetric.java @@ -41,7 +41,7 @@ public AbstractMetric(AbstractBuild build, PrintStream logger, GraphiteLog */ protected void sendMetric(Server server, Metric metric, String value) throws UnknownHostException, IOException { - logger.println("Trying sending to server : " + server.getIp() + ":" + server.getPort() + " On queue : " + logger.println("Trying to send metric to Graphite server : " + server.getIp() + ":" + server.getPort() + ", Metric name: " + metric.getName() + " On queue : " + metric.getQueueName() + " With value : " + value); if (server.getProtocol().equals("UDP")) { logger.println("Metric " + value + " correctly sended to " + server.getIp() + ":" + server.getPort() @@ -52,13 +52,11 @@ else if (server.getProtocol().equals("TCP")) { if (validator.isListening(server.getIp(), Integer.parseInt(server.getPort()))) { graphiteLogger.logToGraphite(server.getIp(), server.getPort(), metric.getQueueName(), value.trim(), server.getProtocol()); - logger.println("Metric " + value + " correctly sended to " + server.getIp() + ":" + server.getIp() - + " on " + metric.getQueueName()); - + logger.println("Metric: " + metric.getName() + " with value: "+ value + " correctly sent to " + server.getIp() + ":" + server.getIp() + + " on " + metric.getQueueName()); } else { - logger.println("Metric " + value + " failed when sended to " + server.getIp() + ":" + server.getIp() - + " on " + metric.getQueueName()); - + logger.println("Metric: " + metric.getName() + " with value: "+ value + " failed when sent to " + server.getIp() + ":" + server.getIp() + + " on " + metric.getQueueName()); } } } From 98746d237e52937b8c76c4b7efcc4e678157a51b Mon Sep 17 00:00:00 2001 From: Josh Sinfield Date: Tue, 28 Jan 2014 10:18:30 +0000 Subject: [PATCH 05/10] removed debug logging accidentally left in a previous commit Change-Id: I877bd900e54296f0c7c5fd85481e0cdf09765c25 --- .../jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java index d599fda..df020d7 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java @@ -222,7 +222,6 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen } if(metric.name.equals(MetricsEnum.BUILD_SUCCESSFUL.name())){ metricSender = new BuildSuccessfulMetric(build, listener.getLogger(), graphiteLogger); - listener.getLogger().println("lala: " + metric.getName() + " " + metric.getFullQueueAndName() + " " + metric.getQueueName()); metricSender.sendMetric(getServer(), metric); } if (isCoberturaMetric(metric)) { From a5432ed95ee2cc1e3d5cbb3622e06648d3cba137 Mon Sep 17 00:00:00 2001 From: Josh Sinfield Date: Tue, 28 Jan 2014 18:05:07 +0000 Subject: [PATCH 06/10] Add support for running in Freestyle Jobs In order t record metrics from ant builds we need to be able to send metrics from a freestyle project. This adds that support, however the freestyle projects don't get test result actions unless junit xml files are archived/recorded ( I think) therefore added in a null check before sending any test statistics to avoid nullpointerexceptions Change-Id: Ieb8fc419b6b7068a74a5f1210d841e62f625310d --- .../graphiteIntegrator/GraphitePublisher.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java index df020d7..317a0a1 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java @@ -1,4 +1,4 @@ -package org.jenkinsci.plugins.graphiteIntegrator; +ackage org.jenkinsci.plugins.graphiteIntegrator; import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; @@ -230,18 +230,22 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen } coberturaMetrics.add(metric); } - if (metric.name.equals(MetricsEnum.FAIL_TESTS.name())) { - metricSender = new FailTestsMetric(build, listener.getLogger(), graphiteLogger); - metricSender.sendMetric(getServer(), metric); - } - if (metric.name.equals(MetricsEnum.SKIPED_TESTS.name())) { - metricSender = new SkipTestsMetric(build, listener.getLogger(), graphiteLogger); - metricSender.sendMetric(getServer(), metric); - } - if (metric.name.equals(MetricsEnum.TOTAL_TESTS.name())) { - metricSender = new TotalTestsMetric(build, listener.getLogger(), graphiteLogger); - metricSender.sendMetric(getServer(), metric); - } + // If a Freestyle Build has been configured (without saving JUnit XML Results, I think) these will fail. + // Added simple null check in for now to be safe. + if (build.getTestResultAction() != null) { + if (metric.name.equals(MetricsEnum.FAIL_TESTS.name())) { + metricSender = new FailTestsMetric(build, listener.getLogger(), graphiteLogger); + metricSender.sendMetric(getServer(), metric); + } + if (metric.name.equals(MetricsEnum.SKIPED_TESTS.name())) { + metricSender = new SkipTestsMetric(build, listener.getLogger(), graphiteLogger); + metricSender.sendMetric(getServer(), metric); + } + if (metric.name.equals(MetricsEnum.TOTAL_TESTS.name())) { + metricSender = new TotalTestsMetric(build, listener.getLogger(), graphiteLogger); + metricSender.sendMetric(getServer(), metric); + } + } } if (isCoberturaListInitialized(coberturaMetrics)) { metricSender = new CoberturaCodeCoverageMetric(build, listener.getLogger(), graphiteLogger); From 72aa3d2824bdc10197021b7eaed7cd916bcb8ca5 Mon Sep 17 00:00:00 2001 From: Josh Sinfield Date: Fri, 31 Jan 2014 00:04:18 +0000 Subject: [PATCH 07/10] WIP - add configuration value for base name of queue added in the workings for a default/base queue name within the main plugin configuration. This shall enable all jobs to have the same prefix for the Graphite queue, set in a common location. Still WIP as need to verify does what it says on the tin! --- .../graphiteIntegrator/DescriptorImpl.java | 9 + .../graphiteIntegrator/GraphitePublisher.java | 19 +- .../metrics/AbstractMetric.java | 15 +- .../metrics/BuildDurationMetric.java | 90 +++---- .../metrics/CoberturaCodeCoverageMetric.java | 232 +++++++++--------- .../metrics/FailTestsMetric.java | 90 +++---- .../metrics/SkipTestsMetric.java | 90 +++---- .../metrics/TotalTestsMetric.java | 90 +++---- .../GraphitePublisher/global.jelly | 3 + .../GraphitePublisher/global.properties | 3 +- .../help/global/graphite_base_queue_name.html | 5 + 11 files changed, 337 insertions(+), 309 deletions(-) create mode 100644 src/main/webapp/help/global/graphite_base_queue_name.html diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/DescriptorImpl.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/DescriptorImpl.java index 24ecc9b..3209a7a 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/DescriptorImpl.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/DescriptorImpl.java @@ -36,6 +36,9 @@ public final class DescriptorImpl extends BuildStepDescriptor impleme */ private GraphiteValidator validator = new GraphiteValidator(); + + private String baseQueueName; + /** * The default constructor. */ @@ -116,10 +119,16 @@ public Publisher newInstance(StaplerRequest req, JSONObject formData) { @Override public boolean configure(StaplerRequest req, JSONObject formData) { servers.replaceBy(req.bindParametersToList(Server.class, "serverBinding.")); + baseQueueName = formData.optString("baseQueueName"); save(); return true; } +public String getBaseQueueName(){ + return baseQueueName; + } + + /** * @param ip * @param port diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java index 317a0a1..01dc6e9 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java @@ -1,4 +1,4 @@ -ackage org.jenkinsci.plugins.graphiteIntegrator; +package org.jenkinsci.plugins.graphiteIntegrator; import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; @@ -213,15 +213,15 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen for (Metric metric : metrics) { if (metric.name.equals(MetricsEnum.BUILD_DURATION.name())) { - metricSender = new BuildDurationMetric(build, listener.getLogger(), graphiteLogger); + metricSender = new BuildDurationMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); metricSender.sendMetric(getServer(), metric); } if(metric.name.equals(MetricsEnum.BUILD_FAILED.name())){ - metricSender = new BuildFailedMetric(build, listener.getLogger(), graphiteLogger); + metricSender = new BuildFailedMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); metricSender.sendMetric(getServer(), metric); } if(metric.name.equals(MetricsEnum.BUILD_SUCCESSFUL.name())){ - metricSender = new BuildSuccessfulMetric(build, listener.getLogger(), graphiteLogger); + metricSender = new BuildSuccessfulMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); metricSender.sendMetric(getServer(), metric); } if (isCoberturaMetric(metric)) { @@ -234,21 +234,21 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen // Added simple null check in for now to be safe. if (build.getTestResultAction() != null) { if (metric.name.equals(MetricsEnum.FAIL_TESTS.name())) { - metricSender = new FailTestsMetric(build, listener.getLogger(), graphiteLogger); + metricSender = new FailTestsMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); metricSender.sendMetric(getServer(), metric); } if (metric.name.equals(MetricsEnum.SKIPED_TESTS.name())) { - metricSender = new SkipTestsMetric(build, listener.getLogger(), graphiteLogger); + metricSender = new SkipTestsMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); metricSender.sendMetric(getServer(), metric); } if (metric.name.equals(MetricsEnum.TOTAL_TESTS.name())) { - metricSender = new TotalTestsMetric(build, listener.getLogger(), graphiteLogger); + metricSender = new TotalTestsMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); metricSender.sendMetric(getServer(), metric); } } } if (isCoberturaListInitialized(coberturaMetrics)) { - metricSender = new CoberturaCodeCoverageMetric(build, listener.getLogger(), graphiteLogger); + metricSender = new CoberturaCodeCoverageMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); metricSender.sendMetric(getServer(), coberturaMetrics.toArray(new Metric[coberturaMetrics.size()])); } @@ -271,8 +271,7 @@ private boolean isCoberturaMetric(Metric metric) { return (// metric.name.equals(MetricsEnum.COBERTURA_PACKAGE_BRANCH_COVERAGE.name()) // || metric.name.equals(MetricsEnum.COBERTURA_PACKAGE_LINE_COVERAGE.name()) // || - metric.name.equals(MetricsEnum.COBERTURA_TOTAL_BRANCH_COVERAGE.name()) || metric.name - .equals(MetricsEnum.COBERTURA_TOTAL_LINE_COVERAGE.name()) + metric.name.equals(MetricsEnum.COBERTURA_TOTAL_BRANCH_COVERAGE.name()) || metric.name.equals(MetricsEnum.COBERTURA_TOTAL_LINE_COVERAGE.name()) ); } diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/AbstractMetric.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/AbstractMetric.java index 01e32c6..23f43c4 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/AbstractMetric.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/AbstractMetric.java @@ -19,6 +19,7 @@ public abstract class AbstractMetric { protected final AbstractBuild build; protected final PrintStream logger; protected final GraphiteLogger graphiteLogger; + protected final String baseQueueName; /** * @@ -26,10 +27,11 @@ public abstract class AbstractMetric { * @param logger * @param graphiteLogger */ - public AbstractMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger) { + public AbstractMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger, String baseQueueName) { this.build = build; this.logger = logger; this.graphiteLogger = graphiteLogger; + this.baseQueueName = baseQueueName; } /** @@ -44,18 +46,17 @@ protected void sendMetric(Server server, Metric metric, String value) throws Unk logger.println("Trying to send metric to Graphite server : " + server.getIp() + ":" + server.getPort() + ", Metric name: " + metric.getName() + " On queue : " + metric.getQueueName() + " With value : " + value); if (server.getProtocol().equals("UDP")) { - logger.println("Metric " + value + " correctly sended to " + server.getIp() + ":" + server.getPort() + logger.println("Metric: " + metric.getName() + " with value: "+ value + " correctly sent to " + server.getIp() + ":" + server.getPort() + " on " + metric.getQueueName() + "using UDP"); - graphiteLogger.logToGraphite(server.getIp(), server.getPort(), metric.getQueueName(), value.trim(), server.getProtocol()); + graphiteLogger.logToGraphite(server.getIp(), server.getPort(), baseQueueName + "." + metric.getFullQueueAndName(), value.trim(), server.getProtocol()); } else if (server.getProtocol().equals("TCP")) { if (validator.isListening(server.getIp(), Integer.parseInt(server.getPort()))) { - graphiteLogger.logToGraphite(server.getIp(), server.getPort(), metric.getQueueName(), value.trim(), server.getProtocol()); - - logger.println("Metric: " + metric.getName() + " with value: "+ value + " correctly sent to " + server.getIp() + ":" + server.getIp() + graphiteLogger.logToGraphite(server.getIp(), server.getPort(), baseQueueName + "." + metric.getFullQueueAndName(), value.trim(), server.getProtocol()); + logger.println("Metric: " + metric.getName() + " with value: "+ value + " correctly sent to " + server.getIp() + ":" + server.getPort() + " on " + metric.getQueueName()); } else { - logger.println("Metric: " + metric.getName() + " with value: "+ value + " failed when sent to " + server.getIp() + ":" + server.getIp() + logger.println("Metric: " + metric.getName() + " with value: "+ value + " failed when sent to " + server.getIp() + ":" + server.getPort() + " on " + metric.getQueueName()); } } diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/BuildDurationMetric.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/BuildDurationMetric.java index 942d31e..702ade3 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/BuildDurationMetric.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/BuildDurationMetric.java @@ -1,45 +1,45 @@ -/* - * To change this template, choose Tools | Templates and open the template in the editor. - */ -package org.jenkinsci.plugins.graphiteIntegrator.metrics; - -import hudson.model.AbstractBuild; -import java.io.IOException; -import java.io.PrintStream; -import java.net.UnknownHostException; -import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; -import org.jenkinsci.plugins.graphiteIntegrator.Metric; -import org.jenkinsci.plugins.graphiteIntegrator.Server; - -/** - * - * @author joachimrodrigues - */ -public class BuildDurationMetric extends AbstractMetric { - - /** - * - * @param build - * @param logger - * @param graphiteLogger - */ - public BuildDurationMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger) { - super(build, logger, graphiteLogger); - } - - /** - * - * @param server - * @param metric - * @throws UnknownHostException - * @throws IOException - */ - @Override - public void sendMetric(Server server, Metric... metric) throws UnknownHostException, IOException { - - String metricToSend = String.valueOf((new Long(build.getDuration()).intValue() / 1000)); - - sendMetric(server, metric[0], metricToSend); - } - -} +/* + * To change this template, choose Tools | Templates and open the template in the editor. + */ +package org.jenkinsci.plugins.graphiteIntegrator.metrics; + +import hudson.model.AbstractBuild; +import java.io.IOException; +import java.io.PrintStream; +import java.net.UnknownHostException; +import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; +import org.jenkinsci.plugins.graphiteIntegrator.Metric; +import org.jenkinsci.plugins.graphiteIntegrator.Server; + +/** + * + * @author joachimrodrigues + */ +public class BuildDurationMetric extends AbstractMetric { + + /** + * + * @param build + * @param logger + * @param graphiteLogger + */ + public BuildDurationMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger, String baseQueueName) { + super(build, logger, graphiteLogger, baseQueueName); + } + + /** + * + * @param server + * @param metric + * @throws UnknownHostException + * @throws IOException + */ + @Override + public void sendMetric(Server server, Metric... metric) throws UnknownHostException, IOException { + + String metricToSend = String.valueOf((new Long(build.getDuration()).intValue() / 1000)); + + sendMetric(server, metric[0], metricToSend); + } + +} diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/CoberturaCodeCoverageMetric.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/CoberturaCodeCoverageMetric.java index 0c6e3f0..f946661 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/CoberturaCodeCoverageMetric.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/CoberturaCodeCoverageMetric.java @@ -1,114 +1,118 @@ -/* - * To change this template, choose Tools | Templates and open the template in the editor. - */ -package org.jenkinsci.plugins.graphiteIntegrator.metrics; - -import hudson.model.AbstractBuild; -import java.io.File; -import java.io.IOException; -import java.io.PrintStream; -import java.math.BigDecimal; -import java.net.UnknownHostException; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import net.sourceforge.cobertura.check.PackageCoverage; -import net.sourceforge.cobertura.coveragedata.ClassData; -import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler; -import net.sourceforge.cobertura.coveragedata.ProjectData; -import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; -import org.jenkinsci.plugins.graphiteIntegrator.Metric; -import org.jenkinsci.plugins.graphiteIntegrator.Server; -import utils.MetricsEnum; - -/** - * - * @author joachimrodrigues - */ -public class CoberturaCodeCoverageMetric extends AbstractMetric { - - /** - * - * @param build - * @param logger - * @param graphiteLogger - */ - public CoberturaCodeCoverageMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger) { - super(build, logger, graphiteLogger); - } - - @Override - public void sendMetric(Server server, Metric... metrics) throws UnknownHostException, IOException { - - File dataFile = new File(build.getWorkspace() + "/target/cobertura/cobertura.ser"); - - ProjectData projectData = CoverageDataFileHandler.loadCoverageData(dataFile); - - if (projectData == null) { - logger.print("Error: Unable to read from data file " + dataFile.getAbsolutePath()); - } - - double totalLines = 0; - double totalLinesCovered = 0; - double totalBranches = 0; - double totalBranchesCovered = 0; - - Iterator iter = projectData.getClasses().iterator(); - while (iter.hasNext()) { - ClassData classData = (ClassData) iter.next(); - - totalBranches += classData.getNumberOfValidBranches(); - totalBranchesCovered += classData.getNumberOfCoveredBranches(); - - totalLines += classData.getNumberOfValidLines(); - totalLinesCovered += classData.getNumberOfCoveredLines(); - - // for next release : - // PackageCoverage packageCoverage = getPackageCoverage(classData.getPackageName()); - // packageCoverage.addBranchCount(classData.getNumberOfValidBranches()); - // packageCoverage.addBranchCoverage(classData.getNumberOfCoveredBranches()); - // - // packageCoverage.addLineCount(classData.getNumberOfValidLines()); - // packageCoverage.addLineCoverage(classData.getNumberOfCoveredLines()); - // - // + percentage(classData.getLineCoverageRate()) + "%, branch coverage rate: " - // + percentage(classData.getBranchCoverageRate()) + "%"); - - } - - for (int i = 0; i < metrics.length; i++) { - if (metrics[i].getName().equals(MetricsEnum.COBERTURA_TOTAL_LINE_COVERAGE.name())) { - sendMetric(server, metrics[i], percentage(totalLinesCovered / totalLines)); - } - if (metrics[i].getName().equals(MetricsEnum.COBERTURA_TOTAL_BRANCH_COVERAGE.name())) { - sendMetric(server, metrics[i], percentage(totalBranchesCovered / totalBranches)); - } - } - - } - - Map packageCoverageMap = new HashMap(); - - /** - * @param packageName - * @return - */ - private PackageCoverage getPackageCoverage(String packageName) { - PackageCoverage packageCoverage = packageCoverageMap.get(packageName); - if (packageCoverage == null) { - packageCoverage = new PackageCoverage(); - packageCoverageMap.put(packageName, packageCoverage); - } - return packageCoverage; - } - - /** - * @param coverateRate - * @return - */ - private String percentage(double coverateRate) { - BigDecimal decimal = new BigDecimal(coverateRate * 100); - return decimal.setScale(1, BigDecimal.ROUND_DOWN).toString(); - } - -} +/* + * To change this template, choose Tools | Templates and open the template in the editor. + */ +package org.jenkinsci.plugins.graphiteIntegrator.metrics; + +import hudson.model.AbstractBuild; + +import java.io.File; +import java.io.IOException; +import java.io.PrintStream; +import java.math.BigDecimal; +import java.net.UnknownHostException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import net.sourceforge.cobertura.check.PackageCoverage; +import net.sourceforge.cobertura.coveragedata.ClassData; +import net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler; +import net.sourceforge.cobertura.coveragedata.ProjectData; + +import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; +import org.jenkinsci.plugins.graphiteIntegrator.Metric; +import org.jenkinsci.plugins.graphiteIntegrator.Server; + +import utils.MetricsEnum; + +/** + * + * @author joachimrodrigues + */ +public class CoberturaCodeCoverageMetric extends AbstractMetric { + + /** + * + * @param build + * @param logger + * @param graphiteLogger + */ + public CoberturaCodeCoverageMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger, String baseQueueName) { + super(build, logger, graphiteLogger, baseQueueName); + } + + @Override + public void sendMetric(Server server, Metric... metrics) throws UnknownHostException, IOException { + + File dataFile = new File(build.getWorkspace() + "/target/cobertura/cobertura.ser"); + + ProjectData projectData = CoverageDataFileHandler.loadCoverageData(dataFile); + + if (projectData == null) { + logger.print("Error: Unable to read from data file " + dataFile.getAbsolutePath()); + } + + double totalLines = 0; + double totalLinesCovered = 0; + double totalBranches = 0; + double totalBranchesCovered = 0; + + Iterator iter = projectData.getClasses().iterator(); + while (iter.hasNext()) { + ClassData classData = (ClassData) iter.next(); + + totalBranches += classData.getNumberOfValidBranches(); + totalBranchesCovered += classData.getNumberOfCoveredBranches(); + + totalLines += classData.getNumberOfValidLines(); + totalLinesCovered += classData.getNumberOfCoveredLines(); + + // for next release : + // PackageCoverage packageCoverage = getPackageCoverage(classData.getPackageName()); + // packageCoverage.addBranchCount(classData.getNumberOfValidBranches()); + // packageCoverage.addBranchCoverage(classData.getNumberOfCoveredBranches()); + // + // packageCoverage.addLineCount(classData.getNumberOfValidLines()); + // packageCoverage.addLineCoverage(classData.getNumberOfCoveredLines()); + // + // + percentage(classData.getLineCoverageRate()) + "%, branch coverage rate: " + // + percentage(classData.getBranchCoverageRate()) + "%"); + + } + + for (int i = 0; i < metrics.length; i++) { + if (metrics[i].getName().equals(MetricsEnum.COBERTURA_TOTAL_LINE_COVERAGE.name())) { + sendMetric(server, metrics[i], percentage(totalLinesCovered / totalLines)); + } + if (metrics[i].getName().equals(MetricsEnum.COBERTURA_TOTAL_BRANCH_COVERAGE.name())) { + sendMetric(server, metrics[i], percentage(totalBranchesCovered / totalBranches)); + } + } + + } + + Map packageCoverageMap = new HashMap(); + + /** + * @param packageName + * @return + */ + private PackageCoverage getPackageCoverage(String packageName) { + PackageCoverage packageCoverage = packageCoverageMap.get(packageName); + if (packageCoverage == null) { + packageCoverage = new PackageCoverage(); + packageCoverageMap.put(packageName, packageCoverage); + } + return packageCoverage; + } + + /** + * @param coverateRate + * @return + */ + private String percentage(double coverateRate) { + BigDecimal decimal = new BigDecimal(coverateRate * 100); + return decimal.setScale(1, BigDecimal.ROUND_DOWN).toString(); + } + +} diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/FailTestsMetric.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/FailTestsMetric.java index 469cab8..7f0d49e 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/FailTestsMetric.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/FailTestsMetric.java @@ -1,44 +1,46 @@ -/* - * To change this template, choose Tools | Templates and open the template in the editor. - */ -package org.jenkinsci.plugins.graphiteIntegrator.metrics; - -import hudson.model.AbstractBuild; -import java.io.IOException; -import java.io.PrintStream; -import java.net.UnknownHostException; -import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; -import org.jenkinsci.plugins.graphiteIntegrator.Metric; -import org.jenkinsci.plugins.graphiteIntegrator.Server; - -/** - * - * @author joachimrodrigues - */ -public class FailTestsMetric extends AbstractMetric { - - /** - * - * @param build - * @param logger - * @param graphiteLogger - */ - public FailTestsMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger) { - super(build, logger, graphiteLogger); - } - - /** - * - * @param server - * @param metric - * @throws UnknownHostException - * @throws IOException - */ - @Override - public void sendMetric(Server server, Metric... metric) throws UnknownHostException, IOException { - - String metricToSend = Integer.toString(build.getTestResultAction().getFailCount()); - - sendMetric(server, metric[0], metricToSend); - } -} +/* + * To change this template, choose Tools | Templates and open the template in the editor. + */ +package org.jenkinsci.plugins.graphiteIntegrator.metrics; + +import hudson.model.AbstractBuild; + +import java.io.IOException; +import java.io.PrintStream; +import java.net.UnknownHostException; + +import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; +import org.jenkinsci.plugins.graphiteIntegrator.Metric; +import org.jenkinsci.plugins.graphiteIntegrator.Server; + +/** + * + * @author joachimrodrigues + */ +public class FailTestsMetric extends AbstractMetric { + + /** + * + * @param build + * @param logger + * @param graphiteLogger + */ + public FailTestsMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger, String baseQueueName) { + super(build, logger, graphiteLogger, baseQueueName); + } + + /** + * + * @param server + * @param metric + * @throws UnknownHostException + * @throws IOException + */ + @Override + public void sendMetric(Server server, Metric... metric) throws UnknownHostException, IOException { + + String metricToSend = Integer.toString(build.getTestResultAction().getFailCount()); + + sendMetric(server, metric[0], metricToSend); + } +} diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/SkipTestsMetric.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/SkipTestsMetric.java index 18c50aa..2fd78e2 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/SkipTestsMetric.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/SkipTestsMetric.java @@ -1,44 +1,46 @@ -/* - * To change this template, choose Tools | Templates and open the template in the editor. - */ -package org.jenkinsci.plugins.graphiteIntegrator.metrics; - -import hudson.model.AbstractBuild; -import java.io.IOException; -import java.io.PrintStream; -import java.net.UnknownHostException; -import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; -import org.jenkinsci.plugins.graphiteIntegrator.Metric; -import org.jenkinsci.plugins.graphiteIntegrator.Server; - -/** - * - * @author joachimrodrigues - */ -public class SkipTestsMetric extends AbstractMetric { - - /** - * - * @param build - * @param logger - * @param graphiteLogger - */ - public SkipTestsMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger) { - super(build, logger, graphiteLogger); - } - - /** - * - * @param server - * @param metric - * @throws UnknownHostException - * @throws IOException - */ - @Override - public void sendMetric(Server server, Metric... metric) throws UnknownHostException, IOException { - - String metricToSend = Integer.toString(build.getTestResultAction().getSkipCount()); - - sendMetric(server, metric[0], metricToSend); - } -} +/* + * To change this template, choose Tools | Templates and open the template in the editor. + */ +package org.jenkinsci.plugins.graphiteIntegrator.metrics; + +import hudson.model.AbstractBuild; + +import java.io.IOException; +import java.io.PrintStream; +import java.net.UnknownHostException; + +import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; +import org.jenkinsci.plugins.graphiteIntegrator.Metric; +import org.jenkinsci.plugins.graphiteIntegrator.Server; + +/** + * + * @author joachimrodrigues + */ +public class SkipTestsMetric extends AbstractMetric { + + /** + * + * @param build + * @param logger + * @param graphiteLogger + */ + public SkipTestsMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger, String baseQueueName) { + super(build, logger, graphiteLogger, baseQueueName); + } + + /** + * + * @param server + * @param metric + * @throws UnknownHostException + * @throws IOException + */ + @Override + public void sendMetric(Server server, Metric... metric) throws UnknownHostException, IOException { + + String metricToSend = Integer.toString(build.getTestResultAction().getSkipCount()); + + sendMetric(server, metric[0], metricToSend); + } +} diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/TotalTestsMetric.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/TotalTestsMetric.java index e547f46..9d93a70 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/TotalTestsMetric.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/TotalTestsMetric.java @@ -1,44 +1,46 @@ -/* - * To change this template, choose Tools | Templates and open the template in the editor. - */ -package org.jenkinsci.plugins.graphiteIntegrator.metrics; - -import hudson.model.AbstractBuild; -import java.io.IOException; -import java.io.PrintStream; -import java.net.UnknownHostException; -import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; -import org.jenkinsci.plugins.graphiteIntegrator.Metric; -import org.jenkinsci.plugins.graphiteIntegrator.Server; - -/** - * - * @author joachimrodrigues - */ -public class TotalTestsMetric extends AbstractMetric { - - /** - * - * @param build - * @param logger - * @param graphiteLogger - */ - public TotalTestsMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger) { - super(build, logger, graphiteLogger); - } - - /** - * - * @param server - * @param metric - * @throws UnknownHostException - * @throws IOException - */ - @Override - public void sendMetric(Server server, Metric... metric) throws UnknownHostException, IOException { - - String metricToSend = Integer.toString(build.getTestResultAction().getTotalCount()); - - sendMetric(server, metric[0], metricToSend); - } -} +/* + * To change this template, choose Tools | Templates and open the template in the editor. + */ +package org.jenkinsci.plugins.graphiteIntegrator.metrics; + +import hudson.model.AbstractBuild; + +import java.io.IOException; +import java.io.PrintStream; +import java.net.UnknownHostException; + +import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; +import org.jenkinsci.plugins.graphiteIntegrator.Metric; +import org.jenkinsci.plugins.graphiteIntegrator.Server; + +/** + * + * @author joachimrodrigues + */ +public class TotalTestsMetric extends AbstractMetric { + + /** + * + * @param build + * @param logger + * @param graphiteLogger + */ + public TotalTestsMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger, String baseQueueName) { + super(build, logger, graphiteLogger, baseQueueName); + } + + /** + * + * @param server + * @param metric + * @throws UnknownHostException + * @throws IOException + */ + @Override + public void sendMetric(Server server, Metric... metric) throws UnknownHostException, IOException { + + String metricToSend = Integer.toString(build.getTestResultAction().getTotalCount()); + + sendMetric(server, metric[0], metricToSend); + } +} diff --git a/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly b/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly index 51f8871..34c0542 100644 --- a/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly +++ b/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly @@ -46,6 +46,9 @@ + + + \ No newline at end of file diff --git a/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.properties b/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.properties index 287cfb8..148de88 100644 --- a/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.properties +++ b/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.properties @@ -8,4 +8,5 @@ test_graphite_server_connection=Test connection testing_graphite_server_connection=Testing connection... delete_current_server=delete this server --> delete_current_graphite_server_button=delete me -graphite_servers_adding_protocol=Network protocol \ No newline at end of file +graphite_servers_adding_protocol=Network protocol +base_graphite_queue_name=Base Graphite Queue Name : diff --git a/src/main/webapp/help/global/graphite_base_queue_name.html b/src/main/webapp/help/global/graphite_base_queue_name.html new file mode 100644 index 0000000..2543990 --- /dev/null +++ b/src/main/webapp/help/global/graphite_base_queue_name.html @@ -0,0 +1,5 @@ +Set the base queue name. This will appear at the beginning of every job's queue. +It's a convenient way to set a default base section of the queue without repeating it in every job. + +i.e.: +jenkins.team4.server1.builds From f763329ea68de85aa5a9d0197373a441e6b362e3 Mon Sep 17 00:00:00 2001 From: Josh Sinfield Date: Fri, 31 Jan 2014 11:39:29 +0000 Subject: [PATCH 08/10] Add validation for base queue name added validation for user input into global setting text box added validation within AbstractMetric for empty/null value Change-Id: I8fa2b751612889fa9e5481d24635b908ba0162c8 --- .../graphiteIntegrator/DescriptorImpl.java | 20 +++++++++++++++- .../metrics/AbstractMetric.java | 23 ++++++++++++++++--- src/main/java/utils/GraphiteValidator.java | 18 +++++++++++++++ .../GraphitePublisher/global.jelly | 6 ++--- 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/DescriptorImpl.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/DescriptorImpl.java index 3209a7a..2141b82 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/DescriptorImpl.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/DescriptorImpl.java @@ -119,7 +119,7 @@ public Publisher newInstance(StaplerRequest req, JSONObject formData) { @Override public boolean configure(StaplerRequest req, JSONObject formData) { servers.replaceBy(req.bindParametersToList(Server.class, "serverBinding.")); - baseQueueName = formData.optString("baseQueueName"); + baseQueueName = formData.optString("baseQueueName", ""); save(); return true; } @@ -197,4 +197,22 @@ public FormValidation doCheckPort(@QueryParameter final String value) { return FormValidation.ok("Port is correctly configured"); } + + /** + * + * @param value + * @return + */ + public FormValidation doCheckBaseQueueName(@QueryParameter final String value) { + if(!validator.isBaseQueueNamePresent(value)){ + return FormValidation.ok(); + } + + if(!validator.validateBaseQueueName(value)){ + return FormValidation.error("Please "); + } + + return FormValidation.ok("Base queue name is correctly Configured"); + + } } diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/AbstractMetric.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/AbstractMetric.java index 23f43c4..2acb1a7 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/AbstractMetric.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/AbstractMetric.java @@ -1,12 +1,16 @@ package org.jenkinsci.plugins.graphiteIntegrator.metrics; import hudson.model.AbstractBuild; + import java.io.IOException; import java.io.PrintStream; import java.net.UnknownHostException; + +import org.apache.commons.lang.StringUtils; import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; import org.jenkinsci.plugins.graphiteIntegrator.Metric; import org.jenkinsci.plugins.graphiteIntegrator.Server; + import utils.GraphiteValidator; /** @@ -46,13 +50,15 @@ protected void sendMetric(Server server, Metric metric, String value) throws Unk logger.println("Trying to send metric to Graphite server : " + server.getIp() + ":" + server.getPort() + ", Metric name: " + metric.getName() + " On queue : " + metric.getQueueName() + " With value : " + value); if (server.getProtocol().equals("UDP")) { - logger.println("Metric: " + metric.getName() + " with value: "+ value + " correctly sent to " + server.getIp() + ":" + server.getPort() + if (validator.isListening(server.getIp(), Integer.parseInt(server.getPort()))) { + graphiteLogger.logToGraphite(server.getIp(), server.getPort(), getCheckedBaseQueueName() + metric.getFullQueueAndName(), value.trim(), server.getProtocol()); + logger.println("Metric: " + metric.getName() + " with value: "+ value + " correctly sent to " + server.getIp() + ":" + server.getPort() + " on " + metric.getQueueName() + "using UDP"); - graphiteLogger.logToGraphite(server.getIp(), server.getPort(), baseQueueName + "." + metric.getFullQueueAndName(), value.trim(), server.getProtocol()); + } } else if (server.getProtocol().equals("TCP")) { if (validator.isListening(server.getIp(), Integer.parseInt(server.getPort()))) { - graphiteLogger.logToGraphite(server.getIp(), server.getPort(), baseQueueName + "." + metric.getFullQueueAndName(), value.trim(), server.getProtocol()); + graphiteLogger.logToGraphite(server.getIp(), server.getPort(), getCheckedBaseQueueName() + metric.getFullQueueAndName(), value.trim(), server.getProtocol()); logger.println("Metric: " + metric.getName() + " with value: "+ value + " correctly sent to " + server.getIp() + ":" + server.getPort() + " on " + metric.getQueueName()); } else { @@ -61,6 +67,17 @@ else if (server.getProtocol().equals("TCP")) { } } } + + /** + * Check if base queuename is null or whitespace and return empty, otherwise return the base queue name with a full stop appended + * @return + */ + protected String getCheckedBaseQueueName(){ + if(StringUtils.isBlank(baseQueueName)){ + return ""; + } + return baseQueueName.concat("."); + } /** * diff --git a/src/main/java/utils/GraphiteValidator.java b/src/main/java/utils/GraphiteValidator.java index 8addbcf..573d505 100644 --- a/src/main/java/utils/GraphiteValidator.java +++ b/src/main/java/utils/GraphiteValidator.java @@ -6,6 +6,8 @@ import java.net.Socket; import java.util.regex.Pattern; +import org.apache.commons.lang.StringUtils; + /** * * @author joachimrodrigues @@ -91,5 +93,21 @@ public boolean isDescriptionTooLong(String description) { } return false; } + + /** + * + * @param baseQueueName + * @return + */ + public boolean isBaseQueueNamePresent(String baseQueueName) { + return StringUtils.isNotBlank(baseQueueName); + } + + public boolean validateBaseQueueName(String value) { + if(value.endsWith(".")){ + return false; + } + return true; + } } diff --git a/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly b/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly index 34c0542..21244d2 100644 --- a/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly +++ b/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly @@ -46,9 +46,9 @@ - - - + + + \ No newline at end of file From 799d44f7fadac4f54cbd1cfa8c62cc19b588c033 Mon Sep 17 00:00:00 2001 From: Josh Sinfield Date: Tue, 18 Feb 2014 17:52:57 +0000 Subject: [PATCH 09/10] Add Build_failed and Build_Successful metrics also added correct classpath and project file Change-Id: I499bffe890d28668e9da79b21d4260a7f7a80244 --- .classpath | 44 ++ .project | 23 ++ .../graphiteIntegrator/GraphitePublisher.java | 380 +++++++++--------- .../plugins/graphiteIntegrator/Server.java | 26 +- .../metrics/BuildFailedMetric.java | 4 +- .../metrics/BuildSuccessfulMetric.java | 24 +- .../GraphitePublisher/global.jelly | 14 +- 7 files changed, 288 insertions(+), 227 deletions(-) create mode 100644 .classpath create mode 100644 .project diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..cfd1885 --- /dev/null +++ b/.classpath @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..a435710 --- /dev/null +++ b/.project @@ -0,0 +1,23 @@ + + + graphite-plugin + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + + diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java index 01dc6e9..56205c9 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher.java @@ -18,8 +18,8 @@ import org.jenkinsci.plugins.graphiteIntegrator.metrics.AbstractMetric; import org.jenkinsci.plugins.graphiteIntegrator.metrics.BuildDurationMetric; - - +import org.jenkinsci.plugins.graphiteIntegrator.metrics.BuildFailedMetric; +import org.jenkinsci.plugins.graphiteIntegrator.metrics.BuildSuccessfulMetric; import org.jenkinsci.plugins.graphiteIntegrator.metrics.CoberturaCodeCoverageMetric; import org.jenkinsci.plugins.graphiteIntegrator.metrics.FailTestsMetric; import org.jenkinsci.plugins.graphiteIntegrator.metrics.SkipTestsMetric; @@ -33,246 +33,244 @@ */ public class GraphitePublisher extends Notifier { - /** + /** * */ - @Extension - public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl(); + @Extension + public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl(); - /** + /** * */ - private String selectedIp; + private String selectedIp; - /** + /** * */ - private String selectedMetric; + private String selectedMetric; - /** + /** * */ + private String protocol; + private List metrics = new ArrayList(); - - - - private List metrics = new ArrayList(); - - /** + /** * */ - public GraphitePublisher() { - } + public GraphitePublisher() { + } - /** + /** * */ - public GraphitePublisher(String ip, String metric, String protocol) { - this.selectedIp = ip; - this.selectedMetric = metric; - this.protocol = protocol; - System.out.println("IP: " + ip); - System.out.println("Protocol: " + protocol); + public GraphitePublisher(String ip, String metric, String protocol) { + this.selectedIp = ip; + this.selectedMetric = metric; + this.protocol = protocol; + System.out.println("IP: " + ip); + System.out.println("Protocol: " + protocol); - } + } - /** + /** * */ - public List getMetrics() { - return metrics; - } + public List getMetrics() { + return metrics; + } - /** + /** * */ - public String getSelectedIp() { - String ipTemp = selectedIp; - if (ipTemp == null) { - Server[] servers = DESCRIPTOR.getServers(); - if (servers.length > 0) { - ipTemp = servers[0].getIp(); - } - } - return ipTemp; + public String getSelectedIp() { + String ipTemp = selectedIp; + if (ipTemp == null) { + Server[] servers = DESCRIPTOR.getServers(); + if (servers.length > 0) { + ipTemp = servers[0].getIp(); + } } + return ipTemp; + } - /** + /** * */ - public String getSelectedMetric() { - String metricTemp = selectedMetric; - if (metricTemp == null) { - Metric[] metrics = DESCRIPTOR.getMetrics(); - if (metrics.length > 0) { - metricTemp = metrics[0].getName(); - } - } - return metricTemp; + public String getSelectedMetric() { + String metricTemp = selectedMetric; + if (metricTemp == null) { + Metric[] metrics = DESCRIPTOR.getMetrics(); + if (metrics.length > 0) { + metricTemp = metrics[0].getName(); + } } + return metricTemp; + } - /** + /** * */ - public void setSelectedIp(String ip) { - this.selectedIp = ip; - } + public void setSelectedIp(String ip) { + this.selectedIp = ip; + } - /** + /** * */ - public void setSelectedMetric(String metric) { - this.selectedMetric = metric; - } + public void setSelectedMetric(String metric) { + this.selectedMetric = metric; + } - /** + /** * */ - public Server getServer() { - Server[] servers = DESCRIPTOR.getServers(); - if (selectedIp == null && servers.length > 0) { - return servers[0]; - } - for (Server server : servers) { - if (server.getIp().equals(selectedIp)) { - return server; - } - } - return null; - } - - /* - * (non-Javadoc) - * - * @see hudson.tasks.BuildStepCompatibilityLayer#prebuild(hudson.model.AbstractBuild, hudson.model.BuildListener) - */ - @Override - public boolean prebuild(AbstractBuild build, BuildListener listener) { - return true; + public Server getServer() { + Server[] servers = DESCRIPTOR.getServers(); + if (selectedIp == null && servers.length > 0) { + return servers[0]; } - - /* - * (non-Javadoc) - * - * @see hudson.tasks.Publisher#needsToRunAfterFinalized() - */ - @Override - public boolean needsToRunAfterFinalized() { - return true; + for (Server server : servers) { + if (server.getIp().equals(selectedIp)) { + return server; + } } + return null; + } + + /* + * (non-Javadoc) + * + * @see + * hudson.tasks.BuildStepCompatibilityLayer#prebuild(hudson.model.AbstractBuild + * , hudson.model.BuildListener) + */ + @Override + public boolean prebuild(AbstractBuild build, BuildListener listener) { + return true; + } + + /* + * (non-Javadoc) + * + * @see hudson.tasks.Publisher#needsToRunAfterFinalized() + */ + @Override + public boolean needsToRunAfterFinalized() { + return true; + } + + /* + * (non-Javadoc) + * + * @see hudson.tasks.BuildStep#getRequiredMonitorService() + */ + @Override + public BuildStepMonitor getRequiredMonitorService() { + return BuildStepMonitor.NONE; + } + + /* + * (non-Javadoc) + * + * @see hudson.tasks.Notifier#getDescriptor() + */ + @Override + public BuildStepDescriptor getDescriptor() { + return DESCRIPTOR; + } + + /* + * (non-Javadoc) + * + * @see + * hudson.tasks.BuildStepCompatibilityLayer#perform(hudson.model.AbstractBuild + * , hudson.Launcher, hudson.model.BuildListener) + */ + @Override + public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { - /* - * (non-Javadoc) - * - * @see hudson.tasks.BuildStep#getRequiredMonitorService() - */ - @Override - public BuildStepMonitor getRequiredMonitorService() { - return BuildStepMonitor.NONE; + if (build.getResult() == Result.ABORTED) { + return true; } - /* - * (non-Javadoc) - * - * @see hudson.tasks.Notifier#getDescriptor() - */ - @Override - public BuildStepDescriptor getDescriptor() { - return DESCRIPTOR; + if (getServer() == null) { + return false; } - /* - * (non-Javadoc) - * - * @see hudson.tasks.BuildStepCompatibilityLayer#perform(hudson.model.AbstractBuild, hudson.Launcher, - * hudson.model.BuildListener) - */ - @Override - public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) - throws InterruptedException, IOException { - - - - if (build.getResult() == Result.ABORTED) { - return true; + listener.getLogger().println("Connecting to " + getServer().getDescription()); + + GraphiteLogger graphiteLogger = new GraphiteLogger(listener.getLogger()); + + AbstractMetric metricSender = null; + + List coberturaMetrics = null; + + for (Metric metric : metrics) { + if (metric.name.equals(MetricsEnum.BUILD_DURATION.name())) { + metricSender = new BuildDurationMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); + metricSender.sendMetric(getServer(), metric); + } + if (metric.name.equals(MetricsEnum.BUILD_FAILED.name())) { + metricSender = new BuildFailedMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); + metricSender.sendMetric(getServer(), metric); + } + if (metric.name.equals(MetricsEnum.BUILD_SUCCESSFUL.name())) { + metricSender = new BuildSuccessfulMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); + metricSender.sendMetric(getServer(), metric); + } + if (isCoberturaMetric(metric)) { + if (!isCoberturaListInitialized(coberturaMetrics)) { + coberturaMetrics = new ArrayList(); } - - - if (getServer() == null) { - return false; + coberturaMetrics.add(metric); + } + // If a Freestyle Build has been configured (without publishing + // JUnit XML Results) these will fail. + // Added simple null check in for now to be safe. + if (build.getTestResultAction() != null) { + if (metric.name.equals(MetricsEnum.FAIL_TESTS.name())) { + metricSender = new FailTestsMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); + metricSender.sendMetric(getServer(), metric); } - - listener.getLogger().println("Connecting to " + getServer().getDescription()); - - GraphiteLogger graphiteLogger = new GraphiteLogger(listener.getLogger()); - - AbstractMetric metricSender = null; - - List coberturaMetrics = null; - - for (Metric metric : metrics) { - if (metric.name.equals(MetricsEnum.BUILD_DURATION.name())) { - metricSender = new BuildDurationMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); - metricSender.sendMetric(getServer(), metric); - } - if(metric.name.equals(MetricsEnum.BUILD_FAILED.name())){ - metricSender = new BuildFailedMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); - metricSender.sendMetric(getServer(), metric); - } - if(metric.name.equals(MetricsEnum.BUILD_SUCCESSFUL.name())){ - metricSender = new BuildSuccessfulMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); - metricSender.sendMetric(getServer(), metric); - } - if (isCoberturaMetric(metric)) { - if (!isCoberturaListInitialized(coberturaMetrics)) { - coberturaMetrics = new ArrayList(); - } - coberturaMetrics.add(metric); - } - // If a Freestyle Build has been configured (without saving JUnit XML Results, I think) these will fail. - // Added simple null check in for now to be safe. - if (build.getTestResultAction() != null) { - if (metric.name.equals(MetricsEnum.FAIL_TESTS.name())) { - metricSender = new FailTestsMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); - metricSender.sendMetric(getServer(), metric); - } - if (metric.name.equals(MetricsEnum.SKIPED_TESTS.name())) { - metricSender = new SkipTestsMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); - metricSender.sendMetric(getServer(), metric); - } - if (metric.name.equals(MetricsEnum.TOTAL_TESTS.name())) { - metricSender = new TotalTestsMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); - metricSender.sendMetric(getServer(), metric); - } - } + if (metric.name.equals(MetricsEnum.SKIPED_TESTS.name())) { + metricSender = new SkipTestsMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); + metricSender.sendMetric(getServer(), metric); } - if (isCoberturaListInitialized(coberturaMetrics)) { - metricSender = new CoberturaCodeCoverageMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); - metricSender.sendMetric(getServer(), coberturaMetrics.toArray(new Metric[coberturaMetrics.size()])); + if (metric.name.equals(MetricsEnum.TOTAL_TESTS.name())) { + metricSender = new TotalTestsMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); + metricSender.sendMetric(getServer(), metric); } - - return true; + } } - - /** - * @param coberturaMetrics - * @return - */ - private boolean isCoberturaListInitialized(List coberturaMetrics) { - return coberturaMetrics != null; + if (isCoberturaListInitialized(coberturaMetrics)) { + metricSender = new CoberturaCodeCoverageMetric(build, listener.getLogger(), graphiteLogger, DESCRIPTOR.getBaseQueueName()); + metricSender.sendMetric(getServer(), coberturaMetrics.toArray(new Metric[coberturaMetrics.size()])); } - /** - * @param metric - * @return - */ - private boolean isCoberturaMetric(Metric metric) { - return (// metric.name.equals(MetricsEnum.COBERTURA_PACKAGE_BRANCH_COVERAGE.name()) - // || metric.name.equals(MetricsEnum.COBERTURA_PACKAGE_LINE_COVERAGE.name()) - // || - metric.name.equals(MetricsEnum.COBERTURA_TOTAL_BRANCH_COVERAGE.name()) || metric.name.equals(MetricsEnum.COBERTURA_TOTAL_LINE_COVERAGE.name()) - - ); - } + return true; + } + + /** + * @param coberturaMetrics + * @return + */ + private boolean isCoberturaListInitialized(List coberturaMetrics) { + return coberturaMetrics != null; + } + + /** + * @param metric + * @return + */ + private boolean isCoberturaMetric(Metric metric) { + return (// metric.name.equals(MetricsEnum.COBERTURA_PACKAGE_BRANCH_COVERAGE.name()) + // || + // metric.name.equals(MetricsEnum.COBERTURA_PACKAGE_LINE_COVERAGE.name()) + // || + metric.name.equals(MetricsEnum.COBERTURA_TOTAL_BRANCH_COVERAGE.name()) || metric.name.equals(MetricsEnum.COBERTURA_TOTAL_LINE_COVERAGE.name()) + + ); + } } diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/Server.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/Server.java index 0a6d5c1..bf3a3c0 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/Server.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/Server.java @@ -5,30 +5,28 @@ package org.jenkinsci.plugins.graphiteIntegrator; /** - * + * * @author joachimrodrigues */ public class Server { - String ip; - + String port; - + String description; - + String protocol; - public String getProtocol() { - return protocol; - } + return protocol; + } - public void setProtocol(String protocol) { - this.protocol = protocol; - } + public void setProtocol(String protocol) { + this.protocol = protocol; + } - public String getIp() { + public String getIp() { return ip; } @@ -51,7 +49,5 @@ public void setPort(String port) { public void setDescription(String description) { this.description = description; } - - -} +} diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/BuildFailedMetric.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/BuildFailedMetric.java index 78b6553..dc20898 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/BuildFailedMetric.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/BuildFailedMetric.java @@ -23,8 +23,8 @@ public class BuildFailedMetric extends AbstractMetric { * @param logger * @param graphiteLogger */ - public BuildFailedMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger) { - super(build, logger, graphiteLogger); + public BuildFailedMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger, String baseQueueName) { + super(build, logger, graphiteLogger, baseQueueName); } /** diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/BuildSuccessfulMetric.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/BuildSuccessfulMetric.java index 4ded52d..cbbd7e0 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/BuildSuccessfulMetric.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/BuildSuccessfulMetric.java @@ -23,8 +23,8 @@ public class BuildSuccessfulMetric extends AbstractMetric { * @param logger * @param graphiteLogger */ - public BuildSuccessfulMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger) { - super(build, logger, graphiteLogger); + public BuildSuccessfulMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger, String baseQueueName) { + super(build, logger, graphiteLogger, baseQueueName); } /** @@ -36,13 +36,13 @@ public BuildSuccessfulMetric(AbstractBuild build, PrintStream logger, Grap */ @Override public void sendMetric(Server server, Metric... metric) throws UnknownHostException, IOException { - - if(build.getResult() == Result.SUCCESS){ - String metricToSend = String.valueOf(1); - sendMetric(server, metric[0], metricToSend); - } - - - } - - } \ No newline at end of file + + if(build.getResult().isCompleteBuild() && build.getResult() == Result.SUCCESS){ + String metricToSend = String.valueOf(1); + sendMetric(server, metric[0], metricToSend); + } + + + } + +} diff --git a/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly b/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly index 21244d2..da0957e 100644 --- a/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly +++ b/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly @@ -30,9 +30,9 @@ + + + - - - - + + + + \ No newline at end of file From 307987223b2bf5fb0ce3420cbf58aad9c074688f Mon Sep 17 00:00:00 2001 From: andyf Date: Thu, 2 Jul 2015 15:55:52 +0100 Subject: [PATCH 10/10] Updated to cover later version of Jenkins. 1. The .jelly files were updated to cover off the latest XSS support sauch that they can be used within the Jenkins UI. 2. The deprecated getTestResultAction() method is no longer available in Jenkins and this causes no metrics to be logged due to missing method errors. Replaced these with the recommended getAction() calls. 3. Updated the POM to reference a later version of the HPI plug in and be based on a later version of Jenkins --- pom.xml | 11 +++- .../metrics/FailTestsMetric.java | 55 ++++++++++--------- .../metrics/SkipTestsMetric.java | 54 +++++++++--------- .../metrics/TotalTestsMetric.java | 54 +++++++++--------- src/main/resources/index.jelly | 1 + .../GraphitePublisher/config.jelly | 1 + .../GraphitePublisher/global.jelly | 1 + 7 files changed, 99 insertions(+), 78 deletions(-) diff --git a/pom.xml b/pom.xml index 6e4c724..586b9d5 100644 --- a/pom.xml +++ b/pom.xml @@ -4,11 +4,11 @@ org.jenkins-ci.plugins plugin - 1.532.1 graphiteIntegrator - 1.2-SNAPSHOT + 1.2.1-SNAPSHOT hpi https://wiki.jenkins-ci.org/display/JENKINS/Graphite-plugin @@ -67,6 +67,11 @@ cobertura 2.0.3 + + org.jenkins-ci.plugins + junit + 1.3 + @@ -78,6 +83,6 @@ - 1.95 + 1.112 diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/FailTestsMetric.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/FailTestsMetric.java index 7f0d49e..8dd3768 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/FailTestsMetric.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/FailTestsMetric.java @@ -4,14 +4,15 @@ package org.jenkinsci.plugins.graphiteIntegrator.metrics; import hudson.model.AbstractBuild; +import hudson.tasks.test.AbstractTestResultAction; import java.io.IOException; import java.io.PrintStream; import java.net.UnknownHostException; -import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; import org.jenkinsci.plugins.graphiteIntegrator.Metric; import org.jenkinsci.plugins.graphiteIntegrator.Server; +import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; /** * @@ -19,28 +20,32 @@ */ public class FailTestsMetric extends AbstractMetric { - /** - * - * @param build - * @param logger - * @param graphiteLogger - */ - public FailTestsMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger, String baseQueueName) { - super(build, logger, graphiteLogger, baseQueueName); - } - - /** - * - * @param server - * @param metric - * @throws UnknownHostException - * @throws IOException - */ - @Override - public void sendMetric(Server server, Metric... metric) throws UnknownHostException, IOException { - - String metricToSend = Integer.toString(build.getTestResultAction().getFailCount()); - - sendMetric(server, metric[0], metricToSend); - } + /** + * + * @param build + * @param logger + * @param graphiteLogger + */ + public FailTestsMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger, String baseQueueName) { + super(build, logger, graphiteLogger, baseQueueName); + } + + /** + * + * @param server + * @param metric + * @throws UnknownHostException + * @throws IOException + */ + @Override + public void sendMetric(Server server, Metric... metric) throws UnknownHostException, IOException { + final AbstractTestResultAction testResult = build.getAction(AbstractTestResultAction.class); + + if (testResult != null) { + final String metricToSend = Integer.toString(testResult.getFailCount()); + + sendMetric(server, metric[0], metricToSend); + } + } + } diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/SkipTestsMetric.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/SkipTestsMetric.java index 2fd78e2..9bb6618 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/SkipTestsMetric.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/SkipTestsMetric.java @@ -4,14 +4,15 @@ package org.jenkinsci.plugins.graphiteIntegrator.metrics; import hudson.model.AbstractBuild; +import hudson.tasks.test.AbstractTestResultAction; import java.io.IOException; import java.io.PrintStream; import java.net.UnknownHostException; -import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; import org.jenkinsci.plugins.graphiteIntegrator.Metric; import org.jenkinsci.plugins.graphiteIntegrator.Server; +import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; /** * @@ -19,28 +20,31 @@ */ public class SkipTestsMetric extends AbstractMetric { - /** - * - * @param build - * @param logger - * @param graphiteLogger - */ - public SkipTestsMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger, String baseQueueName) { - super(build, logger, graphiteLogger, baseQueueName); - } - - /** - * - * @param server - * @param metric - * @throws UnknownHostException - * @throws IOException - */ - @Override - public void sendMetric(Server server, Metric... metric) throws UnknownHostException, IOException { - - String metricToSend = Integer.toString(build.getTestResultAction().getSkipCount()); - - sendMetric(server, metric[0], metricToSend); - } + /** + * + * @param build + * @param logger + * @param graphiteLogger + */ + public SkipTestsMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger, String baseQueueName) { + super(build, logger, graphiteLogger, baseQueueName); + } + + /** + * + * @param server + * @param metric + * @throws UnknownHostException + * @throws IOException + */ + @Override + public void sendMetric(Server server, Metric... metric) throws UnknownHostException, IOException { + final AbstractTestResultAction testResult = build.getAction(AbstractTestResultAction.class); + + if (testResult != null) { + final String metricToSend = Integer.toString(testResult.getSkipCount()); + + sendMetric(server, metric[0], metricToSend); + } + } } diff --git a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/TotalTestsMetric.java b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/TotalTestsMetric.java index 9d93a70..c307e70 100644 --- a/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/TotalTestsMetric.java +++ b/src/main/java/org/jenkinsci/plugins/graphiteIntegrator/metrics/TotalTestsMetric.java @@ -4,14 +4,15 @@ package org.jenkinsci.plugins.graphiteIntegrator.metrics; import hudson.model.AbstractBuild; +import hudson.tasks.test.AbstractTestResultAction; import java.io.IOException; import java.io.PrintStream; import java.net.UnknownHostException; -import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; import org.jenkinsci.plugins.graphiteIntegrator.Metric; import org.jenkinsci.plugins.graphiteIntegrator.Server; +import org.jenkinsci.plugins.graphiteIntegrator.loggers.GraphiteLogger; /** * @@ -19,28 +20,31 @@ */ public class TotalTestsMetric extends AbstractMetric { - /** - * - * @param build - * @param logger - * @param graphiteLogger - */ - public TotalTestsMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger, String baseQueueName) { - super(build, logger, graphiteLogger, baseQueueName); - } - - /** - * - * @param server - * @param metric - * @throws UnknownHostException - * @throws IOException - */ - @Override - public void sendMetric(Server server, Metric... metric) throws UnknownHostException, IOException { - - String metricToSend = Integer.toString(build.getTestResultAction().getTotalCount()); - - sendMetric(server, metric[0], metricToSend); - } + /** + * + * @param build + * @param logger + * @param graphiteLogger + */ + public TotalTestsMetric(AbstractBuild build, PrintStream logger, GraphiteLogger graphiteLogger, String baseQueueName) { + super(build, logger, graphiteLogger, baseQueueName); + } + + /** + * + * @param server + * @param metric + * @throws UnknownHostException + * @throws IOException + */ + @Override + public void sendMetric(Server server, Metric... metric) throws UnknownHostException, IOException { + final AbstractTestResultAction testResult = build.getAction(AbstractTestResultAction.class); + + if (testResult != null) { + final String metricToSend = Integer.toString(testResult.getTotalCount()); + + sendMetric(server, metric[0], metricToSend); + } + } } diff --git a/src/main/resources/index.jelly b/src/main/resources/index.jelly index 6323c59..c19f9a5 100644 --- a/src/main/resources/index.jelly +++ b/src/main/resources/index.jelly @@ -1,3 +1,4 @@ +
This plugin allows you to send these metrics : number of tests, tests skipped, tests failed, build duration, cobertura total line coverage and cobertura total branch coverage to one or more graphite servers. diff --git a/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/config.jelly b/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/config.jelly index fa660c0..c2534b3 100644 --- a/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/config.jelly +++ b/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/config.jelly @@ -1,3 +1,4 @@ + diff --git a/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly b/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly index da0957e..4537f25 100644 --- a/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly +++ b/src/main/resources/org/jenkinsci/plugins/graphiteIntegrator/GraphitePublisher/global.jelly @@ -1,3 +1,4 @@ +