指标配置概念

指标配置定义了 Telemetry 服务运行的遥测活动。指标配置是 MetricsConfig 协议缓冲区 (protobuf) 消息的一个实例。指标配置用于指定如何收集、处理和报告数据。OEM 可以通过 Telemetry 服务的 API 激活指标配置。多个配置可以同时运行。

在开始之前,请先熟悉 SDV 架构,这是一种面向服务的架构,服务以 protobuf 消息的形式发布数据。这些消息通过 RPC 或发布-订阅使用 SDV 通信堆栈进行通信。

关键词

指标配置通过定义数据源、处理规则和报告机制来协调数据收集。这种边缘处理的主要优势之一是减少了移动数据流量消耗。通过在设备上处理高频数据并仅上传汇总数据或数据洞见,您可以大幅减少传输到云端的数据量。

指标配置的定义首先要列出配置中要使用的数据源。这些服务通过 SDV 通信堆栈提供数据。当您激活配置时,Telemetry 服务会连接到这些来源,以便根据需要流式传输或提取数据。

配置的核心是其边缘数据处理能力,通过有状态的数据聚合器进行管理。每个聚合器都使用一个消息构建器,该构建器会维护一个有状态的 proto 消息实例。此消息中的每个字段都是通过评估表达式来填充的,该表达式定义了要从其他数据源或聚合器读取哪些数据,以及要对这些数据应用哪些数学、逻辑或聚合运算。您可以对表达式的结果应用其他聚合。

触发器是控制此流程的关键。它们可以定期触发,也可以在有新数据时或满足基于数据的条件时触发。触发器决定了聚合器何时评估其消息构建器、何时生成指标报告,并且可以通过启动或停止数据收集等方式影响配置生命周期。

指标报告是最终输出。每份报告都包含由消息构建器定义的数据载荷,以及时间戳和报告 ID 等元数据。您可以在特定配置生命周期时刻(例如配置处于启用或停用状态时)生成报告。生成的报告存储在内存中,并通过报告状态通知渠道通知客户端进行检索。

下图提供了一个概念性示例,展示了组件如何在指标配置中进行交互:

概念图,展示了指标配置中的数据源、处理和报告

图 1. 指标配置中的数据源、处理和报告。

指标配置组件

您可以使用指标配置来定义数据收集任务和复杂的设备端处理流水线。本部分详细介绍了用于定义指标宣传活动的核心组件。这些组件按数据在系统中的流动顺序(从输入到输出)呈现。您可以按任意顺序定义这些组件。使用聚合器处理数据和生命周期管理是可选的。

  • 定义数据源
  • 使用聚合器处理数据
  • 使用触发器控制执行流程
  • 生成指标报告
  • 管理数据收集生命周期

定义数据源

任何以指标为目标的广告系列的基础都是数据。在指标配置中,接收数据的机制已抽象化,您只需指定可用于标识数据源的名称和连接模式(订阅或按需)。数据源可以是任何通过 SDV 通信堆栈提供数据或在可配置的发布者注册表中注册自身的服务,这使得可以从没有 SDV 中间件的应用中收集数据。每个数据源在配置中都必须具有唯一的名称,以便其他指标配置组件(如触发器或聚合器)可以引用它。您可以配置其连接方式、接收数据的频率,并提供特定于服务的配置对象。

数据源配置

Telemetry 服务可以通过以下两种方式连接到数据源:

  • Getter:每当指标配置中定义的表达式需要从此来源读取数据时,此方法都会按需提取数据。这对于不提供连续数据流的数据源或需要不频繁的数据快照时非常有用。
  • 订阅:这是默认方法。它会建立从来源到目标位置的持续数据流。如果您打算使用在收到来自此来源的新消息时触发的数据触发器,则必须使用此连接类型。

