mirror of https://gitee.com/bigwinds/arangodb
Merge branch 'devel' of https://github.com/triAGENS/ArangoDB into devel
This commit is contained in:
commit
7a27b61583
|
@ -29,6 +29,10 @@
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
var actions = require("org/arangodb/actions");
|
||||
var cluster = require("org/arangodb/cluster");
|
||||
var internal = require("internal");
|
||||
var console = require("console");
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// --SECTION-- private functions
|
||||
|
@ -662,7 +666,7 @@ actions.defineHttp({
|
|||
});
|
||||
|
||||
actions.defineHttp({
|
||||
url : "_admin/clusterHistory",
|
||||
url : "_admin/history",
|
||||
context : "admin",
|
||||
prefix : "false",
|
||||
callback : function (req, res) {
|
||||
|
@ -670,26 +674,67 @@ actions.defineHttp({
|
|||
actions.resultError(req, res, actions.HTTP_FORBIDDEN, 0,
|
||||
"only POST requests are allowed");
|
||||
return;
|
||||
}
|
||||
if (!require("org/arangodb/cluster").isCoordinator()) {
|
||||
actions.resultError(req, res, actions.HTTP_FORBIDDEN, 0,
|
||||
"only allowed on coordinator");
|
||||
return;
|
||||
}
|
||||
if (!req.parameters.hasOwnProperty("DBserver")) {
|
||||
actions.resultError(req, res, actions.HTTP_BAD,
|
||||
"required parameter DBserver was not given");
|
||||
return;
|
||||
|
||||
}
|
||||
var body = actions.getJsonBody(req, res);
|
||||
if (body === undefined) {
|
||||
return;
|
||||
}
|
||||
var DBserver = req.parameters.DBserver;
|
||||
|
||||
//build query
|
||||
var startDate = body.startDate;
|
||||
var endDate = body.endDate;
|
||||
var figures = body.figures;
|
||||
var filterString = "";
|
||||
if (startDate) {
|
||||
filterString += " filter u.time > " + startDate;
|
||||
} else {
|
||||
endDate = startDate;
|
||||
}
|
||||
if (endDate) {
|
||||
filterString += " filter u.time < " + endDate;
|
||||
}
|
||||
if (cluster.isCoordinator() && !req.parameters.hasOwnProperty("DBserver")) {
|
||||
filterString += " filter u.clusterId == '" + cluster.coordinatorId() +"'";
|
||||
}
|
||||
var returnValue = " return u";
|
||||
if (figures) {
|
||||
returnValue = " return {time : u.time, server : {uptime : u.server.uptime} ";
|
||||
var groups = {};
|
||||
figures.forEach(function(f) {
|
||||
var g = f.split(".")[0];
|
||||
if (!groups[g]) {
|
||||
groups[g] = [];
|
||||
}
|
||||
groups[g].push(f.split(".")[1] + " : u." + f);
|
||||
});
|
||||
Object.keys(groups).forEach(function(key) {
|
||||
returnValue += ", " + key + " : {" + groups[key] +"}";
|
||||
});
|
||||
returnValue += "}";
|
||||
}
|
||||
var myQueryVal = "FOR u in _statistics "+ filterString + " sort u.time" + returnValue;
|
||||
|
||||
if (!req.parameters.hasOwnProperty("DBserver")) {
|
||||
var cursor = internal.AQL_QUERY(myQueryVal,
|
||||
{},
|
||||
{batchSize: 100000}
|
||||
);
|
||||
res.contentType = "application/json; charset=utf-8";
|
||||
if (cursor instanceof Error) {
|
||||
res.responseCode = actions.HTTP_BAD;
|
||||
res.body = JSON.stringify( {"error":true,
|
||||
"errorMessage": "an error occured"});
|
||||
}
|
||||
res.responseCode = actions.HTTP_OK;
|
||||
res.body = JSON.stringify({result : cursor.docs});
|
||||
} else {
|
||||
var DBserver = req.parameters.DBserver;
|
||||
var coord = { coordTransactionID: ArangoClusterInfo.uniqid() };
|
||||
var options = { coordTransactionID: coord.coordTransactionID, timeout:10 };
|
||||
var op = ArangoClusterComm.asyncRequest("POST","server:"+DBserver,"_system",
|
||||
"/_api/cursor",JSON.stringify(body),{},options);
|
||||
"/_api/cursor",JSON.stringify({query: myQueryVal, batchSize: 100000}),{},options);
|
||||
var r = ArangoClusterComm.wait(op);
|
||||
res.contentType = "application/json; charset=utf-8";
|
||||
if (r.status === "RECEIVED") {
|
||||
|
@ -714,6 +759,7 @@ actions.defineHttp({
|
|||
"body": bodyobj} );
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
|
|
@ -212,51 +212,29 @@
|
|||
window.arangoDocumentsStore.reset();
|
||||
},
|
||||
getStatisticsHistory: function(params) {
|
||||
var startDate = params.startDate;
|
||||
var endDate = params.endDate;
|
||||
var self = this;
|
||||
var body = {
|
||||
startDate : params.startDate,
|
||||
endDate : params.endDate,
|
||||
figures : params.figures
|
||||
};
|
||||
var server = params.server;
|
||||
var url = "";
|
||||
var figures = params.figures;
|
||||
var self = this;
|
||||
var filterString = "";
|
||||
if (startDate) {
|
||||
filterString += " filter u.time > " + startDate;
|
||||
} else {
|
||||
endDate = startDate;
|
||||
}
|
||||
if (endDate) {
|
||||
filterString += " filter u.time < " + endDate;
|
||||
}
|
||||
var returnValue = " return u";
|
||||
if (figures) {
|
||||
returnValue = " return {time : u.time, server : {uptime : u.server.uptime} ";
|
||||
var groups = {};
|
||||
figures.forEach(function(f) {
|
||||
var g = f.split(".")[0];
|
||||
if (!groups[g]) {
|
||||
groups[g] = [];
|
||||
}
|
||||
groups[g].push(f.split(".")[1] + " : u." + f);
|
||||
});
|
||||
Object.keys(groups).forEach(function(key) {
|
||||
returnValue += ", " + key + " : {" + groups[key] +"}";
|
||||
});
|
||||
returnValue += "}";
|
||||
}
|
||||
var myQueryVal = "FOR u in _statistics "+ filterString + " sort u.time" + returnValue;
|
||||
if (server) {
|
||||
url = server.endpoint;
|
||||
url += "/_admin/clusterHistory";
|
||||
url += "/_admin/history";
|
||||
if (server.isDBServer) {
|
||||
url += "?DBserver=" + server.target;
|
||||
}
|
||||
} else {
|
||||
url = "/_api/cursor";
|
||||
url = "/_admin/history";
|
||||
}
|
||||
$.ajax({
|
||||
cache: false,
|
||||
type: 'POST',
|
||||
async: false,
|
||||
url: url,
|
||||
data: JSON.stringify({query: myQueryVal, batchSize: 10000}),
|
||||
data: JSON.stringify(body),
|
||||
contentType: "application/json",
|
||||
success: function(data) {
|
||||
self.history = data.result;
|
||||
|
|
|
@ -61,7 +61,6 @@
|
|||
contentEl: '.contentDiv',
|
||||
distributionChartDiv : "#distributionChartDiv",
|
||||
interval: 12000, // in milliseconds
|
||||
defaultRollPeriod : 1,
|
||||
detailTemplate: templateEngine.createTemplate("lineChartDetailView.ejs"),
|
||||
detailEl: '#modalPlaceholder',
|
||||
|
||||
|
@ -411,7 +410,6 @@
|
|||
dateWindow : [new Date().getTime() - 20 * 60 * 1000,new Date().getTime()],
|
||||
colors: [this.colors[0]],
|
||||
xAxisLabelWidth : "60",
|
||||
rollPeriod: 3,
|
||||
rightGap: 10,
|
||||
showRangeSelector: false,
|
||||
rangeSelectorHeight: 40,
|
||||
|
@ -487,6 +485,7 @@
|
|||
var time = entry.time * 1000;
|
||||
var newUptime = entry.server.uptime;
|
||||
if (self.uptime && newUptime < self.uptime) {
|
||||
|
||||
var e = {time : (time-(newUptime+10)* 1000 ) /1000};
|
||||
self.description.get("figures").forEach(function(figure) {
|
||||
if (!e[figure.group]) {
|
||||
|
@ -583,7 +582,7 @@
|
|||
|
||||
|
||||
updateSeries : function(data) {
|
||||
this.uptime = data.system.uptime;
|
||||
this.uptime = data.server.uptime;
|
||||
this.processSingleStatistic(data);
|
||||
},
|
||||
|
||||
|
|
|
@ -958,10 +958,22 @@ var dispatcherDisabled = function () {
|
|||
return ArangoServerState.disableDispatcherFrontend();
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief coordinatorId
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
var coordinatorId= function () {
|
||||
if (! isCoordinator()) {
|
||||
console.error("not a coordinator");
|
||||
}
|
||||
return ArangoServerState.id();
|
||||
};
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// --SECTION-- MODULE EXPORTS
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
exports.coordinatorId = coordinatorId;
|
||||
exports.dispatcherDisabled = dispatcherDisabled;
|
||||
exports.handlePlanChange = handlePlanChange;
|
||||
exports.isCluster = isCluster;
|
||||
|
|
|
@ -920,26 +920,25 @@ TRI_external_status_t TRI_CheckExternalProcess (TRI_external_id_t pid,
|
|||
external->_exitStatus = 0;
|
||||
}
|
||||
#else
|
||||
HANDLE hProcess = OpenProcess(SYNCHRONIZE |
|
||||
PROCESS_QUERY_LIMITED_INFORMATION,
|
||||
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,
|
||||
FALSE, external->_pid);
|
||||
if (hProcess == NULL) {
|
||||
LOG_WARNING("could not do OpenProcess for subprocess with PID '%ud'",
|
||||
external->_pid);
|
||||
LOG_WARNING("could not do OpenProcess for subprocess with PID '%u' error '%u'",
|
||||
external->_pid, GetLastError());
|
||||
}
|
||||
else {
|
||||
if (wait) {
|
||||
DWORD result;
|
||||
result = WaitForSingleObject(hProcess, INFINITE);
|
||||
if (result == WAIT_FAILED) {
|
||||
LOG_WARNING("could not wait for subprocess with PID '%ud'",
|
||||
external->_pid);
|
||||
LOG_WARNING("could not wait for subprocess with PID '%u' error '%u'",
|
||||
external->_pid, GetLastError());
|
||||
}
|
||||
}
|
||||
DWORD exitCode = STILL_ACTIVE;
|
||||
if (!GetExitCodeProcess(hProcess , &exitCode)) {
|
||||
LOG_WARNING("exit status could not be determined for PID '%ud'",
|
||||
external->_pid);
|
||||
LOG_WARNING("exit status could not be determined for PID '%u' error '%u'",
|
||||
external->_pid, GetLastError());
|
||||
}
|
||||
else {
|
||||
if (exitCode == STILL_ACTIVE) {
|
||||
|
|
Loading…
Reference in New Issue