|
|
|
import { ElasticsearchMetric } from '../src/metrics/elasticsearch_metric';
|
|
|
|
import { Datasource, DatasourceType } from '../src/metrics/metric';
|
|
|
|
|
|
|
|
import 'jest';
|
|
|
|
import * as _ from 'lodash';
|
|
|
|
|
|
|
|
describe('simple query', function(){
|
|
|
|
|
|
|
|
let datasource: Datasource = {
|
|
|
|
url: "api/datasources/proxy/1/_msearch",
|
|
|
|
data: [{
|
|
|
|
"search_type": "query_then_fetch",
|
|
|
|
"ignore_unavailable": true,
|
|
|
|
"index": "metricbeat-*"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"size": 0,
|
|
|
|
"query": {
|
|
|
|
"bool": {
|
|
|
|
"filter": [
|
|
|
|
{
|
|
|
|
"range": {
|
|
|
|
"@timestamp": {
|
|
|
|
"gte": "1545933121101",
|
|
|
|
"lte": "1545954721101",
|
|
|
|
"format": "epoch_millis"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"query_string": {
|
|
|
|
"analyze_wildcard": true,
|
|
|
|
"query": "beat.hostname:example.com AND !system.network.name:\"IBM USB Remote NDIS Network Device\""
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"aggs": {
|
|
|
|
"2": {
|
|
|
|
"date_histogram": {
|
|
|
|
"interval": "30s",
|
|
|
|
"field": "@timestamp",
|
|
|
|
"min_doc_count": 0,
|
|
|
|
"extended_bounds": {
|
|
|
|
"min": "1545933121101",
|
|
|
|
"max": "1545954721101"
|
|
|
|
},
|
|
|
|
"format": "epoch_millis"
|
|
|
|
},
|
|
|
|
"aggs": {
|
|
|
|
"1": {
|
|
|
|
"avg": {
|
|
|
|
"field": "system.network.in.bytes"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"3": {
|
|
|
|
"derivative": {
|
|
|
|
"buckets_path": "1"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}],
|
|
|
|
type: DatasourceType.ELASTICSEARCH
|
|
|
|
};
|
|
|
|
datasource.data = datasource.data.map(d => JSON.stringify(d)).join('\n');
|
|
|
|
|
|
|
|
let targets = [
|
|
|
|
{
|
|
|
|
"bucketAggs": [
|
|
|
|
{
|
|
|
|
"field": "@timestamp",
|
|
|
|
"id": "2",
|
|
|
|
"settings": {
|
|
|
|
"interval": "auto",
|
|
|
|
"min_doc_count": 0,
|
|
|
|
"trimEdges": 0
|
|
|
|
},
|
|
|
|
"type": "date_histogram"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"metrics": [
|
|
|
|
{
|
|
|
|
"field": "system.network.in.bytes",
|
|
|
|
"hide": true,
|
|
|
|
"id": "1",
|
|
|
|
"meta": {},
|
|
|
|
"pipelineAgg": "select metric",
|
|
|
|
"settings": {},
|
|
|
|
"type": "avg"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"field": "1",
|
|
|
|
"id": "3",
|
|
|
|
"meta": {},
|
|
|
|
"pipelineAgg": "1",
|
|
|
|
"settings": {},
|
|
|
|
"type": "derivative"
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"query": "beat.hostname:example.com AND !system.network.name:\"IBM USB Remote NDIS Network Device\"",
|
|
|
|
"refId": "A",
|
|
|
|
"target": "carbon.agents.0b0226864dc8-a.cpuUsage",
|
|
|
|
"timeField": "@timestamp"
|
|
|
|
}
|
|
|
|
];
|
|
|
|
|
|
|
|
let queryTemplate = [{
|
|
|
|
"search_type": "query_then_fetch",
|
|
|
|
"ignore_unavailable": true,
|
|
|
|
"index": "metricbeat-*"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"size": 0,
|
|
|
|
"query": {
|
|
|
|
"bool": {
|
|
|
|
"filter": [
|
|
|
|
{
|
|
|
|
"range": {
|
|
|
|
"@timestamp": {
|
|
|
|
"gte": "1545933121101",
|
|
|
|
"lte": "1545954721101",
|
|
|
|
"format": "epoch_millis"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"query_string": {
|
|
|
|
"analyze_wildcard": true,
|
|
|
|
"query": "beat.hostname:example.com AND !system.network.name:\"IBM USB Remote NDIS Network Device\""
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"aggs": {
|
|
|
|
"2": {
|
|
|
|
"date_histogram": {
|
|
|
|
"interval": "30s",
|
|
|
|
"field": "@timestamp",
|
|
|
|
"min_doc_count": 0,
|
|
|
|
"extended_bounds": {
|
|
|
|
"min": "1545933121101",
|
|
|
|
"max": "1545954721101"
|
|
|
|
},
|
|
|
|
"format": "epoch_millis"
|
|
|
|
},
|
|
|
|
"aggs": {
|
|
|
|
"1": {
|
|
|
|
"avg": {
|
|
|
|
"field": "system.network.in.bytes"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"3": {
|
|
|
|
"derivative": {
|
|
|
|
"buckets_path": "1"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}];
|
|
|
|
|
|
|
|
let elasticMetric = new ElasticsearchMetric(datasource, targets);
|
|
|
|
|
|
|
|
it('check correct time processing', function() {
|
|
|
|
const expectedQueryTemplate = _.cloneDeep(queryTemplate);
|
|
|
|
|
|
|
|
const from = 0;
|
|
|
|
const to = 1;
|
|
|
|
const limit = 222;
|
|
|
|
const offset = 333;
|
|
|
|
|
|
|
|
expectedQueryTemplate[1].query.bool.filter[0].range['@timestamp'].gte = from.toString();
|
|
|
|
expectedQueryTemplate[1].query.bool.filter[0].range['@timestamp'].lte = to.toString();
|
|
|
|
|
|
|
|
expectedQueryTemplate[1].aggs["2"].date_histogram.extended_bounds = {
|
|
|
|
min: from.toString(),
|
|
|
|
max: to.toString()
|
|
|
|
};
|
|
|
|
|
|
|
|
let expectedQuery = {
|
|
|
|
headers: {
|
|
|
|
'Content-Type': 'application/json'
|
|
|
|
},
|
|
|
|
url: datasource.url,
|
|
|
|
method: 'POST',
|
|
|
|
schema: {
|
|
|
|
data: expectedQueryTemplate.map(e => JSON.stringify(e)).join('\n') + '\n'
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
let result = elasticMetric.getQuery(from, to, limit, offset);
|
|
|
|
|
|
|
|
expect(result).toEqual(expectedQuery);
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
let result = {
|
|
|
|
"data": {
|
|
|
|
"responses": [
|
|
|
|
{
|
|
|
|
"took": 39,
|
|
|
|
"timed_out": false,
|
|
|
|
"_shards": {
|
|
|
|
"total": 37,
|
|
|
|
"successful": 37,
|
|
|
|
"failed": 0
|
|
|
|
},
|
|
|
|
"hits": {
|
|
|
|
"total": 63127,
|
|
|
|
"max_score": 0.0,
|
|
|
|
"hits": []
|
|
|
|
},
|
|
|
|
"aggregations": {
|
|
|
|
"2": {
|
|
|
|
"buckets": [
|
|
|
|
{
|
|
|
|
"key_as_string": "1545934140000",
|
|
|
|
"key": 1545934140000,
|
|
|
|
"doc_count": 118,
|
|
|
|
"1": {
|
|
|
|
"value": 8.640455022375E9
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"key_as_string": "1545934200000",
|
|
|
|
"key": 1545934200000,
|
|
|
|
"doc_count": 178,
|
|
|
|
"1": {
|
|
|
|
"value": 8.641446309833334E9
|
|
|
|
},
|
|
|
|
"3": {
|
|
|
|
"value": 991287.4583339691
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"key_as_string": "1545934260000",
|
|
|
|
"key": 1545934260000,
|
|
|
|
"doc_count": 177,
|
|
|
|
"1": {
|
|
|
|
"value": 8.642345302333334E9
|
|
|
|
},
|
|
|
|
"3": {
|
|
|
|
"value": 898992.5
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
it('check results parsing', function() {
|
|
|
|
let expectedResult = {
|
|
|
|
columns: ['timestamp', 'target'],
|
|
|
|
values: [
|
|
|
|
[1545934140000, null],
|
|
|
|
[1545934200000, 991287.4583339691],
|
|
|
|
[1545934260000, 898992.5]
|
|
|
|
]
|
|
|
|
};
|
|
|
|
|
|
|
|
expect(elasticMetric.getResults(result)).toEqual(expectedResult);
|
|
|
|
});
|
|
|
|
});
|