指標構成生成リクエストの JSON 形式

このガイドでは、Metrics Configuration Generator(MCG)ツールの /api/v2/generate_metrics_config エンドポイントの JSON リクエスト形式について詳しく説明します。この形式を使用すると、テレメトリー キャンペーン(データの収集、デバイス上の処理、レポート生成の指定)を人が読める構造で定義できます。

MCG ツールは、この JSON オブジェクトを検証して、型の不一致、循環依存関係、未定義の参照などの問題を確認し、MetricsConfig プロトコル バッファ(protobuf)メッセージにコンパイルします。この MetricsConfig メッセージは、オンデバイス テレメトリー サービスがキャンペーンを実行するために実行するバイナリ形式です。

前提条件: JSON スキーマ、protobuf、基本的なデータ構造に精通している必要があります。コンセプトの概要については、指標構成のコンセプトをご覧ください。

構成の説明の作成方法

指標収集キャンペーンを設計するには、次の論理フローに従います。

  1. データソースを指定する: データの取得元を定義します。
  2. ロジックと処理を定義する: データを収集するタイミングと処理方法に関するルールを設定します。
  3. 出力を作成する: 処理されたデータを最終的なメッセージにパッケージ化します。
  4. 最上位フィールド: UUID、シグナル定義、ライフサイクル制御などの最上位フィールドを追加します。

例: 平均速度レポート

このガイドでは、すべてのコンポーネントがどのように組み合わされているかを例を使って説明します。1 分ごとに車両の平均速度を計算するレポートを作成します。速度データを収集するデータソース(SpeedSource)、実行フローを制御するトリガー(OnNewSpeed、EveryMinute)、平均を計算する集計ツール(SpeedAggregator)、結果をパッケージ化する指標レポート構成(MinuteReport)を定義します。展開可能なセクションの例は、このシナリオに基づいています。

データソースを指定する

テレメトリーは、SDV サービス(SDV ミドルウェア経由)と構成可能なパブリッシャー レジストリ ベースのパブリッシャーからのデータ収集をサポートしています。

SDV でデータを使用するには、データソース(コンセプト)を定義して data_sources 配列に追加します。

データソース オブジェクトのフィールド(data_sources リスト内のアイテム)
name 指標構成内でこのデータソースを識別するユーザー定義の文字列。
source_identifier サービスの検出に使用される識別子。詳細については、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 の形式

Telemetry サービスは、複数のソース識別子形式を受け入れます。概要については、指標構成のデータソース定義をご覧ください。

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 を使用して、更新を 1 秒あたり 1 メッセージに制限します。

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

ロジックと処理を定義する

ロジックは、連携して動作する 2 つのコンポーネントによって処理されます。トリガー(コンセプト)は、何かが発生するタイミングを定義します。アグリゲータ(コンセプト)は、これらのトリガーに基づいてデータがどのように処理されるかを定義します。式(コンセプト)はトリガー条件と集計ロジックの鍵となるため、このセクションではまず式の記述方法について説明します。

式

式を使用すると、人が読める構文を使用して計算と条件を定義できます。MCG は、これらの文字列を、オンデバイス評価用に最適化された実行可能形式にコンパイルします。

式では、算術計算、論理条件、データ比較を表現できます。演算子や関数を含む完全な構文については、式の構文をご覧ください。

データの更新速度: 式がデータソースにアクセスする場合、取得動作は接続タイプによって異なります。

  • SUBSCRIPTION: テレメトリー サービスによってキャッシュに保存された最後に受信したメッセージを使用します。(注: sub_sampling_interval_ms が設定されている場合、これは公開された最新のメッセージとは異なる場合があります)。
  • ON_DEMAND: サービスから新しいメッセージを取得するための即時呼び出しをトリガーします。

型制約

  • 配列: 配列インデックスへの直接アクセス(my_data_source.my_array[0] など)はサポートされていません。
  • 型安全性: 互換性のある型を比較してください(たとえば、文字列フィールドを整数のリストと比較しないでください)。

例: 式

この例では、速度値を抽出して平均を計算する必要があります。また、条件付きトリガーのために、車両が速度超過(100 km/h 超)しているかどうかを判断する必要もあります。フィールド名(この場合は speed)は、データソースで使用される protobuf メッセージ定義で確認できます。次の式でこれを実現できます。

  • SpeedSource.speed: SpeedSource データソースから speed フィールドの値を取得します。
  • SpeedSource.speed > 27.7: 速度が 27.7 m/s(約 100 km/h)を超える場合、true と評価されます。

