datadog数据json格式转换prometheus文本格式
代码如下:
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);
}
}
浙公网安备 33010602011771号