指標設定產生要求 JSON 格式

本指南詳細說明指標設定產生器 (MCG) 工具 /api/v2/generate_metrics_config 端點的 JSON 要求格式。這種格式可讓您以人類可讀的結構定義遙測活動,指定資料收集、裝置端處理和報表產生。

MCG 工具會驗證這個 JSON 物件,檢查是否有類型不符、循環相依或未定義的參照等問題,然後將其編譯為 MetricsConfig 通訊協定緩衝區 (protobuf) 訊息。這個 MetricsConfig 訊息是裝置端遙測服務執行廣告活動時採用的二進位格式。

必要條件:您應熟悉 JSON 結構定義、protobuf 和基本資料結構。如需概念總覽,請參閱「指標設定概念」。

如何撰寫設定說明

如要設計指標收集廣告活動,請按照下列邏輯流程操作:

  1. 指定資料來源:定義資料來源。
  2. 定義邏輯和處理方式:設定收集資料的時機和處理方式規則。
  3. 建立輸出內容:將處理過的資料封裝成最終訊息。
  4. 頂層欄位:新增頂層欄位,例如 UUID、信號定義和生命週期控制項。

範例:平均速度報表

本指南將透過範例說明所有元件如何搭配運作。這項作業會建立報表,計算每分鐘的平均車速。它定義了用於收集速度資料的資料來源 (SpeedSource)、用於控制執行流程的觸發條件 (OnNewSpeed、EveryMinute)、用於計算平均值的匯總器 (SpeedAggregator),以及用於封裝結果的指標報告設定 (MinuteReport)。可展開部分中的範例會以這個情境為基礎。

指定資料來源

遙測功能支援從 SDV 服務 (透過 SDV 中介軟體) 和可設定的發布者註冊表型發布者收集資料。

如要在 SDV 中使用資料,請定義資料來源 (概念),並將其新增至 data_sources 陣列。

資料來源物件的欄位 (data_sources 清單中的項目)
name 使用者定義的字串,用於在指標設定中識別這個資料來源。
source_identifier 用於探索服務的 ID。詳情請參閱「source_identifier 格式」。
connection_type SUBSCRIPTION:用於連續資料串流 (資料觸發條件的必要條件),或 ON_DEMAND:用於隨選擷取 (詳情請參閱「設定資料來源」)。
選填
configuration

僅限 RPC 和可設定的發布商註冊。用於設定資料來源的物件,包含下列欄位:

type_url 設定的 protobuf 訊息 FQN。
value_json、
value_textproto、
或 value
JSON、textproto 或 base64 格式的酬載。
SUBSCRIPTION 連線類型的欄位
選填
sub_sampling_interval_ms
僅限 Pub/Sub。非負整數 (毫秒),可指定訊息之間的最小間隔,藉此限制訊息頻率。
選填
fetch_last_message
(預設:false)
僅限 Pub/Sub。布林值。如果為 true,則會在連線時擷取最新訊息。

部分選項不適用於某些類型的資料來源。詳情請參閱資料來源整合指南。

source_identifier 的格式

遙測服務接受多種來源 ID 格式。如需總覽,請參閱「指標設定中的資料來源定義」。

只有在 source_identifier 使用單位類型名稱格式時,MCG 才會從中推論 protobuf 訊息類型。如果您使用 FQIN 或自訂名稱 (來自可設定的發布者註冊資料庫),MCG 就無法推論類型。在這種情況下,您必須提供 data_source_message_types。如果目錄中沒有該類型,您也必須在 descriptor_protos 中提供其定義。

範例:定義資料來源

這個範例會回報車速。首先,請參閱 VSIDL 目錄,找出發布這項資料的服務。

使用 SDV 程式碼集中的範例目錄,找出相關服務。與source_identifier 的格式一致,指定 protobuf 訊息類型 mcg.test.subpkg.speed_msg。由於速度通常會頻繁發布,請使用 sub_sampling_interval_ms 將更新限制為每秒一則訊息:

