package com.speedledger.measure.jenkins; import com.google.common.collect.Sets; import hudson.EnvVars; import hudson.Extension; import hudson.Plugin; import hudson.model.Job; import hudson.model.Run; import hudson.model.TaskListener; import hudson.model.listeners.RunListener; import io.searchbox.client.JestClient; import io.searchbox.client.JestClientFactory; import io.searchbox.client.JestResult; import io.searchbox.client.config.ClientConfig; import io.searchbox.client.config.HttpClientConfig; import io.searchbox.core.Index; import jenkins.model.Jenkins; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Calendar; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.logging.Level; import java.util.logging.Logger; /** * Send Jenkins build information to Elasticsearch. */ @Extension public class BuildListener extends RunListener<Run> { private static final Logger LOG = Logger.getLogger(BuildListener.class.getName()); private final JestClient jestClient; private Config config; public BuildListener() { LOG.info("Initializing"); /* final JestClientFactory factory = new JestClientFactory(); ClientConfig clientConfig = new ClientConfig.Builder(new ArrayList<String>()).multiThreaded(true).build(); factory.setClientConfig(clientConfig); jestClient = factory.getObject(); }*/ final JestClientFactory factory = new JestClientFactory(); HttpClientConfig clientConfig = new HttpClientConfig.Builder(new ArrayList<String>()).multiThreaded(true).build(); factory.setHttpClientConfig(clientConfig); jestClient = factory.getObject(); } public synchronized void loadConfig() { final Plugin plugin = Jenkins.getInstance().getPlugin("elasticsearch-jenkins"); if (plugin instanceof ElasticsearchPlugin) { ElasticsearchPlugin elasticsearchPlugin = (ElasticsearchPlugin) plugin; Config newConfig = elasticsearchPlugin.getConfig(); if (newConfig == null && config != null) { config = newConfig; LOG.info("Clearing configuration"); jestClient.setServers(new HashSet<String>()); } else if (newConfig != null && !newConfig.equals(config)) { config = newConfig; LOG.info("Applying new configuration: " + newConfig); jestClient.setServers(Sets.newHashSet(config.getUrl())); } } else { LOG.info("Could not find correct plugin"); } } @Override public void onCompleted(Run run, TaskListener listener) { loadConfig(); final boolean validConfig = config != null && config.nonEmptyValues(); if (validConfig) { final Build build = createBuild(run, listener); try { final Index index = new Index.Builder(build).index(config.getIndexName()).type(config.getTypeName()).build(); final JestResult result = jestClient.execute(index); if (result.isSucceeded()) { LOG.fine("Sent build to Elasticsearch: " + build); } else { LOG.warning("Failed to index build, got error message: " + result.getErrorMessage()); } } catch (Exception e) { LOG.log(Level.SEVERE, "Error when sending build data: " + build, e); } } else { LOG.fine("The configuration is not valid, can not index the build"); } } private Build createBuild(Run run, TaskListener listener) { final Job job = run.getParent(); EnvVars environment = null; try { environment = run.getEnvironment(listener); } catch (IOException e) { LOG.log(Level.WARNING, "Error getting environment", e); } catch (InterruptedException e) { LOG.log(Level.WARNING, "Error getting environment", e); } final Build build = new Build(); build.setDuration(run.getDuration()); build.setJobName(job.getFullName()); build.setResult(run.getResult().toString()); build.setStartTime(run.getStartTimeInMillis()); build.setNumber(run.getNumber()); build.setEnvironment(environment); build.setTimestamp(run.getTimestamp()); return build; } }