package com.easemob.tsdb.utils; import com.easemob.tsdb.thrift.models.TSData; import net.opentsdb.core.Const; import net.opentsdb.core.Tags; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.HashMap; import java.util.Map; /** * Description for Class TSDataUtils * * @author Lynch Lee<Lynch.lee9527@gmail.com> * @version 2016-01-14. */ public class TSDataUtils { private static final Logger logger = LoggerFactory.getLogger(TSDataUtils.class); //name tags timestamp value //sys.cpu.user host=webserver01,cpu=0 1356998400 1 public static TSData parseString2TSData(String s) { try { if (s == null || s.isEmpty()) { return null; } String[] fragements = s.split(" "); if (fragements.length < 4) { return null; } String name = fragements[0].trim(); if (name.isEmpty()) { return null; } String tagsString = fragements[1].trim(); if (tagsString.isEmpty()) { return null; } long timestamp = Long.valueOf(fragements[2].trim()); double value = Double.valueOf(fragements[3].trim()); Map<String, String> tags = parseTags(tagsString); if (tags == null || tags.isEmpty()) { return null; } TSData tsdata = new TSData(); tsdata.setName(name); tsdata.setTags(tags); tsdata.setTimestamp(timestamp); tsdata.setValue(value); return tsdata; } catch (Exception e) { logger.error("Failed to parse '{}' to data point, just ignore this", s, e); return null; } } private static Map<String, String> parseTags(String tagsString) { String[] tags = tagsString.split(","); Map<String, String> map = new HashMap<>(tags.length); for (String tag : tags) { String[] keyValue = tag.trim().split("="); if (keyValue.length != 2) { continue; } map.put(keyValue[0], keyValue[1]); } return map; } /** * Validates the given metric and tags. * * @throws IllegalArgumentException if any of the arguments aren't valid. */ public static boolean isValidMetricAndTags(final String metric, final Map<String, String> tags) { if (tags.size() <= 0) { logger.warn("Need at least one tag (metric=" + metric + ", tags=" + tags + ')'); return false; } else if (tags.size() > Const.MAX_NUM_TAGS) { logger.warn("Too many tags: " + tags.size() + " maximum allowed: " + Const.MAX_NUM_TAGS + ", tags: " + tags); return false; } try { Tags.validateString("metric name", metric); for (final Map.Entry<String, String> tag : tags.entrySet()) { Tags.validateString("tag name", tag.getKey()); Tags.validateString("tag value", tag.getValue()); } return true; } catch (IllegalArgumentException iae) { System.out.println(iae.getMessage()); logger.warn(iae.getMessage()); } return false; } }