org.kairosdb.util.ResponseToMetricConverter.java Source code

Java tutorial

Introduction

Here is the source code for org.kairosdb.util.ResponseToMetricConverter.java

Source

/*
 * Copyright 2013 Proofpoint Inc.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *        http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package org.kairosdb.util;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;

import java.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * Converts a query response to a metric that could be pushed back into KairosDB.
 */
public class ResponseToMetricConverter {
    Gson gson = new GsonBuilder().create();

    public static void main(String[] args) throws IOException {
        ResponseToMetricConverter converter = new ResponseToMetricConverter();
        File outFile = new File(args[1]);
        converter.convert(new FileInputStream(args[0]), new FileOutputStream(outFile));
    }

    public void convert(InputStream inputStream, OutputStream outStream) throws IOException {

        JsonReader reader = new JsonReader(new InputStreamReader(inputStream));
        JsonWriter writer = new JsonWriter(new OutputStreamWriter(outStream));

        try {
            writer.beginArray();

            // Queries array
            reader.beginObject();
            while (reader.hasNext()) {
                String token = reader.nextName();
                if (token.equals("queries")) {
                    reader.beginArray();

                    while (reader.hasNext()) {
                        reader.beginObject();
                        token = reader.nextName();
                        if (token.equals("results")) {
                            parseResults(reader, writer);
                        }
                        reader.endObject();
                    }

                    reader.endArray();
                }
            }
            reader.endObject();

            writer.endArray();
        } catch (RuntimeException e) {
            e.printStackTrace();
        } finally {
            reader.close();
            writer.close();
        }
    }

    private void parseResults(JsonReader reader, JsonWriter writer) throws IOException {
        reader.beginArray();
        while (reader.hasNext()) {
            MetricFrom metricFrom = gson.fromJson(reader, MetricFrom.class);
            MetricTo metricTo = new MetricTo(metricFrom);
            gson.toJson(metricTo, MetricTo.class, writer);
        }

        reader.endArray();
    }

    private static class MetricFrom {
        private String name;

        private Map<String, String[]> tags;

        private long[][] values;

        private GroupBy[] groupBy;
    }

    private class GroupBy {
        private String name;

        private String[] tags;

        private Map<String, String> group;
    }

    private static class MetricTo {
        private String name;
        private Map<String, String> tags = new HashMap<String, String>();
        private long[][] datapoints;

        private MetricTo(MetricFrom from) {
            this.name = from.name;
            this.datapoints = Arrays.copyOf(from.values, from.values.length);

            for (Map.Entry<String, String[]> entry : from.tags.entrySet()) {
                tags.put(entry.getKey(), entry.getValue()[0]);
            }
        }
    }
}