1
0
Fork 0

allow turning off statistics feature (#5883)

This commit is contained in:
Jan 2018-07-16 10:46:43 +02:00 committed by GitHub
parent 1f5d2f38e7
commit 201a6a308b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 119 additions and 170 deletions

View File

@ -231,6 +231,16 @@ void AgencyFeature::validateOptions(std::shared_ptr<ProgramOptions> options) {
if (result.touched("agency.supervision")) { if (result.touched("agency.supervision")) {
_supervisionTouched = true; _supervisionTouched = true;
} }
// turn off the following features, as they are not needed in an agency:
// - MMFilesPersistentIndex: not needed by agency even if MMFiles is
// the selected storage engine
// - ArangoSearch: not needed by agency even if MMFiles is the selected
// storage engine
// - Statistics: turn off statistics gathering for agency
application_features::ApplicationServer::disableFeatures(
{"MMFilesPersistentIndex", "ArangoSearch", "Statistics"}
);
} }
void AgencyFeature::prepare() { void AgencyFeature::prepare() {

View File

@ -54,8 +54,7 @@ RestStatus RestAdminStatisticsHandler::execute() {
void RestAdminStatisticsHandler::getStatistics() { void RestAdminStatisticsHandler::getStatistics() {
stats::Descriptions const* desc = StatisticsFeature::descriptions(); stats::Descriptions const* desc = StatisticsFeature::descriptions();
if (!desc) { if (!desc) {
generateError(rest::ResponseCode::SERVICE_UNAVAILABLE, generateError(rest::ResponseCode::NOT_FOUND, TRI_ERROR_DISABLED, "statistics not enabled");
TRI_ERROR_SHUTTING_DOWN);
return; return;
} }
@ -91,8 +90,7 @@ void RestAdminStatisticsHandler::getStatistics() {
void RestAdminStatisticsHandler::getStatisticsDescription() { void RestAdminStatisticsHandler::getStatisticsDescription() {
stats::Descriptions const* desc = StatisticsFeature::descriptions(); stats::Descriptions const* desc = StatisticsFeature::descriptions();
if (!desc) { if (!desc) {
generateError(rest::ResponseCode::SERVICE_UNAVAILABLE, generateError(rest::ResponseCode::NOT_FOUND, TRI_ERROR_DISABLED, "statistics not enabled");
TRI_ERROR_SHUTTING_DOWN);
return; return;
} }

View File

@ -33,7 +33,6 @@
#include "RestServer/DatabaseFeature.h" #include "RestServer/DatabaseFeature.h"
#include "RestServer/VocbaseContext.h" #include "RestServer/VocbaseContext.h"
#include "Scheduler/SchedulerFeature.h" #include "Scheduler/SchedulerFeature.h"
#include "Statistics/StatisticsFeature.h"
#include "V8/v8-conv.h" #include "V8/v8-conv.h"
#include "V8/v8-globals.h" #include "V8/v8-globals.h"
#include "V8/v8-utils.h" #include "V8/v8-utils.h"
@ -129,7 +128,7 @@ void ServerFeature::validateOptions(std::shared_ptr<ProgramOptions> options) {
if (!_restServer) { if (!_restServer) {
ApplicationServer::disableFeatures({"Daemon", "Endpoint", "GeneralServer", ApplicationServer::disableFeatures({"Daemon", "Endpoint", "GeneralServer",
"SslServer", "Supervisor"}); "SslServer", "Statistics", "Supervisor"});
if (!options->processingResult().touched("replication.auto-start")) { if (!options->processingResult().touched("replication.auto-start")) {
// turn off replication applier when we do not have a rest server // turn off replication applier when we do not have a rest server
@ -139,10 +138,6 @@ void ServerFeature::validateOptions(std::shared_ptr<ProgramOptions> options) {
ApplicationServer::getFeature<ReplicationFeature>("Replication"); ApplicationServer::getFeature<ReplicationFeature>("Replication");
replicationFeature->disableReplicationApplier(); replicationFeature->disableReplicationApplier();
} }
StatisticsFeature* statisticsFeature =
ApplicationServer::getFeature<StatisticsFeature>("Statistics");
statisticsFeature->disableStatistics();
} }
if (_operationMode == OperationMode::MODE_CONSOLE) { if (_operationMode == OperationMode::MODE_CONSOLE) {

View File

@ -64,8 +64,6 @@ void ConnectionStatistics::initialize() {
} }
} }
void ConnectionStatistics::shutdown() {}
ConnectionStatistics* ConnectionStatistics::acquire() { ConnectionStatistics* ConnectionStatistics::acquire() {
ConnectionStatistics* statistics = nullptr; ConnectionStatistics* statistics = nullptr;
@ -96,7 +94,7 @@ void ConnectionStatistics::fill(StatisticsCounter& httpConnections,
totalRequests = TRI_TotalRequestsStatistics; totalRequests = TRI_TotalRequestsStatistics;
methodRequests = TRI_MethodRequestsStatistics; methodRequests = TRI_MethodRequestsStatistics;
asyncRequests = TRI_AsyncRequestsStatistics; asyncRequests = TRI_AsyncRequestsStatistics;
connectionTime = *TRI_ConnectionTimeDistributionStatistics; connectionTime = TRI_ConnectionTimeDistributionStatistics;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
@ -113,7 +111,7 @@ void ConnectionStatistics::release() {
if (_connStart != 0.0 && _connEnd != 0.0) { if (_connStart != 0.0 && _connEnd != 0.0) {
double totalTime = _connEnd - _connStart; double totalTime = _connEnd - _connStart;
TRI_ConnectionTimeDistributionStatistics->addFigure(totalTime); TRI_ConnectionTimeDistributionStatistics.addFigure(totalTime);
} }
} }

View File

@ -36,7 +36,6 @@ namespace arangodb {
class ConnectionStatistics { class ConnectionStatistics {
public: public:
static void initialize(); static void initialize();
static void shutdown();
static ConnectionStatistics* acquire(); static ConnectionStatistics* acquire();
void release(); void release();

View File

@ -21,7 +21,6 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#include "Descriptions.h" #include "Descriptions.h"
#include "Basics/Common.h"
#include "Basics/process-utils.h" #include "Basics/process-utils.h"
#include "Statistics/ConnectionStatistics.h" #include "Statistics/ConnectionStatistics.h"
#include "Statistics/RequestStatistics.h" #include "Statistics/RequestStatistics.h"
@ -105,10 +104,10 @@ void stats::Figure::toVPack(velocypack::Builder& b) const {
} }
stats::Descriptions::Descriptions() stats::Descriptions::Descriptions()
: _requestTimeCuts({0.01, 0.05, 0.1, 0.2, 0.5, 1.0}), : _requestTimeCuts(arangodb::basics::TRI_RequestTimeDistributionVectorStatistics),
_connectionTimeCuts({0.1, 1.0, 60.0}), _connectionTimeCuts(arangodb::basics::TRI_ConnectionTimeDistributionVectorStatistics),
_bytesSendCuts({250, 1000, 2 * 1000, 5 * 1000, 10 * 1000}), _bytesSendCuts(arangodb::basics::TRI_BytesSentDistributionVectorStatistics),
_bytesReceivedCuts({250, 1000, 2 * 1000, 5 * 1000, 10 * 1000}) { _bytesReceivedCuts(arangodb::basics::TRI_BytesReceivedDistributionVectorStatistics) {
_groups.emplace_back(Group{stats::GroupType::System, "Process Statistics", _groups.emplace_back(Group{stats::GroupType::System, "Process Statistics",
"Statistics about the ArangoDB process"}); "Statistics about the ArangoDB process"});
_groups.emplace_back(Group{stats::GroupType::Client, _groups.emplace_back(Group{stats::GroupType::Client,
@ -240,7 +239,7 @@ stats::Descriptions::Descriptions()
_figures.emplace_back( _figures.emplace_back(
Figure{stats::GroupType::Client, "bytesReceived", "Bytes Received", Figure{stats::GroupType::Client, "bytesReceived", "Bytes Received",
"Bytes receiveds for a request.", stats::FigureType::Distribution, "Bytes received for a request.", stats::FigureType::Distribution,
// cuts: internal.bytesReceivedDistribution, // cuts: internal.bytesReceivedDistribution,
stats::Unit::Bytes, _bytesReceivedCuts}); stats::Unit::Bytes, _bytesReceivedCuts});
@ -355,18 +354,18 @@ stats::Descriptions::Descriptions()
void stats::Descriptions::serverStatistics(velocypack::Builder& b) const { void stats::Descriptions::serverStatistics(velocypack::Builder& b) const {
ServerStatistics info = ServerStatistics::statistics(); ServerStatistics info = ServerStatistics::statistics();
b.add("uptime", VPackValue(info._uptime)); b.add("uptime", VPackValue(info._uptime));
b.add("physicalMemory", VPackValue((double)TRI_PhysicalMemory)); b.add("physicalMemory", VPackValue(TRI_PhysicalMemory));
V8DealerFeature* dealer = V8DealerFeature* dealer =
application_features::ApplicationServer::getFeature<V8DealerFeature>("V8Dealer"); application_features::ApplicationServer::getFeature<V8DealerFeature>("V8Dealer");
if (dealer->isEnabled()) { if (dealer->isEnabled()) {
b.add("v8Context", VPackValue(VPackValueType::Object, true)); b.add("v8Context", VPackValue(VPackValueType::Object, true));
auto v8Counters = dealer->getCurrentContextNumbers(); auto v8Counters = dealer->getCurrentContextNumbers();
b.add( "available", VPackValue(static_cast<int32_t>(v8Counters.available))); b.add( "available", VPackValue(v8Counters.available));
b.add( "busy", VPackValue(static_cast<int32_t>(v8Counters.busy))); b.add( "busy", VPackValue(v8Counters.busy));
b.add( "dirty", VPackValue(static_cast<int32_t>(v8Counters.dirty))); b.add( "dirty", VPackValue(v8Counters.dirty));
b.add( "free", VPackValue(static_cast<int32_t>(v8Counters.free))); b.add( "free", VPackValue(v8Counters.free));
b.add( "max", VPackValue(static_cast<int32_t>(v8Counters.max))); b.add( "max", VPackValue(v8Counters.max));
b.close(); b.close();
} }
@ -377,7 +376,6 @@ void stats::Descriptions::serverStatistics(velocypack::Builder& b) const {
b.close(); b.close();
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief fills the distribution /// @brief fills the distribution
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -386,11 +384,10 @@ static void FillDistribution(VPackBuilder& b, std::string const& name,
basics::StatisticsDistribution const& dist) { basics::StatisticsDistribution const& dist) {
b.add(name, VPackValue(VPackValueType::Object, true)); b.add(name, VPackValue(VPackValueType::Object, true));
b.add("sum", VPackValue(dist._total)); b.add("sum", VPackValue(dist._total));
b.add("count", VPackValue((double)dist._count)); b.add("count", VPackValue(dist._count));
b.add("counts", VPackValue(VPackValueType::Array, true)); b.add("counts", VPackValue(VPackValueType::Array, true));
for (std::vector<uint64_t>::const_iterator i = dist._counts.begin(); for (auto const& it : dist._counts) {
i != dist._counts.end(); ++i) { b.add(VPackValue(it));
b.add(VPackValue(*i));
} }
b.close(); b.close();
b.close(); b.close();
@ -407,7 +404,7 @@ void stats::Descriptions::clientStatistics(velocypack::Builder& b) const {
ConnectionStatistics::fill(httpConnections, totalRequests, methodRequests, ConnectionStatistics::fill(httpConnections, totalRequests, methodRequests,
asyncRequests, connectionTime); asyncRequests, connectionTime);
b.add("httpConnections", VPackValue((double)httpConnections._count)); b.add("httpConnections", VPackValue(httpConnections._count));
FillDistribution(b, "connectionTime", connectionTime); FillDistribution(b, "connectionTime", connectionTime);
basics::StatisticsDistribution totalTime; basics::StatisticsDistribution totalTime;
@ -439,19 +436,18 @@ void stats::Descriptions::httpStatistics(velocypack::Builder& b) const {
asyncRequests, connectionTime); asyncRequests, connectionTime);
// request counters // request counters
b.add("requestsTotal", VPackValue((double)totalRequests._count)); b.add("requestsTotal", VPackValue(totalRequests._count));
b.add("requestsAsync", VPackValue((double)asyncRequests._count)); b.add("requestsAsync", VPackValue(asyncRequests._count));
b.add("requestsGet", VPackValue((double)methodRequests[(int)rest::RequestType::GET]._count)); b.add("requestsGet", VPackValue(methodRequests[(int)rest::RequestType::GET]._count));
b.add("requestsHead", VPackValue((double)methodRequests[(int)rest::RequestType::HEAD]._count)); b.add("requestsHead", VPackValue(methodRequests[(int)rest::RequestType::HEAD]._count));
b.add("requestsPost", VPackValue((double)methodRequests[(int)rest::RequestType::POST]._count)); b.add("requestsPost", VPackValue(methodRequests[(int)rest::RequestType::POST]._count));
b.add("requestsPut", VPackValue((double)methodRequests[(int)rest::RequestType::PUT]._count)); b.add("requestsPut", VPackValue(methodRequests[(int)rest::RequestType::PUT]._count));
b.add("requestsPatch", VPackValue((double)methodRequests[(int)rest::RequestType::PATCH]._count)); b.add("requestsPatch", VPackValue(methodRequests[(int)rest::RequestType::PATCH]._count));
b.add("requestsDelete", VPackValue((double)methodRequests[(int)rest::RequestType::DELETE_REQ]._count)); b.add("requestsDelete", VPackValue(methodRequests[(int)rest::RequestType::DELETE_REQ]._count));
b.add("requestsOptions", VPackValue((double)methodRequests[(int)rest::RequestType::OPTIONS]._count)); b.add("requestsOptions", VPackValue(methodRequests[(int)rest::RequestType::OPTIONS]._count));
b.add("requestsOther", VPackValue((double)methodRequests[(int)rest::RequestType::ILLEGAL]._count)); b.add("requestsOther", VPackValue(methodRequests[(int)rest::RequestType::ILLEGAL]._count));
} }
void stats::Descriptions::processStatistics(VPackBuilder& b) const { void stats::Descriptions::processStatistics(VPackBuilder& b) const {
ProcessInfo info = TRI_ProcessInfoSelf(); ProcessInfo info = TRI_ProcessInfoSelf();
double rss = (double)info._residentSize; double rss = (double)info._residentSize;
@ -461,12 +457,12 @@ void stats::Descriptions::processStatistics(VPackBuilder& b) const {
rssp = rss / TRI_PhysicalMemory; rssp = rss / TRI_PhysicalMemory;
} }
b.add("minorPageFaults", VPackValue((double)info._minorPageFaults)); b.add("minorPageFaults", VPackValue(info._minorPageFaults));
b.add("majorPageFaults", VPackValue((double)info._majorPageFaults)); b.add("majorPageFaults", VPackValue(info._majorPageFaults));
b.add("userTime", VPackValue((double)info._userTime / (double)info._scClkTck)); b.add("userTime", VPackValue((double)info._userTime / (double)info._scClkTck));
b.add("systemTime", VPackValue((double)info._systemTime / (double)info._scClkTck)); b.add("systemTime", VPackValue((double)info._systemTime / (double)info._scClkTck));
b.add("numberOfThreads", VPackValue((double)info._numberThreads)); b.add("numberOfThreads", VPackValue(info._numberThreads));
b.add("residentSize", VPackValue(rss)); b.add("residentSize", VPackValue(rss));
b.add("residentSizePercent", VPackValue(rssp)); b.add("residentSizePercent", VPackValue(rssp));
b.add("virtualSize", VPackValue((double)info._virtualSize)); b.add("virtualSize", VPackValue(info._virtualSize));
} }

View File

@ -23,6 +23,8 @@
#ifndef ARANGOD_STATISTICS_DESCRIPTIONS_H #ifndef ARANGOD_STATISTICS_DESCRIPTIONS_H
#define ARANGOD_STATISTICS_DESCRIPTIONS_H 1 #define ARANGOD_STATISTICS_DESCRIPTIONS_H 1
#include "Basics/Common.h"
#include <velocypack/Builder.h> #include <velocypack/Builder.h>
#include <string> #include <string>

View File

@ -62,8 +62,6 @@ void RequestStatistics::initialize() {
} }
} }
void RequestStatistics::shutdown() {}
size_t RequestStatistics::processAll() { size_t RequestStatistics::processAll() {
RequestStatistics* statistics = nullptr; RequestStatistics* statistics = nullptr;
size_t count = 0; size_t count = 0;
@ -130,26 +128,26 @@ void RequestStatistics::process(RequestStatistics* statistics) {
totalTime = statistics->_writeEnd - statistics->_readStart; totalTime = statistics->_writeEnd - statistics->_readStart;
} }
TRI_TotalTimeDistributionStatistics->addFigure(totalTime); TRI_TotalTimeDistributionStatistics.addFigure(totalTime);
double requestTime = statistics->_requestEnd - statistics->_requestStart; double requestTime = statistics->_requestEnd - statistics->_requestStart;
TRI_RequestTimeDistributionStatistics->addFigure(requestTime); TRI_RequestTimeDistributionStatistics.addFigure(requestTime);
double queueTime = 0.0; double queueTime = 0.0;
if (statistics->_queueStart != 0.0 && statistics->_queueEnd != 0.0) { if (statistics->_queueStart != 0.0 && statistics->_queueEnd != 0.0) {
queueTime = statistics->_queueEnd - statistics->_queueStart; queueTime = statistics->_queueEnd - statistics->_queueStart;
TRI_QueueTimeDistributionStatistics->addFigure(queueTime); TRI_QueueTimeDistributionStatistics.addFigure(queueTime);
} }
double ioTime = totalTime - requestTime - queueTime; double ioTime = totalTime - requestTime - queueTime;
if (ioTime >= 0.0) { if (ioTime >= 0.0) {
TRI_IoTimeDistributionStatistics->addFigure(ioTime); TRI_IoTimeDistributionStatistics.addFigure(ioTime);
} }
TRI_BytesSentDistributionStatistics->addFigure(statistics->_sentBytes); TRI_BytesSentDistributionStatistics.addFigure(statistics->_sentBytes);
TRI_BytesReceivedDistributionStatistics->addFigure( TRI_BytesReceivedDistributionStatistics.addFigure(
statistics->_receivedBytes); statistics->_receivedBytes);
} }
} }
@ -205,12 +203,12 @@ void RequestStatistics::fill(StatisticsDistribution& totalTime,
MUTEX_LOCKER(mutexLocker, _dataLock); MUTEX_LOCKER(mutexLocker, _dataLock);
totalTime = *TRI_TotalTimeDistributionStatistics; totalTime = TRI_TotalTimeDistributionStatistics;
requestTime = *TRI_RequestTimeDistributionStatistics; requestTime = TRI_RequestTimeDistributionStatistics;
queueTime = *TRI_QueueTimeDistributionStatistics; queueTime = TRI_QueueTimeDistributionStatistics;
ioTime = *TRI_IoTimeDistributionStatistics; ioTime = TRI_IoTimeDistributionStatistics;
bytesSent = *TRI_BytesSentDistributionStatistics; bytesSent = TRI_BytesSentDistributionStatistics;
bytesReceived = *TRI_BytesReceivedDistributionStatistics; bytesReceived = TRI_BytesReceivedDistributionStatistics;
} }
std::string RequestStatistics::timingsCsv() { std::string RequestStatistics::timingsCsv() {

View File

@ -37,7 +37,6 @@ namespace arangodb {
class RequestStatistics { class RequestStatistics {
public: public:
static void initialize(); static void initialize();
static void shutdown();
static size_t processAll(); static size_t processAll();
static RequestStatistics* acquire(); static RequestStatistics* acquire();

View File

@ -22,7 +22,6 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#include "ServerStatistics.h" #include "ServerStatistics.h"
#include "Statistics/StatisticsFeature.h" #include "Statistics/StatisticsFeature.h"
using namespace arangodb; using namespace arangodb;
@ -49,6 +48,3 @@ ServerStatistics ServerStatistics::statistics() {
void ServerStatistics::initialize() { void ServerStatistics::initialize() {
START_TIME = StatisticsFeature::time(); START_TIME = StatisticsFeature::time();
} }
void ServerStatistics::shutdown() {
}

View File

@ -29,7 +29,6 @@ class ServerStatistics {
static ServerStatistics statistics(); static ServerStatistics statistics();
static void initialize(); static void initialize();
static void shutdown();
double _startTime; double _startTime;
double _uptime; double _uptime;

View File

@ -46,21 +46,25 @@ using namespace arangodb::options;
namespace arangodb { namespace arangodb {
namespace basics { namespace basics {
std::vector<double> const TRI_BytesReceivedDistributionVectorStatistics({ 250, 1000, 2000, 5000, 10000 });
std::vector<double> const TRI_BytesSentDistributionVectorStatistics({ 250, 1000, 2000, 5000, 10000 });
std::vector<double> const TRI_ConnectionTimeDistributionVectorStatistics({ 0.1, 1.0, 60.0 });
std::vector<double> const TRI_RequestTimeDistributionVectorStatistics({ 0.01, 0.05, 0.1, 0.2, 0.5, 1.0 });
StatisticsCounter TRI_AsyncRequestsStatistics; StatisticsCounter TRI_AsyncRequestsStatistics;
StatisticsCounter TRI_HttpConnectionsStatistics; StatisticsCounter TRI_HttpConnectionsStatistics;
StatisticsCounter TRI_TotalRequestsStatistics; StatisticsCounter TRI_TotalRequestsStatistics;
StatisticsDistribution* TRI_BytesReceivedDistributionStatistics;
StatisticsDistribution* TRI_BytesSentDistributionStatistics;
StatisticsDistribution* TRI_ConnectionTimeDistributionStatistics;
StatisticsDistribution* TRI_IoTimeDistributionStatistics;
StatisticsDistribution* TRI_QueueTimeDistributionStatistics;
StatisticsDistribution* TRI_RequestTimeDistributionStatistics;
StatisticsDistribution* TRI_TotalTimeDistributionStatistics;
StatisticsVector TRI_BytesReceivedDistributionVectorStatistics;
StatisticsVector TRI_BytesSentDistributionVectorStatistics;
StatisticsVector TRI_ConnectionTimeDistributionVectorStatistics;
StatisticsVector TRI_RequestTimeDistributionVectorStatistics;
std::vector<StatisticsCounter> TRI_MethodRequestsStatistics; std::vector<StatisticsCounter> TRI_MethodRequestsStatistics;
StatisticsDistribution TRI_BytesReceivedDistributionStatistics(TRI_BytesReceivedDistributionVectorStatistics);
StatisticsDistribution TRI_BytesSentDistributionStatistics(TRI_BytesSentDistributionVectorStatistics);
StatisticsDistribution TRI_ConnectionTimeDistributionStatistics(TRI_ConnectionTimeDistributionVectorStatistics);
StatisticsDistribution TRI_IoTimeDistributionStatistics(TRI_RequestTimeDistributionVectorStatistics);
StatisticsDistribution TRI_QueueTimeDistributionStatistics(TRI_RequestTimeDistributionVectorStatistics);
StatisticsDistribution TRI_RequestTimeDistributionStatistics(TRI_RequestTimeDistributionVectorStatistics);
StatisticsDistribution TRI_TotalTimeDistributionStatistics(TRI_RequestTimeDistributionVectorStatistics);
} }
} }
@ -105,10 +109,6 @@ class arangodb::StatisticsThread final : public Thread {
} }
} }
} }
RequestStatistics::shutdown();
ConnectionStatistics::shutdown();
ServerStatistics::shutdown();
} }
}; };
@ -125,6 +125,7 @@ StatisticsFeature::StatisticsFeature(
_descriptions(new stats::Descriptions()) { _descriptions(new stats::Descriptions()) {
startsAfter("Logger"); startsAfter("Logger");
startsAfter("Aql"); startsAfter("Aql");
setOptional(true);
} }
void StatisticsFeature::collectOptions( void StatisticsFeature::collectOptions(
@ -138,6 +139,14 @@ void StatisticsFeature::collectOptions(
new BooleanParameter(&_statistics)); new BooleanParameter(&_statistics));
} }
void StatisticsFeature::validateOptions(
std::shared_ptr<ProgramOptions>) {
if (!_statistics) {
// turn ourselves off
disable();
}
}
void StatisticsFeature::prepare() { void StatisticsFeature::prepare() {
// initialize counters for all HTTP request types // initialize counters for all HTTP request types
TRI_MethodRequestsStatistics.clear(); TRI_MethodRequestsStatistics.clear();
@ -146,31 +155,7 @@ void StatisticsFeature::prepare() {
StatisticsCounter c; StatisticsCounter c;
TRI_MethodRequestsStatistics.emplace_back(c); TRI_MethodRequestsStatistics.emplace_back(c);
} }
TRI_ConnectionTimeDistributionVectorStatistics << (0.1) << (1.0) << (60.0);
TRI_BytesSentDistributionVectorStatistics << (250) << (1000) << (2 * 1000)
<< (5 * 1000) << (10 * 1000);
TRI_BytesReceivedDistributionVectorStatistics << (250) << (1000) << (2 * 1000)
<< (5 * 1000) << (10 * 1000);
TRI_RequestTimeDistributionVectorStatistics << (0.01) << (0.05) << (0.1)
<< (0.2) << (0.5) << (1.0);
TRI_ConnectionTimeDistributionStatistics = new StatisticsDistribution(
TRI_ConnectionTimeDistributionVectorStatistics);
TRI_TotalTimeDistributionStatistics =
new StatisticsDistribution(TRI_RequestTimeDistributionVectorStatistics);
TRI_RequestTimeDistributionStatistics =
new StatisticsDistribution(TRI_RequestTimeDistributionVectorStatistics);
TRI_QueueTimeDistributionStatistics =
new StatisticsDistribution(TRI_RequestTimeDistributionVectorStatistics);
TRI_IoTimeDistributionStatistics =
new StatisticsDistribution(TRI_RequestTimeDistributionVectorStatistics);
TRI_BytesSentDistributionStatistics =
new StatisticsDistribution(TRI_BytesSentDistributionVectorStatistics);
TRI_BytesReceivedDistributionStatistics =
new StatisticsDistribution(TRI_BytesReceivedDistributionVectorStatistics);
STATISTICS = this; STATISTICS = this;
ServerStatistics::initialize(); ServerStatistics::initialize();
@ -179,7 +164,7 @@ void StatisticsFeature::prepare() {
} }
void StatisticsFeature::start() { void StatisticsFeature::start() {
if (!_statistics) { if (!isEnabled()) {
return; return;
} }
@ -232,27 +217,6 @@ void StatisticsFeature::unprepare() {
_statisticsThread.reset(); _statisticsThread.reset();
_statisticsWorker.reset(); _statisticsWorker.reset();
delete TRI_ConnectionTimeDistributionStatistics;
TRI_ConnectionTimeDistributionStatistics = nullptr;
delete TRI_TotalTimeDistributionStatistics;
TRI_TotalTimeDistributionStatistics = nullptr;
delete TRI_RequestTimeDistributionStatistics;
TRI_RequestTimeDistributionStatistics = nullptr;
delete TRI_QueueTimeDistributionStatistics;
TRI_QueueTimeDistributionStatistics = nullptr;
delete TRI_IoTimeDistributionStatistics;
TRI_IoTimeDistributionStatistics = nullptr;
delete TRI_BytesSentDistributionStatistics;
TRI_BytesSentDistributionStatistics = nullptr;
delete TRI_BytesReceivedDistributionStatistics;
TRI_BytesReceivedDistributionStatistics = nullptr;
STATISTICS = nullptr; STATISTICS = nullptr;
} }

View File

@ -29,21 +29,25 @@
namespace arangodb { namespace arangodb {
namespace basics { namespace basics {
extern std::vector<double> const TRI_BytesReceivedDistributionVectorStatistics;
extern std::vector<double> const TRI_BytesSentDistributionVectorStatistics;
extern std::vector<double> const TRI_ConnectionTimeDistributionVectorStatistics;
extern std::vector<double> const TRI_RequestTimeDistributionVectorStatistics;
extern StatisticsCounter TRI_AsyncRequestsStatistics; extern StatisticsCounter TRI_AsyncRequestsStatistics;
extern StatisticsCounter TRI_HttpConnectionsStatistics; extern StatisticsCounter TRI_HttpConnectionsStatistics;
extern StatisticsCounter TRI_TotalRequestsStatistics; extern StatisticsCounter TRI_TotalRequestsStatistics;
extern StatisticsDistribution* TRI_BytesReceivedDistributionStatistics;
extern StatisticsDistribution* TRI_BytesSentDistributionStatistics;
extern StatisticsDistribution* TRI_ConnectionTimeDistributionStatistics;
extern StatisticsDistribution* TRI_IoTimeDistributionStatistics;
extern StatisticsDistribution* TRI_QueueTimeDistributionStatistics;
extern StatisticsDistribution* TRI_RequestTimeDistributionStatistics;
extern StatisticsDistribution* TRI_TotalTimeDistributionStatistics;
extern StatisticsVector TRI_BytesReceivedDistributionVectorStatistics;
extern StatisticsVector TRI_BytesSentDistributionVectorStatistics;
extern StatisticsVector TRI_ConnectionTimeDistributionVectorStatistics;
extern StatisticsVector TRI_RequestTimeDistributionVectorStatistics;
extern std::vector<StatisticsCounter> TRI_MethodRequestsStatistics; extern std::vector<StatisticsCounter> TRI_MethodRequestsStatistics;
extern StatisticsDistribution TRI_BytesReceivedDistributionStatistics;
extern StatisticsDistribution TRI_BytesSentDistributionStatistics;
extern StatisticsDistribution TRI_ConnectionTimeDistributionStatistics;
extern StatisticsDistribution TRI_IoTimeDistributionStatistics;
extern StatisticsDistribution TRI_QueueTimeDistributionStatistics;
extern StatisticsDistribution TRI_RequestTimeDistributionStatistics;
extern StatisticsDistribution TRI_TotalTimeDistributionStatistics;
} }
namespace stats{ namespace stats{
class Descriptions; class Descriptions;
@ -69,6 +73,7 @@ class StatisticsFeature final
public: public:
void collectOptions(std::shared_ptr<options::ProgramOptions>) override final; void collectOptions(std::shared_ptr<options::ProgramOptions>) override final;
void validateOptions(std::shared_ptr<options::ProgramOptions>) override final;
void prepare() override final; void prepare() override final;
void start() override final; void start() override final;
void unprepare() override final; void unprepare() override final;
@ -80,9 +85,6 @@ class StatisticsFeature final
return nullptr; return nullptr;
} }
public:
void disableStatistics() { _statistics = false; }
private: private:
bool _statistics; bool _statistics;

View File

@ -73,7 +73,7 @@ StatisticsWorker::StatisticsWorker(TRI_vocbase_t& vocbase)
_vocbase(vocbase) { _vocbase(vocbase) {
_bytesSentDistribution.openArray(); _bytesSentDistribution.openArray();
for (auto const& val : TRI_BytesSentDistributionVectorStatistics._value) { for (auto const& val : TRI_BytesSentDistributionVectorStatistics) {
_bytesSentDistribution.add(VPackValue(val)); _bytesSentDistribution.add(VPackValue(val));
} }
@ -81,7 +81,7 @@ StatisticsWorker::StatisticsWorker(TRI_vocbase_t& vocbase)
_bytesReceivedDistribution.openArray(); _bytesReceivedDistribution.openArray();
for (auto const& val : TRI_BytesReceivedDistributionVectorStatistics._value) { for (auto const& val : TRI_BytesReceivedDistributionVectorStatistics) {
_bytesReceivedDistribution.add(VPackValue(val)); _bytesReceivedDistribution.add(VPackValue(val));
} }
@ -89,7 +89,7 @@ StatisticsWorker::StatisticsWorker(TRI_vocbase_t& vocbase)
_requestTimeDistribution.openArray(); _requestTimeDistribution.openArray();
for (auto const& val : TRI_RequestTimeDistributionVectorStatistics._value) { for (auto const& val : TRI_RequestTimeDistributionVectorStatistics) {
_requestTimeDistribution.add(VPackValue(val)); _requestTimeDistribution.add(VPackValue(val));
} }

View File

@ -29,21 +29,6 @@
namespace arangodb { namespace arangodb {
namespace basics { namespace basics {
////////////////////////////////////////////////////////////////////////////////
/// @brief vector generator
////////////////////////////////////////////////////////////////////////////////
struct StatisticsVector {
StatisticsVector() : _value() {}
StatisticsVector& operator<<(double v) {
_value.push_back(v);
return *this;
}
std::vector<double> _value;
};
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief a simple counter /// @brief a simple counter
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -65,8 +50,8 @@ struct StatisticsCounter {
struct StatisticsDistribution { struct StatisticsDistribution {
StatisticsDistribution() : _count(0), _total(0.0), _cuts(), _counts() {} StatisticsDistribution() : _count(0), _total(0.0), _cuts(), _counts() {}
StatisticsDistribution(StatisticsVector const& dist) explicit StatisticsDistribution(std::vector<double> const& dist)
: _count(0), _total(0.0), _cuts(dist._value), _counts() { : _count(0), _total(0.0), _cuts(dist), _counts() {
_counts.resize(_cuts.size() + 1); _counts.resize(_cuts.size() + 1);
} }

View File

@ -47,13 +47,13 @@ using namespace arangodb::basics;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
static v8::Handle<v8::Array> DistributionList(v8::Isolate* isolate, static v8::Handle<v8::Array> DistributionList(v8::Isolate* isolate,
StatisticsVector const& dist) { std::vector<double> const& dist) {
v8::EscapableHandleScope scope(isolate); v8::EscapableHandleScope scope(isolate);
v8::Handle<v8::Array> result = v8::Array::New(isolate); v8::Handle<v8::Array> result = v8::Array::New(isolate);
for (uint32_t i = 0; i < (uint32_t)dist._value.size(); ++i) { for (uint32_t i = 0; i < (uint32_t)dist.size(); ++i) {
result->Set(i, v8::Number::New(isolate, dist._value[i])); result->Set(i, v8::Number::New(isolate, dist[i]));
} }
return scope.Escape<v8::Array>(result); return scope.Escape<v8::Array>(result);

View File

@ -41,6 +41,7 @@
"ERROR_ARANGO_ICU_ERROR" : { "code" : 33, "message" : "icu error: %s" }, "ERROR_ARANGO_ICU_ERROR" : { "code" : 33, "message" : "icu error: %s" },
"ERROR_CANNOT_READ_FILE" : { "code" : 34, "message" : "cannot read file" }, "ERROR_CANNOT_READ_FILE" : { "code" : 34, "message" : "cannot read file" },
"ERROR_INCOMPATIBLE_VERSION" : { "code" : 35, "message" : "incompatible server version" }, "ERROR_INCOMPATIBLE_VERSION" : { "code" : 35, "message" : "incompatible server version" },
"ERROR_DISABLED" : { "code" : 36, "message" : "disabled" },
"ERROR_HTTP_BAD_PARAMETER" : { "code" : 400, "message" : "bad parameter" }, "ERROR_HTTP_BAD_PARAMETER" : { "code" : 400, "message" : "bad parameter" },
"ERROR_HTTP_UNAUTHORIZED" : { "code" : 401, "message" : "unauthorized" }, "ERROR_HTTP_UNAUTHORIZED" : { "code" : 401, "message" : "unauthorized" },
"ERROR_HTTP_FORBIDDEN" : { "code" : 403, "message" : "forbidden" }, "ERROR_HTTP_FORBIDDEN" : { "code" : 403, "message" : "forbidden" },

View File

@ -19,7 +19,7 @@ ERROR_CORRUPTED_CSV,13,"csv is corrupt","Will be raised when encountering a corr
ERROR_FILE_NOT_FOUND,14,"file not found","Will be raised when a file is not found." ERROR_FILE_NOT_FOUND,14,"file not found","Will be raised when a file is not found."
ERROR_CANNOT_WRITE_FILE,15,"cannot write file","Will be raised when a file cannot be written." ERROR_CANNOT_WRITE_FILE,15,"cannot write file","Will be raised when a file cannot be written."
ERROR_CANNOT_OVERWRITE_FILE,16,"cannot overwrite file","Will be raised when an attempt is made to overwrite an existing file." ERROR_CANNOT_OVERWRITE_FILE,16,"cannot overwrite file","Will be raised when an attempt is made to overwrite an existing file."
ERROR_TYPE_ERROR,17,"type error","Will be raised when a type error is unencountered." ERROR_TYPE_ERROR,17,"type error","Will be raised when a type error is encountered."
ERROR_LOCK_TIMEOUT,18,"lock timeout","Will be raised when there's a timeout waiting for a lock." ERROR_LOCK_TIMEOUT,18,"lock timeout","Will be raised when there's a timeout waiting for a lock."
ERROR_CANNOT_CREATE_DIRECTORY,19,"cannot create directory","Will be raised when an attempt to create a directory fails." ERROR_CANNOT_CREATE_DIRECTORY,19,"cannot create directory","Will be raised when an attempt to create a directory fails."
ERROR_CANNOT_CREATE_TEMP_FILE,20,"cannot create temporary file","Will be raised when an attempt to create a temporary file fails." ERROR_CANNOT_CREATE_TEMP_FILE,20,"cannot create temporary file","Will be raised when an attempt to create a temporary file fails."
@ -35,6 +35,7 @@ ERROR_RESOURCE_LIMIT,32,"resource limit exceeded","Will be raised when the resou
ERROR_ARANGO_ICU_ERROR,33,"icu error: %s","will be raised if icu operations failed" ERROR_ARANGO_ICU_ERROR,33,"icu error: %s","will be raised if icu operations failed"
ERROR_CANNOT_READ_FILE,34,"cannot read file","Will be raised when a file cannot be read." ERROR_CANNOT_READ_FILE,34,"cannot read file","Will be raised when a file cannot be read."
ERROR_INCOMPATIBLE_VERSION,35,"incompatible server version","Will be raised when a server is running an incompatible version of ArangoDB." ERROR_INCOMPATIBLE_VERSION,35,"incompatible server version","Will be raised when a server is running an incompatible version of ArangoDB."
ERROR_DISABLED,36,"disabled","Will be raised when a requested resource is not enabled."
################################################################################ ################################################################################
## HTTP error status codes ## HTTP error status codes

View File

@ -40,6 +40,7 @@ void TRI_InitializeErrorMessages() {
REG_ERROR(ERROR_ARANGO_ICU_ERROR, "icu error: %s"); REG_ERROR(ERROR_ARANGO_ICU_ERROR, "icu error: %s");
REG_ERROR(ERROR_CANNOT_READ_FILE, "cannot read file"); REG_ERROR(ERROR_CANNOT_READ_FILE, "cannot read file");
REG_ERROR(ERROR_INCOMPATIBLE_VERSION, "incompatible server version"); REG_ERROR(ERROR_INCOMPATIBLE_VERSION, "incompatible server version");
REG_ERROR(ERROR_DISABLED, "disabled");
REG_ERROR(ERROR_HTTP_BAD_PARAMETER, "bad parameter"); REG_ERROR(ERROR_HTTP_BAD_PARAMETER, "bad parameter");
REG_ERROR(ERROR_HTTP_UNAUTHORIZED, "unauthorized"); REG_ERROR(ERROR_HTTP_UNAUTHORIZED, "unauthorized");
REG_ERROR(ERROR_HTTP_FORBIDDEN, "forbidden"); REG_ERROR(ERROR_HTTP_FORBIDDEN, "forbidden");

View File

@ -92,7 +92,7 @@ constexpr int TRI_ERROR_CANNOT_OVERWRITE_FILE
/// 17: ERROR_TYPE_ERROR /// 17: ERROR_TYPE_ERROR
/// "type error" /// "type error"
/// Will be raised when a type error is unencountered. /// Will be raised when a type error is encountered.
constexpr int TRI_ERROR_TYPE_ERROR = 17; constexpr int TRI_ERROR_TYPE_ERROR = 17;
/// 18: ERROR_LOCK_TIMEOUT /// 18: ERROR_LOCK_TIMEOUT
@ -173,6 +173,11 @@ constexpr int TRI_ERROR_CANNOT_READ_FILE
/// Will be raised when a server is running an incompatible version of ArangoDB. /// Will be raised when a server is running an incompatible version of ArangoDB.
constexpr int TRI_ERROR_INCOMPATIBLE_VERSION = 35; constexpr int TRI_ERROR_INCOMPATIBLE_VERSION = 35;
/// 36: ERROR_DISABLED
/// "disabled"
/// Will be raised when a requested resource is not enabled.
constexpr int TRI_ERROR_DISABLED = 36;
/// 400: ERROR_HTTP_BAD_PARAMETER /// 400: ERROR_HTTP_BAD_PARAMETER
/// "bad parameter" /// "bad parameter"
/// Will be raised when the HTTP request does not fulfill the requirements. /// Will be raised when the HTTP request does not fulfill the requirements.