diff options
| author | Stefan Boberg <[email protected]> | 2021-11-18 19:25:31 +0100 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-11-18 19:25:31 +0100 |
| commit | f74d55e41daa9f95b45cf5f4cd195664f1502bf0 (patch) | |
| tree | 26f8e59741a7b72893aacc6ffd7ad7bd61341042 | |
| parent | explicitly delete some unnecessary class members to ensure proper usage (diff) | |
| parent | Merge branch 'main' of https://github.com/EpicGames/zen (diff) | |
| download | zen-f74d55e41daa9f95b45cf5f4cd195664f1502bf0.tar.xz zen-f74d55e41daa9f95b45cf5f4cd195664f1502bf0.zip | |
merged from main
| -rw-r--r-- | zenserver/compute/apply.cpp | 11 | ||||
| -rw-r--r-- | zenserver/diag/diagsvcs.cpp | 113 | ||||
| -rw-r--r-- | zenserver/diag/diagsvcs.h | 28 | ||||
| -rw-r--r-- | zenserver/zenserver.cpp | 20 | ||||
| -rw-r--r-- | zenserver/zenserver.vcxproj | 1 | ||||
| -rw-r--r-- | zenserver/zenserver.vcxproj.filters | 3 |
6 files changed, 150 insertions, 26 deletions
diff --git a/zenserver/compute/apply.cpp b/zenserver/compute/apply.cpp index 8ad14a1ed..1f18b054f 100644 --- a/zenserver/compute/apply.cpp +++ b/zenserver/compute/apply.cpp @@ -924,15 +924,16 @@ HttpFunctionService::ExecActionUpstreamResult(const IoHash& WorkerId, const IoHa GetUpstreamApplyResult& Completed = Status.Status.Result; if (!Completed.Success || Completed.Error.ErrorCode != 0) { - ZEN_ERROR("Action {}/{} failed:\n stdout: {} \n stderr: {} \n reason: {}", + ZEN_ERROR("Action {}/{} failed:\n stdout: {}\n stderr: {}\n reason: {}\n errorcode: {}", WorkerId.ToHexString(), ActionId.ToHexString(), Completed.StdOut, Completed.StdErr, - Completed.Error.Reason); - // throw std::runtime_error( - // "Action {}/{} failed: {}"_format(WorkerId.ToHexString(), ActionId.ToHexString(), Completed.Error.Reason).c_str()); - return HttpResponseCode::BadRequest; + Completed.Error.Reason, + Completed.Error.ErrorCode); + + throw std::runtime_error( + "Action {}/{} failed"_format(WorkerId.ToHexString(), ActionId.ToHexString()).c_str()); } ZEN_INFO("Action {}/{} completed with {} attachments ({} compressed, {} uncompressed)", diff --git a/zenserver/diag/diagsvcs.cpp b/zenserver/diag/diagsvcs.cpp new file mode 100644 index 000000000..edd9b782e --- /dev/null +++ b/zenserver/diag/diagsvcs.cpp @@ -0,0 +1,113 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "diagsvcs.h" + +#include <zencore/compactbinary.h> +#include <zencore/compactbinarybuilder.h> +#include <zencore/filesystem.h> +#include <zencore/logging.h> +#include <zencore/string.h> +#include <fstream> +#include <sstream> + +#include <json11.hpp> + +namespace zen { + +using namespace std::literals; + +bool +ReadFile(const std::string& Path, StringBuilderBase& Out) +{ + try + { + constexpr auto ReadSize = std::size_t{4096}; + auto FileStream = std::ifstream{Path}; + + std::string Buf(ReadSize, '\0'); + while (FileStream.read(&Buf[0], ReadSize)) + { + Out.Append(std::string_view(&Buf[0], FileStream.gcount())); + } + Out.Append(std::string_view(&Buf[0], FileStream.gcount())); + + return true; + } + catch (std::exception&) + { + Out.Reset(); + return false; + } +} + +HttpHealthService::HttpHealthService() +{ + m_Router.RegisterRoute( + "", + [this](HttpRouterRequest& RoutedReq) { + HttpServerRequest& HttpReq = RoutedReq.ServerRequest(); + HttpReq.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, u8"OK!"sv); + }, + HttpVerb::kGet); + + m_Router.RegisterRoute( + "info", + [this](HttpRouterRequest& RoutedReq) { + HttpServerRequest& HttpReq = RoutedReq.ServerRequest(); + + CbObjectWriter Writer; + Writer << "DataRoot"sv << m_HealthInfo.DataRoot.string(); + Writer << "AbsLogPath"sv << m_HealthInfo.AbsLogPath.string(); + Writer << "BuildVersion"sv << m_HealthInfo.BuildVersion; + Writer << "HttpServerClass"sv << m_HealthInfo.HttpServerClass; + + ExtendableStringBuilder<256> Sb; + HttpReq.WriteResponse(HttpResponseCode::OK, HttpContentType::kJSON, Writer.Save().ToJson(Sb).ToView()); + }, + HttpVerb::kGet); + + m_Router.RegisterRoute( + "log", + [this](HttpRouterRequest& RoutedReq) { + HttpServerRequest& HttpReq = RoutedReq.ServerRequest(); + + zen::Log().flush(); + + std::filesystem::path Path = + m_HealthInfo.AbsLogPath.empty() ? m_HealthInfo.DataRoot / "logs/zenserver.log" : m_HealthInfo.AbsLogPath; + + ExtendableStringBuilder<4096> Sb; + if (ReadFile(Path.string(), Sb) && Sb.Size() > 0) + { + HttpReq.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, Sb.ToView()); + } + else + { + HttpReq.WriteResponse(HttpResponseCode::NotFound); + } + }, + HttpVerb::kGet); +} + +void +HttpHealthService::SetHealthInfo(HealthServiceInfo&& Info) +{ + m_HealthInfo = std::move(Info); +} + +const char* +HttpHealthService::BaseUri() const +{ + return "/health/"; +} + +void +HttpHealthService::HandleRequest(HttpServerRequest& Request) +{ + if (!m_Router.HandleRequest(Request)) + { + Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, u8"OK!"sv); + } +} + +} // namespace zen diff --git a/zenserver/diag/diagsvcs.h b/zenserver/diag/diagsvcs.h index 61703e393..bd03f8023 100644 --- a/zenserver/diag/diagsvcs.h +++ b/zenserver/diag/diagsvcs.h @@ -5,6 +5,8 @@ #include <zencore/iobuffer.h> #include <zenhttp/httpserver.h> +#include <filesystem> + ////////////////////////////////////////////////////////////////////////// namespace zen { @@ -82,26 +84,28 @@ private: IoBuffer m_1k{m_1m, 0u, 1024}; }; +struct HealthServiceInfo +{ + std::filesystem::path DataRoot; + std::filesystem::path AbsLogPath; + std::string HttpServerClass; + std::string BuildVersion; +}; + class HttpHealthService : public HttpService { public: - HttpHealthService() = default; + HttpHealthService(); ~HttpHealthService() = default; - virtual const char* BaseUri() const override { return "/health/"; } + void SetHealthInfo(HealthServiceInfo&& Info); - virtual void HandleRequest(HttpServerRequest& Request) override - { - using namespace std::literals; - - switch (Request.RequestVerb()) - { - case HttpVerb::kGet: - return Request.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, u8"OK!"sv); - } - } + virtual const char* BaseUri() const override; + virtual void HandleRequest(HttpServerRequest& Request) override final; private: + HttpRequestRouter m_Router; + HealthServiceInfo m_HealthInfo; }; } // namespace zen diff --git a/zenserver/zenserver.cpp b/zenserver/zenserver.cpp index bb57b4d0a..567f1d40b 100644 --- a/zenserver/zenserver.cpp +++ b/zenserver/zenserver.cpp @@ -151,16 +151,13 @@ namespace utils { class ZenServer : public IHttpStatusProvider { public: - void Initialize(ZenServiceConfig& ServiceConfig, - std::string_view HttpServerClass, - int BasePort, - int ParentPid, - ZenServerState::ZenServerEntry* ServerEntry) + void Initialize(ZenServiceConfig& ServiceConfig, const ZenServerOptions& ServerOptions, ZenServerState::ZenServerEntry* ServerEntry) { using namespace fmt::literals; m_ServerEntry = ServerEntry; m_DebugOptionForcedCrash = ServiceConfig.ShouldCrash; + const int ParentPid = ServerOptions.OwnerPid; if (ParentPid) { @@ -184,7 +181,7 @@ public: // Initialize/check mutex based on base port - std::string MutexName = "zen_{}"_format(BasePort); + std::string MutexName = "zen_{}"_format(ServerOptions.BasePort); if (zen::NamedMutex::Exists(MutexName) || ((m_ServerMutex.Create(MutexName) == false))) { @@ -193,10 +190,15 @@ public: InitializeState(ServiceConfig); + m_HealthService.SetHealthInfo({.DataRoot = m_DataRoot, + .AbsLogPath = ServerOptions.AbsLogFile, + .HttpServerClass = std::string(ServerOptions.HttpServerClass), + .BuildVersion = std::string(BUILD_VERSION)}); + // Ok so now we're configured, let's kick things off - m_Http = zen::CreateHttpServer(HttpServerClass); - m_Http->Initialize(BasePort); + m_Http = zen::CreateHttpServer(ServerOptions.HttpServerClass); + m_Http->Initialize(ServerOptions.BasePort); m_Http->RegisterService(m_HealthService); m_Http->RegisterService(m_StatsService); m_Http->RegisterService(m_StatusService); @@ -878,7 +880,7 @@ ZenWindowsService::Run() Server.SetContentRoot(GlobalOptions.ContentDir); Server.SetTestMode(GlobalOptions.IsTest); Server.SetDedicatedMode(GlobalOptions.IsDedicated); - Server.Initialize(ServiceConfig, GlobalOptions.HttpServerClass, GlobalOptions.BasePort, GlobalOptions.OwnerPid, Entry); + Server.Initialize(ServiceConfig, GlobalOptions, Entry); // Monitor shutdown signals diff --git a/zenserver/zenserver.vcxproj b/zenserver/zenserver.vcxproj index 38b51e2f0..d1719000b 100644 --- a/zenserver/zenserver.vcxproj +++ b/zenserver/zenserver.vcxproj @@ -138,6 +138,7 @@ <ClCompile Include="cache\structuredcachestore.cpp" /> <ClCompile Include="compute\apply.cpp" /> <ClCompile Include="config.cpp" /> + <ClCompile Include="diag\diagsvcs.cpp" /> <ClCompile Include="diag\logging.cpp" /> <ClCompile Include="experimental\frontend.cpp" /> <ClCompile Include="experimental\vfs.cpp" /> diff --git a/zenserver/zenserver.vcxproj.filters b/zenserver/zenserver.vcxproj.filters index 97a43c901..9b248a38b 100644 --- a/zenserver/zenserver.vcxproj.filters +++ b/zenserver/zenserver.vcxproj.filters @@ -83,6 +83,9 @@ <ClCompile Include="upstream\upstreamapply.cpp"> <Filter>upstream</Filter> </ClCompile> + <ClCompile Include="diag\diagsvcs.cpp"> + <Filter>diag</Filter> + </ClCompile> <ClCompile Include="cache\cachetracking.cpp" /> </ItemGroup> <ItemGroup> |