/** * Serializes the collection of metric data points to json * * @param timeSeries - the time series whose points should be serialized. * @return a json serialized collection of metric data points */ public byte[] toJson(MetricTimeSeries timeSeries) { if (!timeSeries.isEmpty()) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); JsonWriter writer = new JsonWriter(new OutputStreamWriter(baos, UTF_8)); List[] data = new List[]{new ArrayList<>(timeSeries.size()), new ArrayList<>(timeSeries.size())}; for (int i = 0; i < timeSeries.size(); i++) { data[0].add(timeSeries.getTime(i)); data[1].add(timeSeries.getValue(i)); } gson.toJson(data, List[].class, writer); writer.close(); baos.flush(); return baos.toByteArray(); } catch (IOException e) { LOGGER.error("Could not serialize data to json", e); } } return EMPTY_JSON; }
/** * Serializes the collection of metric data points to json * * @param timeSeries - the time series whose points should be serialized. * @return a json serialized collection of metric data points */ public byte[] toJson(MetricTimeSeries timeSeries) { if (!timeSeries.isEmpty()) { try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); JsonWriter writer = new JsonWriter(new OutputStreamWriter(baos, UTF_8)); List[] data = new List[]{new ArrayList<>(timeSeries.size()), new ArrayList<>(timeSeries.size())}; for (int i = 0; i < timeSeries.size(); i++) { data[0].add(timeSeries.getTime(i)); data[1].add(timeSeries.getValue(i)); } gson.toJson(data, List[].class, writer); writer.close(); baos.flush(); return baos.toByteArray(); } catch (IOException e) { LOGGER.error("Could not serialize data to json", e); } } return EMPTY_JSON; }
@Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); functionCtx.add(this, timeSeries.size(), chronixTimeSeries.getJoinKey()); } }
/** * Sets the start and end end based on the */ private void setStartAndEnd() { //When the time stamps are empty we do not set the start and end //An aggregation or analysis response does not have a data field per default. if (!timestamps.isEmpty()) { start = timestamps.get(0); end = timestamps.get(size() - 1); } }
/** * Sets the start and end end based on the */ private void setStartAndEnd() { //When the time stamps are empty we do not set the start and end //An aggregation or analysis response does not have a data field per default. if (!timestamps.isEmpty()) { sort(); start = timestamps.get(0); end = timestamps.get(size() - 1); } }
@Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); if (timeSeries.isEmpty()) { functionCtx.add(this, Double.NaN, chronixTimeSeries.getJoinKey()); continue; } //Else calculate the analysis value int size = timeSeries.size(); double current = 0; for (int i = 0; i < size; i++) { current += timeSeries.getValue(i); } functionCtx.add(this, current / timeSeries.size(), chronixTimeSeries.getJoinKey()); } }
/** * Calculates the sum of the values of the given time series * * @param timeSeriesList list with time series * @return the sum of the values */ @Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); //If it is empty, we return NaN if (timeSeries.size() <= 0) { functionCtx.add(this, Double.NaN, chronixTimeSeries.getJoinKey()); continue; } //Else calculate the analysis value int size = timeSeries.size(); double sum = 0; //Sum up the single values for (int i = 0; i < size; i++) { sum += timeSeries.getValue(i); } //add it to the function context functionCtx.add(this, sum, chronixTimeSeries.getJoinKey()); } }
/** * Gets the last value in the time series. * It first orders the time series. * * @param timeSeriesList list with time series * @return the average or 0 if the list is empty */ @Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); //If it is empty, we return NaN if (timeSeries.size() <= 0) { functionCtx.add(this, Double.NaN, chronixTimeSeries.getJoinKey()); continue; } //We need to sort the time series timeSeries.sort(); functionCtx.add(this, timeSeries.getValue(timeSeries.size() - 1), chronixTimeSeries.getJoinKey()); } }
/** * Calculate the difference between the first and the last value of a given time series * * @param timeSeriesList list with time series * @return the average or 0 if the list is empty */ @Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); //If it is empty, we return NaN if (timeSeries.size() <= 0) { functionCtx.add(this, Double.NaN, chronixTimeSeries.getJoinKey()); continue; } //we need to sort the time series timeSeries.sort(); //get the first and the last value double firstValue = timeSeries.getValue(0); double lastValue = timeSeries.getValue(timeSeries.size() - 1); functionCtx.add(this, Math.abs(firstValue - lastValue), chronixTimeSeries.getJoinKey()); } }
/** * Calculates the maximum value of the first time series. * * @param timeSeriesList list with time series * @return the maximum or 0 if the list is empty */ @Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); //If it is empty, we return NaN if (timeSeries.size() <= 0) { functionCtx.add(this, Double.NaN, chronixTimeSeries.getJoinKey()); continue; } //Else calculate the analysis value int size = timeSeries.size(); double max = timeSeries.getValue(0); for (int i = 1; i < size; i++) { double next = timeSeries.getValue(i); if (next > max) { max = next; } } functionCtx.add(this, max, chronixTimeSeries.getJoinKey()); } }
/** * Calculates the minimum value of the first time series. * * @param timeSeriesList list with time series * @return the minimum or 0 if the list is empty */ @Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); //If it is empty, we return NaN if (timeSeries.size() <= 0) { functionCtx.add(this, Double.NaN, chronixTimeSeries.getJoinKey()); continue; } //Else calculate the analysis value int size = timeSeries.size(); double min = timeSeries.getValue(0); for (int i = 1; i < size; i++) { double next = timeSeries.getValue(i); if (next < min) { min = next; } } functionCtx.add(this, min, chronixTimeSeries.getJoinKey()); } }
if (timeSeries.size() <= 0) { functionCtx.add(this, Double.NaN, chronixTimeSeries.getJoinKey()); continue;
@Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); //get a copy of the values double[] values = timeSeries.getValuesAsArray(); //get a copy of timestamps long[] times = timeSeries.getTimestampsAsArray(); for (int i = 0; i < timeSeries.size(); i++) { //scale the original value values[i] = values[i] * value; } //clear and delete the time series timeSeries.clear(); timeSeries.addAll(times, values); functionCtx.add(this, chronixTimeSeries.getJoinKey()); } }
/** * Calculates the standard deviation of the first time series. * * @param timeSeriesList list with time series * @return the percentile or 0 if the list is empty */ @Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); //If it is empty, we return NaN if (timeSeries.size() <= 0) { functionCtx.add(this, Double.NaN, chronixTimeSeries.getJoinKey()); continue; } //Else calculate the analysis value functionCtx.add(this, de.qaware.chronix.solr.type.metric.functions.math.StdDev.dev(timeSeries.getValues()), chronixTimeSeries.getJoinKey()); } }
@Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); //Get a copy of the values double[] values = timeSeries.getValuesAsArray(); //Get a copy of the timestamps long[] times = timeSeries.getTimestampsAsArray(); for (int i = 0; i < timeSeries.size(); i++) { //simply divide the original value values[i] = values[i] / value; } //Clear the original time series and add the values timeSeries.clear(); timeSeries.addAll(times, values); functionCtx.add(this, chronixTimeSeries.getJoinKey()); } }
/** * Calculates the percentile of the first time series. * * @param timeSeriesList list with time series * @return the percentile or 0 if the list is empty */ @Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); //If it is empty, we return NaN if (timeSeries.size() <= 0) { functionCtx.add(this, Double.NaN, chronixTimeSeries.getJoinKey()); continue; } //Else calculate the analysis value functionCtx.add(this, de.qaware.chronix.solr.type.metric.functions.math.Percentile.evaluate(timeSeries.getValues(), percentile), chronixTimeSeries.getJoinKey()); } }
int size = timeSeries.size();
/** * Calculates the integral of the given time series using the simpson integrator of commons math lib * * @param timeSeriesList list with time series * @param functionCtx the analysis and values result map */ @Override public void execute(List<ChronixTimeSeries<MetricTimeSeries>> timeSeriesList, FunctionCtx functionCtx) { for (ChronixTimeSeries<MetricTimeSeries> chronixTimeSeries : timeSeriesList) { MetricTimeSeries timeSeries = chronixTimeSeries.getRawTimeSeries(); if (timeSeries.isEmpty()) { functionCtx.add(this, Double.NaN, chronixTimeSeries.getJoinKey()); continue; } SimpsonIntegrator simpsonIntegrator = new SimpsonIntegrator(); double integral = simpsonIntegrator.integrate(Integer.MAX_VALUE, x -> timeSeries.getValue((int) x), 0, timeSeries.size() - 1); functionCtx.add(this, integral, chronixTimeSeries.getJoinKey()); } }
long[] times = timeSeries.getTimestampsAsArray(); int timeSeriesSize = timeSeries.size();