Compare commits

..
1 Commits
Author SHA1 Message Date
Bill Oley 1597ec61ae scripts, interval, collectd, try to build grafana plugin 2024-03-28 16:42:59 -04:00
35 changed files with 491 additions and 794 deletions

No files matched your search

+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<groupId>timely</groupId>
<artifactId>timely</artifactId>
<version>2.1.4</version>
<version>2.1.4-SNAPSHOT</version>
</parent>
<artifactId>timely-analytics</artifactId>
<!--
+6 -7
View File
@@ -53,13 +53,12 @@ if [ "$PID" == "" ]; then
JVM_ARGS="${JVM_ARGS} -Djava.net.preferIPv4Stack=true"
JVM_ARGS="${JVM_ARGS} -XX:+UseNUMA"
# for linux varieties of OS, extract native libraries if not already present
if [[ -n "$OS_PATH" && (! -d ${NATIVE_DIR} || -z "$(ls -A ${NATIVE_DIR})") ]]; then
pushd "${BASE_DIR}/bin" || exit
"${JAVA_HOME}"/bin/jar xf "${LIB_DIR}"/netty-tcnative-boringssl-static-*.Final-"${OS_PATH}".jar ${NATIVE_DIR}/libnetty_tcnative_linux_"${HW}".so
"${JAVA_HOME}"/bin/jar xf "${LIB_DIR}"/netty-transport-native-epoll-*-"${OS_PATH}".jar ${NATIVE_DIR}/libnetty_transport_native_epoll_"${HW}".so
popd || exit
JVM_ARGS="${JVM_ARGS} -Djava.library.path=${NATIVE_DIR}"
if [[ -n "$OS_PATH" ]]; then
pushd "${BASE_DIR}/bin" || exit
"${JAVA_HOME}"/bin/jar xf "${LIB_DIR}"/netty-tcnative-boringssl-static-*.Final-"${OS_PATH}".jar ${NATIVE_DIR}/libnetty_tcnative_linux_"${HW}".so
"${JAVA_HOME}"/bin/jar xf "${LIB_DIR}"/netty-transport-native-epoll-*-"${OS_PATH}".jar ${NATIVE_DIR}/libnetty_transport_native_epoll_"${HW}".so
popd || exit
JVM_ARGS="${JVM_ARGS} -Djava.library.path=${NATIVE_DIR}"
fi
echo "${JAVA_HOME}/bin/java ${JVM_ARGS} -jar ${BIN_DIR}/timely-balancer-*-exec.jar --instance=${INSTANCE}"
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<groupId>timely</groupId>
<artifactId>timely</artifactId>
<version>2.1.4</version>
<version>2.1.4-SNAPSHOT</version>
</parent>
<artifactId>timely-balancer</artifactId>
<description>Timely Balancer</description>
+2 -2
View File
@@ -4,13 +4,13 @@
<parent>
<groupId>timely</groupId>
<artifactId>timely</artifactId>
<version>2.1.4</version>
<version>2.1.4-SNAPSHOT</version>
</parent>
<artifactId>timely-client</artifactId>
<properties>
<!-- PEP 440 compliant version gets substituted into src/main/python/template/setup.py -->
<!-- use .dev0 instead of -SNAPSHOT -->
<python.client.version>2.1.4</python.client.version>
<python.client.version>2.1.4.dev0</python.client.version>
</properties>
<dependencies>
<dependency>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<groupId>timely</groupId>
<artifactId>timely</artifactId>
<version>2.1.4</version>
<version>2.1.4-SNAPSHOT</version>
</parent>
<artifactId>collectd-nsq-plugin</artifactId>
<dependencies>
@@ -79,7 +79,6 @@ public class WriteNSQPlugin extends CollectDPluginParent implements CollectdConf
} catch (IOException e1) {}
try {
clientPool.invalidateObject(client);
client = null;
} catch (Exception e2) {}
}
} finally {
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<groupId>timely</groupId>
<artifactId>timely</artifactId>
<version>2.1.4</version>
<version>2.1.4-SNAPSHOT</version>
</parent>
<artifactId>collectd-plugin-parent</artifactId>
<dependencies>
@@ -99,7 +99,7 @@ public abstract class CollectDPluginParent {
} else {
addTag(tagMap, "host", host);
}
int nIdx = host.lastIndexOf('n');
int nIdx = host.indexOf('n');
if (-1 != nIdx) {
addTag(tagMap, "rack", host.substring(0, nIdx));
}
@@ -118,15 +118,26 @@ public abstract class CollectDPluginParent {
String instance = null;
if (!typeInstance.startsWith("nsq")) {
String[] parts = typeInstance.split("\\.");
if (parts.length % 2 == 1) {
if (parts[0].equals("dwquery") && parts.length >= 4) {
metric.append(STATSD_PREFIX).append(PERIOD).append(parts[1]).append(PERIOD).append(parts[3]);
addTag(tagMap, "queryId", parts[0]);
} else {
// EtsyStatsD format -- metric.(tagName.tagValue)*
metric.append(STATSD_PREFIX).append(PERIOD).append(parts[0]);
for (int x = 1; x < parts.length; x += 2) {
addTag(tagMap, parts[x], parts[x + 1]);
if (parts.length % 2 == 1 && parts.length >= 3) {
switch(parts[0]) {
case "dwingest":
if (parts.length >= 4) {
metric.append(STATSD_PREFIX).append(PERIOD).append(parts[1]).append(PERIOD).append(parts[3]);
instance = parts[0];
}
break;
case "dwquery":
if (parts.length >= 4) {
metric.append(STATSD_PREFIX).append(PERIOD).append(parts[1]).append(PERIOD).append(parts[3]);
addTag(tagMap, "queryId", parts[0]);
}
break;
default:
// EtsyStatsD format -- metric.(tagName.tagValue)*
metric.append(STATSD_PREFIX).append(PERIOD).append(parts[0]);
for (int x = 1; x < parts.length; x += 2) {
addTag(tagMap, parts[x], parts[x + 1]);
}
}
}
} else if (statsd_4_groups.matches()) {
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<groupId>timely</groupId>
<artifactId>timely</artifactId>
<version>2.1.4</version>
<version>2.1.4-SNAPSHOT</version>
</parent>
<artifactId>collectd-timely-plugin</artifactId>
<dependencies>
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<groupId>timely</groupId>
<artifactId>timely</artifactId>
<version>2.1.4</version>
<version>2.1.4-SNAPSHOT</version>
</parent>
<artifactId>timely-common</artifactId>
<dependencies>
@@ -32,7 +32,7 @@ public class QueryRequest extends AuthenticatedRequest implements HttpGetRequest
private boolean counter = false;
private long counterMax = 0;
private long resetValue = 0;
private String interval = null;
private Optional<String> interval = Optional.empty();
public RateOption() {}
@@ -85,11 +85,11 @@ public class QueryRequest extends AuthenticatedRequest implements HttpGetRequest
this.resetValue = resetValue;
}
public String getInterval() {
public Optional<String> getInterval() {
return interval;
}
public void setInterval(String interval) {
public void setInterval(Optional<String> interval) {
this.interval = interval;
}
@@ -221,7 +221,7 @@ public class QueryRequest extends AuthenticatedRequest implements HttpGetRequest
private String aggregator;
private String metric;
private boolean rate = false;
private RateOption rateOptions = new RateOption();
private RateOption rateOptions = null;
private Optional<String> downsample = Optional.empty();
private Map<String,String> tags = new LinkedHashMap<>();
private Collection<Filter> filters = new ArrayList<>();
@@ -547,7 +547,7 @@ public class QueryRequest extends AuthenticatedRequest implements HttpGetRequest
options.setCounter(rateOptions[x].endsWith("counter"));
break;
case 1:
options.setInterval(rateOptions[x]);
options.setInterval(Optional.of(rateOptions[x]));
break;
case 2:
options.setCounterMax(Long.parseLong(rateOptions[x]));
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<groupId>timely</groupId>
<artifactId>timely</artifactId>
<version>2.1.4</version>
<version>2.1.4-SNAPSHOT</version>
</parent>
<artifactId>timely-app</artifactId>
<packaging>pom</packaging>
+2 -2
View File
@@ -28,8 +28,8 @@
}
],
"screenshots": [],
"version": "2.1.4",
"updated": "2024-03-29"
"version": "2.1.4-SNAPSHOT",
"updated": "2024-03-13"
},
"dependencies": {
"classnames": "2.2.6",
+91 -6
View File
@@ -1,11 +1,96 @@
module github.com/NationalSecurityAgency/timely-datasource
go 1.14
go 1.21
toolchain go1.22.1
require (
github.com/grafana/grafana-plugin-sdk-go v0.111.0
github.com/hashicorp/go-hclog v0.16.1
github.com/mattn/go-colorable v0.1.6 // indirect
github.com/prometheus/common v0.29.0 // indirect
golang.org/x/net v0.17.0 // indirect
github.com/grafana/grafana-plugin-sdk-go v0.218.0
github.com/hashicorp/go-hclog v1.6.2
)
require (
github.com/BurntSushi/toml v1.3.2 // indirect
github.com/apache/arrow/go/v15 v15.0.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/cheekybits/genny v1.0.0 // indirect
github.com/chromedp/cdproto v0.0.0-20220208224320-6efb837e6bc2 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
github.com/elazarl/goproxy v0.0.0-20230731152917-f99041a5c027 // indirect
github.com/fatih/color v1.15.0 // indirect
github.com/fsnotify/fsnotify v1.4.9 // indirect
github.com/getkin/kin-openapi v0.120.0 // indirect
github.com/go-logr/logr v1.4.1 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.19.6 // indirect
github.com/go-openapi/swag v0.22.4 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.3 // indirect
github.com/google/flatbuffers v23.5.26+incompatible // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/mux v1.8.0 // indirect
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect
github.com/hashicorp/go-plugin v1.6.0 // indirect
github.com/hashicorp/yamux v0.1.1 // indirect
github.com/invopop/yaml v0.2.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.16.7 // indirect
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
github.com/magefile/mage v1.15.0 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattetti/filebuffer v1.0.1 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/mattn/go-runewidth v0.0.9 // indirect
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/oklog/run v1.1.0 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/perimeterx/marshmallow v1.1.5 // indirect
github.com/pierrec/lz4/v4 v4.1.18 // indirect
github.com/prometheus/client_golang v1.18.0 // indirect
github.com/prometheus/client_model v0.5.0 // indirect
github.com/prometheus/common v0.46.0 // indirect
github.com/prometheus/procfs v0.12.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/smartystreets/goconvey v1.6.4 // indirect
github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 // indirect
github.com/unknwon/com v1.0.1 // indirect
github.com/unknwon/log v0.0.0-20150304194804-e617c87089d3 // indirect
github.com/urfave/cli v1.22.14 // indirect
github.com/zeebo/xxh3 v1.0.2 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.49.0 // indirect
go.opentelemetry.io/contrib/propagators/jaeger v1.22.0 // indirect
go.opentelemetry.io/contrib/samplers/jaegerremote v0.18.0 // indirect
go.opentelemetry.io/otel v1.24.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.24.0 // indirect
go.opentelemetry.io/otel/metric v1.24.0 // indirect
go.opentelemetry.io/otel/sdk v1.24.0 // indirect
go.opentelemetry.io/otel/trace v1.24.0 // indirect
go.opentelemetry.io/proto/otlp v1.1.0 // indirect
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
golang.org/x/mod v0.13.0 // indirect
golang.org/x/net v0.22.0 // indirect
golang.org/x/sys v0.18.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/tools v0.14.0 // indirect
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect
google.golang.org/grpc v1.62.1 // indirect
google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
+229 -642
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "timely-datasource",
"version": "2.1.4",
"version": "2.1.4-SNAPSHOT",
"description": "Timely",
"backend": true,
"alerting": true,
+7
View File
@@ -398,6 +398,13 @@ func (td *TimelyDatasource) convertTimelyQuery(timelyQueryForm *TimelyQueryForm)
timelyQuery.RateOptions.Counter = timelyQueryForm.IsCounter
}
if len(timelyQueryForm.RateInterval) > 0 {
rateInterval, error := strconv.ParseInt(timelyQueryForm.RateInterval, 10, 32)
if error == nil {
timelyQuery.RateOptions.Interval = int32(rateInterval)
}
}
if len(timelyQueryForm.CounterMax) > 0 {
counterMax, error := strconv.ParseInt(timelyQueryForm.CounterMax, 10, 32)
if error == nil {
+4 -1
View File
@@ -11,6 +11,7 @@ type TimelyQueryForm struct {
Tags map[string]string `json:"tags"`
Filters []Filter `json:"filters"`
ShouldComputeRate bool `json:"shouldComputeRate"`
RateInterval string `json:"rateInterval"`
IsCounter bool `json:"isCounter"`
CounterMax string `json:"counterMax"`
CounterResetValue string `json:"counterResetValue"`
@@ -34,6 +35,7 @@ type TimelyQueryServer struct {
Tags map[string]string `json:"tags"`
Filters []Filter `json:"filters"`
ShouldComputeRate bool `json:"shouldComputeRate"`
RateInterval string `json:"rateInterval"`
IsCounter bool `json:"isCounter"`
CounterMax string `json:"counterMax"`
CounterResetValue string `json:"counterResetValue"`
@@ -50,6 +52,7 @@ type Filter struct {
}
type RateOptions struct {
Interval int32 `json:"interval"`
Counter bool `json:"counter"`
CounterMax int32 `json:"counterMax"`
ResetValue int32 `json:"resetValue"`
@@ -96,4 +99,4 @@ type TimelyErrorResponse struct {
ResponseCode int32 `json:responseCode`
Message string `json:message`
DetailMessage string `json:detailMessage`
}
}
+19 -2
View File
@@ -37,6 +37,7 @@ export class QueryEditor extends Component<Props, State> {
downsampleInterval: '1m',
downsampleAggregator: 'avg',
shouldComputeRate: false,
rateInterval: '1m',
isCounter: false,
tags: {},
};
@@ -123,6 +124,15 @@ export class QueryEditor extends Component<Props, State> {
});
};
onRateIntervalChange = (option: React.FormEvent<HTMLInputElement>) => {
const value = e.target.value;
this.setState((state, props) => {
var query = Object.assign(state.query, { rateInterval: value });
this.updateQuery(query);
return { query: query };
});
};
onCounterChange = (option: React.FormEvent<HTMLInputElement>) => {
const checked = option.currentTarget.checked;
this.setState((state, props) => {
@@ -247,7 +257,7 @@ export class QueryEditor extends Component<Props, State> {
const { metric, aggregator, alias } = this.state.query;
const { downsampleInterval, downsampleAggregator, disableDownsampling } = this.state.query;
const { tags } = this.state.query;
const { shouldComputeRate, isCounter, counterResetValue, counterMax } = this.state.query;
const { shouldComputeRate, rateInterval, isCounter, counterResetValue, counterMax } = this.state.query;
const aggregatorOptions: Array<{}> = _.map(this.state.aggregatorTypes, (value: string) => ({
label: value,
value: value,
@@ -345,7 +355,7 @@ export class QueryEditor extends Component<Props, State> {
spellCheck={false}
value={downsampleInterval || ''}
onChange={this.onDownsampleChange}
placeholder={'interval'}
placeholder={'downsample interval'}
/>
</div>
<div className="gf-form timely">
@@ -390,6 +400,13 @@ export class QueryEditor extends Component<Props, State> {
onChange={this.onRateChange}
/>
<div hidden={!shouldComputeRate}>
<Input
className={'min-width-6 flex-grow-1'}
spellCheck={false}
value={rateInterval || ''}
onChange={this.onRateIntervalChange}
placeholder={'rate interval'}
/>
<Switch
label={'Counter'}
labelClass="width-10"
+1
View File
@@ -9,6 +9,7 @@ export interface TimelyQueryForm extends DataQuery {
downsampleAggregator?: string;
tags: { [key: string]: string };
shouldComputeRate?: boolean;
rateInterval?: string;
isCounter?: boolean;
counterMax?: string;
counterResetValue?: string;
+1 -1
View File
@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>timely</groupId>
<artifactId>timely</artifactId>
<version>2.1.4</version>
<version>2.1.4-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Timely</name>
<description>A secure and scalable time series database based on Apache Accumulo</description>
+6 -7
View File
@@ -53,13 +53,12 @@ if [ "$PID" == "" ]; then
JVM_ARGS="${JVM_ARGS} -Djava.net.preferIPv4Stack=true"
JVM_ARGS="${JVM_ARGS} -XX:+UseNUMA"
# for linux varieties of OS, extract native libraries if not already present
if [[ -n "$OS_PATH" && (! -d ${NATIVE_DIR} || -z "$(ls -A ${NATIVE_DIR})") ]]; then
pushd "${BASE_DIR}/bin" || exit
"${JAVA_HOME}"/bin/jar xf "${LIB_DIR}"/netty-tcnative-boringssl-static-*.Final-"${OS_PATH}".jar ${NATIVE_DIR}/libnetty_tcnative_linux_"${HW}".so
"${JAVA_HOME}"/bin/jar xf "${LIB_DIR}"/netty-transport-native-epoll-*-"${OS_PATH}".jar ${NATIVE_DIR}/libnetty_transport_native_epoll_"${HW}".so
popd || exit
JVM_ARGS="${JVM_ARGS} -Djava.library.path=${NATIVE_DIR}"
if [[ -n "$OS_PATH" ]]; then
pushd "${BASE_DIR}/bin" || exit
"${JAVA_HOME}"/bin/jar xf "${LIB_DIR}"/netty-tcnative-boringssl-static-*-"${OS_PATH}".jar ${NATIVE_DIR}/libnetty_tcnative_linux_"${HW}".so
"${JAVA_HOME}"/bin/jar xf "${LIB_DIR}"/netty-transport-native-epoll-*-"${OS_PATH}".jar ${NATIVE_DIR}/libnetty_transport_native_epoll_"${HW}".so
popd || exit
JVM_ARGS="${JVM_ARGS} -Djava.library.path=${NATIVE_DIR}"
fi
echo "${JAVA_HOME}/bin/java ${JVM_ARGS} -jar ${BIN_DIR}/timely-server*-exec.jar timelyserver --instance=${INSTANCE}"
+1 -2
View File
@@ -25,8 +25,7 @@ JVM_ARGS="-Xmx256m -Xms128m"
JVM_ARGS="${JVM_ARGS} -Dlogging.config=${CONF_DIR}/log4j2-console.yml"
JVM_ARGS="${JVM_ARGS} -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"
# for linux varieties of OS, extract native libraries if not already present
if [[ -n "$OS_PATH" && (! -d ${NATIVE_DIR} || -z "$(ls -A ${NATIVE_DIR})") ]]; then
if [[ -n "$OS_PATH" ]]; then
pushd "${BASE_DIR}/bin" || exit
"${JAVA_HOME}"/bin/jar xf "${LIB_DIR}"/netty-tcnative-boringssl-static-*.Final-"${OS_PATH}".jar ${NATIVE_DIR}/libnetty_tcnative_linux_"${HW}".so
"${JAVA_HOME}"/bin/jar xf "${LIB_DIR}"/netty-transport-native-epoll-*-"${OS_PATH}".jar ${NATIVE_DIR}/libnetty_transport_native_epoll_"${HW}".so
+1 -2
View File
@@ -25,8 +25,7 @@ JVM_ARGS="-Xmx1024m -Xms128m"
JVM_ARGS="${JVM_ARGS} -Dlogging.config=${CONF_DIR}/log4j2-console.yml"
JVM_ARGS="${JVM_ARGS} -Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector"
# for linux varieties of OS, extract native libraries if not already present
if [[ -n "$OS_PATH" && (! -d ${NATIVE_DIR} || -z "$(ls -A ${NATIVE_DIR})") ]]; then
if [[ -n "$OS_PATH" ]]; then
pushd "${BASE_DIR}/bin" || exit
"${JAVA_HOME}"/bin/jar xf "${LIB_DIR}"/netty-tcnative-boringssl-static-*.Final-"${OS_PATH}".jar ${NATIVE_DIR}/libnetty_tcnative_linux_"${HW}".so
"${JAVA_HOME}"/bin/jar xf "${LIB_DIR}"/netty-transport-native-epoll-*-"${OS_PATH}".jar ${NATIVE_DIR}/libnetty_transport_native_epoll_"${HW}".so
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<groupId>timely</groupId>
<artifactId>timely</artifactId>
<version>2.1.4</version>
<version>2.1.4-SNAPSHOT</version>
</parent>
<artifactId>timely-server</artifactId>
<description>Timely Server</description>
@@ -53,9 +53,11 @@ public class MetricQuery {
}
public void setCounterOptions(long max, long resetValue) {
this.subQuery.getRateOptions().setCounter(true);
this.subQuery.getRateOptions().setCounterMax(max);
this.subQuery.getRateOptions().setResetValue(resetValue);
QueryRequest.RateOption rateOption = new QueryRequest.RateOption();
rateOption.setCounter(true);
rateOption.setCounterMax(max);
rateOption.setResetValue(resetValue);
this.subQuery.setRateOptions(rateOption);
}
public void setTags(Map<String,String> tags) {
@@ -14,7 +14,6 @@ import org.apache.accumulo.core.data.Value;
import org.apache.accumulo.core.iterators.IteratorEnvironment;
import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
import org.apache.accumulo.core.util.Pair;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -30,7 +29,7 @@ public class RateIterator extends TimeSeriesGroupingIterator {
private boolean isCounter = false;
private long maxCounter = 0;
private long resetValue = 0;
private long interval = 1000;
private long interval = 1;
public static void setRateOptions(IteratorSetting is, QueryRequest.RateOption options) {
if (options != null && options.isCounter()) {
@@ -38,10 +37,10 @@ public class RateIterator extends TimeSeriesGroupingIterator {
is.addOption(COUNTER_MAX, Long.toString(options.getCounterMax()));
is.addOption(RATE_RESET_VALUE, Long.toString(options.getResetValue()));
}
if (options != null && StringUtils.isNotBlank(options.getInterval())) {
is.addOption(RATE_INTERVAL, Long.toString(getTimeInMillis(options.getInterval())));
if (options != null && options.getInterval().isPresent()) {
is.addOption(RATE_INTERVAL, Long.toString(getTimeInMillis(options.getInterval().get())));
} else {
is.addOption(RATE_INTERVAL, "1000");
is.addOption(RATE_INTERVAL, "1");
}
}
@@ -77,12 +76,9 @@ public class RateIterator extends TimeSeriesGroupingIterator {
if (isCounter && (secondVal < firstVal)) {
if (maxCounter > 0) {
// assume that the data has reset so add maxCounter to the lower value to calculate the difference
secondVal += maxCounter;
log.trace("second counter reset based on max:{} to ts:{}, value:{}", maxCounter, secondTs, secondVal);
} else {
// assume that the data has reset but no maxCounter set, so add the higher value
// (approximate maxCounter) to the lower value to calculate the difference
secondVal += firstVal;
log.trace("second counter reset based on first:{} to ts:{}, value:{}", firstVal, secondTs, secondVal);
}
@@ -700,11 +700,11 @@ public class DataStore {
if (query.isRate()) {
log.trace("Adding rate iterator");
IteratorSetting rate = new IteratorSetting(499, RateIterator.class);
RateOption rateOptions = query.getRateOptions();
// if there is no rate interval set, then use the downsample value
// so that the result is the change per downsample period
RateOption rateOptions = query.getRateOptions();
if (StringUtils.isBlank(rateOptions.getInterval())) {
rateOptions.setInterval(downsample + "ms");
if (rateOptions != null && !rateOptions.getInterval().isPresent()) {
rateOptions.setInterval(Optional.of(downsample + "ms"));
}
RateIterator.setRateOptions(rate, query.getRateOptions());
scanner.addScanIterator(rate);
@@ -14,6 +14,7 @@ import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.Executors;
@@ -28,7 +29,6 @@ import org.apache.accumulo.core.data.Value;
import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
import org.apache.accumulo.core.security.Authorizations;
import org.apache.commons.lang3.SerializationUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.atomic.DistributedAtomicValue;
import org.apache.curator.framework.recipes.cache.TreeCache;
@@ -766,11 +766,11 @@ public class DataStoreCache {
if (subQuery.isRate()) {
log.trace("Adding rate iterator");
IteratorSetting rate = new IteratorSetting(499, RateIterator.class);
QueryRequest.RateOption rateOptions = subQuery.getRateOptions();
// if there is no rate interval set, then use the downsample value
// so that the result is the change per downsample period
QueryRequest.RateOption rateOptions = subQuery.getRateOptions();
if (StringUtils.isBlank(rateOptions.getInterval())) {
rateOptions.setInterval(downsamplePeriod + "ms");
if (rateOptions != null && !rateOptions.getInterval().isPresent()) {
rateOptions.setInterval(Optional.of(downsamplePeriod + "ms"));
}
RateIterator.setRateOptions(rate, rateOptions);
RateIterator rateIterator = new RateIterator();
@@ -189,8 +189,10 @@ public class DataStoreCacheIteratorIT extends ITBase {
subQuery.setDownsample(Optional.of("1ms-avg"));
subQuery.setMetric("metric.number.1");
subQuery.addTag("host", ".*");
QueryRequest.RateOption rateOption = new QueryRequest.RateOption();
rateOption.setCounter(false);
subQuery.setRate(true);
subQuery.getRateOptions().setCounter(false);
subQuery.setRateOptions(rateOption);
query.setQueries(Collections.singleton(subQuery));
SortedKeyValueIterator<org.apache.accumulo.core.data.Key,org.apache.accumulo.core.data.Value> itr;
@@ -702,20 +702,25 @@ public class HttpApiIT extends OneWaySSLBase {
assertEquals(1.0, entry2.getValue());
}
private void addRateData(String metric, String tagString, long testStartTime, long timeIncrement, long testStopTime, double startValue, double maxValue,
double valueIncrement) throws Exception {
long ts = testStartTime;
double value = startValue;
while (ts <= testStopTime) {
put(metric + " " + ts + " " + value + " " + tagString);
ts += timeIncrement;
value = (value >= maxValue) ? startValue : (value + valueIncrement);
}
}
@Test
public void testRateQuery() throws Exception {
addRateData("sys.cpu.user", "tag1=value1 tag2=value2 rack=r1", TEST_TIME, 1, TEST_TIME + 14, 1.0, Double.MAX_VALUE, 1.0);
// @formatter:off
put("sys.cpu.user " + (TEST_TIME) + " 1.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME + 1) + " 2.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME + 2) + " 3.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME + 3) + " 4.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME + 4) + " 5.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME + 5) + " 6.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME + 6) + " 7.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME + 7) + " 8.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME + 8) + " 9.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME + 9) + " 10.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME + 10) + " 11.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME + 11) + " 12.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME + 12) + " 13.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME + 13) + " 14.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME + 14) + " 15.0 tag1=value1 tag2=value2 rack=r1");
// @formatter:on
dataStore.flush();
dataStoreCache.flushCaches(-1);
// Latency in TestConfiguration is 2s, wait for it
@@ -746,7 +751,23 @@ public class HttpApiIT extends OneWaySSLBase {
@Test
public void testRateCounterQuery() throws Exception {
addRateData("sys.cpu.user", "tag1=value1 tag2=value2 rack=r1", TEST_TIME, 1, TEST_TIME + 14, 1.0, 10.0, 1.0);
// @formatter:off
put("sys.cpu.user " + (TEST_TIME) + " 1.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+1) + " 2.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+2) + " 3.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+3) + " 4.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+4) + " 5.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+5) + " 6.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+6) + " 7.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+7) + " 8.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+8) + " 9.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+9) + " 10.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+10) + " 1.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+11) + " 2.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+12) + " 3.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+13) + " 4.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+14) + " 5.0 tag1=value1 tag2=value2 rack=r1");
// @formatter:on
dataStore.flush();
dataStoreCache.flushCaches(-1);
// Latency in TestConfiguration is 2s, wait for it
@@ -761,6 +782,7 @@ public class HttpApiIT extends OneWaySSLBase {
subQuery.setTags(t);
subQuery.setDownsample(Optional.of("1ms-max"));
subQuery.setRate(true);
subQuery.setRateOptions(new QueryRequest.RateOption());
subQuery.getRateOptions().setCounter(true);
request.addQuery(subQuery);
List<QueryResponse> response = query(baseUrl + "/api/query", request);
@@ -777,8 +799,24 @@ public class HttpApiIT extends OneWaySSLBase {
}
@Test
public void testRateCounterWithCounterMaxOption() throws Exception {
addRateData("sys.cpu.user", "tag1=value1 tag2=value2 rack=r1", TEST_TIME, 1, TEST_TIME + 14, 1.0, 10.0, 1.0);
public void testRateCounterWithOptions() throws Exception {
// @formatter:off
put("sys.cpu.user " + (TEST_TIME) + " 1.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+1) + " 2.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+2) + " 3.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+3) + " 4.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+4) + " 5.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+5) + " 6.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+6) + " 7.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+7) + " 8.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+8) + " 9.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+9) + " 10.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+10) + " 0.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+11) + " 1.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+12) + " 2.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+13) + " 3.0 tag1=value1 tag2=value2 rack=r1",
"sys.cpu.user " + (TEST_TIME+14) + " 4.0 tag1=value1 tag2=value2 rack=r1");
// @formatter:on
dataStore.flush();
dataStoreCache.flushCaches(-1);
// Latency in TestConfiguration is 2s, wait for it
@@ -793,8 +831,9 @@ public class HttpApiIT extends OneWaySSLBase {
subQuery.setTags(t);
subQuery.setDownsample(Optional.of("1ms-max"));
subQuery.setRate(true);
subQuery.setRateOptions(new QueryRequest.RateOption());
subQuery.getRateOptions().setCounter(true);
subQuery.getRateOptions().setCounterMax(10);
subQuery.getRateOptions().setCounterMax(Long.MAX_VALUE);
subQuery.getRateOptions().setResetValue(2);
request.addQuery(subQuery);
List<QueryResponse> response = query(baseUrl + "/api/query", request);
@@ -805,54 +844,7 @@ public class HttpApiIT extends OneWaySSLBase {
int i = 1;
for (Entry<String,Object> e : dps.entrySet()) {
assertEquals(Long.toString(TEST_TIME + i), e.getKey());
assertEquals(1.0, e.getValue());
i++;
}
}
@Test
public void testRateCounterWithRateIntervalOption() throws Exception {
Long TEST_TIME = (System.currentTimeMillis() / 60000) * 60000;
addRateData("sys.cpu.user", "tag1=value1 tag2=value2 rack=r1", TEST_TIME, 60000, TEST_TIME + 600000, 1.0, Double.MAX_VALUE, 5);
dataStore.flush();
dataStoreCache.flushCaches(-1);
// Latency in TestConfiguration is 2s, wait for it
sleepUninterruptibly(TestConfiguration.WAIT_SECONDS, TimeUnit.SECONDS);
QueryRequest request = new QueryRequest();
request.setStart(TEST_TIME);
request.setEnd(TEST_TIME + 600000);
request.setMsResolution(true);
SubQuery subQuery = new SubQuery();
subQuery.setMetric("sys.cpu.user");
subQuery.setDownsample(Optional.of("1m-max"));
subQuery.setRate(true);
subQuery.getRateOptions().setInterval("2m");
request.addQuery(subQuery);
// test interval (2m) that is different from the downsample period (1m)
List<QueryResponse> response = query(baseUrl + "/api/query", request);
assertEquals(1, response.size());
QueryResponse response1 = response.get(0);
Map<String,Object> dps = response1.getDps();
assertEquals(10, dps.size());
int i = 1;
for (Entry<String,Object> e : dps.entrySet()) {
assertEquals(Long.toString(TEST_TIME + (60000 * i)), e.getKey());
assertEquals(10.0, e.getValue());
i++;
}
// test that interval defaults to downsample period
subQuery.getRateOptions().setInterval(null);
response = query(baseUrl + "/api/query", request);
assertEquals(1, response.size());
response1 = response.get(0);
dps = response1.getDps();
assertEquals(10, dps.size());
i = 1;
for (Entry<String,Object> e : dps.entrySet()) {
assertEquals(Long.toString(TEST_TIME + (60000 * i)), e.getKey());
assertEquals(5.0, e.getValue());
assertEquals((i == 10 ? 0.0 : 1.0), e.getValue());
i++;
}
}
@@ -499,7 +499,7 @@ public class HttpRequestDecoderIT extends ITBase {
public void testQueryURIAllAnonAccess() throws Exception {
decoder = new HttpRequestDecoder(authenticationService, anonymousSecurity, httpProperties);
DefaultFullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET,
"/api/query?start=1356998400&end=1356998460&m=sum:rate{false,1s,100,0}:sys.cpu.user{host=*}{rack=r1|r2}&tsuid=sum:000001000002000042,000001000002000043");
"/api/query?start=1356998400&end=1356998460&m=sum:rate{false,100,0}:sys.cpu.user{host=*}{rack=r1|r2}&tsuid=sum:000001000002000042,000001000002000043");
decoder.decode(null, request, results);
Assert.assertEquals(1, results.size());
Assert.assertEquals(QueryRequest.class, results.iterator().next().getClass());
@@ -515,7 +515,6 @@ public class HttpRequestDecoderIT extends ITBase {
Assert.assertEquals("sys.cpu.user", first.getMetric());
Assert.assertEquals(true, first.isRate());
RateOption firstRateOption = first.getRateOptions();
Assert.assertEquals("1s", firstRateOption.getInterval());
Assert.assertEquals(false, firstRateOption.isCounter());
Assert.assertEquals(100, firstRateOption.getCounterMax());
Assert.assertEquals(0, firstRateOption.getResetValue());
@@ -546,7 +545,7 @@ public class HttpRequestDecoderIT extends ITBase {
public void testQueryURIAllWithSession() throws Exception {
decoder = new HttpRequestDecoder(authenticationService, requireUserSecurity, httpProperties);
DefaultFullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET,
"/api/query?start=1356998400&end=1356998460&m=sum:rate{false,1s,100,0}:sys.cpu.user{host=*}{rack=r1|r2}&tsuid=sum:000001000002000042,000001000002000043");
"/api/query?start=1356998400&end=1356998460&m=sum:rate{false,100,0}:sys.cpu.user{host=*}{rack=r1|r2}&tsuid=sum:000001000002000042,000001000002000043");
addCookie(request);
decoder.decode(null, request, results);
Assert.assertEquals(1, results.size());
@@ -563,7 +562,6 @@ public class HttpRequestDecoderIT extends ITBase {
Assert.assertEquals("sys.cpu.user", first.getMetric());
Assert.assertEquals(true, first.isRate());
RateOption firstRateOption = first.getRateOptions();
Assert.assertEquals("1s", firstRateOption.getInterval());
Assert.assertEquals(false, firstRateOption.isCounter());
Assert.assertEquals(100, firstRateOption.getCounterMax());
Assert.assertEquals(0, firstRateOption.getResetValue());
@@ -185,7 +185,7 @@ public class ITBase {
TestDataStore.StoreCallback storeCallback = () -> PUT_REQUESTS.countDown();
try {
dataStore.addStoreCallback(storeCallback);
StringBuilder format = new StringBuilder();
StringBuffer format = new StringBuffer();
for (String line : lines) {
format.append("put ");
format.append(line);
@@ -7,6 +7,7 @@ import static org.junit.Assert.assertTrue;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import java.util.TreeMap;
@@ -46,7 +47,7 @@ public class RateIteratorTest extends IteratorTestBase {
@Test
public void testConstantTimeRate() throws Exception {
testInterval(null, 1.0D);
testInterval(null, 0.001D);
testInterval("1ms", 0.001D);
testInterval("1s", 1.0D);
testInterval("60s", 60.0D);
@@ -58,7 +59,7 @@ public class RateIteratorTest extends IteratorTestBase {
IteratorSetting settings = new IteratorSetting(100, RateIterator.class);
QueryRequest.RateOption rateOption = new QueryRequest.RateOption();
if (interval != null) {
rateOption.setInterval(interval);
rateOption.setInterval(Optional.of(interval));
}
RateIterator.setRateOptions(settings, rateOption);
iter.init(source, settings.getOptions(), SCAN_IE);
@@ -95,7 +96,7 @@ public class RateIteratorTest extends IteratorTestBase {
Value v = source.getTopValue();
if (prevTs != -1L) {
Double thisValue = MetricAdapter.decodeValue(v.get());
expected.add((thisValue + (prevValue * -1)) / (k.getTimestamp() - prevTs) * 1000);
expected.add((thisValue + (prevValue * -1)) / (k.getTimestamp() - prevTs));
}
prevTs = k.getTimestamp();
prevValue = MetricAdapter.decodeValue(v.get());
@@ -144,7 +145,7 @@ public class RateIteratorTest extends IteratorTestBase {
iter.seek(new Range(), EMPTY_COL_FAMS, true);
for (int i = 0; i < 99; i++) {
assertTrue(iter.hasTop());
assertEquals(1.0D, MetricAdapter.decodeValue(iter.getTopValue().get()), 0.0D);
assertEquals(0.001D, MetricAdapter.decodeValue(iter.getTopValue().get()), 0.0D);
iter.next();
}
assertFalse(iter.hasTop());
@@ -178,7 +179,7 @@ public class RateIteratorTest extends IteratorTestBase {
iter.seek(new Range(), EMPTY_COL_FAMS, true);
for (int i = 0; i < 99; i++) {
assertTrue(iter.hasTop());
assertEquals(1.0D, MetricAdapter.decodeValue(iter.getTopValue().get()), 0.0D);
assertEquals(0.001D, MetricAdapter.decodeValue(iter.getTopValue().get()), 0.0D);
iter.next();
}
assertFalse(iter.hasTop());
@@ -213,7 +214,7 @@ public class RateIteratorTest extends IteratorTestBase {
iter.seek(new Range(), EMPTY_COL_FAMS, true);
for (int i = 0; i < 99; i++) {
assertTrue(iter.hasTop());
assertEquals(((i + 1) % 10 == 0 ? 0.0D : 1.0D), MetricAdapter.decodeValue(iter.getTopValue().get()), 0.0D);
assertEquals(((i + 1) % 10 == 0 ? 0.0D : 0.001D), MetricAdapter.decodeValue(iter.getTopValue().get()), 0.0D);
iter.next();
}
assertFalse(iter.hasTop());
+1 -1
View File
@@ -4,7 +4,7 @@
<parent>
<groupId>timely</groupId>
<artifactId>timely</artifactId>
<version>2.1.4</version>
<version>2.1.4-SNAPSHOT</version>
</parent>
<artifactId>timely-test</artifactId>
<properties>