健康检查

健康检查(health check)是一种标准化的检查指标。向审视节点添加一个 fuchsia.inspect.Health 子节点,会为该子节点提供已被包含的健康信息。该信息能够通过系统范围的健康检查工具进行汇总。

健康检查节点布局

下面的属性和指标被导出至任何健康检查节点中:

名称 类型 描述
start_timestamp_nanos int64 该健康节点初始化时的单调时钟系统时间戳(即:首先变为 STARTING UP
message String 如果 status==UNHEALTHY,那么它包含可选的故障细节消息。
status Enum STARTING_UP
该健康节点已初始化,但尚未标记为运行。
OK
向该健康节点报告的子系统报告状况良好。
UNHEALTHY:
向该健康节点报告的子系统报告状况不佳。

用户指南

下面的示例说明了使用 iquery 获取组件(component)健康状况信息的方法。

示例:

  1. $ iquery show `iquery list`
  2. a.cmx:
  3. root:
  4. fuchsia.inspect.Health:
  5. start_timestamp_nanos = ...
  6. status = OK
  7. connections:
  8. 0:
  9. fuchsia.inspect.Health:
  10. start_timestamp_nanos = ...
  11. status = STARTING_UP
  12. optional_database:
  13. fuchsia.inspect.Health:
  14. start_timestamp_nanos = ...
  15. status = UNHEALTHY
  16. message = "Cannot open local.file"
  17. b.cmx:
  18. root:
  19. fuchsia.inspect.Health:
  20. start_timestamp_nanos = ...
  21. status = OK
  22. c.cmx:
  23. root:
  24. fuchsia.inspect.Health:
  25. start_timestamp_nanos = ...
  26. status = UNHEALTHY
  27. message = "Failed to connect to fuchsia.example.RequiredService"
  1. $ iquery show 'a.cmx:root/fuchsia.inspect.Health:status' 'b.cmx:root/fuchsia.inspect.Healh:status' 'c.cmx:root/fuchsia.inspect.Health:status'
  2. a:
  3. root:
  4. fuchsia.inspectHealth:
  5. status = Ok
  6. b:
  7. root:
  8. fuchsia.inspectHealth:
  9. status = Ok
  10. c:
  11. root:
  12. fuchsia.inspectHealth:
  13. status = Ok

在组件中使用健康检查

下面的部分用不同编程语言解释了如何使用 Fuchsia 组件中的库。

  • {C++}
  1. #include <lib/async-loop/cpp/loop.h>
  2. #include <lib/async-loop/default.h>
  3. #include <lib/sys/cpp/component_context.h>
  4. #include <lib/sys/inspect/cpp/component.h>
  5. int main(int argc, char** argv) {
  6. async::Loop loop(&kAsyncLoopConfigAttachToCurrentThread);
  7. auto context = sys::ComponentContext::CreateAndServeOutgoingDirectory();
  8. sys::ComponentInspector inspector(context.get());
  9. inspector.Health().StartingUp();
  10. // ...进行启动工作...
  11. inspector.Health().Ok();
  12. inspector.Health().Unhealthy("I'm not feeling well.");
  13. inspector.Health().Ok();
  14. loop.Run();
  15. return 0;
  16. }
  • {Rust}
  1. use fuchsia_inspect as inspect;
  2. use fuchsia_inspect::health;
  3. fn main() {
  4. // 如果您有您自己的检查器,那么也可以导出它的健康状态。
  5. /* 检查器需要初始化 */
  6. let inspector = /* ... */
  7. let mut node = inspector::root();
  8. let mut health = fuchsia_inspect::health::Node(node);
  9. // ...
  10. health.set_ok();
  11. health.set_unhealthy("I'm not feeling well.");
  12. health.set_ok(); // 组件恢复健康。
  13. }
  • {Dart}

    1. import 'package:fuchsia_inspect/inspect.dart' as inspect;
    2. void main(List<String> args) {
    3. final inspector = inspect.Inspect();
    4. inspector.health.setStartingUp();
    5. // ...Do startup work...
    6. inspector.health.setOk();
    7. inspector.health.setUnhealthy("I'm not feeling well.");
    8. inspector.health.setOk();
    9. }