8000 Replacing statistics handler with c++ (#4653) · ashang/arangodb@11a7bbf · GitHub
[go: up one dir, main page]

8000
Skip to content

Commit 11a7bbf

Browse files
graetzerjsteemann
authored andcommitted
Replacing statistics handler with c++ (arangodb#4653)
1 parent d841b56 commit 11a7bbf

File tree

15 files changed

+731
-523
lines changed

15 files changed

+731
-523
lines changed

CHANGELOG

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ devel
33

44
* fix issue #4583 - add AQL ASSERT and AQL WARN
55

6+
* remove _admin/echo handler
7+
68
* remove long disfunctional admin/long_echo handler
79

810
* fixed Foxx API:

Documentation/Books/HTTP/MiscellaneousFunctions/README.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@ This is an overview of ArangoDB's HTTP interface for miscellaneous functions.
2424
<!-- js/actions/api-system.js -->
2525
@startDocuBlock JSF_get_admin_time
2626

27-
<!-- js/actions/api-system.js -->
28-
@startDocuBlock JSF_get_admin_echo
29-
3027
@startDocuBlock JSF_get_admin_database_version
3128

3229
<!-- 97AE lib/Admin/RestShutdownHandler.cpp -->

Documentation/DocuBlocks/Rest/Administration/JSF_get_admin_echo.md

Lines changed: 0 additions & 22 deletions
This file was deleted.

UnitTests/HttpInterface/api-admin-spec.rb

Lines changed: 0 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -53,65 +53,6 @@
5353

5454
end
5555

56-
################################################################################
57-
## /_admin/echo
58-
################################################################################
59-
60-
context "checks /_admin/echo" do
61-
62-
prefix = "api-system"
63-
64-
it "using GET" do
65-
cmd = "/_admin/echo"
66-
doc = ArangoDB.log_get("#{prefix}-echo", cmd)
67-
68-
doc.code.should eq(200)
69-
doc.parsed_response['url'].should eq("/_admin/echo")
70-
doc.parsed_response['path'].should eq("/")
71-
doc.parsed_response['parameters'].should eq({})
72-
doc.parsed_response['requestType'].should eq("GET")
73-
end
74-
75-
it "using GET, with query parameter" do
76-
cmd = "/_admin/echo?a=1"
77-
doc = ArangoDB.log_get("#{prefix}-echo", cmd)
78-
79-
doc.code.should eq(200)
80-
doc.parsed_response['url'].should eq("/_admin/echo?a=1")
81-
doc.parsed_response['path'].should eq("/")
82-
doc.parsed_response['parameters'].should eq({ "a" => "1" })
83-
doc.parsed_response['requestType'].should eq("GET")
84-
end
85-
86-
it "using POST, with query parameters" do
87-
cmd = "/_admin/echo?a=1&b=2&foo[]=bar&foo[]=baz"
88-
body = "{\"foo\": \"bar\", \"baz\": { \"bump\": true, \"moo\": [ ] } }"
89-
doc = ArangoDB.log_post("#{prefix}-echo", cmd, :body => body)
90-
91-
doc.code.should eq(200)
92-
doc.parsed_response['url'].should eq("/_admin/echo?a=1&b=2&foo[]=bar&foo[]=baz")
93-
doc.parsed_response['path'].should eq("/")
94-
doc.parsed_response['parameters'].should eq( { "a"=>"1", "b"=>"2", "foo"=>["bar", "baz"] } )
95-
doc.parsed_response['requestType'].should eq("POST")
96-
doc.parsed_response['requestBody'].should eq("{\"foo\": \"bar\", \"baz\": { \"bump\": true, \"moo\": [ ] } }")
97-
end
98-
99-
it "using PUT, with headers" do
100-
cmd = "/_admin/echo?"
101-
body = "{ }"
102-
headers = { "X-Foo" => "Bar", "x-meow" => "mOO" }
103-
doc = ArangoDB.log_put("#{prefix}-echo", cmd, :body => body, :headers => headers)
104-
105-
doc.code.should eq(200)
106-
doc.parsed_response['url'].should eq("/_admin/echo?")
107-
doc.parsed_response['path'].should eq("/")
108-
doc.parsed_response['parameters'].should eq({ })
109-
doc.parsed_response['requestType'].should eq("PUT")
110-
doc.parsed_response['requestBody'].should eq("{ }")
111-
end
112-
113-
end
114-
11556
################################################################################
11657
## check whether admin interface is accessible
11758
################################################################################

arangod/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ SET(ARANGOD_SOURCES
363363
RestHandler/RestAdminLogHandler.cpp
364364
RestHandler/RestAdminRoutingHandler.cpp
365365
RestHandler/RestAdminServerHandler.cpp
366+
RestHandler/RestAdminStatisticsHandler.cpp
366367
RestHandler/RestAqlFunctionsHandler.cpp
367368
RestHandler/RestAqlUserFunctionsHandler.cpp
368369
RestHandler/RestAuthHandler.cpp
@@ -374,7 +375,6 @@ SET(ARANGOD_SOURCES
374375
RestHandler/RestDebugHandler.cpp
375376
RestHandler/RestDemoHandler.cpp
376377
RestHandler/RestDocumentHandler.cpp
377-
RestHandler/RestEchoHandler.cpp
378378
RestHandler/RestEdgesHandler.cpp
379379
RestHandler/RestEndpointHandler.cpp
380380
RestHandler/RestEngineHandler.cpp
@@ -436,6 +436,7 @@ SET(ARANGOD_SOURCES
436436
Scheduler/SocketTcp.cpp
437437
Scheduler/Task.cpp
438438
Statistics/ConnectionStatistics.cpp
439+
Statistics/Descriptions.cpp
439440
Statistics/RequestStatistics.cpp
440441
Statistics/ServerStatistics.cpp
441442
Statistics/StatisticsFeature.cpp

arangod/GeneralServer/GeneralServerFeature.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#include "RestHandler/RestAdminLogHandler.h"
4646
#include "RestHandler/RestAdminRoutingHandler.h"
4747
#include "RestHandler/RestAdminServerHandler.h"
48+
#include "RestHandler/RestAdminStatisticsHandler.h"
4849
#include "RestHandler/RestAqlFunctionsHandler.h"
4950
#include "RestHandler/RestAqlUserFunctionsHandler.h"
5051
#include "RestHandler/RestAuthHandler.h"
@@ -55,7 +56,6 @@
5556
#include "RestHandler/RestDebugHandler.h"
5657
#include "RestHandler/RestDemoHandler.h"
5758
#include "RestHandler/RestDocumentHandler.h"
58-
#include "RestHandler/RestEchoHandler.h"
5959
#include "RestHandler/RestEdgesHandler.h"
6060
#include "RestHandler/RestEndpointHandler.h"
6161
#include "RestHandler/RestEngineHandler.h"
@@ -526,9 +526,6 @@ void GeneralServerFeature::defineHandlers() {
526526
"/_admin/work-monitor",
527527
RestHandlerCreator<WorkMonitorHandler>::createNoData);
528528

529-
_handlerFactory->addHandler(
530-
"/_admin/json-echo", RestHandlerCreator<RestEchoHandler>::createNoData);
531-
532529
#ifdef ARANGODB_ENABLE_FAILURE_TESTS
533530
// This handler is to activate SYS_DEBUG_FAILAT on DB servers
534531
_handlerFactory->addPrefixHandler(
@@ -548,6 +545,14 @@ void GeneralServerFeature::defineHandlers() {
548545
_handlerFactory->addPrefixHandler(
549546
"/_admin/server",
550547
RestHandlerCreator<arangodb::RestAdminServerHandler>::createNoData);
548+
549+
_handlerFactory->addHandler(
550+
"/_admin/statistics",
551+
RestHandlerCreator<arangodb::RestAdminStatisticsHandler>::createNoData);
552+
553+
_handlerFactory->addHandler(
554+
"/_admin/statistics-description",
555+
RestHandlerCreator<arangodb::RestAdminStatisticsHandler>::createNoData);
551556

552557
// ...........................................................................
553558
// actions defined in v8
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
////////////////////////////////////////////////////////////////////////////////
2+
/// DISCLAIMER
3+
///
4+
/// Copyright 2018 ArangoDB GmbH, Cologne, Germany
5+
///
6+
/// Licensed under the Apache License, Version 2.0 (the "License");
7+
/// you may not use this file except in compliance with the License.
8+
/// You may obtain a copy of the License at
9+
///
10+
/// http://www.apache.org/licenses/LICENSE-2.0
11+
///
12+
/// Unless required by applicable law or agreed to in writing, software
13+
/// distributed under the License is distributed on an "AS IS" BASIS,
14+
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
/// See the License for the specific language governing permissions and
16+
/// limitations under the License.
17+
///
18+
/// Copyright holder is ArangoDB GmbH, Cologne, Germany
19+
///
20+
/// @author Simon Grätzer
21+
////////////////////////////////////////////////////////////////////////////////
22+
23+
#include "RestAdminStatisticsHandler.h"
24+
#include "Statistics/Descriptions.h"
25+
#include "Statistics/StatisticsFeature.h"
26+
27+
using namespace arangodb;
28+
using namespace arangodb::basics;
29+
using namespace arangodb::rest;
30+
31+
RestAdminStatisticsHandler::RestAdminStatisticsHandler(GeneralRequest* request,
32+
GeneralResponse* response)
33+
: RestBaseHandler(request, response) {}
34+
35+
RestStatus RestAdminStatisticsHandler::execute() {
36+
if (_request->requestType() != rest::RequestType::GET) {
37+
generateError(rest::ResponseCode::METHOD_NOT_ALLOWED,
38+
TRI_ERROR_HTTP_METHOD_NOT_ALLOWED);
39+
return RestStatus::DONE;
40+
}
41+
42+
if (_request->requestPath() == "/_admin/statistics") {
43+
getStatistics();
44+
} else if (_request->requestPath() == "/_admin/statistics-description") {
45+
getStatisticsDescription();
46+
} else {
47+
generateError(rest::ResponseCode::NOT_FOUND, TRI_ERROR_HTTP_NOT_FOUND);
48+
}
49+
50+
// this handler is done
51+
return RestStatus::DONE;
52+
}
53+
54+
void RestAdminStatisticsHandler::getStatistics() {
55+
stats::Descriptions const* desc = StatisticsFeature::descriptions();
56+
if (!desc) {
57+
generateError(rest::ResponseCode::SERVICE_UNAVAILABLE,
58+
TRI_ERROR_SHUTTING_DOWN);
59+
return;
60+
}
61+
62+
VPackBuffer<uint8_t> buffer;
63+
VPackBuilder tmp(buffer);
64+
tmp.add(VPackValue(VPackValueType::Object, true));
65+
66+
tmp.add("time", VPackValue(TRI_microtime()));
67+
tmp.add("enabled", VPackValue(StatisticsFeature::enabled()));
68+
69+
tmp.add("system", VPackValue(VPackValueType::Object, true));
70+
desc->processStatistics(tmp);
71+
tmp.close(); // system
72+
73+
tmp.add("client", VPackValue(VPackValueType::Object, true));
74+
desc->clientStatistics(tmp);
75+
tmp.close(); // client
76+
77+
tmp.add("http", VPackValue(VPackValueType::Object, true));
78+
desc->httpStatistics(tmp);
79+
tmp.close(); // http
80+
81+
tmp.add("server", VPackValue(VPackValueType::Object, true));
82+
desc->serverStatistics(tmp);
83+
tmp.close(); // server
84+
85+
tmp.add(StaticStrings::Error, VPackValue(false));
86+
tmp.add(StaticStrings::Code, VPackValue(static_cast<int>(ResponseCode::OK)));
87+
tmp.close(); // outer
88+
generateResult(ResponseCode::OK, std::move(buffer));
89+
}
90+
91+
void RestAdminStatisticsHandler::getStatisticsDescription() {
92+
stats::Descriptions const* desc = StatisticsFeature::descriptions();
93+
if (!desc) {
94+
generateError(rest::ResponseCode::SERVICE_UNAVAILABLE,
95+
TRI_ERROR_SHUTTING_DOWN);
96+
return;
97+
}
98+
99+
VPackBuffer<uint8_t> buffer;
100+
VPackBuilder tmp(buffer);
101+
tmp.add(VPackValue(VPackValueType::Object));
102+
103+
tmp.add("groups", VPackValue(VPackValueType::Array, true));
104+
for (stats::Group const& group : desc->groups()) {
105+
tmp.openObject();
106+
group.toVPack(tmp);
107+
tmp.close();
108+
}
109+
tmp.close(); // groups
110+
111+
tmp.add("figures", VPackValue(VPackValueType::Array, true));
112+
for (stats::Figure const& figure : desc->figures()) {
113+
tmp.openObject();
114+
figure.toVPack(tmp);
115+
tmp.close();
116+
}
117+
tmp.close(); // figures
118+
119+
tmp.add(StaticStrings::Error, VPackValue(false));
120+
tmp.add(StaticStrings::Code, VPackValue(static_cast<int>(ResponseCode::OK)));
121+
tmp.close(); // outer
122+
generateResult(ResponseCode::OK, std::move(buffer));
123+
}

arangod/RestHandler/RestEchoHandler.h renamed to arangod/RestHandler/RestAdminStatisticsHandler.h

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
////////////////////////////////////////////////////////////////////////////////
22
/// DISCLAIMER
33
///
4-
/// Copyright 2014-2016 ArangoDB GmbH, Cologne, Germany
5-
/// Copyright 2004-2014 triAGENS GmbH, Cologne, Germany
4+
/// Copyright 2018 ArangoDB GmbH, Cologne, Germany
65
///
76
/// Licensed under the Apache License, Version 2.0 (the "License");
87
/// you may not use this file except in compliance with the License.
@@ -18,23 +17,28 @@
1817
///
1918
/// Copyright holder is ArangoDB GmbH, Cologne, Germany
2019
///
21-
/// @author Achim Brandt
20+
/// @author Simon Grätzer
2221
////////////////////////////////////////////////////////////////////////////////
2322

24-
#ifndef ARANGOD_REST_HANDLER_REST_ECHO_HANDLER_H
25-
#define ARANGOD_REST_HANDLER_REST_ECHO_HANDLER_H 1
23+
#ifndef ARANGOD_REST_HANDLER_REST_ADMIN_STATISTICS_HANDLER_H
24+
#define ARANGOD_REST_HANDLER_REST_ADMIN_STATISTICS_HANDLER_H 1
2625

27-
#include "RestHandler/RestVocbaseBaseHandler.h"
26+
#include "Basics/Common.h"
27+
#include "RestHandler/RestBaseHandler.h"
2828

2929
namespace arangodb {
30-
class RestEchoHandler : public arangodb::RestVocbaseBaseHandler {
30+
class RestAdminStatisticsHandler : public RestBaseHandler {
3131
public:
32-
RestEchoHandler(GeneralRequest*, GeneralResponse*);
32+
RestAdminStatisticsHandler(GeneralRequest*, GeneralResponse*);
3333

3434
public:
35-
char const* name() const override final { return "RestEchoHandler"; }
36-
bool isDirect() const override { return true; }
37-
RestStatus execute() override;
35+
char const* name() const override final { return "RestAdminStatisticsHandler"; }
36+
bool isDirect() const override final { return false; }
37+
RestStatus execute() override final;
38+
39+
private:
40+
void getStatistics();
41+
void getStatisticsDescription();
3842
};
3943
}
4044

arangod/RestHandler/RestBaseHandler.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ void RestBaseHandler::generateOk(rest::ResponseCode code,
107107
try {
108108
VPackBuffer<uint8_t> buffer;
109109
VPackBuilder tmp(buffer);
110-
tmp.add(VPackValue(VPackValueType::Object));
110+
tmp.add(VPackValue(VPackValueType::Object, true));
111111
tmp.add(StaticStrings::Error, VPackValue(false));
112112
tmp.add(StaticStrings::Code, VPackValue(static_cast<int>(code)));
113113
tmp.add("result", payload);
@@ -127,7 +127,7 @@ void RestBaseHandler::generateOk(rest::ResponseCode code,
127127

128128
try {
129129
VPackBuilder tmp;
130-
tmp.add(VPackValue(VPackValueType::Object));
130+
tmp.add(VPackValue(VPackValueType::Object, true));
131131
tmp.add(StaticStrings::Error, VPackValue(false));
132132
tmp.add(StaticStrings::Code, VPackValue(static_cast<int>(code)));
133133
tmp.close();

0 commit comments

Comments
 (0)
0