{
  "name": "SpeedSource",
  "source_identifier": "mcg.test.subpkg.speed_msg",
  "connection_type": "SUBSCRIPTION",
  "sub_sampling_interval_ms": 1000 // Limit updates to 1 per second
}

定義邏輯和處理

邏輯由兩個元件共同處理:觸發條件 (概念) 定義事件發生的時間,匯總工具 (概念) 則定義如何根據這些觸發條件處理資料。運算式 (概念) 是觸發條件和匯總邏輯的關鍵,因此本節會先說明如何編寫運算式。

運算式

運算式可讓您使用人類可讀的語法定義計算和條件。MCG 會將這些字串編譯成可執行的格式,並針對裝置端評估進行最佳化。

運算式可以表示算術計算、邏輯條件和資料比較。如需完整語法 (包括運算子和函式),請參閱「運算式語法」。

資料更新間隔:運算式存取資料來源時,擷取行為取決於連結類型:

  • SUBSCRIPTION:使用遙測服務快取的最新接收訊息。(注意:如果設定 sub_sampling_interval_ms,這可能與絕對最新發布的訊息不同)。
  • ON_DEMAND:觸發立即呼叫,從服務擷取最新訊息。

類型限制

  • 陣列:不支援直接存取陣列索引 (例如 my_data_source.my_array[0])。
  • 類型安全:請務必比較相容的類型 (例如,不要將字串欄位與整數清單進行比較)。

範例:運算式

範例需要擷取速度值,才能計算平均值。此外,系統也需要判斷車輛是否超速 (超過 100 公里/小時),以觸發條件。您可以在資料來源使用的 protobuf 訊息定義中,找到欄位名稱 (在本例中為 speed)。下列運算式可達到這個目的:

  • SpeedSource.speed:從 SpeedSource 資料來源擷取 speed 欄位的值。
  • SpeedSource.speed > 27.7:如果速度大於 27.7 公尺/秒 (約 100 公里/小時),則評估為 true。

觸發條件:定義動作發生時間

觸發條件會定義動作的執行時機:評估匯總器、產生報表,或控管收集生命週期。將所有定義的觸發條件新增至頂層 triggers 陣列。

觸發條件物件的欄位 (triggers 清單中的項目)
name 指標設定中這個觸發條件的專屬 ID。
periodic
data
conditional
您必須提供其中一個欄位來定義行為。

資料觸發條件

當 SUBSCRIPTION 資料來源提供新訊息 (概念) 時觸發。

data 物件的欄位 (在觸發條件中)
source_name 這個觸發條件監聽的 data_source 的 name。

範例:資料觸發條件

在範例中,每次 SpeedSource 發布新訊息時,都會更新平均速度計算。每次發生這種情況時,系統都會觸發這項資料觸發條件:

{
  "name": "OnNewSpeed",
  "data": {
    "source_name": "SpeedSource" // Reference to the defined data source
  }
}

定期觸發

定期觸發 (概念)。

periodic 物件的欄位 (在觸發條件中)
period_ms 非負數,定義間隔時間 (以毫秒為單位)。

範例:週期性觸發條件

範例要求每分鐘回報一次。這個週期性觸發條件每 60,000 毫秒就會觸發一次,以產生報表:

{
  "name": "EveryMinute",
  "periodic": {
    "period_ms": 60000 // 60,000 ms = 60 seconds
  }
}

條件式觸發條件

根據運算式 (概念) 的評估結果觸發。必須有一或多個父項觸發條件,才能開始評估。這通常是運算式中資料來源或匯總器的資料觸發條件,或是輪詢資料的週期性觸發條件。

conditional 物件的欄位 (在觸發條件中)
triggers 至少包含一個父項觸發條件名稱的陣列。當父項觸發條件啟動時,條件式觸發條件會評估運算式。
expression 要評估的運算式。請參閱「運算式」。
condition_type 根據運算式的評估結果,指定觸發條件的觸發時機。
條件類型