トリガー: アクションが発生するタイミングを定義します。

トリガーは、アクションが実行されるタイミング(集計ツールの評価、レポートの生成、コレクション ライフサイクルの制御)を定義します。定義したすべてのトリガーを最上位の triggers 配列に追加します。

トリガー オブジェクトのフィールド(triggers リスト内のアイテム)
name 指標構成におけるこのトリガーの固有識別子。
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 間隔をミリ秒単位で定義する負でない数値。

例: 例: 定期的なトリガー

この例では、1 分ごとにレポートが必要です。この定期的なトリガーは 60,000 ミリ秒ごとに起動して、レポートを生成します。

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

条件付きトリガー

式の評価に基づいて起動します(コンセプト)。評価を開始するには、1 つ以上の親トリガーが必要です。これは多くの場合、式内のデータソースまたは集計ツールのデータトリガー、またはデータをポーリングする定期的なトリガーです。

conditional オブジェクトのフィールド(トリガー内)
triggers 1 つ以上の親トリガー名を含む配列。親トリガーが起動すると、条件付きトリガーが式を評価します。
expression 評価する式。式をご覧ください。
condition_type 式の評価に基づいて、トリガーを起動するタイミングを指定します。
条件タイプ

condition_type 辞書には、使用可能な条件タイプの 1 つだけをキーとして含める必要があります。詳細については、条件付きトリガーをご覧ください。

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、またはその両方を含めることができます(エッジ オプションをご覧ください)。

エッジ オプション

rising_options オブジェクトと falling_options オブジェクトには次のフィールドがあります。指定する場合、対応する移行は期間の要件を満たす必要があります。オプションが指定されていない遷移はすぐに実行されます。

エッジ オプション オブジェクトのフィールド
min_duration_ms トリガーが起動する前に、新しい状態で条件が保持される期間を指定する負でない数値(ミリ秒単位)。
任意
require_exact
ブール値。true の場合、トリガーが起動するには、期間中に公開されたすべての値が同じである必要があります。

例: 条件付きトリガー

次のトリガーは、エッジ オプションを使用します。速度が 27.7 m/s を超え、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 この集計の評価をトリガーする 1 つ以上のトリガー名の配列。
任意
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 集計関数。

  • 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 が統計情報を読み取るたびに統計情報がリセットされ、次の 1 分間のアグリゲータの新しい収集ウィンドウが開始されます。

