/** * 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; }
/** * 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()); } }
@Test public void testParse() throws Exception { try (InputStream stream = GraphiteFormatParserTest.class.getResourceAsStream("/prometheus-text.txt")) { assertNotNull(stream); List<MetricTimeSeries> series = Lists.newArrayList(sut.parse(stream)); assertThat(series.size(), is(3)); MetricTimeSeries metricWithoutTimestampAndLabel = series.stream().filter(s -> s.getName().equals("metric_without_timestamp_and_labels")).findFirst().get(); assertThat(metricWithoutTimestampAndLabel.getTime(0), is(NOW.toEpochMilli())); assertThat(metricWithoutTimestampAndLabel.getValue(0), is(12.47)); MetricTimeSeries httpRequestsTotal200 = series.stream().filter(s -> s.getName().equals("http_requests_total") && s.getAttributesReference().get("code").equals("200")).findFirst().get(); assertThat(httpRequestsTotal200.getTime(0), is(1395066363000L)); assertThat(httpRequestsTotal200.getValue(0), is(1027.0)); MetricTimeSeries httpRequestsTotal400 = series.stream().filter(s -> s.getName().equals("http_requests_total") && s.getAttributesReference().get("code").equals("400")).findFirst().get(); assertThat(httpRequestsTotal400.getTime(0), is(1395066363000L)); assertThat(httpRequestsTotal400.getValue(0), is(3.0)); } } }
/** * Gets the first 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.isEmpty()) { functionCtx.add(this, Double.NaN, chronixTimeSeries.getJoinKey()); continue; } //we need to sort the time series timeSeries.sort(); functionCtx.add(this, timeSeries.getValue(0), 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()); } }
double value = timeSeries.getValue(i);
@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()); } }
/** * 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()); } }
/** * 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()); } }