Search in sources :

Example 1 with Function

use of com.srotya.sidewinder.core.functions.Function in project sidewinder by srotya.

the class GrafanaUtils method extractTargetsFromJson.

/**
 * Extract target series from Grafana Json query payload
 *
 * @param json
 * @param targetSeries
 */
public static void extractTargetsFromJson(JsonObject json, List<TargetSeries> targetSeries) {
    JsonArray targets = json.get("targets").getAsJsonArray();
    for (int i = 0; i < targets.size(); i++) {
        JsonObject jsonElement = targets.get(i).getAsJsonObject();
        if (jsonElement == null) {
            continue;
        }
        if (jsonElement.has("target") && jsonElement.has("field")) {
            TagFilter filter = extractGrafanaFilter(jsonElement);
            Function aggregationFunction = extractGrafanaAggregation(jsonElement);
            boolean correlate = false;
            if (jsonElement.has("correlate")) {
                correlate = jsonElement.get("correlate").getAsBoolean();
            }
            TargetSeries e = new TargetSeries(jsonElement.get("target").getAsString(), jsonElement.get("field").getAsString(), filter, aggregationFunction, correlate);
            targetSeries.add(e);
            logger.log(Level.FINE, () -> "Parsed and extracted target:" + e);
        } else if (jsonElement.has("raw") && jsonElement.get("rawQuery").getAsBoolean()) {
            // raw query recieved
            TargetSeries e = MiscUtils.extractTargetFromQuery(jsonElement.get("raw").getAsString());
            logger.log(Level.FINE, () -> "Parsed and extracted raw query:" + e);
            if (e != null) {
                targetSeries.add(e);
            }
        }
    }
}
Also used : JsonArray(com.google.gson.JsonArray) Function(com.srotya.sidewinder.core.functions.Function) TagFilter(com.srotya.sidewinder.core.filters.TagFilter) SimpleTagFilter(com.srotya.sidewinder.core.filters.SimpleTagFilter) ComplexTagFilter(com.srotya.sidewinder.core.filters.ComplexTagFilter) JsonObject(com.google.gson.JsonObject) DataPoint(com.srotya.sidewinder.core.storage.DataPoint)

Example 2 with Function

use of com.srotya.sidewinder.core.functions.Function in project sidewinder by srotya.

the class GrafanaUtils method extractGrafanaAggregation.

public static Function extractGrafanaAggregation(JsonObject jsonElement) {
    if (!jsonElement.has("aggregator")) {
        return null;
    }
    JsonObject obj = jsonElement.get("aggregator").getAsJsonObject();
    if (!obj.has("name") || !obj.has("args")) {
        return null;
    }
    String name = obj.get("name").getAsString();
    if (name.equalsIgnoreCase("none")) {
        return null;
    }
    int multipleFactor = 1;
    if (obj.has("unit")) {
        multipleFactor = toSeconds(obj.get("unit").getAsString());
    }
    Class<? extends Function> lookupFunction = FunctionTable.get().lookupFunction(name);
    if (lookupFunction != null) {
        try {
            Function instance = (Function) lookupFunction.newInstance();
            JsonArray ary = obj.get("args").getAsJsonArray();
            Object[] args = new Object[ary.size()];
            for (JsonElement element : ary) {
                JsonObject arg = element.getAsJsonObject();
                // ignore invalid aggregation function
                if (!arg.has("index") || !arg.has("value")) {
                    return null;
                }
                int index = arg.get("index").getAsInt();
                switch(arg.get("type").getAsString().toLowerCase()) {
                    case "string":
                        args[index] = arg.get("value").getAsString();
                        break;
                    case "int":
                        args[index] = arg.get("value").getAsInt() * multipleFactor;
                        break;
                    case "long":
                        args[index] = arg.get("value").getAsLong() * multipleFactor;
                        break;
                    case "double":
                        args[index] = arg.get("value").getAsDouble();
                        break;
                }
            }
            instance.init(args);
            return instance;
        } catch (Exception e) {
            logger.log(Level.FINE, "Failed to extract aggregate function:" + jsonElement, e);
        }
    }
    return null;
}
Also used : JsonArray(com.google.gson.JsonArray) Function(com.srotya.sidewinder.core.functions.Function) JsonElement(com.google.gson.JsonElement) JsonObject(com.google.gson.JsonObject) JsonObject(com.google.gson.JsonObject) DataPoint(com.srotya.sidewinder.core.storage.DataPoint) ItemNotFoundException(com.srotya.sidewinder.core.storage.ItemNotFoundException) IOException(java.io.IOException) NotFoundException(javax.ws.rs.NotFoundException) BadRequestException(javax.ws.rs.BadRequestException)

Example 3 with Function

use of com.srotya.sidewinder.core.functions.Function in project sidewinder by srotya.

the class MiscUtils method createFunctionChain.

