代码如下:
import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.zip.InflaterInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.prometheus.client.Collector; import io.prometheus.client.Collector.MetricFamilySamples; import io.prometheus.client.Collector.MetricFamilySamples.Sample; import io.prometheus.client.exporter.common.TextFormat; @RestController public class ReceiveController { @RequestMapping("/metrics") public String foo() { return "test"; } @RequestMapping(value = { "/api/v1/series" }, method = RequestMethod.POST) public void dataDogRev(HttpServletRequest request, HttpServletResponse response) { try { InflaterInputStream iis = new InflaterInputStream(request.getInputStream()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] data = new byte[2048]; int len = 0; while ((len = iis.read(data)) > -1) { baos.write(data, 0, len); } String dataStr = new String(baos.toByteArray(), "UTF-8"); System.out.println(dataStr); convert2PromText(dataStr); } catch (IOException e) { e.printStackTrace(); } } private void convert2PromText(String dataStr) { try { ObjectMapper mapper = new ObjectMapper(); Map<String, List<Map<String, Object>>> map = mapper.readValue(dataStr, new TypeReference<Map<String, List<Map<String, Object>>>>() { }); List<Map<String, Object>> list = map.get("series"); List<MetricFamilySamples> datas = new ArrayList<MetricFamilySamples>(); for (Map<String, Object> map2 : list) { String sourceTypeName = (String) map2.get("source_type_name"); if (sourceTypeName == null) { continue; } String metricName = (String) map2.get("metric"); if (metricName.startsWith("system") || metricName.indexOf("datadog") > -1) { continue; } String typeStr = (String) map2.get("type"); Collector.Type type = Collector.Type.valueOf(typeStr.toUpperCase()); String host = (String) map2.get("host"); List<String> tags = (List<String>) map2.get("tags"); List<String> labelsK = new ArrayList<String>(); labelsK.add("host"); List<String> labelsV = new ArrayList<String>(); labelsV.add(host); for (String tagStr : tags) { String[] tagArray = tagStr.split(":"); labelsK.add(tagArray[0]); labelsV.add(tagArray[1]); } List<List<Object>> points = (List<List<Object>>) map2.get("points"); String time = points.get(0).get(0).toString(); String value = points.get(0).get(1).toString(); MetricFamilySamples metricFamilySamples = new MetricFamilySamples(metricName, type, metricName, Arrays.asList(new Sample(metricName, labelsK, labelsV, Double.parseDouble(value), Long.parseLong(time)))); datas.add(metricFamilySamples); } ByteArrayOutputStream baos = new ByteArrayOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(baos); final Iterator<MetricFamilySamples> iterator = datas.iterator(); Enumeration<MetricFamilySamples> mfs = new Enumeration<MetricFamilySamples>() { @Override public boolean hasMoreElements() { return iterator.hasNext(); } @Override public MetricFamilySamples nextElement() { return iterator.next(); } }; TextFormat.write004(osw, mfs); osw.flush(); osw.close(); System.out.println(new String(baos.toByteArray())); } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws IOException { String fileName = "E:\yaoyu\datadog.txt"; BufferedReader br = new BufferedReader(new FileReader(new File(fileName))); String dataStr = br.readLine(); new ReceiveController().convert2PromText(dataStr); } }