指標設定產生要求 JSON 格式

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

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

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

如何撰寫設定說明

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

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

範例:平均速度報表

本指南會透過範例,說明如何搭配使用所有元件。這項功能會建立報表,每分鐘計算車輛的平均速度。這個範例定義了資料來源 (SpeedSource) 來收集速度資料、觸發條件 (OnNewSpeedEveryMinute) 來控制執行流程、匯總工具 (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 才會從 source_identifier 推斷 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 觸發條件監聽的 name data_source

範例:資料觸發條件

在這個範例中,每次 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
布林運算式分別評估為 truefalse 時,就會觸發。
rising_edge

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

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

falling_edge

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

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

all_changes

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

可以包含 rising_optionsfalling_options 或兩者 (請參閱「邊緣選項」)。

邊緣選項

rising_optionsfalling_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 物件會定義輸出訊息結構,以及用於計算欄位的匯總邏輯。匯總工具和報表設定都會使用這個物件。

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

這個物件會定義系統如何計算欄位值,並包含下列欄位:

@type 匯總函式。

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

示例:Aggregator

以本範例來說,請計算每分鐘報表之間的統計資料。這個匯總器會由 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_sourcesaggregatorstriggersreport_configs 陣列,指標設定的說明也需要參照信號目錄。您也可以加入選用欄位,指派特定 UUID 並管理收集生命週期。

設定 UUID

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

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

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

信號定義

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

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

"vs_version": "v1.0",

定義生命週期觸發條件

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

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

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

    重要事項:這項操作只會暫停收集資料,不會定義邏輯時間視窗、區隔資料集,也不會產生任何其他副作用。暫停或繼續收集資料時,系統不會重設匯總器值。

  • 單次偵測 (完成):如果設定只應執行一次 (例如偵測特定故障代碼的首次發生情況),然後在該裝置上永久停用自身,即使廣告活動在技術上仍處於有效狀態,也請使用 deactivate_trigger_name

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

頂層生命週期欄位 (根物件)
選填
start_trigger_name
啟動收集作業的觸發條件名稱。可設定,但不必使用 stop_trigger_name
選填
stop_trigger_name
暫停收集作業的觸發條件名稱 (例如車輛靜止時)。如要設定,也必須設定 start_trigger_name
選填
deactivate_trigger_name
觸發條件的名稱,會完全完成並停用 `MetricsConfig`。

進階:自訂通訊協定定義

在兩種主要情況下,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_typesmessage_builder 中使用的任何訊息類型提供定義,這些訊息類型不得位於已設定的 vs_version 中。

descriptor_protos 陣列中傳遞經過 Base64 編碼的 descriptorpb.FileDescriptorSet。使用 Protobuf 編譯器 protoc.proto 檔案產生這個檔案。

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

範例:完成設定說明

前幾節定義了範例的所有元件:每分鐘產生一份報告,內容為該分鐘內觀察到的平均車速。

這些元件包括:

  • 資料來源 (SpeedSource),可每秒取得一次速度資料。
  • 資料觸發條件 (OnNewSpeed):在 SpeedSource 傳送資料時觸發。
  • 每 60 秒觸發一次的週期性觸發條件 (EveryMinute)。
  • 匯總器 (SpeedAggregator):使用 OnNewSpeed 計算平均速度、讀取次數,並儲存最近的值,讀取時會重設。
  • 報表設定 (MinuteReport),使用 EveryMinute 觸發包含 SpeedAggregator 平均速度和計數的報表。
  • 頂層欄位 (existing_uuidvs_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": "00000000-0000-0000-0000-000000000000", // 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 中的所有項目都等於 valuealleq(list, value) 會傳回 true
函式 timestamp(clock_type) 目前的奈秒時間。
clock_typeREALTIME_CLOCK
MONOTONIC_TIME_SINCE_BOOT_OR_RESUME
abs(n) 絕對值
floor(n)round(n)ceil(n) Rounding 函式
作業順序 () 優先順序的標準分組