condition_type 字典必須包含一個可用的條件類型做為鍵。詳情請參閱「條件式觸發條件」。

condition_type 物件的欄位 (互斥)
is_true

is_false
布林運算式的評估結果分別為 true 或 false 時觸發。
rising_edge

如果值為數字,則會在值增加時觸發。如果運算式是布林值,則會在從 false 變更為 true 時觸發。

可包含 rising_options 物件 (請參閱「邊緣選項」)。

falling_edge

如果值為數字,則會在值減少時觸發。如果運算式是布林值,則會在從 true 變更為 false 時觸發。

可包含 falling_options 物件 (請參閱「邊緣選項」)。

all_changes

運算式的結果與先前的值不同時,就會觸發。如果設定邊緣選項,則僅支援數值和布林值。

可包含 rising_options、falling_options 或兩者 (請參閱「Edge 選項」)。

Edge 選項

rising_options 和 falling_options 物件包含下列欄位。如果提供,對應的轉場效果必須符合時間長度規定。未指定選項的轉換會立即觸發。

邊緣選項物件的欄位
min_duration_ms 非負數 (以毫秒為單位),指定條件必須在新狀態中維持多久,觸發條件才會啟動。
選填
require_exact
布林值。如果設為 true,則在指定時間長度內發布的所有值都必須相同,才能觸發。

範例:條件式觸發條件

下列觸發條件會使用邊緣選項。如果速度超過 27.7 公尺/秒,且持續至少 5 秒,就會觸發:

{
  "name": "SpeedingFor5Seconds",
  "conditional": {
    "triggers": ["OnNewSpeed"],
    "expression": "SpeedSource.speed > 27.7",
    "condition_type": {
      "rising_edge": {
        "rising_options": {
          "min_duration_ms": 5000 // Condition must hold for 5s in new state
        }
      }
    }
  }
}

匯總器:定義資料處理方式

使用匯總工具,處理有狀態的中繼資料 (概念)。定義匯總工具,並將其新增至 aggregators 陣列。

匯總工具會轉換資料,並提供給其他匯總工具和報表。

集結網站的欄位 (aggregators 清單中的項目)
name 由使用者定義、用來識別這個匯總工具的字串。運算式可以依名稱參照這個匯總工具,以存取其結果。
trigger_names 一或多個觸發條件名稱的陣列,用於評估這項匯總。
選填
reset_on_get
布林值,預設值:`false`。如果設為 `true`,系統會在其他匯總工具、指標報表或條件式觸發條件存取匯總狀態的值後,重設匯總狀態。
message_builder 定義要讀取、處理及匯總的資料。輸出訊息的欄位會成為其他匯總工具和報表的資料來源。它使用 field_assignments,每個指派作業都會在輸出訊息中定義一個欄位。

訊息建立工具

message_builder 物件會定義輸出訊息結構,以及用於計算欄位的匯總邏輯。匯總工具和報表設定都會用到這個 ID。

message_builder 物件的欄位 (在匯總工具或報表中)
message_type 輸出內容的 protobuf 訊息類型完整名稱。如果省略,MCG 會根據 field_assignments 推論出的輸出類型,建立自訂訊息類型。只有在訊息建構工具是指標報表的一部分,且報表必須符合特定預先定義的 protobuf 訊息定義時,才應使用這個方法。
field_assignments 欄位定義物件陣列。每個物件都會指定輸出訊息中的欄位,以及計算其值的邏輯。
欄位指派物件的欄位 (field_assignments 清單中的項目)
field_name 使用者定義的欄位名稱。在運算式中使用點標記法 (aggregator_name.field_name) 時,它會識別物件中的特定值。
aggregation

這個物件定義系統如何使用下列欄位計算欄位值:

@type 匯總函式。

  • avg、min、max、sum、stddev:標準數學統計資料。
  • count:計算這個匯總工具的觸發次數。
  • delta:目前值與先前值的差異。
  • vector:建立值清單 (環狀緩衝區)。
  • none:傳遞原始值。
