LCOV - code coverage report
Current view: top level - source/server/admin - server_info_handler.cc (source / functions) Hit Total Coverage
Test: coverage.dat Lines: 1 64 1.6 %
Date: 2024-01-05 06:35:25 Functions: 1 7 14.3 %

          Line data    Source code
       1             : #include "source/server/admin/server_info_handler.h"
       2             : 
       3             : #include "envoy/admin/v3/memory.pb.h"
       4             : 
       5             : #include "source/common/http/headers.h"
       6             : #include "source/common/memory/stats.h"
       7             : #include "source/common/version/version.h"
       8             : #include "source/server/utils.h"
       9             : 
      10             : namespace Envoy {
      11             : namespace Server {
      12             : 
      13         134 : ServerInfoHandler::ServerInfoHandler(Server::Instance& server) : HandlerContextBase(server) {}
      14             : 
      15             : Http::Code ServerInfoHandler::handlerCerts(Http::ResponseHeaderMap& response_headers,
      16           0 :                                            Buffer::Instance& response, AdminStream&) {
      17             :   // This set is used to track distinct certificates. We may have multiple listeners, upstreams, etc
      18             :   // using the same cert.
      19           0 :   response_headers.setReferenceContentType(Http::Headers::get().ContentTypeValues.Json);
      20           0 :   envoy::admin::v3::Certificates certificates;
      21           0 :   server_.sslContextManager().iterateContexts([&](const Ssl::Context& context) -> void {
      22           0 :     envoy::admin::v3::Certificate& certificate = *certificates.add_certificates();
      23           0 :     if (context.getCaCertInformation() != nullptr) {
      24           0 :       envoy::admin::v3::CertificateDetails* ca_certificate = certificate.add_ca_cert();
      25           0 :       *ca_certificate = *context.getCaCertInformation();
      26           0 :     }
      27           0 :     for (const auto& cert_details : context.getCertChainInformation()) {
      28           0 :       envoy::admin::v3::CertificateDetails* cert_chain = certificate.add_cert_chain();
      29           0 :       *cert_chain = *cert_details;
      30           0 :     }
      31           0 :   });
      32           0 :   response.add(MessageUtil::getJsonStringFromMessageOrError(certificates, true, true));
      33           0 :   return Http::Code::OK;
      34           0 : }
      35             : 
      36             : Http::Code ServerInfoHandler::handlerHotRestartVersion(Http::ResponseHeaderMap&,
      37           0 :                                                        Buffer::Instance& response, AdminStream&) {
      38           0 :   response.add(server_.hotRestart().version());
      39           0 :   return Http::Code::OK;
      40           0 : }
      41             : 
      42             : // TODO(ambuc): Add more tcmalloc stats, export proto details based on allocator.
      43             : Http::Code ServerInfoHandler::handlerMemory(Http::ResponseHeaderMap& response_headers,
      44           0 :                                             Buffer::Instance& response, AdminStream&) {
      45           0 :   response_headers.setReferenceContentType(Http::Headers::get().ContentTypeValues.Json);
      46           0 :   envoy::admin::v3::Memory memory;
      47           0 :   memory.set_allocated(Memory::Stats::totalCurrentlyAllocated());
      48           0 :   memory.set_heap_size(Memory::Stats::totalCurrentlyReserved());
      49           0 :   memory.set_total_thread_cache(Memory::Stats::totalThreadCacheBytes());
      50           0 :   memory.set_pageheap_unmapped(Memory::Stats::totalPageHeapUnmapped());
      51           0 :   memory.set_pageheap_free(Memory::Stats::totalPageHeapFree());
      52           0 :   memory.set_total_physical_bytes(Memory::Stats::totalPhysicalBytes());
      53           0 :   response.add(MessageUtil::getJsonStringFromMessageOrError(memory, true, true)); // pretty-print
      54           0 :   return Http::Code::OK;
      55           0 : }
      56             : 
      57             : Http::Code ServerInfoHandler::handlerReady(Http::ResponseHeaderMap&, Buffer::Instance& response,
      58           0 :                                            AdminStream&) {
      59           0 :   const envoy::admin::v3::ServerInfo::State state =
      60           0 :       Utility::serverState(server_.initManager().state(), server_.healthCheckFailed());
      61             : 
      62           0 :   response.add(envoy::admin::v3::ServerInfo::State_Name(state) + "\n");
      63           0 :   Http::Code code =
      64           0 :       state == envoy::admin::v3::ServerInfo::LIVE ? Http::Code::OK : Http::Code::ServiceUnavailable;
      65           0 :   return code;
      66           0 : }
      67             : 
      68             : Http::Code ServerInfoHandler::handlerServerInfo(Http::ResponseHeaderMap& headers,
      69           0 :                                                 Buffer::Instance& response, AdminStream&) {
      70           0 :   const std::time_t current_time =
      71           0 :       std::chrono::system_clock::to_time_t(server_.timeSource().systemTime());
      72           0 :   const std::time_t uptime_current_epoch = current_time - server_.startTimeCurrentEpoch();
      73           0 :   const std::time_t uptime_all_epochs = current_time - server_.startTimeFirstEpoch();
      74             : 
      75           0 :   ASSERT(uptime_current_epoch >= 0);
      76           0 :   ASSERT(uptime_all_epochs >= 0);
      77             : 
      78           0 :   envoy::admin::v3::ServerInfo server_info;
      79           0 :   server_info.set_version(VersionInfo::version());
      80           0 :   server_info.set_hot_restart_version(server_.hotRestart().version());
      81           0 :   server_info.set_state(
      82           0 :       Utility::serverState(server_.initManager().state(), server_.healthCheckFailed()));
      83             : 
      84           0 :   server_info.mutable_uptime_current_epoch()->set_seconds(uptime_current_epoch);
      85           0 :   server_info.mutable_uptime_all_epochs()->set_seconds(uptime_all_epochs);
      86           0 :   envoy::admin::v3::CommandLineOptions* command_line_options =
      87           0 :       server_info.mutable_command_line_options();
      88           0 :   *command_line_options = *server_.options().toCommandLineOptions();
      89           0 :   server_info.mutable_node()->MergeFrom(server_.localInfo().node());
      90           0 :   response.add(MessageUtil::getJsonStringFromMessageOrError(server_info, true, true));
      91           0 :   headers.setReferenceContentType(Http::Headers::get().ContentTypeValues.Json);
      92           0 :   return Http::Code::OK;
      93           0 : }
      94             : 
      95             : } // namespace Server
      96             : } // namespace Envoy

Generated by: LCOV version 1.15