diff options
Diffstat (limited to 'src')
5 files changed, 200 insertions, 0 deletions
diff --git a/src/buildtool/serve_api/progress_reporting/TARGETS b/src/buildtool/serve_api/progress_reporting/TARGETS new file mode 100644 index 00000000..c3a9abb4 --- /dev/null +++ b/src/buildtool/serve_api/progress_reporting/TARGETS @@ -0,0 +1,29 @@ +{ "statistics": + { "type": ["@", "rules", "CC", "library"] + , "name": ["statistics"] + , "hdrs": ["statistics.hpp"] + , "stage": ["src", "buildtool", "serve_api", "progress_reporting"] + } +, "progress": + { "type": ["@", "rules", "CC", "library"] + , "name": ["progress"] + , "hdrs": ["progress.hpp"] + , "stage": ["src", "buildtool", "serve_api", "progress_reporting"] + , "deps": [["src/buildtool/progress_reporting", "task_tracker"]] + } +, "progress_reporter": + { "type": ["@", "rules", "CC", "library"] + , "name": ["progress_reporter"] + , "hdrs": ["progress_reporter.hpp"] + , "srcs": ["progress_reporter.cpp"] + , "stage": ["src", "buildtool", "serve_api", "progress_reporting"] + , "deps": [["src/buildtool/progress_reporting", "base_progress_reporter"]] + , "private-deps": + [ "progress" + , "statistics" + , ["@", "fmt", "", "fmt"] + , ["@", "json", "", "json"] + , ["src/buildtool/logging", "logging"] + ] + } +} diff --git a/src/buildtool/serve_api/progress_reporting/progress.hpp b/src/buildtool/serve_api/progress_reporting/progress.hpp new file mode 100644 index 00000000..adf06e00 --- /dev/null +++ b/src/buildtool/serve_api/progress_reporting/progress.hpp @@ -0,0 +1,41 @@ +// Copyright 2023 Huawei Cloud Computing Technology Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef INCLUDED_SRC_BUILDTOOL_SERVE_API_PROGRESS_REPORTING_PROGRESS_HPP +#define INCLUDED_SRC_BUILDTOOL_SERVE_API_PROGRESS_REPORTING_PROGRESS_HPP + +#include <cstdlib> +#include <string> +#include <unordered_set> +#include <utility> +#include <vector> + +#include "src/buildtool/progress_reporting/task_tracker.hpp" + +class ServeServiceProgress { + public: + [[nodiscard]] static auto Instance() noexcept -> ServeServiceProgress& { + static ServeServiceProgress instance{}; + return instance; + } + + [[nodiscard]] auto TaskTracker() noexcept -> TaskTracker& { + return task_tracker_; + } + + private: + ::TaskTracker task_tracker_{}; +}; + +#endif // INCLUDED_SRC_BUILDTOOL_SERVE_API_PROGRESS_REPORTING_PROGRESS_HPP diff --git a/src/buildtool/serve_api/progress_reporting/progress_reporter.cpp b/src/buildtool/serve_api/progress_reporting/progress_reporter.cpp new file mode 100644 index 00000000..96f1a589 --- /dev/null +++ b/src/buildtool/serve_api/progress_reporting/progress_reporter.cpp @@ -0,0 +1,50 @@ +// Copyright 2023 Huawei Cloud Computing Technology Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "src/buildtool/serve_api/progress_reporting/progress_reporter.hpp" + +#include <string> + +#include "fmt/core.h" +#include "nlohmann/json.hpp" +#include "src/buildtool/logging/log_level.hpp" +#include "src/buildtool/logging/logger.hpp" +#include "src/buildtool/serve_api/progress_reporting/progress.hpp" +#include "src/buildtool/serve_api/progress_reporting/statistics.hpp" + +auto ServeServiceProgressReporter::Reporter() noexcept -> progress_reporter_t { + return BaseProgressReporter::Reporter([]() { + auto const& stats = ServeServiceStatistics::Instance(); + // get served counter before dispatched counter, to ensure we never + // undercount the amount of builds in flight + int served = stats.ServedCounter(); + int dispatched = stats.DispatchedCounter(); + int processing = dispatched - served; + int cached = stats.CacheHitsCounter(); + + auto active = ServeServiceProgress::Instance().TaskTracker().Active(); + auto sample = ServeServiceProgress::Instance().TaskTracker().Sample(); + + auto msg = fmt::format( + "{} cached, {} served, {} processing", cached, served, processing); + + if ((active > 0) && !sample.empty()) { + msg = fmt::format("{} ({}{})", + msg, + nlohmann::json(sample).dump(), + active > 1 ? ", ..." : ""); + } + Logger::Log(LogLevel::Progress, "{}", msg); + }); +} diff --git a/src/buildtool/serve_api/progress_reporting/progress_reporter.hpp b/src/buildtool/serve_api/progress_reporting/progress_reporter.hpp new file mode 100644 index 00000000..2162393d --- /dev/null +++ b/src/buildtool/serve_api/progress_reporting/progress_reporter.hpp @@ -0,0 +1,25 @@ +// Copyright 2023 Huawei Cloud Computing Technology Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef INCLUDED_SRC_BUILDTOOL_SERVE_API_PROGRESS_REPORTING_PROGRESS_REPORTER_HPP +#define INCLUDED_SRC_BUILDTOOL_SERVE_API_PROGRESS_REPORTING_PROGRESS_REPORTER_HPP + +#include "src/buildtool/progress_reporting/base_progress_reporter.hpp" + +class ServeServiceProgressReporter { + public: + [[nodiscard]] static auto Reporter() noexcept -> progress_reporter_t; +}; + +#endif // INCLUDED_SRC_BUILDTOOL_SERVE_API_PROGRESS_REPORTING_PROGRESS_REPORTER_HPP diff --git a/src/buildtool/serve_api/progress_reporting/statistics.hpp b/src/buildtool/serve_api/progress_reporting/statistics.hpp new file mode 100644 index 00000000..6c1aa352 --- /dev/null +++ b/src/buildtool/serve_api/progress_reporting/statistics.hpp @@ -0,0 +1,55 @@ +// Copyright 2023 Huawei Cloud Computing Technology Co., Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef INCLUDED_SRC_BUILDTOOL_SERVE_API_PROGRESS_REPORTING_STATISTICS_HPP +#define INCLUDED_SRC_BUILDTOOL_SERVE_API_PROGRESS_REPORTING_STATISTICS_HPP + +#include <atomic> + +class ServeServiceStatistics { + public: + [[nodiscard]] static auto Instance() noexcept -> ServeServiceStatistics& { + static ServeServiceStatistics instance{}; + return instance; + } + + void Reset() noexcept { + num_cache_hits_ = 0; + num_dispatched_ = 0; + num_served_ = 0; + } + void IncrementCacheHitsCounter() noexcept { ++num_cache_hits_; } + void IncrementDispatchedCounter() noexcept { ++num_dispatched_; } + void IncrementServedCounter() noexcept { ++num_served_; } + + [[nodiscard]] auto CacheHitsCounter() const noexcept -> int { + return num_cache_hits_; + } + [[nodiscard]] auto DispatchedCounter() const noexcept -> int { + return num_dispatched_; + } + [[nodiscard]] auto ServedCounter() const noexcept -> int { + return num_served_; + } + + private: + // locally cached export targets + std::atomic<int> num_cache_hits_{}; + // export targets for which we have queried just serve + std::atomic<int> num_dispatched_{}; + // export targets for which just serve responded + std::atomic<int> num_served_{}; +}; + +#endif // INCLUDED_SRC_BUILDTOOL_SERVE_API_PROGRESS_REPORTING_STATISTICS_HPP |