expression 匯總的輸入運算式。除了 count 以外,所有匯總類型都必須提供這項資訊。
max_length 僅限 @type: "vector"。選用整數,可限制向量大小,建立環形緩衝區。

範例:集結網站

以本例來說,請計算每分鐘報表之間的統計資料。這個匯總器由 OnNewSpeed 觸發,用於計算平均速度 (avg)、計算讀數 (count),並儲存最後 5 個速度值 (vector)。將 reset_on_get 設為 true。每次 MinuteReport 讀取統計資料時,系統都會重設統計資料,並為匯總工具啟動新的收集視窗,以便在下一分鐘收集資料:

{
  "name": "SpeedAggregator",
  "trigger_names": ["OnNewSpeed"], // Update aggregation on new speed data
  "reset_on_get": true, // Reset stats after they are read by the report configuration
  "message_builder": {
    "field_assignments": [
      {
        "field_name": "average_speed",
        "aggregation": {
          "@type": "avg",
          "expression": "SpeedSource.speed"
        }
      },
      {
        "field_name": "speed_reading_count",
        "aggregation": {
          "@type": "count" // Counts triggers (that is, processed speed readings) since last reset
        }
      },
      {
        "field_name": "speed_history_last5",
        "aggregation": {
          "@type": "vector",
          "expression": "SpeedSource.speed",
          "max_length": 5 // Keep last 5 readings
        }
      }
    ]
  }
}

建立輸出內容

如要定義遙測廣告活動的最終輸出內容,請將物件新增至 report_configs 陣列 (概念)。這些設定會決定處理後的資料如何封裝,以及何時產生。您可以在一項指標設定中定義多個報表設定,以便重複使用元件。

您可以使用 trigger_names 欄位控制報表產生。此外,您可以使用 report_initial 在設定啟用時立即產生報表,並使用 report_incomplete 在資料收集作業中斷時產生最終報表。

注意:如要將處理作業連結至輸出,請使用 none 匯總類型 (@type: "none") 從匯總器讀取預先計算的值。由於報表通常是無狀態快照,因此可將複雜的有狀態邏輯保留在匯總工具中,並保留報表以進行格式設定。

報表設定物件的欄位 (report_configs 清單中的項目)
name 報表的專屬名稱。這個名稱會顯示在產生的報表中繼資料中。
trigger_names 觸發條件名稱陣列,用於產生及發布報表。
message_builder 詳情請參閱「訊息建立工具」。 這會定義報表的內容。只有在觸發報表時,系統才會評估匯總。舉例來說,向量匯總會為每份報表新增一個值,而計數匯總則會反映報表數量。
選填
report_incomplete
(預設值:`false`)
布林值。如果設為「true」,系統會在關機或資料收集結束時產生最終報表,即使資料不完整也一樣。
選填
report_initial
(預設值:`false`)
布林值。如果設為「true」,系統會在指標設定啟用時立即產生報表。

範例:報表設定

最後,定義範例的報表設定。由 EveryMinute 觸發。它會使用 none 匯總,從 SpeedAggregator 讀取計算出的平均速度和讀取次數,並將預先匯總的值傳遞至報表:

{
  "name": "MinuteReport",
  "trigger_names": ["EveryMinute"], // Generate report every minute
  "message_builder": {
    "field_assignments": [
      {
        "field_name": "average_speed",
        "aggregation": {
          "@type": "none", // Read the value directly from the aggregator
          "expression": "SpeedAggregator.average_speed"
        }
      },
      {
        "field_name": "reading_count",
        "aggregation": {
          "@type": "none",
          "expression": "SpeedAggregator.speed_reading_count"
        }
      }
    ]
  }
}

頂層欄位

除了 data_sources、aggregators、triggers 和 report_configs 陣列之外,指標設定的說明也需要參照信號目錄。您也可以加入選填欄位,指派特定 UUID 並管理集合生命週期。

設定 UUID

