1
#pragma once
2

            
3
#include <regex>
4
#include <string>
5

            
6
#include "envoy/buffer/buffer.h"
7
#include "envoy/http/codes.h"
8
#include "envoy/http/header_map.h"
9
#include "envoy/server/admin.h"
10
#include "envoy/server/instance.h"
11

            
12
#include "source/server/admin/handler_ctx.h"
13
#include "source/server/admin/stats_request.h"
14
#include "source/server/admin/utils.h"
15

            
16
#include "absl/strings/string_view.h"
17

            
18
namespace Envoy {
19
namespace Server {
20

            
21
class StatsHandler : public HandlerContextBase {
22

            
23
public:
24
  StatsHandler(Server::Instance& server);
25

            
26
  Http::Code handlerResetCounters(Http::ResponseHeaderMap& response_headers,
27
                                  Buffer::Instance& response, AdminStream&);
28
  Http::Code handlerStatsRecentLookups(Http::ResponseHeaderMap& response_headers,
29
                                       Buffer::Instance& response, AdminStream&);
30
  Http::Code handlerStatsRecentLookupsClear(Http::ResponseHeaderMap& response_headers,
31
                                            Buffer::Instance& response, AdminStream&);
32
  Http::Code handlerStatsRecentLookupsDisable(Http::ResponseHeaderMap& response_headers,
33
                                              Buffer::Instance& response, AdminStream&);
34
  Http::Code handlerStatsRecentLookupsEnable(Http::ResponseHeaderMap& response_headers,
35
                                             Buffer::Instance& response, AdminStream&);
36
  Http::Code handlerPrometheusStats(Http::ResponseHeaderMap& response_headers,
37
                                    Buffer::Instance& response, AdminStream&);
38

            
39
  /**
40
   * Parses and executes a prometheus stats request.
41
   *
42
   * @param path_and_query the URL path and query
43
   * @param response buffer into which to write response
44
   * @return http response code
45
   */
46
  Http::Code prometheusStats(const Http::RequestHeaderMap& request_headers,
47
                             Http::ResponseHeaderMap& response_headers, Buffer::Instance& response);
48

            
49
  /**
50
   * Checks the server_ to see if a flush is needed, and then renders the
51
   * prometheus stats request.
52
   *
53
   * @params params the already-parsed parameters.
54
   * @param response buffer into which to write response
55
   */
56
  Http::Code prometheusFlushAndRender(const StatsParams& params,
57
                                      const Http::RequestHeaderMap& request_headers,
58
                                      Http::ResponseHeaderMap& response_headers,
59
                                      Buffer::Instance& response);
60

            
61
  /**
62
   * Renders the stats as prometheus. This is broken out as a separately
63
   * callable API to facilitate the benchmark
64
   * (test/server/admin/stats_handler_speed_test.cc) which does not have a
65
   * server object.
66
   *
67
   * @params stats the stats store to read
68
   * @param custom_namespaces namespace mappings used for prometheus
69
   * @params params the already-parsed parameters.
70
   * @param response buffer into which to write response
71
   */
72
  static void
73
  prometheusRender(Stats::Store& stats, const Stats::CustomStatNamespaces& custom_namespaces,
74
                   const Upstream::ClusterManager& cluster_manager, const StatsParams& params,
75
                   const Http::RequestHeaderMap& request_headers,
76
                   Http::ResponseHeaderMap& response_headers, Buffer::Instance& response);
77

            
78
  Http::Code handlerContention(Http::ResponseHeaderMap& response_headers,
79
                               Buffer::Instance& response, AdminStream&);
80

            
81
  /**
82
   * When stats are rendered in HTML mode, we want users to be able to tweak
83
   * parameters after the stats page is rendered, such as tweaking the filter or
84
   * `usedonly`. We use the same stats UrlHandler both for the admin home page
85
   * and for rendering in /stats?format=html. We share the same UrlHandler in
86
   * both contexts by defining an API for it here.
87
   *
88
   * @param active_mode skips rendering a form-field for 'usedonly', which we
89
   *        force-enable for active mode. It makes no sense to include stats
90
   *        that have never been written in a top-most-frequently-updated list.
91
   * @return a URL handler for stats.
92
   */
93
  Admin::UrlHandler statsHandler(bool active_mode);
94

            
95
  static Admin::RequestPtr makeRequest(Stats::Store& stats, const StatsParams& params,
96
                                       const Upstream::ClusterManager& cm,
97
                                       StatsRequest::UrlHandlerFn url_handler_fn = nullptr);
98
  Admin::RequestPtr makeRequest(AdminStream&);
99
};
100

            
101
} // namespace Server
102
} // namespace Envoy