Jian Li
Committed by Gerrit Code Review

[ONOS-4176] Implement influxdb retriever for querying metrics

Change-Id: Ia1f3fc4fb3c76fafd003320940b8fe16b039ddae
......@@ -21,5 +21,10 @@
<bundle>mvn:${project.groupId}/onos-app-influxdb/${project.version}</bundle>
<bundle>wrap:mvn:com.izettle/metrics-influxdb/1.1.1$Bundle-SymbolicName=metrics-influxdb&amp;Bundle-Version=1.1.1</bundle>
<bundle>mvn:commons-codec/commons-codec/1.10</bundle>
<bundle>wrap:mvn:org.influxdb/influxdb-java/2.1$Bundle-SymbolicName=influxdb-java&amp;Bundle-Version=2.1</bundle>
<bundle>wrap:mvn:com.squareup.retrofit/retrofit/1.9.0$Bundle-SymbolicName=retrofit&amp;Bundle-Version=1.9.0</bundle>
<bundle>wrap:mvn:com.squareup.okhttp/okhttp/2.4.0$Bundle-SymbolicName=okhttp&amp;Bundle-Version=2.4.0</bundle>
<bundle>wrap:mvn:com.squareup.okio/okio/1.4.0$Bundle-SymbolicName=okio&amp;Bundle-Version=1.4.0</bundle>
<bundle>mvn:com.google.code.gson/gson/2.3.1</bundle>
</feature>
</features>
......
......@@ -71,6 +71,11 @@
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.influxdb</groupId>
<artifactId>influxdb-java</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>org.onosproject</groupId>
<artifactId>onos-api</artifactId>
<version>${project.version}</version>
......
/*
* Copyright 2016 Open Networking Laboratory
*
* 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 org.onosproject.influxdbmetrics;
import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import static com.google.common.base.Preconditions.checkNotNull;
/**
* Default implementation of influx metric.
*/
public final class DefaultInfluxMetric implements InfluxMetric {
private double oneMinRate;
private DateTime time;
private DefaultInfluxMetric(double oneMinRate, DateTime time) {
this.oneMinRate = oneMinRate;
this.time = time;
}
@Override
public double oneMinRate() {
return oneMinRate;
}
@Override
public DateTime time() {
return time;
}
public static final class Builder implements InfluxMetric.Builder {
private double oneMinRate;
private String timestamp;
private static final String TIMESTAMP_MSG = "Must specify a timestamp.";
private static final String ONE_MIN_RATE_MSG = "Must specify one minute rate.";
public Builder() {
}
@Override
public InfluxMetric.Builder oneMinRate(double rate) {
this.oneMinRate = rate;
return this;
}
@Override
public InfluxMetric.Builder time(String time) {
this.timestamp = time;
return this;
}
@Override
public InfluxMetric build() {
checkNotNull(oneMinRate, ONE_MIN_RATE_MSG);
checkNotNull(timestamp, TIMESTAMP_MSG);
return new DefaultInfluxMetric(oneMinRate, parseTime(timestamp));
}
private DateTime parseTime(String time) {
String reformatTime = StringUtils.replace(StringUtils.replace(time, "T", " "), "Z", "");
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
return formatter.parseDateTime(reformatTime);
}
}
}
/*
* Copyright 2016 Open Networking Laboratory
*
* 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 org.onosproject.influxdbmetrics;
import org.onosproject.cluster.NodeId;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
* A Metric retriever interface for querying metrics value from influxDB server.
*/
public interface InfluxDbMetricsRetriever {
/**
* Returns last metric values from all nodes.
*
* @return all metrics from all nodes
*/
Map<NodeId, Map<String, InfluxMetric>> allMetrics();
/**
* Returns last metric values from a node.
*
* @param nodeId node identification
* @return all metrics from a given node
*/
Map<String, InfluxMetric> metricsByNodeId(NodeId nodeId);
/**
* Returns a collection of last metric values from all nodes.
*
* @param metricName metric name
* @return a collection of metrics from all nodes
*/
Map<NodeId, InfluxMetric> metricsByName(String metricName);
/**
* Returns a last metric value from a given node.
*
* @param nodeId node identification
* @param metricName metric name
* @return a metric value from a given node
*/
InfluxMetric metric(NodeId nodeId, String metricName);
/**
* Returns metric values of all nodes within a given period of time.
*
* @param period projected period
* @param unit time unit
* @return all metric values of all nodes
*/
Map<NodeId, Map<String, List<InfluxMetric>>> allMetrics(int period, TimeUnit unit);
/**
* Returns metric values of a node within a given period of time.
*
* @param nodeId node identification
* @param period projected period
* @param unit time unit
* @return metric value of a node
*/
Map<String, List<InfluxMetric>> metricsByNodeId(NodeId nodeId, int period, TimeUnit unit);
/**
* Returns a collection of last metric values of all nodes within a given period of time.
*
* @param metricName metric name
* @param period projected period
* @param unit time unit
* @return metric value of all nodes
*/
Map<NodeId, List<InfluxMetric>> metricsByName(String metricName, int period, TimeUnit unit);
/**
* Returns metric value of a given node within a given period of time.
*
* @param nodeId node identification
* @param metricName metric name
* @param period projected period
* @param unit time unit
* @return metric value of a node
*/
List<InfluxMetric> metric(NodeId nodeId, String metricName, int period, TimeUnit unit);
}
/*
* Copyright 2016 Open Networking Laboratory
*
* 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 org.onosproject.influxdbmetrics;
import org.joda.time.DateTime;
/**
* Metric that represents all values queried from influx database.
*/
public interface InfluxMetric {
/**
* Returns one minute rate of the given metric.
*
* @return one minute rate of the given metric
*/
double oneMinRate();
/**
* Returns collected timestamp of the given metric.
*
* @return collected timestamp of the given metric
*/
DateTime time();
/**
* A builder of InfluxMetric.
*/
interface Builder {
/**
* Sets one minute rate.
*
* @param rate one minute rate
* @return builder object
*/
Builder oneMinRate(double rate);
/**
* Sets collected timestamp.
*
* @param time timestamp
* @return builder object
*/
Builder time(String time);
/**
* Builds a influx metric instance.
*
* @return influx metric instance
*/
InfluxMetric build();
}
}