诊断架构

本文档介绍了 Archivistfuchsia.diagnostics/ArchiveAccessor#StreamDiagnostics 返回的响应的架构。

简介

规范诊断数据架构描述了所有诊断数据源(无论其通过流式传输访问还是通过快照访问)共享的结构。此规范架构为我们现在称为诊断数据的内容提供了一些要求;诊断数据必须:

  • 与对应于系统中的执行单元的特定名称相关联。
  • 带有时间戳。
  • 包含任意结构化数据载荷,包括分层数据。

您可以将诊断架构视为包含三个不同的部分:命名空间部分、元数据部分和载荷部分。

架构

顶级

顶级架构包含以下字段:

这将在 JSON 中如下所示:

{
    "data_source": "INSPECT",
    "moniker": "core/foo",
    "metadata": { ... },
    "payload": { ... },
    "version": 1,
}

命名空间

命名空间部分包含可应用于整个架构(涵盖所有数据类型)的信息;此信息用于描述生成此诊断数据的来源的命名空间。命名空间部分由两个字段组成:

  • 一个组件 moniker,用于描述架构中包含的诊断数据适用的组件。
  • data source,用于说明是哪项诊断服务生成了数据。

元数据

元数据部分由具有静态已知和记录架构的属性组成,这些属性的单个值无法在所有嵌套架构之间共享。每个数据源都会添加自己的元数据属性。元数据部分是统一架构中表示诊断中唯一和不可统一变体的位置。

检查

检查响应的元数据包含以下字段:

  • 错误:提取组件时出现的错误。检查数据(可选)。 此错误是只包含一个 message 字符串字段的对象。

  • 组件网址:启动组件的网址。

  • Timestamp:为检查数据截取快照时的单调时间。

  • 文件名:检查数据位于组件的 out/diagnostics 目录内的文件的名称(如果存在)。

这将在 JSON 中如下所示:

{
    ...,
    "metadata": {
        "errors": [
            {
                "message": "...",
            }
        ],
        "component_url": "fuchsia-pkg://...",
        "timestamp": 12345,
        "filename": "fuchsia.inpsect.Tree"
    },
}

日志

日志响应的元数据包含以下字段:

  • 错误:提取组件时出现的错误。检查数据(可选)。每个错误可能为以下状态之一:

    • 丢弃的日志数量:组件在写入时由于套接字写入错误而丢弃的日志数量。
    • 已发布日志:由于内部日志缓冲区已满,归档人员从组件发布的日志数量。
    • 未能解析记录:无法解析组件写入套接字的日志记录。
    • Other:说明所发生的其他错误的字符串。
  • 组件网址:启动组件的网址。

  • 时间戳:框架中发生事件的单调时间。

  • 严重级别:日志的严重级别。以下各项中的一项:TraceDebugInfoWarnErrorFatal

  • 标记:与日志关联的字符串标记列表(可选)。

  • Pid:发出日志的进程 koid(可选)。

  • Tid:发出日志的线程 koid(可选)。

  • File:发出日志的文件的名称(可选)。

  • 行:生成日志的文件中的行号(可选)。

这将在 JSON 中如下所示:

{
    ...,
    "metadata": {
        "errors": [
            {
                "dropped_logs": { "count": 3 },
            }
        ],
        "component_url": "fuchsia-pkg://...",
        "timestamp": 12345,
        "severity": "Info",
        "tags": ["foo"],
        "pid": 123,
        "tid": 456,
        "file": "lib.rs",
        "line": 5,
    },
}

载荷

载荷部分包含要报告的实际诊断数据。载荷采用分层结构,并且数据的上下文或主题按其在层次结构中的位置(例如,其所在节点的名称)进行编码。

检查

Inspect 响应的载荷是一个对象,表示在截取快照时组件公开的检查树。

这将在 JSON 中如下所示:

{
    ...,
    "payload": {
        "root": {
            "foo": { ... },
            "bar": 3,
            ...
        }
    },
}

日志

日志载荷是一个包含以下字段的对象:

  • 消息:包含日志消息。这是一个包含一个字段的对象:
    • 值:表示日志消息的字符串。
  • Keys:包含一个对象,该对象具有结构化日志消息的键和相关值。

对于常规文本日志(或不含键的结构化日志),采用 JSON 格式如下:

{
    ...
    "payload": {
        "message": {
            "value": "my log",
        }
    }
}

对于包含键的结构化日志,采用 JSON 格式时应如下所示:

{
    ...
    "payload": {
        "message": {
            "value": "my log",
        },
        "keys": {
            "foo": 3,
            "bar": "baz",
            ...
        }
    }
}