// This file is part of OpenTSDB.
// Copyright (C) 2015 The OpenTSDB Authors.
//
// This program is free software: you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 2.1 of the License, or (at your
// option) any later version. This program is distributed in the hope that it
// will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
// General Public License for more details. You should have received a copy
// of the GNU Lesser General Public License along with this program. If not,
// see <http://www.gnu.org/licenses/>.
package net.opentsdb.tsd;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.nio.charset.Charset;
import net.opentsdb.core.BaseTsdbTest;
import net.opentsdb.core.Query;
import net.opentsdb.core.TSDB;
import net.opentsdb.meta.TestTSUIDQuery;
import net.opentsdb.storage.MockBase;
import net.opentsdb.uid.UniqueId;
import net.opentsdb.utils.Config;
import net.opentsdb.utils.DateTime;
import org.hbase.async.HBaseClient;
import org.hbase.async.KeyValue;
import org.hbase.async.Scanner;
import org.jboss.netty.handler.codec.http.HttpResponseStatus;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;
import com.stumbleupon.async.Deferred;
@RunWith(PowerMockRunner.class)
@PrepareForTest({ TSDB.class, HBaseClient.class, Config.class, HttpQuery.class,
Query.class, Deferred.class, UniqueId.class, DateTime.class, KeyValue.class,
Scanner.class })
public class TestQueryRpcLastDataPoint extends BaseTsdbTest {
private QueryRpc rpc;
@Before
public void beforeLocal() throws Exception {
Whitebox.setInternalState(config, "enable_tsuid_incrementing", true);
Whitebox.setInternalState(config, "enable_realtime_ts", true);
rpc = new QueryRpc();
storage = new MockBase(tsdb, client, true, true, true, true);
TestTSUIDQuery.setupStorage(tsdb, storage);
}
@Test
public void qsMetricMeta() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user{host=web01}");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsMetricMetaScan() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsMetricMetaScanResolve() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user&resolve");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertTrue(json.contains("\"metric\":\"sys.cpu.user\""));
assertTrue(json.contains("\"tags\":{\"host\":\"web01\"}"));
assertTrue(json.contains("\"tags\":{\"host\":\"web02\"}"));
}
@Test
public void qsMetricMetaScanOneMissing() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertFalse(json.contains("\"value\":\"42\""));
assertFalse(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsMetricMetaScanNoResults() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals("[]", json);
}
@Test
public void qsMetricMetaScanBackscanZero() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user&back_scan=0");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsMetricBackscan() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1356998400L, 42, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user{host=web01}&back_scan=1");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1356998400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsMetricBackscanResolved() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1356998400L, 42, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user{host=web01}"
+ "&back_scan=1&resolve=true");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1356998400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"metric\":\"sys.cpu.user\""));
assertTrue(json.contains("\"tags\":{\"host\":\"web01\"}"));
}
@Test
public void qsMetricBackscanNoResult() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user{host=web01}&back_scan=1");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertEquals("[]", json);
}
@Test
public void qsMetricTwoQueriesBackscan() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1356998400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1356998400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user{host=web01}"
+ "×eries=sys.cpu.user{host=web02}&back_scan=1");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1356998400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsMetricTwoQueriesBackscanResolve() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1356998400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1356998400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user{host=web01}"
+ "×eries=sys.cpu.user{host=web02}&back_scan=1&resolve");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1356998400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertTrue(json.contains("\"metric\":\"sys.cpu.user\""));
assertTrue(json.contains("\"tags\":{\"host\":\"web01\"}"));
assertTrue(json.contains("\"tags\":{\"host\":\"web02\"}"));
}
@Test
public void qsMetricTwoQueriesOneMissingBackscan() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1356998400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user{host=web01}"
+ "×eries=sys.cpu.user{host=web02}&back_scan=1");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1356998400000"));
assertFalse(json.contains("\"value\":\"42\""));
assertFalse(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsMetricBackscanMissingTags() throws Exception {
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user&back_scan=1");
try {
rpc.execute(tsdb, query);
fail("Expected a BadRequestException");
} catch (BadRequestException e) {
assertTrue(e.getMessage().contains("Tags"));
}
}
@Test
public void qsMetricNSUNMetric() throws Exception {
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.nice{host=web01}");
try {
rpc.execute(tsdb, query);
fail("Expected a BadRequestException");
} catch (BadRequestException e) {
assertTrue(e.getMessage().contains("No such name"));
assertTrue(e.getMessage().contains("metric"));
}
}
@Test
public void qsMetricNSUNTagk() throws Exception {
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user{dc=web01}");
try {
rpc.execute(tsdb, query);
fail("Expected a BadRequestException");
} catch (BadRequestException e) {
assertTrue(e.getMessage().contains("No such name"));
assertTrue(e.getMessage().contains("tagk"));
}
}
@Test
public void qsMetricNSUNTagv() throws Exception {
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user{host=web03}");
try {
rpc.execute(tsdb, query);
fail("Expected a BadRequestException");
} catch (BadRequestException e) {
assertTrue(e.getMessage().contains("No such name"));
assertTrue(e.getMessage().contains("tagv"));
}
}
@Test
public void qsTSUIDMeta() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?tsuids=000001000001000001");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertFalse(json.contains("\"value\":\"24\""));
assertFalse(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsTSUIDMetaCommaSeparated() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?tsuids=000001000001000001,000001000001000002");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsTSUIDMetaTwoQueries() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?tsuids=000001000001000001&tsuids=000001000001000002");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsTSUIDMetaNoResults() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?tsuids=000001000001000001");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals("[]", json);
}
@Test
public void qsTSUIDBackscan() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1356998400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1356998400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?tsuids=000001000001000001&back_scan=1");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1356998400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsTSUIDBackscanNoResult() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1356998400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?tsuids=000001000001000001&back_scan=1");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertEquals("[]", json);
}
@Test
public void qsTSUIDCommaSeparatedBackscan() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1356998400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1356998400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?tsuids=000001000001000001,000001000001000002&back_scan=1");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1356998400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsTSUIDCommaSeparatedOneMissingBackscan() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1356998400L, 42, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?tsuids=000001000001000001,000001000001000002&back_scan=1");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1356998400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertFalse(json.contains("\"value\":\"24\""));
assertFalse(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsTSUIDTwoQueriesBackscan() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1356998400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1356998400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?tsuids=000001000001000001"
+ "&tsuids=000001000001000002&back_scan=1");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1356998400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsTSUIDTwoQueriesOneMissingBackscan() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1356998400L, 42, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?tsuids=000001000001000001"
+ "&tsuids=000001000001000002&back_scan=1");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1356998400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertFalse(json.contains("\"value\":\"24\""));
assertFalse(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsTSUIDNSUIMetric() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
storage.addColumn(MockBase.stringToBytes("00000350E22700000001000001"),
new byte[] { 0, 0 }, new byte[] { 0x2A });
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?tsuids=000003000001000001&back_scan=1&resolve");
try {
rpc.execute(tsdb, query);
fail("Expected a BadRequestException");
} catch (BadRequestException e) {
assertTrue(e.getMessage().contains("No such unique ID"));
assertTrue(e.getMessage().contains("metric"));
}
}
@Test
public void qsTSUIDNSUITagk() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
storage.addColumn(MockBase.stringToBytes("00000150E22700000004000001"),
new byte[] { 0, 0 }, new byte[] { 0x2A });
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?tsuids=000001000004000001&back_scan=1&resolve");
try {
rpc.execute(tsdb, query);
fail("Expected a BadRequestException");
} catch (BadRequestException e) {
assertTrue(e.getMessage().contains("No such unique ID"));
assertTrue(e.getMessage().contains("tagk"));
}
}
@Test
public void qsTSUIDNSUITagv() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
storage.addColumn(MockBase.stringToBytes("00000150E22700000001000003"),
new byte[] { 0, 0 }, new byte[] { 0x2A });
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?tsuids=000001000001000003&back_scan=1&resolve");
try {
rpc.execute(tsdb, query);
fail("Expected a BadRequestException");
} catch (BadRequestException e) {
assertTrue(e.getMessage().contains("No such unique ID"));
assertTrue(e.getMessage().contains("tagv"));
}
}
@Test
public void qsDualMeta() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user{host=web01}"
+ "&tsuids=000001000001000002");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsDualBackscan() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1356998400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1356998400L, 24, tags);
final HttpQuery query = NettyMocks.getQuery(tsdb,
"/api/query/last?timeseries=sys.cpu.user{host=web01}"
+ "&tsuids=000001000001000002&back_scan=1");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1356998400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void qsEmpty() throws Exception {
final HttpQuery query = NettyMocks.getQuery(tsdb, "/api/query/last");
try {
rpc.execute(tsdb, query);
fail("Expected a BadRequestException");
} catch (BadRequestException e) { }
}
@Test
public void postMetricMetaWithTags() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.postQuery(tsdb, "/api/query/last",
"{\"queries\":[{\"metric\":\"sys.cpu.user\",\"tags\":"
+ "{\"host\":\"web01\"}}]}");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void postMetricMetaWithoutTags() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.postQuery(tsdb, "/api/query/last",
"{\"queries\":[{\"metric\":\"sys.cpu.user\"}]}");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void postMetricMetaWithoutTagsResolve() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.postQuery(tsdb, "/api/query/last",
"{\"queries\":[{\"metric\":\"sys.cpu.user\"}],\"resolveNames\":true}");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertTrue(json.contains("\"metric\":\"sys.cpu.user\""));
assertTrue(json.contains("\"tags\":{\"host\":\"web01\"}"));
assertTrue(json.contains("\"tags\":{\"host\":\"web02\"}"));
}
@Test
public void postMetricMetaTwoQueries() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.postQuery(tsdb, "/api/query/last",
"{\"queries\":[{\"metric\":\"sys.cpu.user\",\"tags\":"
+ "{\"host\":\"web01\"}},"
+ "{\"metric\":\"sys.cpu.user\",\"tags\":"
+ "{\"host\":\"web02\"}}]}");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void postMetricBackscanWithTags() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1356998400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1356998400L, 24, tags);
final HttpQuery query = NettyMocks.postQuery(tsdb, "/api/query/last",
"{\"queries\":[{\"metric\":\"sys.cpu.user\",\"tags\":"
+ "{\"host\":\"web01\"}}],\"backScan\":1}");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1356998400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void postTSUIDMeta() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.postQuery(tsdb, "/api/query/last",
"{\"queries\":[{\"tsuids\":[\"000001000001000001\"]}]}");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertFalse(json.contains("\"value\":\"24\""));
assertFalse(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void postTSUIDMetaList() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.postQuery(tsdb, "/api/query/last",
"{\"queries\":[{\"tsuids\":[\"000001000001000001\","
+ "\"000001000001000002\"]}]}");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void postTSUIDMetaResolve() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.postQuery(tsdb, "/api/query/last",
"{\"queries\":[{\"tsuids\":[\"000001000001000001\","
+ "\"000001000001000002\"]}],\"resolveNames\":true}");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertTrue(json.contains("\"metric\":\"sys.cpu.user\""));
assertTrue(json.contains("\"tags\":{\"host\":\"web01\"}"));
assertTrue(json.contains("\"tags\":{\"host\":\"web02\"}"));
}
@Test
public void postTSUIDMetaTwoQueries() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.postQuery(tsdb, "/api/query/last",
"{\"queries\":[{\"tsuids\":[\"000001000001000001\"]},"
+ "{\"tsuids\":[\"000001000001000002\"]}]}");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void postTSUIDBackscan() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1356998400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1356998400L, 24, tags);
final HttpQuery query = NettyMocks.postQuery(tsdb, "/api/query/last",
"{\"queries\":[{\"tsuids\":[\"000001000001000001\"]}],\"backScan\":1}");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1356998400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertFalse(json.contains("\"value\":\"24\""));
assertFalse(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void postDualMeta() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.postQuery(tsdb, "/api/query/last",
"{\"queries\":[{\"metric\":\"sys.cpu.user\",\"tags\":"
+ "{\"host\":\"web01\"}},"
+ "{\"tsuids\":[\"000001000001000002\"]}]}");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertFalse(json.contains("\"metric\""));
assertFalse(json.contains("\"tags\""));
}
@Test
public void postDualMetaResolve() throws Exception {
PowerMockito.mockStatic(DateTime.class);
PowerMockito.when(DateTime.currentTimeMillis()).thenReturn(1356998400000L);
tsdb.addPoint("sys.cpu.user", 1388534400L, 42, tags);
tags.put("host", "web02");
tsdb.addPoint("sys.cpu.user", 1388534400L, 24, tags);
final HttpQuery query = NettyMocks.postQuery(tsdb, "/api/query/last",
"{\"queries\":[{\"metric\":\"sys.cpu.user\",\"tags\":"
+ "{\"host\":\"web01\"}},"
+ "{\"tsuids\":[\"000001000001000002\"]}],"
+ "\"resolveNames\":true}");
rpc.execute(tsdb, query);
final String json = getContent(query);
assertEquals(HttpResponseStatus.OK, query.response().getStatus());
assertTrue(json.contains("\"timestamp\":1388534400000"));
assertTrue(json.contains("\"value\":\"42\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000001\""));
assertTrue(json.contains("\"value\":\"24\""));
assertTrue(json.contains("\"tsuid\":\"000001000001000002\""));
assertTrue(json.contains("\"metric\":\"sys.cpu.user\""));
assertTrue(json.contains("\"tags\":{\"host\":\"web01\"}"));
assertTrue(json.contains("\"tags\":{\"host\":\"web02\"}"));
}
@Test
public void postEmpty() throws Exception {
final HttpQuery query = NettyMocks.postQuery(tsdb, "/api/query/last",
"{\"queries\":[]}");
try {
rpc.execute(tsdb, query);
fail("Expected a BadRequestException");
} catch (BadRequestException e) { }
}
@Test
public void postEmptyList() throws Exception {
final HttpQuery query = NettyMocks.postQuery(tsdb, "/api/query/last",
"{}");
try {
rpc.execute(tsdb, query);
fail("Expected a BadRequestException");
} catch (BadRequestException e) { }
}
/**
* Returns the content of the response buffer
* @param query The query to parse
* @return Some string if we were lucky
*/
private String getContent(final HttpQuery query) {
return query.response().getContent().toString(Charset.forName("UTF-8"));
}
}