每個 MetricsConfig 都需要通用專屬 ID (UUID)。如果您提供 existing_uuid,MCG 就會使用。否則會建立隨機 ID。為確保部署作業和工具之間的一致性,請指定 existing_uuid。

字串必須是有效的 UUID,且只能使用小寫英文字母和連字號。

"existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8",

信號定義

為驗證信號名稱和類型,MCG 必須存取車輛信號目錄。這是 protobuf FileDescriptorSet,包含 VSIDL .proto 定義 (已封裝並上傳至 MCG)。如要進一步瞭解如何建立及上傳目錄,請參閱「車輛信號目錄」。

在 JSON 物件的 vs_version 欄位中指定目錄版本:

"vs_version": "v1.0",

定義生命週期觸發條件

在遙測活動中,MetricsConfig 的生命週期會決定實際記錄資料的時間。當廣告活動管理系統在裝置上部署並啟用設定時,您可以使用生命週期觸發條件,精確控制該部署作業中收集資料的時間。

這樣一來,您就能根據車輛使用模式 (例如「行程」(IgnitionOn 到 IgnitionOff) 或「充電工作階段」) 收集資料,而不必停用設定。

  • 工作階段控制 (開始/暫停):使用 start_trigger_name 和 stop_trigger_name 控制收集資料的時間。舉例來說,如要只在車輛行駛時收集資料,請使用 IgnitionOn 做為啟動觸發條件,並使用 IgnitionOff 做為停止觸發條件。設定在裝置上仍會保持啟用狀態,但會在停止觸發條件觸發時有效「暫停」(停止收集和處理),只有在啟動觸發條件再次觸發時才會恢復。

    重要事項:這只會暫停收集資料,這項作業「不會」定義邏輯視窗、分隔資料集,或產生任何其他副作用。暫停或恢復收集資料時,匯總器值「不會」重設。

  • 一次性偵測 (完成):如果設定只應執行一次 (例如偵測特定錯誤代碼首次出現),然後在該裝置上永久停用,即使廣告活動在技術上仍處於有效狀態,也請使用 deactivate_trigger_name。

如未指定任何生命週期觸發條件,廣告活動啟用設定後,系統會立即開始資料收集,並持續到廣告活動結束。

頂層生命週期欄位 (根物件)
選填
start_trigger_name
啟動收集工作階段的觸發條件名稱。不需 stop_trigger_name 即可設定。
選填
stop_trigger_name
暫停收集工作階段的觸發條件名稱 (例如車輛靜止時)。如果設定這項屬性,也必須設定 start_trigger_name。
選填
deactivate_trigger_name
觸發條件的名稱,用於完成並完全停用 `MetricsConfig`。

進階:自訂 proto 定義

在以下兩種主要情況下,MCG 無法單靠 vs_version 瞭解指標設定說明中的所有訊息類型:

  1. 類型推論失敗:如「source_identifier 格式」一節所述,當 source_identifier 使用 FQIN 或自訂名稱時,MCG 無法推論類型。
  2. 自訂訊息:指標設定說明使用的 protobuf 訊息,在 vs_version 指定的 VSIDL 目錄中找不到。在自訂報表格式的 message_builder 中設定 message_type 時,就會發生這種情況。

在這種情況下,請使用 data_source_message_types 協助 MCG 推論類型,並使用 descriptor_protos 提供訊息定義。

data_source_message_types

將 source_identifier 字串對應至完整的 protobuf 訊息類型。data_source_message_types 中的鍵必須與 data_sources 項目的 source_identifier 值相符:

"data_source_message_types": {
  "MyCustomSpeedService": "com.sdv.example.SampleMessage"
}

descriptor_protos

針對 data_source_message_types 或 message_builder 中使用的任何訊息類型提供定義,但這些類型不在設定的 vs_version 中。

在 descriptor_protos 陣列中傳遞 Base64 編碼的 descriptorpb.FileDescriptorSet。使用 Protobuf 編譯器 protoc,從 .proto 檔案產生。

"descriptor_protos": [
  "Cu8BCiZtY2cvdGVzdGRhdGEvbWF4YXZnY3..." // Base64 string
]

範例:完整設定說明

上述各節定義了範例的所有元件:每分鐘產生一份報表,其中包含該分鐘內觀察到的平均車速。

這些元件包括:

  • 資料來源 (SpeedSource),每秒最多可取得一次速度資料。
  • 資料觸發條件 (OnNewSpeed),會在 SpeedSource 傳送資料時觸發。
  • 每 60 秒觸發一次的週期性觸發條件 (EveryMinute)。
  • 使用 OnNewSpeed 計算平均速度、讀數和儲存最近值的匯總工具 (SpeedAggregator),在讀取時重設。
  • 報表設定 (MinuteReport) 使用 EveryMinute 觸發報表,其中包含 SpeedAggregator 的平均速度和計數。
  • 頂層欄位 (existing_uuid、vs_version),用於識別指標設定,並指定要用於信號定義的 VSIDL 目錄。

這些部分結合後,就會形成指標設定的完整說明:

{
  "existing_uuid": "a1a2a3a4-b1b2-c1c2-d1d2-d3d4d5d6d7d8", // Unique identifier for the configuration
  "vs_version": "example_version", // Version of the VSIDL catalog to use
  "data_sources": [
    {
      "name": "SpeedSource",
      "source_identifier": "mcg.test.subpkg.speed_msg",
      "connection_type": "SUBSCRIPTION",
      "sub_sampling_interval_ms": 1000
    }
  ],
  "aggregators": [
    {
      "name": "SpeedAggregator",
      "trigger_names": ["OnNewSpeed"],
      "reset_on_get": true,
      "message_builder": {
        "field_assignments": [
          {
            "field_name": "average_speed",
            "aggregation": {
              "@type": "avg",
              "expression": "SpeedSource.speed"
            }
          },
          {
            "field_name": "speed_reading_count",
            "aggregation": { "@type": "count" }
          },
          {
            "field_name": "speed_history_last5",
            "aggregation": {
              "@type": "vector",
              "expression": "SpeedSource.speed",
              "max_length": 5
            }
          }
        ]
      }
    }
  ],
  "triggers": [
    {
      "name": "OnNewSpeed",
      "data": { "source_name": "SpeedSource" }
    },
    {
      "name": "EveryMinute",
      "periodic": { "period_ms": 60000 }
    }
  ],
  "report_configs": [
    {
      "name": "MinuteReport",
      "trigger_names": ["EveryMinute"],
      "message_builder": {
        "field_assignments": [
          {
            "field_name": "average_speed",
            "aggregation": {
              "@type": "none",
              "expression": "SpeedAggregator.average_speed"
            }
          },
          {
            "field_name": "reading_count",
            "aggregation": {
              "@type": "none",
              "expression": "SpeedAggregator.speed_reading_count"
            }
          }
        ]
      }
    }
  ]
}

參考範本

如需 API 定義,請參閱 MCG API 參考資料。

下列各節提供指標設定說明的完整參考資料。請參考這份範例,自行建立指標設定說明。

頂層欄位

{
  "existing_uuid": "1cbec8e6-46f5-4649-9fa2-09f81bc93f8b", // Optional
  "vs_version": "example_version", // Optional
  "descriptor_protos": ["..."], // Optional. Base64 encoded FileDescriptorSet
  "data_source_message_types": {
    "ExampleServiceName": "com.example.ProtoMessage"
  }, // Optional
  "start_trigger_name": "DataTriggerExample", // Optional
  "stop_trigger_name": "ConditionalTriggerExample", // Optional
  "deactivate_trigger_name": "PeriodicTriggerExample" // Optional
}

輸入:資料來源和匯總工具

