This commit is contained in:
2026-08-15 17:44:35 +08:00
parent b4094ede44
commit d48f6608ad
18 changed files with 310 additions and 280 deletions
+11
View File
@@ -4,6 +4,7 @@
#include "Gallery_Observer_Adminive.h"
#include "Gallery_Renderables.h"
#include "Gallery_Session_Control_Adminive.h"
#include "common/Gallery_Scheduler_Adminive.h"
#include "adminive/adminive.hpp"
#include "adminive/adapters/nlohmann_json.hpp"
@@ -392,6 +393,10 @@ Json dashboard_contract() {
dashboard_field("呈现 P95 ms", "client_performance.display_interval_p95_ms", "fixed", 2),
dashboard_field("呈现 P99 ms", "client_performance.display_interval_p99_ms", "fixed", 2),
dashboard_field("响应负载 MB/s", "performance.pixel_payload_megabytes_per_second", "fixed", 1),
dashboard_field("TBB 并发度", "scheduler.concurrency"),
dashboard_field("活动 Worker", "scheduler.active_workers"),
dashboard_field("峰值 Worker", "scheduler.peak_workers"),
dashboard_field("活动外部线程", "scheduler.active_external_threads"),
described_dashboard_field<renderive::Plot_Frame_Status>(
"kernel_observer", "pending_frame_count"),
described_dashboard_field<renderive::Plot_Frame_Status>(
@@ -433,6 +438,12 @@ Json dashboard_contract() {
{"source", "client_performance"},
{"descriptor", adminive::to_descriptor_json<
Json, Gallery_Client_Performance>()}
},
{
{"title", "oneTBB 调度器"},
{"source", "scheduler"},
{"descriptor", adminive::to_descriptor_json<
Json, renderive::scheduling::Scheduler_Statistics>()}
}
})}
}}
@@ -0,0 +1,23 @@
#pragma once
#include "renderive/scheduling/Scheduler.hpp"
#include "adminive/adminive.hpp"
namespace adminive {
template <>
struct Type_Descriptor<renderive::scheduling::Scheduler_Statistics> {
static auto get() {
using T = renderive::scheduling::Scheduler_Statistics;
return object<T>("scheduler_statistics",
ADMINIVE_FIELD_LABEL(T, concurrency, "调度并发度"),
ADMINIVE_FIELD_LABEL(T, active_workers, "活动 Worker"),
ADMINIVE_FIELD_LABEL(T, peak_workers, "峰值 Worker"),
ADMINIVE_FIELD_LABEL(T, active_external_threads, "活动外部线程"),
ADMINIVE_FIELD_LABEL(T, peak_external_threads, "峰值外部线程"),
ADMINIVE_FIELD_LABEL(T, worker_entry_count, "Worker 进入次数"),
ADMINIVE_FIELD_LABEL(T, worker_exit_count, "Worker 退出次数"),
ADMINIVE_FIELD_LABEL(T, external_entry_count, "外部线程进入次数"),
ADMINIVE_FIELD_LABEL(T, external_exit_count, "外部线程退出次数"))
.label("oneTBB 调度器");
}
};
static_assert(Described_Type<renderive::scheduling::Scheduler_Statistics>);
}
@@ -3,6 +3,7 @@
#include "../Gallery_Enum.h"
#include "../Gallery_Observer_Adminive.h"
#include "../Gallery_Session_Control_Adminive.h"
#include "../common/Gallery_Scheduler_Adminive.h"
#include "../Pixel_Frame.h"
#include "../Web_Performance_Log.h"
#include "render_2D/export.h"
@@ -653,6 +654,8 @@ public:
{"kernel_observer", std::move(observer_data)},
{"consumer_feedback", std::move(consumer_feedback_data)},
{"client_performance", std::move(client_performance_data)},
{"scheduler", adminive::to_frontend_json<nlohmann::json>(
renderive::scheduling::scheduler_statistics())},
{"renderable_observers", controls_.observers(plot_.render_scene())},
{"performance_capture", gallery_performance_capture_json(plot_.render_scene())},
{"last_action_result", last_action_result_}
@@ -2,6 +2,7 @@
#include "../Gallery_Capture_Json.h"
#include "../Gallery_Enum.h"
#include "../common/Gallery_Scheduler_Adminive.h"
#include "../common/Pixel_Frame.h"
#include <render_3D/Point_Scene.h>
@@ -461,6 +462,8 @@ public:
{"presentation_fps", client_performance_.presentation_fps},
{"websocket_buffered_bytes",
client_performance_.websocket_buffered_bytes}}},
{"scheduler", adminive::to_frontend_json<nlohmann::json>(
renderive::scheduling::scheduler_statistics())},
{"session_id", session_id_},
{"performance_capture",
gallery_performance_capture_json(scene_.render_scene())},
@@ -240,6 +240,7 @@ TEST(RenderiveWebDatovizGallery, PublishesRealRgbaAndRendersAfterResize) {
const auto observed = response_json(session.handle(gallery_request(
Gallery_Request_Kind::Observe,
R"({"category":"event","type":"gallery_observe","client_metrics":{}})")));
EXPECT_TRUE(observed.at("telemetry").contains("scheduler"));
const auto& performance = observed.at("telemetry").at("performance");
EXPECT_GT(performance.at("measured_fps").get<double>(), 0.0);
EXPECT_GT(performance.at("pixel_response_fps").get<double>(), 0.0);
+2 -1
View File
@@ -243,7 +243,7 @@ TEST(RenderiveWebGallery, AdminiveCatalogCoversEveryControlCaseAndThreeModes) {
TEST(RenderiveWebGallery, CatalogOwnsDashboardFieldsAndDynamicBehavior) {
const nlohmann::json catalog = parse_json(Gallery_Protocol::catalog_json());
const auto& dashboard = catalog.at("dashboard");
EXPECT_EQ(dashboard.at("performance").at("fields").size(), 26U);
EXPECT_EQ(dashboard.at("performance").at("fields").size(), 30U);
EXPECT_EQ(dashboard.at("limits").at("fields").size(), 4U);
EXPECT_EQ(dashboard.at("observer").at("sections").size(), 4U);
std::set<std::string> client_sources;
@@ -972,6 +972,7 @@ TEST(RenderiveWebGallery, EveryIndependentCore2CanvasBuildsAndRenders) {
EXPECT_EQ(telemetry.at("frame_mode").at("id"), std::string(mode)) << case_id;
EXPECT_TRUE(telemetry.at("telemetry").contains("kernel_observer")) << case_id;
EXPECT_TRUE(telemetry.at("telemetry").contains("performance")) << case_id;
EXPECT_TRUE(telemetry.at("telemetry").contains("scheduler")) << case_id;
EXPECT_TRUE(telemetry.at("telemetry").contains("data_shape")) << case_id;
EXPECT_GT(telemetry.at("telemetry").at("data_shape").at("rendered_elements")
.get<std::size_t>(), 0U) << case_id;