diff --git a/build.gradle b/build.gradle index 6f5bd1e..6062551 100644 --- a/build.gradle +++ b/build.gradle @@ -58,7 +58,7 @@ subprojects { apply plugin: 'com.jfrog.bintray' apply plugin: 'com.github.hierynomus.license' - version = "0.2-beta-2" + version = "0.2" license { includes(["**/*.java", "**/*.groovy"]) diff --git a/chronix-importer/build.gradle b/chronix-importer/build.gradle index bc51a47..ed3477f 100644 --- a/chronix-importer/build.gradle +++ b/chronix-importer/build.gradle @@ -4,9 +4,9 @@ dependencies { compile 'org.yaml:snakeyaml:1.17' compile 'de.qaware.chronix:chronix-api:0.1' - compile 'de.qaware.chronix:chronix-server-client:0.2-beta-1' - compile 'de.qaware.chronix:chronix-kassiopeia-simple:0.1.8-beta-4' - compile 'de.qaware.chronix:chronix-kassiopeia-simple-converter:0.1.8-beta-4' + compile 'de.qaware.chronix:chronix-server-client:0.2' + compile 'de.qaware.chronix:chronix-kassiopeia-simple:0.2' + compile 'de.qaware.chronix:chronix-kassiopeia-simple-converter:0.2' //Testing testCompile 'org.codehaus.groovy:groovy-all:2.4.6' @@ -30,5 +30,5 @@ jar { task buildRelease(type: Copy) { into "$projectDir/release/lib" - from "$buildDir/libs/chronix-importer-0.2-beta-1.jar" + from "$buildDir/libs/chronix-importer-0.2.jar" } diff --git a/chronix-importer/release/import.sh b/chronix-importer/release/import.sh index 400e87e..ef0413e 100755 --- a/chronix-importer/release/import.sh +++ b/chronix-importer/release/import.sh @@ -1,3 +1,3 @@ #!/bin/bash -java -Dlog4j.configurationFile=log4j2.xml -jar lib/chronix-importer-0.2-beta-1.jar config.yml data/ \ No newline at end of file +java -Dlog4j.configurationFile=log4j2.xml -jar lib/chronix-importer-0.2.jar config.yml data/ \ No newline at end of file diff --git a/chronix-importer/src/main/java/de/qaware/chronix/importer/csv/ChronixImporter.java b/chronix-importer/src/main/java/de/qaware/chronix/importer/csv/ChronixImporter.java index f783018..ecef181 100644 --- a/chronix-importer/src/main/java/de/qaware/chronix/importer/csv/ChronixImporter.java +++ b/chronix-importer/src/main/java/de/qaware/chronix/importer/csv/ChronixImporter.java @@ -20,7 +20,7 @@ import de.qaware.chronix.converter.serializer.gen.SimpleProtocolBuffers; import de.qaware.chronix.solr.client.ChronixSolrStorage; import de.qaware.chronix.timeseries.MetricTimeSeries; -import de.qaware.chronix.timeseries.dt.Point; +import de.qaware.chronix.timeseries.Point; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; diff --git a/chronix-server-integration/build.gradle b/chronix-server-integration/build.gradle index a904f5d..ac362db 100644 --- a/chronix-server-integration/build.gradle +++ b/chronix-server-integration/build.gradle @@ -31,17 +31,17 @@ dependencies { //Chronix compile 'de.qaware.chronix:chronix-api:0.1' - compile 'de.qaware.chronix:chronix-server-client:0.1.3' + compile 'de.qaware.chronix:chronix-server-client:0.2' //Kassiopeia-Simple - compile 'de.qaware.chronix:chronix-kassiopeia-simple:0.1.7' - compile 'de.qaware.chronix:chronix-kassiopeia-simple-converter:0.1.7' + compile 'de.qaware.chronix:chronix-kassiopeia-simple:0.2' + compile 'de.qaware.chronix:chronix-kassiopeia-simple-converter:0.2' //Kassiopeia - compile 'de.qaware.chronix:chronix-kassiopeia:0.1.7' - compile 'de.qaware.chronix:chronix-kassiopeia-converter:0.1.7' + compile 'de.qaware.chronix:chronix-kassiopeia:0.2' + compile 'de.qaware.chronix:chronix-kassiopeia-converter:0.2' //Solr - compile 'org.apache.solr:solr-solrj:5.5.0' + compile 'org.apache.solr:solr-solrj:6.0.1' } \ No newline at end of file diff --git a/chronix-server-integration/src/main/java/de/qaware/chronix/examples/server/ChronixClientExampleWithKassiopeia.java b/chronix-server-integration/src/main/java/de/qaware/chronix/examples/server/ChronixClientExampleWithKassiopeia.java index 4eb75f0..1cc6807 100644 --- a/chronix-server-integration/src/main/java/de/qaware/chronix/examples/server/ChronixClientExampleWithKassiopeia.java +++ b/chronix-server-integration/src/main/java/de/qaware/chronix/examples/server/ChronixClientExampleWithKassiopeia.java @@ -34,7 +34,7 @@ /** * An example showcase of how to integrate chronix into your application. - * Works with the release 0.1.1 of the chronix-server + * Works with the release 0.2 of the chronix-server * Download at chronix-server-0.1.1 * Note: The example data stored in the release * @@ -59,7 +59,7 @@ public static void main(String[] args) { //We want the maximum of all time series that metric matches *load*. SolrQuery query = new SolrQuery("metric:*Load*"); - query.addFilterQuery("ag=max"); + query.addFilterQuery("function=max"); //The result is a Java Stream. We simply collect the result into a list. List> maxTS = chronix.stream(solr, query).collect(Collectors.toList()); diff --git a/chronix-server-integration/src/main/java/de/qaware/chronix/examples/server/ChronixClientExampleWithKassiopeiaSimple.java b/chronix-server-integration/src/main/java/de/qaware/chronix/examples/server/ChronixClientExampleWithKassiopeiaSimple.java index e3af958..5b97f4a 100644 --- a/chronix-server-integration/src/main/java/de/qaware/chronix/examples/server/ChronixClientExampleWithKassiopeiaSimple.java +++ b/chronix-server-integration/src/main/java/de/qaware/chronix/examples/server/ChronixClientExampleWithKassiopeiaSimple.java @@ -17,10 +17,10 @@ import de.qaware.chronix.ChronixClient; import de.qaware.chronix.converter.KassiopeiaSimpleConverter; +import de.qaware.chronix.converter.common.DoubleList; +import de.qaware.chronix.converter.common.LongList; import de.qaware.chronix.solr.client.ChronixSolrStorage; import de.qaware.chronix.timeseries.MetricTimeSeries; -import de.qaware.chronix.timeseries.dt.DoubleList; -import de.qaware.chronix.timeseries.dt.LongList; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.impl.HttpSolrClient; @@ -34,7 +34,7 @@ /** * An example showcase of how to integrate chronix into your application using kassiopeia-simple - * Works with the release 0.1.1 of the chronix-server + * Works with the release 0.2 of the chronix-server * Download at chronix-server-0.1.1 * * @author f.lautenschlager @@ -64,7 +64,7 @@ public static void main(String[] args) { //We want the maximum of all time series that metric matches *load*. SolrQuery query = new SolrQuery("metric:*Load*"); - query.addFilterQuery("ag=max"); + query.addFilterQuery("function=max"); //The result is a Java Stream. We simply collect the result into a list. List maxTS = chronix.stream(solr, query).collect(Collectors.toList()); diff --git a/chronix-timeseries-exploration/README.md b/chronix-timeseries-exploration/README.md index 5ce36ca..a38097b 100644 --- a/chronix-timeseries-exploration/README.md +++ b/chronix-timeseries-exploration/README.md @@ -16,12 +16,12 @@ To start you have to do a few steps: First ensure that you have a Java 8 runtime environment in your PATH. That should be easy ;-). -Then download, unzip and start the [Chronix Server](https://github.com/ChronixDB/chronix.server/releases/tag/v0.0.2). +Then download, unzip and start the [Chronix Server](https://github.com/ChronixDB/chronix.server/releases/tag/0.2). ``` -wget https://github.com/ChronixDB/chronix.server/releases/download/v0.1.1/chronix-0.1.1.zip -unzip chronix-0.1.1.zip +wget https://github.com/ChronixDB/chronix.server/releases/download/0.2/chronix-0.2.zip +unzip chronix-0.2.zip -./chronix-solr-5.4.0/bin/solr start +./chronix-solr-6.0.4/bin/solr start Waiting up to 30 seconds to see Solr running on port 8983 [|] Started Solr server on port 8983 (pid=2504). Happy searching! ``` diff --git a/chronix-timeseries-exploration/build.gradle b/chronix-timeseries-exploration/build.gradle index 7246147..80aa618 100644 --- a/chronix-timeseries-exploration/build.gradle +++ b/chronix-timeseries-exploration/build.gradle @@ -29,9 +29,9 @@ dependencies { compile 'commons-logging:commons-logging:1.2' compile 'de.qaware.chronix:chronix-api:0.1' - compile 'de.qaware.chronix:chronix-server-client:0.2-beta-1' - compile 'de.qaware.chronix:chronix-kassiopeia-simple:0.1.8-beta-4' - compile 'de.qaware.chronix:chronix-kassiopeia-simple-converter:0.1.8-beta-4' + compile 'de.qaware.chronix:chronix-server-client:0.2' + compile 'de.qaware.chronix:chronix-kassiopeia-simple:0.2' + compile 'de.qaware.chronix:chronix-kassiopeia-simple-converter:0.2' } diff --git a/chronix-timeseries-exploration/src/main/java/de/qaware/chronix/examples/exploration/ui/MainController.java b/chronix-timeseries-exploration/src/main/java/de/qaware/chronix/examples/exploration/ui/MainController.java index 3bd7356..d843223 100644 --- a/chronix-timeseries-exploration/src/main/java/de/qaware/chronix/examples/exploration/ui/MainController.java +++ b/chronix-timeseries-exploration/src/main/java/de/qaware/chronix/examples/exploration/ui/MainController.java @@ -18,11 +18,14 @@ import de.qaware.chronix.ChronixClient; import de.qaware.chronix.converter.KassiopeiaSimpleConverter; import de.qaware.chronix.examples.exploration.ui.dt.DateAxis; +import de.qaware.chronix.examples.exploration.ui.dt.ResultRow; import de.qaware.chronix.examples.exploration.ui.log.TextAreaLogger; import de.qaware.chronix.solr.client.ChronixSolrStorage; import de.qaware.chronix.timeseries.MetricTimeSeries; -import de.qaware.chronix.timeseries.dt.Point; +import de.qaware.chronix.timeseries.Point; import javafx.application.Platform; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; import javafx.concurrent.Task; import javafx.event.EventHandler; import javafx.fxml.FXML; @@ -30,6 +33,8 @@ import javafx.scene.chart.LineChart; import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; import javafx.scene.control.TextArea; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; @@ -76,6 +81,24 @@ public class MainController implements Initializable { @FXML private LineChart chart; + /** + * Table stuff below + */ + @FXML + private TableView resultTable; + @FXML + private TableColumn timeSeries; + @FXML + private TableColumn aggregationOrAnalysis; + @FXML + private TableColumn arguments; + @FXML + private TableColumn values; + @FXML + private TableColumn order; + + private ObservableList rows = FXCollections.observableArrayList(); + //Chronix stuff private ChronixClient chronix; private SolrClient solr; @@ -87,6 +110,14 @@ public void initialize(URL location, ResourceBundle resources) { //Pipe logs to ui TextAreaLogger.setTextArea(logs); + //Init table + timeSeries.setCellValueFactory(cellData -> cellData.getValue().timeSeriesProperty()); + aggregationOrAnalysis.setCellValueFactory(cellData -> cellData.getValue().aggregationOrAnalysisProperty()); + arguments.setCellValueFactory(cellData -> cellData.getValue().argumentsProperty()); + values.setCellValueFactory(cellData -> cellData.getValue().valuesProperty()); + order.setCellValueFactory(cellData -> cellData.getValue().orderProperty()); + resultTable.setItems(rows); + EventHandler queryExecuteHandler = event -> { if (event.getCode() == KeyCode.ENTER && event.isShiftDown()) { queryTimeSeries(); @@ -146,19 +177,18 @@ protected Void call() throws Exception { Platform.runLater(() -> { chart.getData().clear(); + rows.clear(); //Start the query chart.setTitle("Your Query was q=" + queryString + " fq=" + fq); }); SolrQuery query = new SolrQuery(queryString); + query.addField("+data"); + boolean hasFilterQueries = !fq.isEmpty(); if (hasFilterQueries) { query.addFilterQuery(fq); - - if (fq.contains("analysis=")) { - query.addField("+data"); - } } long queryStart = System.currentTimeMillis(); @@ -167,12 +197,10 @@ protected Void call() throws Exception { LOGGER.info("Query took: {} ms for {} points", (queryEnd - queryStart), size(result)); queryStart = System.currentTimeMillis(); result.forEach(ts -> { - if (hasFilterQueries) { - convertAggregationOrAnalysisTs(ts, fq.contains("analysis=")); - } else { - convertTsToSeries(ts); + addFunctionsToTable(ts); } + convertTsToSeries(ts); }); queryEnd = System.currentTimeMillis(); LOGGER.info("Charting took: {} ms", (queryEnd - queryStart)); @@ -183,7 +211,7 @@ protected Void call() throws Exception { } - private void convertAggregationOrAnalysisTs(MetricTimeSeries ts, boolean analysis) { + private void addFunctionsToTable(MetricTimeSeries ts) { //find the aggregations / and analyses @@ -191,39 +219,24 @@ private void convertAggregationOrAnalysisTs(MetricTimeSeries ts, boolean analysi //we have function value if (key.contains("function") && !key.contains("arguments")) { String[] splits = key.split("_"); - XYChart.Series series = new XYChart.Series<>(); //function name - String name = splits[1]; - series.setName(join(ts) + "-" + name); - - //function value - if (analysis) { - ts.sort(); - List points; - if (ts.size() > 200_000) { - points = ts.points().filter(point -> point.getIndex() % 1000 == 0).collect(Collectors.toList()); - } else { - points = ts.points().collect(Collectors.toList()); - } - //reduce the amount shown in the chart we add every 100ths point - addPointsToSeries(series, points); - Platform.runLater(() -> chart.getData().add(series)); + String name = splits[2]; + //Check if the function has an argument + Object arguments = ts.attribute(splits[0] + "_" + splits[1] + "_arguments_" + splits[2]); - } else { - Instant start = Instant.ofEpochMilli(ts.getStart()); - Instant end = Instant.ofEpochMilli(ts.getEnd()); - - series.getData().add(new XYChart.Data(start, value)); - series.getData().add(new XYChart.Data(end, value)); - Platform.runLater(() -> chart.getData().add(series)); + ResultRow row = new ResultRow(); + row.setTimeSeries(join(ts)); + row.setAggregationOrAnalysis(name); + if (arguments != null) { + row.setArguments(arguments.toString()); } + row.setValues(value.toString()); + row.setOrder(key); - } else { - //function arguments - //currently ignored + rows.add(row); } @@ -276,7 +289,7 @@ private String join(MetricTimeSeries ts) { if (ts == null) { return ""; } - return String.valueOf(ts.attribute("host")) + "-" + + return ts.attribute("host") + "-" + ts.attribute("source") + "-" + ts.attribute("group") + "-" + ts.getMetric(); diff --git a/chronix-timeseries-exploration/src/main/java/de/qaware/chronix/examples/exploration/ui/dt/ResultRow.java b/chronix-timeseries-exploration/src/main/java/de/qaware/chronix/examples/exploration/ui/dt/ResultRow.java new file mode 100644 index 0000000..7b4a0f5 --- /dev/null +++ b/chronix-timeseries-exploration/src/main/java/de/qaware/chronix/examples/exploration/ui/dt/ResultRow.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2015 QAware GmbH + * + * 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 de.qaware.chronix.examples.exploration.ui.dt; + +import javafx.beans.property.SimpleStringProperty; + +/** + * Simple java fx result row + * + * @author f.lautenschlager + */ +public class ResultRow { + + private final SimpleStringProperty timeSeries = new SimpleStringProperty(""); + private final SimpleStringProperty aggregationOrAnalysis = new SimpleStringProperty(""); + private final SimpleStringProperty arguments = new SimpleStringProperty(""); + private final SimpleStringProperty values = new SimpleStringProperty(""); + private final SimpleStringProperty order = new SimpleStringProperty(""); + + + public String getTimeSeries() { + return timeSeries.get(); + } + + public SimpleStringProperty timeSeriesProperty() { + return timeSeries; + } + + public void setTimeSeries(String timeSeries) { + this.timeSeries.set(timeSeries); + } + + public String getAggregationOrAnalysis() { + return aggregationOrAnalysis.get(); + } + + public SimpleStringProperty aggregationOrAnalysisProperty() { + return aggregationOrAnalysis; + } + + public void setAggregationOrAnalysis(String aggregationOrAnalysis) { + this.aggregationOrAnalysis.set(aggregationOrAnalysis); + } + + public String getArguments() { + return arguments.get(); + } + + public SimpleStringProperty argumentsProperty() { + return arguments; + } + + public void setArguments(String arguments) { + this.arguments.set(arguments); + } + + public String getValues() { + return values.get(); + } + + public SimpleStringProperty valuesProperty() { + return values; + } + + public void setValues(String values) { + this.values.set(values); + } + + public String getOrder() { + return order.get(); + } + + public SimpleStringProperty orderProperty() { + return order; + } + + public void setOrder(String order) { + this.order.set(order); + } +} diff --git a/chronix-timeseries-exploration/src/main/resources/de/qaware/chronix/examples/exploration/ui/Main.fxml b/chronix-timeseries-exploration/src/main/resources/de/qaware/chronix/examples/exploration/ui/Main.fxml index d071606..04769c2 100644 --- a/chronix-timeseries-exploration/src/main/resources/de/qaware/chronix/examples/exploration/ui/Main.fxml +++ b/chronix-timeseries-exploration/src/main/resources/de/qaware/chronix/examples/exploration/ui/Main.fxml @@ -41,7 +41,6 @@ - @@ -63,29 +62,52 @@ prefWidth="400.0" visible="true" wrapText="true" - promptText="Enter your filter query to analyze results, e.g., ag=max, ag=dev, analysis=trend" + promptText="Enter your filter query to analyze results, e.g., function=max;dev, function=trend" />
- - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + +