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