use of com.srotya.sidewinder.core.functions.iterative.FunctionIteratorFactory in project sidewinder by srotya.
the class GrafanaUtils method extractTargetsFromJson.
/**
* Extract target series from Grafana Json query payload
*
* @param json
* @param targetSeries
* @throws InvalidFilterException
*/
public static void extractTargetsFromJson(JsonObject json, List<TargetSeries> targetSeries) throws InvalidFilterException {
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);
FunctionIteratorFactory functionIterator = extractGrafanaFunction(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, functionIterator);
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;
try {
e = MiscUtils.extractTargetFromQuery(jsonElement.get("raw").getAsString());
} catch (Exception e1) {
throw new InvalidFilterException("Bad function expression:" + jsonElement.get("raw").getAsString() + " reason:" + e1.getMessage());
}
logger.log(Level.FINE, () -> "Parsed and extracted raw query:" + e);
if (e != null) {
targetSeries.add(e);
}
}
}
}
use of com.srotya.sidewinder.core.functions.iterative.FunctionIteratorFactory in project sidewinder by srotya.
the class GrafanaUtils method extractGrafanaFunction.
public static FunctionIteratorFactory extractGrafanaFunction(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 FunctionIterator> functionIteratorClass = FunctionIteratorTable.get().lookupFunction(name);
if (functionIteratorClass != null) {
try {
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;
}
}
FunctionIteratorFactory template = new FunctionIteratorFactory(Arrays.asList(new FunctionIteratorFactory.FunctionTemplate(functionIteratorClass, args)));
return template;
} catch (Exception e) {
logger.log(Level.SEVERE, "Failed to extract aggregate function:" + jsonElement, e);
}
}
return null;
}
use of com.srotya.sidewinder.core.functions.iterative.FunctionIteratorFactory in project sidewinder by srotya.
the class MiscUtils method createIteratorChain.
public static FunctionIteratorFactory createIteratorChain(String[] parts, int startIndex) throws Exception {
List<FunctionTemplate> templates = new ArrayList<>();
for (int k = startIndex; k < parts.length; k++) {
String[] args = parts[k].split(",");
Class<? extends FunctionIterator> lookupFunction = FunctionIteratorTable.get().lookupFunction(args[0]);
if (lookupFunction == null) {
throw new BadRequestException("Unknown function:" + args[0]);
}
FunctionIterator instance = FunctionIterator.getDummyInstance(lookupFunction);
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);
templates.add(new FunctionTemplate(lookupFunction, ary));
}
return new FunctionIteratorFactory(templates);
}
use of com.srotya.sidewinder.core.functions.iterative.FunctionIteratorFactory in project sidewinder by srotya.
the class MiscUtils method extractTargetFromQuery.
public static TargetSeries extractTargetFromQuery(String query) throws Exception {
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.getMessage());
// }
// }
FunctionIteratorFactory template = null;
if (parts.length > 1) {
template = createIteratorChain(parts, 1);
}
return new TargetSeries(measurementName, valueFieldName, tagFilter, aggregationFunction, false, template);
}
Aggregations