package org.datadog.jmxfetch; import java.io.File; import java.util.HashMap; import java.util.LinkedList; import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; import org.yaml.snakeyaml.Yaml; public class Status { public final static String STATUS_WARNING = "WARNING"; public final static String STATUS_OK = "OK"; public final static String STATUS_ERROR = "ERROR"; private final static Logger LOGGER = Logger.getLogger(Status.class.getName()); private final static String INITIALIZED_CHECKS = "initialized_checks"; private final static String FAILED_CHECKS = "failed_checks"; private HashMap<String, Object> instanceStats; private String statusFileLocation; private boolean isEnabled; public Status() { this(null); } public Status(String statusFileLocation) { configure(statusFileLocation); } void configure(String statusFileLocation) { this.statusFileLocation = statusFileLocation; this.isEnabled = this.statusFileLocation != null; this.instanceStats = new HashMap<String, Object>(); this.clearStats(); } private void clearStats() { instanceStats.put(INITIALIZED_CHECKS, new HashMap<String, Object>()); instanceStats.put(FAILED_CHECKS, new HashMap<String, Object>()); } public void addInstanceStats(String checkName, String instance, int metricCount, int serviceCheckCount, String message, String status) { addStats(checkName, instance, metricCount, serviceCheckCount, message, status, INITIALIZED_CHECKS); } @SuppressWarnings("unchecked") private void addStats(String checkName, String instance, int metricCount, int serviceCheckCount, String message, String status, String key) { LinkedList<HashMap<String, Object>> checkStats; HashMap<String, Object> initializedChecks; initializedChecks = (HashMap<String, Object>) this.instanceStats.get(key); if (initializedChecks == null) { initializedChecks = new HashMap<String, Object>(); } checkStats = (LinkedList<HashMap<String, Object>>) initializedChecks.get(checkName); if (checkStats == null) { checkStats = new LinkedList<HashMap<String, Object>>(); } HashMap<String, Object> instStats = new HashMap<String, Object>(); if (instance != null) { instStats.put("instance_name", instance); } if (metricCount != -1) { instStats.put("metric_count", metricCount); } if(serviceCheckCount != -1){ instStats.put("service_check_count", serviceCheckCount); } instStats.put("message", message); instStats.put("status", status); checkStats.add(instStats); initializedChecks.put(checkName, checkStats); this.instanceStats.put(key, initializedChecks); } public void addInitFailedCheck(String checkName, String message, String status) { addStats(checkName, null, -1, -1, message, status, FAILED_CHECKS); } private String generateYaml() { Yaml yaml = new Yaml(); HashMap<String, Object> status = new HashMap<String, Object>(); status.put("timestamp", System.currentTimeMillis()); status.put("checks", this.instanceStats); return yaml.dump(status); } public void flush() { if (isEnabled()) { String yaml = generateYaml(); try { File f = new File(this.statusFileLocation); LOGGER.debug("Writing status to temp yaml file: " + f.getAbsolutePath()); FileUtils.writeStringToFile(f, yaml); } catch (Exception e) { LOGGER.warn("Cannot write status to temp file: " + e.getMessage()); } } this.clearStats(); } public String getStatusFileLocation() { return statusFileLocation; } public boolean isEnabled() { return isEnabled; } }