口径母本已存在:全链路 slog 分段计时日志已定义了完整的时延分段语义,且压测工具 tools/sandbox-benchmark/collector.go:266-295 已在解析这些字段——controller handler_ms/resolve_ms/scheduler_rpc_ms/total_ms(internal/flux-sandbox-controller/controller/controller.go:411-416)、scheduler allocate_ms/agent_rpc_ms/attempts(internal/flux-sandbox-scheduler/sandbox_controller.go:425-429)、agent total_ms/pull_ms/create_ms/start_ms(internal/agent/runtime/containerd.go:358-369,代码注释明确"slog text format so sandbox-benchmark can parse")与 run_pod_ms/ip_status_ms(internal/agent/runtime/e2b.go:344-347)。
指标名称:flux_scheduler_allocate_duration_seconds(聚合:histogram_quantile(0.99, rate(…[5m])))、flux_scheduler_op_total(聚合:rate(…[1m]))、flux_sandbox_ledger_rows(聚合:sum by (state))、flux_sandbox_ledger_state_transitions_total{result="error"}(聚合:rate(…[5m]))
oFEP-0006:FluxSandbox 可观测性指标体系设计
发布签核清单
概述
本提案为 FluxSandbox 建立从零到一的 Prometheus 指标体系:以意图账本状态机为黄金信号、以现有 slog 分段计时日志为口径母本、以 oFEP-0001 的性能硬目标(单沙箱调度时延 <50ms、并发创建吞吐 >3000 实例/s、单节点密度 >1000)为 SLO 锚点,定义约 120 个指标(含标签体系、埋点位置、暴露端点、告警语义与实施分期),并使本指标的 SLI/SLO 可直接回填 oFEP-0001~0005 全部空白的「监控要求」章节。
动机
背景
/metrics端点、无 prometheus 业务代码引用(client_golang v1.23.2仅为间接依赖)、charts 无抓取端口/注解/ServiceMonitor、gRPC 无拦截器(internal/merged/grpc.go:38-47)、HTTP 仅有一个只记非 2xx 的日志中间件(internal/flux-sandbox-scheduler/server.go:194-215)。tools/sandbox-benchmark/collector.go:266-295已在解析这些字段——controllerhandler_ms/resolve_ms/scheduler_rpc_ms/total_ms(internal/flux-sandbox-controller/controller/controller.go:411-416)、schedulerallocate_ms/agent_rpc_ms/attempts(internal/flux-sandbox-scheduler/sandbox_controller.go:425-429)、agenttotal_ms/pull_ms/create_ms/start_ms(internal/agent/runtime/containerd.go:358-369,代码注释明确"slog text format so sandbox-benchmark can parse")与run_pod_ms/ip_status_ms(internal/agent/runtime/e2b.go:344-347)。internal/merged/sandbox_provider.go:195-197注释),日志聚合不宜作为常驻观测手段。test/性能验证-v0.1.md):30000 并发下 QPS 630-1075、p99 26.5-46.9s——时延直方图桶设计需同时覆盖 1ms(目标下限)与 60s(实测 p99 上限)。目标
bound/host_lost/restoring/paused/terminating/orphaned)的状态分布、每次 CAS 迁移、冲突与停留时间全量可见非目标
提案
用户故事
Story 1:SRE 排查创建 503 根因
现状:503 只能翻各副本日志定位(ssg_not_synced?no_available_agent?capacity_exceeded?)。本提案后:
flux_scheduler_create_rejected_total{reason=...}一条 PromQL 给出根因分布;flux_viewlayer_reserve_total{result}区分"Lua 仲裁拒绝"与"本地预留失败"。Story 2:容量运营与扩容决策
现状:节点容量/水位只能靠心跳日志与 Redis 人工查询。本提案后:
flux_registry_capacity{kind=capacity|allocated|idle}、flux_sandbox_ledger_rows{state}(含 paused 驻留时长)构成容量看板,SADD/SREM 对账动作(flux_capacity_reconcile_actions_total)暴露视图漂移。Story 3:性能回归看门
现状:性能验证依赖压测工具离线解析日志。本提案后:CI 压测直接对比
flux_controller_create_phase_seconds/flux_scheduler_allocate_duration_seconds/fluxsandbox_agent_create_total_seconds的分位数与基线,分段回归一眼定位(调度退化 vs agent 退化 vs 镜像拉取退化)。Story 4:SLO 治理与 oFEP 回填
本提案的 SLI/SLO 定义按 oFEP 监控要求模板作答,直接回填 0001(调度引擎)、0002(E2B 运行时)、0005(增量快照)的空白章节,完成监控治理闭环。
风险与缓解措施
instance/Pod 标签;leader 任务指标用flux_leaderrun_leading==1过滤;容量类 gauge 取max by (ssg)而非求和/metrics暴露面安全ListRows全表扫描规模风险被指标放大flux_grpc_provider_list_rows_projected观测规模上限设计细节
整体架构
%%{init: {'flowchart': {'nodeSpacing': 60, 'rankSpacing': 70}}}%% flowchart TB classDef ext stroke-dasharray: 5 5 OS["OpenSandbox Server(仓库外 · 无指标)"] OS -->|"gRPC 客户端,拨号 :9091"| GRPC subgraph CP["合并控制面 flux-sandbox-scheduler-evolution(多副本,监听三个端口)"] GRPC["SandboxProvider gRPC(监听 :9091)"] FP["FastPath HTTP(监听 :9090)"] --> MW["HTTP 中间件(升级 loggingMiddleware)"] GRPC --> IC["gRPC UnaryInterceptor(新增)"] HB["agent 心跳 intake(监听 :9092)"] --> HH["HeartbeatHandler 埋点"] MW --> OPS["Op 层 ×5(HTTP 与 inline 双路汇合)"] IC --> OPS OPS --> SC["SandboxController(fork-join 双腿)"] SC --> CAS["casRowPhase 中心埋点(账本 CAS)"] CAS --> DB[("MySQL 意图账本")] SC --> REG["registry 调度"] REG --> VL["viewlayer 接口(Lua 容量仲裁)"] VL --> RD[("Redis 视图层")] SSG["SSG 编排 / leaderrun 周期任务 ×5"] --> K8S["K8s API"] SC --> PR["Registry · 控制面"] CAS --> PR REG --> PR VL --> PR SSG --> PR HH --> PR end subgraph AG["数据面 flux-sandbox-agent"] MGR["runtime manager"] --> RT["containerd / E2B runtime"] MGR --> RPT["reporter 心跳(5s 版本化向量)"] RT -. Phase-4 规划(新采集) .-> ST["Task.Stats / 事件订阅"] MGR --> PA["Registry · agent"] RT --> PA RPT --> PA end SW["sandbox-watcher(DaemonSet · 节点级孤儿清理)"] --> PW["Registry · watcher"] PR --> P[("Prometheus(Pull 抓取 · 运维侧)")] PA --> P PW --> P class OS ext class P ext读图与走线说明
外部边界(两端):本指标体系的边界是「三个仓库内进程」构成的闭环,图中的虚线框节点均在边界之外——
flux_grpc_provider_duration_seconds{method="CreateSandbox"})测的是 FluxSandbox 对它承诺的服务时延,不含 Server 自身与用户网络段。端口归属:三个端口由同一个进程(合并控制面)监听——
一次 create 请求的指标触发走线(对照上图从上到下):
flux_grpc_provider_requests_total/_duration_seconds{method=CreateSandbox}(UnaryInterceptor 一处覆盖 10 个 RPC)flux_controller_create_phase_seconds{phase=handler/resolve/rpc/total}flux_scheduler_op_total/_op_duration_seconds{op=create}——埋这一层即可同时覆盖 FastPath HTTP 与 gRPC inline 两种入口flux_scheduler_allocate_duration_seconds{mode=local/viewed}、flux_scheduler_allocate_attemptsflux_viewlayer_reserve_total{result=accepted/rejected}(多活唯一裁决点)flux_scheduler_agent_rpc_duration_seconds{op=create}flux_sandbox_ledger_state_transitions_total{from=∅,to=bound,reason=…}fluxsandbox_agent_create_total_seconds(containerd:pull/create/start 分段;E2B:run_pod/ip_status 分段)flux_scheduler_create_rejected_total{reason=…}(503 根因分布)三个收敛埋点:全部埋点只写三处——①入口层(HTTP 中间件 + gRPC 拦截器,两处代码覆盖三个端口的所有请求);②账本中心(
casRowPhase一个函数覆盖约 19 个 CAS 迁移调用点);③依赖接口层(intentstore.Store/viewlayer.ViewLayer两个 Go interface 包装覆盖全部 MySQL/Redis 访问)。后台任务线(无外部请求的自驱循环):SSG 编排(attach/restore/scale/status 四阶段)与 leaderrun 的 5 个周期任务(10s/30s 节奏)没有请求进来,其指标形态是阶段耗时直方图 +
flux_leaderrun_task_last_success_timestamp停摆检测(时间戳不更新 = 任务卡死)。注意:账本六态行分布 gauge(flux_sandbox_ledger_rows{state})挂在view-sweep任务里周期导出,不在抓取路径上实时扫表——这是图上看不出来但关键的设计。三个 Registry 与 Pull/Push 分工:三个 Registry 不是三个服务,而是三个进程各自内存中的指标集合——按二进制边界隔离(watcher 单独重启不影响控制面;agent 侧数千序列不污染控制面基数)。Prometheus(仓库外监控基础设施,见「依赖项」)以 Pull 定时抓取三个端点(进程挂掉序列自然变 stale,无僵尸数据);心跳通道(agent → :9092)是 Push 语义、承载调度器要实时消费的容量/向量数据——观测数据走 Pull 端点、调度数据走心跳,两条通道语义不混用。
设计原则小结:
casRowPhase一处覆盖全部 CAS 迁移)、依赖接口层(intentstore.Store/viewlayer.ViewLayer两个接口包装覆盖全部 DB 访问)指标命名与标签规范
<组件前缀>_<对象>_<动词复数/单位>snake_case,组件前缀即二进制/子系统边界:flux_scheduler_*(合并控制面)、fluxsandbox_*(agent)、fluxwatcher_*、flux_intentstore_*/flux_tm_*(依赖层)。Counter 一律_total后缀,时延一律_secondsstate(账本六态)、op(create/delete/pause/resume/snapshot/status…)、reason(拒绝/迁移根因枚举)、result(ok/error/conflict/not_found/rejected…)、runtime_type(containerd/e2b)、stage(链路分段,继承日志字段名)、mode(local/viewed)、strategy(round_robin/random)、rpc(9 方法白名单)、method(gRPC 10 方法)、gate、task(leader 任务名)unknown/unmatchederror(故障)与conflict(CAS 乐观锁竞争)分列——前者反映故障,后者反映多活并发强度;not_found(幂等正常路径)与error分列;水位型 gauge 与速率型 counter 在告警语义上分列(见告警建议)[0.001, 0.002, 0.005, 0.010, 0.025, 0.050, 0.100, 0.250, 0.500, 1, 2.5, 5, 10, 30, 60]秒——下端覆盖 <50ms SLO 精度,上端覆盖实测 p99 46.9s;DB 快路径如需亚毫秒精度,逐指标用Matcher::Full精确覆盖(参考 AgentENV 的全局桶+白名单覆盖模式)埋点架构设计
internal/flux-sandbox-scheduler/server.go:194-215(statusRecorder 已有,补 counter+histogram)internal/merged/grpc.go:38-47挂载;rpc 白名单对齐 proto 方法集CreateSandboxOp等 5 个 Op(server.go:353-644)casRowPhase(internal/flux-sandbox-scheduler/intent_ledger.go:85-101)+PutIntent/MarkOrphaned/Delete直调点intentstore.Store(store.go:113-162)、viewlayer.ViewLayer(viewlayer.go:128-183)、templatemanager/client.go包装层view-sweep(30s,internal/merged/leader_tasks.go)manager.go/containerd.go/e2b.go各 timing 日志处与分支点rest_client_*、workqueue_*、leader_election_*指标体系定义
按观测对象分八层定义。就绪度标注:
A=数据现成只需导出、B=分支已存在只需计数/直方图、C=需全新采集逻辑。第 1 层:入口 SLI(对齐 SLO 的直接指标)
flux_scheduler_http_requests_totalunmatched)flux_scheduler_http_request_duration_secondsflux_scheduler_op_total/_op_duration_secondsCreateSandboxOp现有total_ms日志直改)server.go:353-644flux_scheduler_create_rejected_totalserver.go:359,363,405-408flux_scheduler_delete_misroute_totalserver.go:464-477flux_scheduler_operation_timeout_expired_totalcontext.WithTimeoutflux_controller_create_phase_secondshandler_ms/resolve_ms/scheduler_rpc_ms/total_ms直改)controller.go:411-416flux_controller_create_route_retry_totalcontroller.go:345-384flux_controller_not_ready_rejected_totalErrControllerNotReady5 处flux_grpc_provider_requests_total/_duration_secondsflux_grpc_provider_list_rows_projectedsandbox_index.go:90-112flux_grpc_inflight_streamsflux_scheduler_heartbeat_requests_totalheartbeat.go:66-115flux_scheduler_heartbeat_apply_totalneed_images=1即镜像向量失配信号)viewlayer.go:397-400flux_scheduler_heartbeat_replay_rejected_totalviewlayer.go:336-340第 2 层:意图账本状态机(黄金信号)
flux_sandbox_ledger_rowsview-sweep)ListRows聚合flux_sandbox_ledger_row_state_dwell_secondsnow-last_seen;paused 行无刷新,停留=精确暂停时长flux_sandbox_ledger_row_age_secondsnow-created_atflux_sandbox_ledger_ttl_remaining_secondsexpires_at-now(TTL 预算 vs 实际生存)flux_sandbox_ledger_state_transitions_totalcasRowPhase中心 + 直调点(intent_ledger.go:87-97,185,206,222,245,256-313、sandbox_controller.go:391,412,812,860,952,1176、crossreplica.go:154,247,336、loop.go:987、leader_tasks.go:144,192)flux_sandbox_ledger_cas_conflicts_totalok=false竞争(与 error 分列,反映多活并发强度)ok==false分支flux_sandbox_ledger_recreate_attempt_totalintent_ledger.go:245,256-304,313)flux_sandbox_ledger_gc_deleted_totalintent_ledger.go:331,356等第 3 层:调度与容量
flux_scheduler_allocate_total/_allocate_duration_secondsallocate_ms直改)registry.go:469-496,564,820flux_scheduler_allocate_attemptsattempts字段)sandbox_controller.go:429flux_scheduler_allocate_candidatesregistry.go:773,782flux_scheduler_allocate_reserve_race_lost_totalregistry.go:798-800flux_scheduler_allocate_queue_wait_secondssandbox_controller.go:150-183flux_scheduler_try_reserve_rejected_totalregistry.go:324-338,537-551,730-767flux_scheduler_agent_rpc_duration_secondsagent_client.goflux_registry_capacityUpdateSummary聚合)registry.go:1283-1337flux_viewlayer_reserve_total/_release_totalviewlayer.go:490-516flux_viewlayer_live_agents/_agent_liveness/_liveness_degraded_totalviewlayer.go:450-460、registry.go:442-454flux_capacity_reconcile_actions_totalcapacity_reconcile.go:99-120flux_snapshotcache_lookups_totalviewlayer/snapshotcache/cache.go:134-255第 4 层:编排与选主
flux_ssg_reconcile_duration_secondsssg_controller.go:126-342)flux_ssg_restore_duration_seconds/_restore_reservationsrestoreSSG:395-499flux_ssg_scale_up_pods_total/_scale_down_pods_total/_scale_duration_secondsscaleUp:656-702、scaleDown:764-820flux_ssg_draining_agents/_syncedregistry.go:1217-1226flux_ssg_owner_reassigned_totalssg_controller.go:165-183flux_ssg_status_write_errors_total/_reconcile_errors_totalloop.go:255-258)flux_router_route_table_sizeroute_sync.go:89-148flux_leaderrun_leadingleaderrun.go:160-164flux_leaderrun_leadership_changes_totalleaderrun.go:140-150flux_leaderrun_task_runs_total/_task_skipped_ticks_total/_task_last_success_timestampleaderrun.go:200-223flux_scheduler_ready/_informer_synced/_startup_duration_secondsserver.go:221-242、main.go:234-446rest_client_*/workqueue_*/leader_election_*第 5 层:数据面(agent)
创建链路分段(口径照抄现有日志字段,
B就绪):fluxsandbox_agent_create_duration_seconds{runtime_type,outcome}server.go:234-241fluxsandbox_agent_manager_create_duration_secondsmanager.go:171-177fluxsandbox_agent_runtime_create_duration_seconds{runtime_type}manager.go:172-177fluxsandbox_agent_create_pull_seconds/_create_container_seconds/_create_task_start_seconds/_create_total_seconds{image}containerd.go:358-369fluxsandbox_agent_create_runpod_seconds/_create_ipwait_seconds{template_id}e2b.go:344-347其余操作与事件(
B就绪):fluxsandbox_agent_image_pull_total{image,result=cache_hit/pulled/error}containerd.go:387-397、e2b.go:555-566fluxsandbox_agent_create_retries_total{stage=snapshot_exists/task_exists/task_exists_backoff}containerd.go:219-238,285-339fluxsandbox_agent_create_rejections_total{reason}manager.go:98-159fluxsandbox_agent_sandboxes{runtime_type,phase}/_capacity/_delete_failuresmanager.go:147-159,344-348,403-415fluxsandbox_agent_delete_duration_seconds{path=sync/async,mode=hints/label_lookup}/_delete_total{result}/_delete_sigkill_total/_delete_retry_totalmanager.go:273-385、containerd.go:597-669fluxsandbox_agent_pause_duration_seconds/_resume_duration_seconds{source}/_snapshot_duration_seconds{op=checkpoint/pause}/_unsupported_op_total{op}runtime.go:32)e2b.go:587-682、containerd.go:839-851fluxsandbox_e2b_cri_calls_total{method,result}/_admin_calls_total{method,result}e2b.go调用点fluxsandbox_e2b_label_lookup_fallback_total{op}/_runpod_failures_totale2b.go:330-335,375-385fluxsandbox_heartbeat_send_total{result}/_packet_total{type=full/delta,anchor}/_repush_totalreporter.go:228-319第 6 层:依赖访问层(接口收敛,一处包装全覆盖)
flux_intentstore_queries_total{op,result}/_query_duration_seconds{op,driver}/_tx_stage_total{op,stage}/_rows_scanned{op}+ 连接池db.Stats()store.go:330-672);not_found单列;sqlite 池=1、mysql 默认池可观测flux_viewlayer_ops_total{op,result}/_op_duration_seconds{op}+PoolStats()viewlayer.go:305-616,含两条 Lua)flux_tm_requests_total{op,code}/_request_duration_seconds{op}client.go:107-322;disabled 分支单列)第 7 层:孤儿清理(sandbox-watcher)
fluxwatcher_scan_duration_seconds{path}scanner.go:31-50、controller.go:47fluxwatcher_orphans_detected_total{reason=AgentPodDisappeared/ManifestMissing/SandboxNotReady,runtime,shape}scanner.go:439-470fluxwatcher_cleanup_duration_seconds{runtime,result}/_cleanup_gate_abort_total{gate}cleanup.go:52-258fluxwatcher_queue_depth/_cleanup_requeues_total/_cleanup_dropped_total/_grace_tracking/_manifest_probe_total{result}controller.go:140-168、types.go:99-101第 8 层:资源用量(Phase-4,全新采集)
fluxsandbox_sandbox_cpu_seconds_total{sandbox,image}/fluxsandbox_sandbox_memory_working_set_bytes{sandbox,image}containerd.go:80):task.Stats(ctx)直采;或按 task PID(metadata 已存:379)反推 cgroup v2 读cpu.stat/memory.current(e2e 已验证路径可得,test/e2e/dataplane/sandbox_lifecycle_test.go:269-301);依赖containerd/cgroups/v3已在 go.mod。采集器设计:manager 侧周期任务遍历活跃沙箱向量(manager.go:403-411),并发度按密度自适应fluxsandbox_sandbox_spec_limits{cpu_quota,mem_bytes}WithCPUCFS/WithMemoryLimit现成,containerd.go:544-558;E2B 模板 vcpu/ramtemplatemanager/types.go:34-36)——用量/限额比即饱和度fluxsandbox_containerd_task_exit_total{exit_code}/fluxsandbox_containerd_oom_totalclient.Subscribe(events 服务)或 per-tasktask.Wait;OOM 亦可读 cgroupmemory.eventsfluxsandbox_containerd_task_status{state}containerd.go:732-750,771-803,随 5s 心跳带出,A就绪)SLO 定义
对齐 oFEP-0001 性能目标,测量点显式声明(边界以 0001 定义为准):
histogram_quantile(0.99, rate(flux_scheduler_allocate_duration_seconds_bucket[5m])),暴露组件 schedulerflux_controller_create_phase_seconds{phase="total"}与fluxsandbox_agent_create_total_seconds分别归因sum(rate(flux_scheduler_op_total{op="create",result="ok"}[1m])),暴露组件 schedulerflux_grpc_provider_requests_total{method="CreateSandbox"}对照sum(rate(flux_scheduler_http_requests_total{code="5xx"}[5m])) / sum(rate(flux_scheduler_http_requests_total[5m])),暴露组件 scheduler/gateway 双面client_closed(客户端断连)不计入 5xx(网关侧语义),调度器侧以 code 原值计flux_sandbox_ledger_rows{state="host_lost"}水位 +flux_sandbox_ledger_recreate_attempt_total{result="failed"}速率,暴露组件 schedulerflux_scheduler_heartbeat_apply_total{need_images="1"}/ 总量,暴露组件 scheduler资源用量采集设计(Phase-4 细化)
task.Stats()(单调用返回 CPU/内存/pids),失败降级 cgroup v2 直读paused行驻留时长指标互补表达Subscribe事件流落 counter;OOM 交叉验证 cgroupmemory.events,与创建规格声明值联动产出"限额饱和度"日志到指标的迁移设计
handler/resolve/rpc/total/allocate/agent_rpc/runtime/pull/create/start/run_pod/ip_status),压测工具sandbox-benchmark的 collector 字段映射表保持有效server.go:411-413等处);collector 增加 Prometheus 抓取模式,压测报告字段来源切换可配置测试计划
[ ] 我/我们理解,相关组件的所有者可能会要求更新已有的测试,以便在提交实现该增强功能所需的更改之前,使代码达到足够稳固的质量标准。
单元测试
unknown)、空序列抑制语义集成测试
/metrics抓取断言对应序列出现且 label 正确(含ledger_state_transitions_total的 from/to 链)flux_leaderrun_leadership_changes_total{event="lost"}与接管方acquired均可见orphans_detected_total{reason=...}与清理结果计数性能测试
/metricsP99 < 200ms)与序列数确认在预算内毕业标准
Alpha 阶段
/metrics端点就绪 + Go 内建指标 + 入口三面(HTTP/gRPC/心跳)request/duration + 账本六态 gauge 与迁移 Counter(第 1、2 层 + P0 基建)docs/design/Beta 阶段
GA 阶段
生产可用性审查
功能启用和回滚
[observability.metrics] enabled(默认 true,Alpha 起生效)+listen_addr(默认挂 :9090 mux,可独立端口);disable-supported: true——关闭即回滚,业务路径零残留(埋点为旁路注册)推出、升级和回滚规划
监控要求
操作员如何确定该功能是否正在被工作负载使用?
http://<scheduler>:9090/metrics(或独立listen_addr),确认flux_scheduler_http_requests_total序列存在flux_scheduler_ready == 1且flux_scheduler_informer_synced{informer="ssg_watcher"} == 1使用此功能的人如何知道它适用于他们的实例?
flux_scheduler_op_total{op=...}/flux_sandbox_ledger_rows{state=...}sum by (op)/sum by (state)allocated/idle聚合(现有loop.go:244-259merge-patch 链路)与本指标体系互为印证增强的合理 SLO(服务级别目标)是什么?
host_lost行在 AutoRecreate 开启时 10 分钟内收敛(或告警人工介入)/healthz请求返回 200运维人员可以使用哪些服务级别指标(SLIs)来判断服务的健康状况?
flux_scheduler_allocate_duration_seconds(聚合:histogram_quantile(0.99, rate(…[5m])))、flux_scheduler_op_total(聚合:rate(…[1m]))、flux_sandbox_ledger_rows(聚合:sum by (state))、flux_sandbox_ledger_state_transitions_total{result="error"}(聚合:rate(…[5m]))是否存在任何尚未覆盖的指标(metrics),可以用来进一步提升该功能的可观测性?
依赖项
此功能是否依赖于集群中运行的任何特定服务?
prometheus.io/*注解模式,对齐现有 ublk 类部署惯例)github.com/prometheus/client_golang(已在 go.mod 间接依赖,本提案转直接依赖;其余零新增)可扩展性
新的 API 调用 / 新 API 类型 / 云厂商 API / 对象大小数量
故障排除
/metrics返回 503enabled配置与启动日志listen_addr未配置export开关与组件就绪度(flux_scheduler_ready);Agent 侧确认 runtime_type 标签cas_conflicts_total突增flux_leaderrun_leadership_changes_total判断是否选主风暴heartbeat_apply_total{need_images="1"}高位fluxsandbox_heartbeat_packet_total{type="full"}频率与节点镜像水位flux_intentstore_rows_scanned是否账本规模异常;确认周期导出器(view-sweep)承担了聚合而非抓取时扫描实施历史
缺点
替代方案