blob: dfc9158af9f69fd876b015815c2b5447e065254c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
(function() {
'use strict';
var serviceModule = angular.module('eagle.service');
var _host = "";
if(localStorage) {
_host = localStorage.getItem("host") || "";
}
serviceModule.service('CompatibleEntity', function($authHttp, Time) {
function CompatibleEntity() {}
function wrapList(list, promise) {
list._done = false;
list._promise = promise.then(function (res) {
var data = res.data;
list.splice(0);
Array.prototype.push.apply(list, data.obj);
list._done = true;
return res;
});
return withThen(list);
}
function withThen(list) {
list._then = list._promise.then.bind(list._promise);
return list;
}
function parseCondition(condition) {
condition = condition || {};
return $.map(condition, function (value, key) {
return '@' + key + '="' + value + '"';
}).join(' AND ');
}
function parseFields(fields) {
fields = $.isArray(fields) ? fields : (
fields && fields !== '*' ? fields.split(/\s*,\s*/) : []
);
if(fields.length === 0) return {
fieldStr: '*',
fields: [],
order: ''
};
var fieldList = [];
var fieldEntities = [];
var orderId = -1;
var fieldStr = $.map(fields, function (field, index) {
var matches = field.match(/^([^\s]*)(\s+.*)?$/);
var fieldName = matches[1];
if(matches[2]) {
orderId = index;
}
var fieldMatches = fieldName.match(/^(.+)\((.+)\)$/);
if (fieldName === 'count') {
fieldEntities.push({
method: 'count',
name: 'count',
});
fieldList.push('count');
return fieldName;
}
else if (fieldMatches) {
fieldEntities.push({
method: fieldMatches[1],
name: fieldMatches[2],
});
fieldList.push(fieldName);
return fieldName;
} else {
fieldEntities.push({
method: '',
name: fieldName,
});
fieldList.push('@' + fieldName);
return '@' + fieldName;
}
}).join(", ");
return {
fieldStr: fieldStr,
fields: fieldList,
fieldEntities: fieldEntities,
order: orderId === -1 ? "" : ".{" + fields[orderId] + "}"
};
}
CompatibleEntity.QUERY_LIST = '/rest/entities?query=${query}[${condition}]{${fields}}&pageSize=${limit}';
CompatibleEntity.QUERY_GROUPS = '/rest/entities?query=${query}[${condition}]<${groups}>{${fields}}&pageSize=${limit}';
CompatibleEntity.QUERY_GROUPS_INTERVAL = '/rest/entities?query=${query}[${condition}]<${groups}>{${fields}}${order}${top}&pageSize=${limit}&startTime=${startTime}&endTime=${endTime}&intervalmin=${intervalMin}&timeSeries=true';
CompatibleEntity.QUERY_METRICS_INTERVAL = '/rest/entities?query=GenericMetricService[${condition}]<${groups}>{${fields}}${order}${top}&metricName=${metric}&pageSize=${limit}&startTime=${startTime}&endTime=${endTime}&intervalmin=${intervalMin}&timeSeries=true';
CompatibleEntity.query = function (queryName, param) {
var list = [];
param = param || {};
list._refresh = function () {
var myParam = $.extend({
limit: 10000,
}, param || {}, {
condition: parseCondition(param.condition),
fields: parseFields(param.fields).fieldStr,
startTime: Time.format(param.startTime),
endTime: Time.format(param.endTime)
});
var url_tpl = CompatibleEntity["QUERY_" + queryName];
if(param.startTime || param.endTime) {
url_tpl += '&startTime=${startTime}&endTime=${endTime}';
}
var url = common.template(url_tpl, myParam);
return wrapList(list, $authHttp.get(_host + url));
};
return list._refresh();
};
/**
*
* @param {string} queryName
* @param {string} param.query
* @param {{}?} param.condition
* @param {string|[]} param.groups
* @param {string|[]} param.fields
* @param {number?} param.limit
*/
CompatibleEntity.groups = function (param) {
return CompatibleEntity.query('GROUPS', $.extend({}, param, {
groups: parseFields(param.groups).fields,
}));
};
/**
*
* @param {string} queryName
* @param {{}?} param.condition
* @param {string|[]} param.groups
* @param {string|[]} param.fields
* @param {string} param.metric
* @param {{}} param.startTime
* @param {{}} param.endTime
* @param {number?} param.top
* @param {number?} param.limit
* @param {number?} param.intervalMin
*/
CompatibleEntity.timeSeries = function (param) {
param = param || {};
var fields = parseFields(param.fields);
var startTime = new Time(param.startTime || 'startTime');
var endTime = new Time(param.endTime || 'endTime');
var startTimestamp = startTime.valueOf();
var intervalMin = param.intervalMin ? param.intervalMin : Time.diffInterval(startTime, endTime) / 1000 / 60;
var interval = intervalMin * 1000 * 60;
var innerList = CompatibleEntity.query(param.metric ? 'METRICS_INTERVAL' : 'GROUPS_INTERVAL', $.extend({}, param, {
groups: parseFields(param.groups).fields,
order: fields.order,
top: param.top ? "&top=" + param.top : "",
startTime: startTime,
endTime: endTime,
intervalMin: intervalMin,
}));
var list = [];
list._done = false;
list._promise = innerList._promise;
innerList._promise.then(function () {
var displayKey = innerList.length > 1;
// Generate series
var series = $.map(innerList, function (group) {
return $.map(fields.fieldEntities, function (entity, i) {
var data = group.value[i];
return {
name: (displayKey ? group.key.join(',') + '-' : '') + (entity.method || entity.name),
type: 'line',
showSymbol: false,
data: $.map(data, function (value, index) {
return {
x: startTimestamp + interval * index,
y: value
};
}),
group: group,
};
});
});
list.splice(0);
Array.prototype.push.apply(list, series);
list._done = true;
});
return list;
};
return CompatibleEntity;
});
})();