使用订阅时,您可以配置以下内容:

  • 子采样:为避免过于频繁地提取数据,您可以定义来自同一来源的连续消息之间的最短时间间隔。如果来源发布数据的速度快于此间隔,Telemetry 服务会限制通知,并且数据触发器仅针对在限制后收到的消息激活。这可有效地对数据进行子抽样。
  • 初始消息检索:您可以配置服务,使其在建立订阅时从来源检索最新消息。因此,如果数据源有值,系统会立即填充该值,而不是等待发布第一条新消息。这在需要初始状态的条件触发器或聚合器中非常有用,或者在数据源发布频率较低时也很有用。

无论消息类型如何,都会在内部进行缓存。如果多个表达式或聚合器在单个评估周期内需要来自同一来源的数据,系统只会提取一次数据,要么从缓存中提取(如果新消息是通过订阅到达的),要么使用单个按需调用来提取。

使用聚合器处理数据

数据源提供原始数据,而聚合器执行有状态的边缘数据处理。它们从数据源或其他汇总器中提取数据,对其进行转换,然后使结果可供指标报告读取或供其他汇总器进一步处理。这样一来,便可构建多阶段处理流水线,例如,在一个聚合器中计算速度统计信息,并在另一个检测驾驶行为模式的组件中使用这些统计信息。

聚合器由一个或多个触发器触发,以执行计算。 每次触发器触发时,聚合器都会评估其规则并更新其内部状态。

您可以配置聚合器,使其在值被其他组件读取后重置状态,这对于计算不重叠时间窗口的统计信息非常有用。

消息构建器用于定义聚合器的结构和逻辑。消息构建器通过描述如何为每个字段生成数据来指定如何构建 proto 消息的实例。对于每个字段,表达式都会定义如何从数据源和聚合器读取数据,以及如何对这些数据应用操作。此外,您还可以应用聚合,即对表达式在一段时间内的结果执行的计算或收集操作。

支持以下聚合类型:

  • 数学:计算每个触发器上表达式返回的值的统计信息(平均值、最小值、最大值、总和、标准差和增量)。增量是指表达式返回的当前数值与上一个数值之间的差值。
  • List:将表达式返回的值收集到一个列表中。您可以限制列表大小,以创建最近值的滚动窗口(环形缓冲区)。
  • 数量:未指定表达式的特殊情况。统计字段的评估次数(即,触发聚合器或报告的次数)。
  • 传递:直接使用表达式的结果,而不应用任何聚合函数。这在报告配置中非常有用,可用于从汇总器访问最终值。

下图是一个概念图,用于说明聚合器评估:

说明汇总函数评估的概念图。

图 2. 聚合器评估。

使用表达式执行计算或定义条件

表达式用于消息构建器和条件触发器中,以执行计算或定义条件。使用指标配置生成器 (MCG) 编写指标配置 JSON 对象时,表达式会以人类可读的字符串形式编写,该字符串使用点表示法来访问数据源的字段(例如 vehicle_speed.speed_value),并应用各种操作。MCG 会将这些字符串转换为优化的树结构(类似于抽象语法树 [AST]),以便在最终的 MetricsConfig protobuf 消息中进行高效的设备端评估。

运算符和函数

表达式支持以下运算符和函数:

  • 算术:支持加法、减法(二元和一元)、乘法、除法、取模和求幂。
  • 逻辑:支持 AND、OR、NOT 和 XOR。
  • 关系型:支持相等性检查以及大于和小于比较。
  • 列表:检查列表是否包含特定值。
  • 时间戳:返回评估时的时间戳(以微秒为单位)。时钟类型可以是实时时钟、自启动以来的单调时间(包括暂停时间),也可以是自启动或上次恢复以来的单调时间。
  • 绝对值:返回数字的绝对值。
  • 舍入:舍入到最接近的整数 (round),返回小于或等于某个数字的最大整数 (floor),或返回大于或等于某个数字的最小整数 (ceil)。

以下是一个表达式示例,该表达式从两个数据源读取数据,并在车速超过 100 kmph 且没有轮胎压力警告时评估为 true

