summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/buildtool/serve_api/progress_reporting/TARGETS29
-rw-r--r--src/buildtool/serve_api/progress_reporting/progress.hpp41
-rw-r--r--src/buildtool/serve_api/progress_reporting/progress_reporter.cpp50
-rw-r--r--src/buildtool/serve_api/progress_reporting/progress_reporter.hpp25
-rw-r--r--src/buildtool/serve_api/progress_reporting/statistics.hpp55
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