{
  "data_sources": [
    {
      "name": "SubscriptionExample",
      "source_identifier": "com.example.sdv.ExampleMessage|example-unit",
      "connection_type": "SUBSCRIPTION", // Options: SUBSCRIPTION (default), ON_DEMAND
      "sub_sampling_interval_ms": 100, // Optional
      "fetch_last_message": false // Optional. Default: false
    },
    {
      "name": "RegistryExample",
      // Configurable Publisher Registry-based publisher (matches data_source_message_types)
      "source_identifier": "ExampleServiceName",
      "connection_type": "SUBSCRIPTION"
    },
    {
      "name": "GetterExample",
      "source_identifier": "com.example.sdv.ExampleConfig|example-unit",
      "connection_type": "ON_DEMAND",
      "configuration": {
        "type_url": "type.googleapis.com/example.Config",
        "value_json": {} // Or value_textproto, value (base64)
      }
    }
  ],
  "aggregators": [
    {
      "name": "AggregatorExample",
      "trigger_names": ["DataTriggerExample"],
      "reset_on_get": false, // Optional. Default: false. If true, resets state after it's read
      "message_builder": {
        "message_type": ".com.example.AggregatedMessage", // Optional
        "field_assignments": [
          {
            "field_name": "avg_example",
            "aggregation": {
              // Options: avg, count, min, max, sum, stddev, delta, vector, none
              "@type": "avg",
              "expression": "SubscriptionExample.value"
            }
          },
          {
            "field_name": "count_example",
            "aggregation": {
              "@type": "count" // Counts number of evaluations. No expression needed
            }
          },
          {
            "field_name": "vector_example",
            "aggregation": {
              "@type": "vector",
              "expression": "SubscriptionExample.value",
              "max_length": 10 // Optional. If set, creates a ring buffer
            }
          }
        ]
      }
    }
  ]
}

邏輯和處理:觸發條件

{
  "triggers": [
    {
      "name": "PeriodicTriggerExample",
      "periodic": { "period_ms": 1000 }
    },
    {
      "name": "DataTriggerExample",
      "data": { "source_name": "SubscriptionExample" }
    },
    {
      "name": "ConditionalTriggerExample",
      "conditional": {
        "triggers": ["PeriodicTriggerExample"],
        "expression": "SubscriptionExample.value > 0",
        "condition_type": {
          // Options: is_true, is_false, rising_edge, falling_edge, all_changes
          "rising_edge": {
            "rising_options": { "min_duration_ms": 0, "require_exact": false }
          }
        }
      }
    }
  ]
}

輸出:報表設定

{
  "report_configs": [
    {
      "name": "ReportExample",
      "trigger_names": ["PeriodicTriggerExample"],
      "report_incomplete": false, // Optional. Default: false
      "report_initial": false, // Optional. Default: false
      "message_builder": {
        "message_type": ".com.example.ReportMessage", // Optional. Must be defined in VSIDL catalog or descriptor_protos. Message type will be inferred if not provided
        "field_assignments": [
          {
            "field_name": "avg_example",
            "aggregation": {
              "@type": "none", // Passthrough since aggregation is done in AggregatorExample
              "expression": "AggregatorExample.avg_example"
            }
          }
        ]
      }
    }
  ]
}

運算式語法

類別 語法 說明
資料存取權 source_name
source_name.field
source_name.field.subfield
從資料來源或匯總工具存取完整訊息
存取訊息中的特定欄位 (包括巢狀欄位)
算術 +,-,*,/,%,** 標準數學。** 是指數。
邏輯 &&、||、!、^ AND、OR、NOT、XOR。
關聯式 ==,!=,<,<=,>,>= == 和 != 適用於所有類型。其他則需要數字。
清單 contains(list, item)
doesnotcontain(list, item)
alleq(list, value)
對向量 (陣列) 執行運算。如果 list 中的所有項目都等於 value,alleq(list, value) 會傳回 true。
函式 timestamp(clock_type) 目前時間 (以微秒為單位)。
clock_type:REALTIME_CLOCK 或
MONOTONIC_TIME_SINCE_BOOT_OR_RESUME
abs(n) 絕對值
floor(n)、round(n)、ceil(n) Rounding 函式
運算順序 () 優先順序的標準分組