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

このガイドでは、Metrics Configuration Generator(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 サービスの検出に使用される識別子。詳細については、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
パブリッシュ/サブスクライブのみ。メッセージ間の最小間隔を指定してメッセージの頻度を調整する負でない整数(ミリ秒)。
省略可
fetch_last_message
(デフォルト: false
パブリッシュ/サブスクライブのみ。ブール値。true の場合、接続時に最新のメッセージを取得します。

すべてのデータソース タイプですべてのオプションを使用できるわけではありません。詳細については、データソース統合ガイドをご覧ください。

source_identifier の形式

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

MCG は、単位型名の形式を使用する場合にのみ、source_identifier から protobuf メッセージ型を推測します。FQIN またはカスタム名(Configurable Publisher Registry から)を使用している場合、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
動作を定義するには、これらのフィールドのいずれか 1 つを指定する必要があります。

データトリガー

SUBSCRIPTION データソースが新しいメッセージ(コンセプト)を提供したときに発生します。

data オブジェクトのフィールド(トリガー内)
source_name このトリガーがリッスンする data_sourcename

例: データ トリガー

この例では、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
  }
}

条件付きトリガー

式(コンセプト)の評価に基づいて発火します。評価を開始するには、1 つ以上の親トリガーが必要です。これは、式内のデータソースまたはアグリゲータのデータトリガー、またはデータをポーリングする定期的なトリガーであることがよくあります。

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

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

condition_type オブジェクトのフィールド(相互に排他的)
is_true

is_false
ブール式がそれぞれ true または false と評価されたときに発生します。
rising_edge

数値の場合、値が増加したときに発火します。式がブール値の場合、false から true に変更されたときに起動します。

rising_options オブジェクトを含めることができます(Edge オプションを参照)。

falling_edge

数値の場合、値が減少したときに発火します。式がブール値の場合、true から false に変更されたときに起動します。

falling_options オブジェクトを含めることができます(Edge オプションを参照)。

all_changes

式の結果が前の値と異なる場合に発生します。エッジ オプションが設定されている場合、数値とブール値のみがサポートされます。

rising_optionsfalling_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 集計関数。

  • avgminmaxsumstddev: 標準的な数学統計。
  • count: このアグリゲータがトリガーされた回数をカウントします。
  • delta: 現在の値と前の値の差。
  • vector: 値のリスト(リングバッファ)を作成します。
  • none: 生の値を渡します。
expression 集計の入力式。count を除くすべての集計タイプに必須。
max_length @type: "vector" のみ。ベクトルサイズを制限してリングバッファを作成する省略可能な整数。

例: アグリゲータ

この例では、1 分間のレポート間の統計情報を計算します。このアグリゲータは OnNewSpeed によってトリガーされ、平均速度(avg)を計算し、読み取り回数(count)をカウントして、最後の 5 つの速度値(vector)を保存します。reset_on_gettrue に設定します。これにより、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_sourcesaggregatorstriggersreport_configs 配列に加えて、指標構成の説明にはシグナル カタログへの参照が必要です。特定の UUID を割り当てて収集ライフサイクルを管理するためのオプション フィールドを含めることもできます。

UUID を設定する

MetricsConfig には Universally Unique Identifier(UUID)が必要です。existing_uuid を指定すると、MCG はそれを使用します。指定しない場合は、ランダムに作成されます。デプロイとツール間で整合性を保つために、existing_uuid を指定します。

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

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

シグナルの定義

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

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

"vs_version": "v1.0",

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

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

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

  • セッション制御(開始/一時停止): start_trigger_namestop_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 つの主なケースでは、MCG が指標構成の説明にあるすべてのメッセージ タイプを理解するには、vs_version だけでは不十分です。

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

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

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

例: 構成の説明を完了する

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

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

  • 速度データを 1 秒に 1 回まで取得するデータソース(SpeedSource)。
  • SpeedSource がデータを送信したときに起動するデータトリガー(OnNewSpeed)。
  • 60 秒ごとに起動する定期的なトリガー(EveryMinute)。
  • OnNewSpeed を使用して平均速度を計算し、読み取りをカウントして、最近の値を保存し、読み取り時にリセットするアグリゲータ(SpeedAggregator)。
  • EveryMinute を使用して、SpeedAggregator からの平均速度とカウントを含むレポートをトリガーするレポート構成(MinuteReport)。
  • 指標構成を識別し、シグナル定義に使用する VSIDL カタログを指定するトップレベル フィールド(existing_uuidvs_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": "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 のすべての項目が 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) 丸め関数
オペレーションの順序 () 優先順位の標準グループ化