{
  "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 配列(コンセプト)にオブジェクトを追加します。これらの構成によって、処理されたデータのパッケージ化方法と生成タイミングが決まります。1 つの指標構成で複数のレポート構成を定義して、コンポーネントを再利用できます。

レポートの生成は、trigger_names フィールドを使用して制御します。また、report_initial を使用して、構成が有効になった直後にレポートを生成し、report_incomplete を使用して、データ収集が中断されたときに最終レポートを生成することもできます。

注: 処理を出力に接続するには、none 集計タイプ(@type: "none")を使用して、Aggregator から事前計算された値を読み取ります。レポートは通常、ステートレスなスナップショットであるため、複雑なステートフル ロジックはアグリゲータ内に保持され、レポートはフォーマット用に予約されます。

レポート構成オブジェクトのフィールド(report_configs リストの項目)
name レポートの一意の名前。この名前は、生成されたレポートのメタデータに表示されます。
trigger_names レポートの生成と公開をトリガーするトリガー名の配列。
message_builder 詳しくは、メッセージ ビルダーをご覧ください。 これにより、レポートのコンテンツが定義されます。集計は、レポートがトリガーされた場合にのみ評価されます。たとえば、ベクトル集計ではレポートごとに 1 つの値が追加され、カウント集計ではレポート数が反映されます。
省略可
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 には、Universally Unique Identifier(UUID)が必要です。existing_uuid を指定すると、MCG はそれを使用します。それ以外の場合は、ランダムな名前が作成されます。デプロイとツール間で一貫性を保つには、existing_uuid を指定します。

文字列は、英小文字のみを含む有効なハイフン付き UUID である必要があります。

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

シグナルの定義

シグナル名とタイプを検証するには、MCG が車両シグナル カタログにアクセスする必要があります。これは、VSIDL .proto 定義(パッケージ化されて MCG にアップロードされたもの)を含む protobuf FileDescriptorSet です。カタログの作成とアップロードの詳細については、車両信号カタログをご覧ください。

JSON オブジェクトの vs_version フィールドにカタログ バージョンを指定します。

"vs_version": "v1.0",

ライフサイクル トリガーを定義する

テレメトリー キャンペーンのコンテキストでは、MetricsConfig のライフサイクルによって、データが実際に記録されるタイミングが決まります。キャンペーン管理システムはデバイスに構成をデプロイして有効化しますが、ライフサイクル トリガーを使用すると、そのデプロイ内でデータが収集されるタイミングを正確に制御できます。

これにより、構成を無効にすることなく、「トリップ」(IgnitionOn から IgnitionOff)や「充電セッション」などの車両の使用パターンに合わせてデータの収集を調整できます。

  • セッション制御(開始 / 一時停止): start_trigger_name と stop_trigger_name を使用して、収集のタイミングを制御します。たとえば、車両の運転中にのみデータを収集するには、開始トリガーとして IgnitionOn を、停止トリガーとして IgnitionOff を使用します。構成はデバイス上でアクティブなままですが、停止トリガーが起動すると実質的に「一時停止」(収集と処理を停止)し、開始トリガーが再度起動したときにのみ再開します。

    重要: この操作は、収集を一時停止するだけです。論理ウィンドウや個別のデータセットを定義したり、その他の副作用を発生させたりすることはありません。収集が一時停止または再開されても、アグリゲータの値はリセットされません。

  • 1 回限りの検出(終了): 構成を 1 回だけ実行し(特定の障害コードの最初の発生を検出するなど)、キャンペーンが技術的にまだアクティブであっても、そのデバイスで永続的に非アクティブにする場合は、deactivate_trigger_name を使用します。

ライフサイクル トリガーを指定しない場合、キャンペーンによって構成が有効になるとすぐにデータの収集が開始され、キャンペーンが終了するまで継続されます。

最上位のライフサイクル フィールド(ルート オブジェクト)
任意
start_trigger_name
収集セッションを開始するトリガーの名前。stop_trigger_name なしで設定できます。
任意
stop_trigger_name
収集セッションを一時停止するトリガーの名前(車両が停止している場合など)。設定する場合は、start_trigger_name も設定する必要があります。
任意
deactivate_trigger_name
`MetricsConfig` を完全に終了して無効にするトリガーの名前。

高度な機能: カスタム proto 定義

主に次の 2 つのケースでは、vs_version だけでは、MCG が指標構成の説明にあるすべてのメッセージ タイプを理解できません。

  1. 型推論の失敗: source_identifier 形式で説明したように、source_identifier が FQIN またはカスタム名を使用している場合、MCG は型を推論できません。
  2. カスタム メッセージ: 指標構成の説明では、vs_version で指定された VSIDL カタログにない protobuf メッセージが使用されています。これは、カスタム レポート形式の 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

構成済みの vs_version にない data_source_message_types または message_builder で使用されるメッセージ タイプの定義を指定します。

base64 でエンコードされた descriptorpb.FileDescriptorSet を descriptor_protos 配列に渡します。Protobuf コンパイラ protoc を使用して、.proto ファイルからこれを生成します。

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

例: 完全な構成の説明

前のセクションでは、この例のすべてのコンポーネントを定義しました。この例では、1 分間に観測された平均車両速度を含むレポートを 1 分ごとに生成します。

関連するコンポーネントは次のとおりです。

  • 速度データを 1 秒に 1 回まで取得するデータソース(SpeedSource)。
  • SpeedSource がデータを送信したときに配信されるデータトリガー(OnNewSpeed)。
  • 60 秒ごとに起動する定期的なトリガー(EveryMinute)。
  • OnNewSpeed を使用して平均速度の計算、読み取り値のカウント、最近の値の保存を行い、読み取り時にリセットする集計ツール(SpeedAggregator)。
  • EveryMinute を使用して、SpeedAggregator の平均速度とカウントを含むレポートをトリガーするレポート構成(MinuteReport)。
  • 指標構成を識別し、シグナル定義に使用する VSIDL カタログを指定する最上位フィールド(existing_uuid、vs_version)。

これらの要素を組み合わせることで、指標構成の完全な説明が形成されます。

{
  "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) 丸め関数
オペレーションの順序 () 優先順位の標準的なグループ化