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"
/>
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+