public static Function createFunctionChain(String[] parts, int startIndex) throws InstantiationException, IllegalAccessException, Exception {
    Function[] arguments = new Function[parts.length - startIndex];
    for (int k = startIndex, p = 0; k < parts.length; k++, p++) {
        String[] args = parts[k].split(",");
        Class<? extends Function> lookupFunction = FunctionTable.get().lookupFunction(args[0]);
        if (lookupFunction == null) {
            throw new BadRequestException("Unknown function:" + args[0]);
        }
        Function instance = (Function) lookupFunction.newInstance();
        if (args.length - 1 < instance.getNumberOfArgs()) {
            throw new BadRequestException("Insufficient arguments for aggregation function, needed:" + instance.getNumberOfArgs() + ", found:" + (args.length - 1));
        }
        Object[] ary = new Object[args.length - 1];
        for (int i = 1; i < args.length; i++) {
            Matcher matcher = NUMBER.matcher(args[i]);
            if (matcher.matches()) {
                if (matcher.group(1) != null) {
                    ary[i - 1] = Double.parseDouble(args[i]);
                } else {
                    ary[i - 1] = Integer.parseInt(args[i]);
                }
            } else {
                ary[i - 1] = args[i];
            }
        }
        instance.init(ary);
        arguments[p] = instance;
    }
    ChainFunction function = new ChainFunction();
    function.init(arguments);
    return function;
}
Also used : ChainFunction(com.srotya.sidewinder.core.functions.multiseries.ChainFunction) Function(com.srotya.sidewinder.core.functions.Function) Matcher(java.util.regex.Matcher) ChainFunction(com.srotya.sidewinder.core.functions.multiseries.ChainFunction) BadRequestException(javax.ws.rs.BadRequestException) DataPoint(com.srotya.sidewinder.core.storage.DataPoint) Point(com.srotya.sidewinder.core.rpc.Point)

Example 4 with Function

use of com.srotya.sidewinder.core.functions.Function in project sidewinder by srotya.

the class MiscUtils method extractTargetFromQuery.

public static TargetSeries extractTargetFromQuery(String query) {
    if (query == null || query.isEmpty()) {
        return null;
    }
    String[] queryParts = query.split("<=?");
    if (queryParts.length > 1) {
        query = queryParts[1];
    }
    String[] parts = query.split("=>");
    // select part
    query = parts[0];
    String[] splits = query.split("\\.");
    if (splits.length < 2) {
        throw new BadRequestException("Invalid query string:" + query + ". Must contain measurement and value field name");
    }
    String measurementName = splits[0];
    String valueFieldName = splits[1];
    TagFilter tagFilter = null;
    if (splits.length >= 3) {
        try {
            tagFilter = buildTagFilter(splits[2]);
        } catch (InvalidFilterException e) {
            throw new BadRequestException(e);
        }
    }
    Function aggregationFunction = null;
    if (parts.length > 1) {
        try {
            aggregationFunction = createFunctionChain(parts, 1);
        } catch (Exception e) {
            throw new BadRequestException(e);
        }
    }
    return new TargetSeries(measurementName, valueFieldName, tagFilter, aggregationFunction, false);
}
Also used : ChainFunction(com.srotya.sidewinder.core.functions.multiseries.ChainFunction) Function(com.srotya.sidewinder.core.functions.Function) TagFilter(com.srotya.sidewinder.core.filters.TagFilter) SimpleTagFilter(com.srotya.sidewinder.core.filters.SimpleTagFilter) ComplexTagFilter(com.srotya.sidewinder.core.filters.ComplexTagFilter) TargetSeries(com.srotya.sidewinder.core.api.grafana.TargetSeries) BadRequestException(javax.ws.rs.BadRequestException) BadRequestException(javax.ws.rs.BadRequestException) IOException(java.io.IOException)

Aggregations

Function (com.srotya.sidewinder.core.functions.Function)4 DataPoint (com.srotya.sidewinder.core.storage.DataPoint)3 BadRequestException (javax.ws.rs.BadRequestException)3 JsonArray (com.google.gson.JsonArray)2 JsonObject (com.google.gson.JsonObject)2 ComplexTagFilter (com.srotya.sidewinder.core.filters.ComplexTagFilter)2 SimpleTagFilter (com.srotya.sidewinder.core.filters.SimpleTagFilter)2 TagFilter (com.srotya.sidewinder.core.filters.TagFilter)2 ChainFunction (com.srotya.sidewinder.core.functions.multiseries.ChainFunction)2 IOException (java.io.IOException)2 JsonElement (com.google.gson.JsonElement)1 TargetSeries (com.srotya.sidewinder.core.api.grafana.TargetSeries)1 Point (com.srotya.sidewinder.core.rpc.Point)1 ItemNotFoundException (com.srotya.sidewinder.core.storage.ItemNotFoundException)1 Matcher (java.util.regex.Matcher)1 NotFoundException (javax.ws.rs.NotFoundException)1