(vehicle_speed.speed_value * 3.6) > 100 && tire_pressure.warning == false

使用触发器控制执行流程

触发器是指标配置的编排器;它们控制着何时处理数据以及何时生成报告。每个触发器都必须具有唯一的名称。

触发器分为三种类型:

  • 数据触发器:当具有订阅连接的数据源发布新消息时(如果已配置,则在进行下采样后)触发。
  • 周期性触发器:以固定的时间间隔触发。
  • 条件触发器:在满足指定的逻辑条件时触发。

条件触发器

条件触发器会监听其他触发器(数据、周期性或其他条件触发器),并在其中一个触发器触发时评估表达式。只有当表达式的结果满足特定条件时,条件触发器才会触发。

您可以配置条件触发器,以根据多种条件类型触发:

  • :当表达式的计算结果为 true(或非零)或 false(或零)时。
  • 上升沿:布尔表达式从 false 变为 true 时,或数值增加时。
  • 下降沿:布尔表达式从 true 变为 false,或数值减小时。
  • 发生变化时:每当表达式的结果与之前的值不同时。
过滤掉嘈杂的状态变化

对于基于边缘或基于变化的触发器,您可以要求条件在触发器触发之前保持新状态至少一定时长,从而过滤掉短暂或嘈杂的状态变化(故障)。

例如,您可以配置一个触发器,使其仅在 vehicle_speed > 100 变为 true 且保持 true 至少 5 秒时触发。这样可防止因速度读数出现短暂的峰值而触发触发器。您还可以要求在此保留时长内看到的所有值完全相等。

生成指标报告

数据处理完毕后,您可以定义如何以及何时将数据打包到报告中。

报告使用指标报告配置进行定义,这些配置使用消息构建器来定义其输出的结构和内容。当报告的某个触发器触发时,消息构建器会评估其字段分配,以构建报告的数据载荷。

每个生成的报告都是一个 MetricsReport Protobuf 消息实例,该实例将消息构建器的输出封装在 payload 字段中并添加元数据。遥测服务会自动将以下元数据添加到每个 MetricsReport

  • 报告的通用唯一标识符 (UUID)
  • 一个顺序报告编号,对于此报告配置生成的每个报告,该编号都会递增
  • 报告的生成时间戳
  • 生成原因(例如,由规则触发或在关机时生成)
  • 生成报告的指标配置的 UUID 和版本
  • 指标报告配置的名称

报告生成控制

虽然报告通常是根据触发条件生成的,但您也可以将报告配置为在指标配置的特定生命周期时刻生成:

  • 报告激活情况:如果启用,系统会在指标配置激活时立即生成初始报告。
  • 最终报告:如果启用,系统会在数据收集暂停或停止时,或者在遥测服务关闭时生成最终报告。此报告包含汇总到该时间点的数据,有助于确保在会话结束时不会丢失任何数据。

管理数据收集生命周期

默认情况下,指标配置在被客户端激活后会立即开始收集和处理数据,直到被客户端停用为止。不过,您可以定义用于启动或停止数据收集或指标配置的触发器,从而更精细地控制此生命周期:

  • 开始触发器:如果已定义,则仅当此触发器触发时,数据收集才会开始。如果因停止触发器而暂停了收集,则开始触发器会恢复收集。
  • 停止触发器:如果已定义,此触发器会暂停数据收集。 在开始触发器再次触发之前,系统会停止聚合和报告生成。
  • 停用触发器:此触发器会以与客户端发出的 deactivate_metrics_config 调用相同的方式停用指标配置。

例如,您可以定义一个条件触发器,当 vehicle_state 更改为 DRIVING 时触发该触发器作为开始触发器;还可以定义另一个条件触发器,当 vehicle_state 更改为 PARKED 时触发该触发器作为停止触发器。这有助于确保仅在车辆行驶时收集数据。