gNMI を使用したテレメトリ データのサブスクライブ
gNMI プロトコルは、テレメトリ データをサブスクライブするための RPC Subscribe
を定義します。テレメトリ コレクターは、この RPC を使用して、状態と構成データの更新をネットワーク デバイスに要求します。
新しいサブスクリプションの要求は、1 つ以上のリソース パスを含む SubscribeRequest
メッセージ内にカプセル化されます。サブスクライブされたパスは、ターゲットネットワークデバイス上の特定のデータインスタンスに関連しています。要求には、OpenConfigまたはネイティブJunosスキーマに基づいたパスを含めることができます。
サブスクリプション要求には、次のいずれかのモードも含める必要があります。
-
ONCE
- データの 1 回限りの要求。 -
POLL
- データの定期的なオンデマンド検索用。 -
STREAM
- 指定されたトリガーに従ってデータをストリーミングする有効期間の長いサブスクリプション。
STREAM
モードのサブスクリプションでは、次のいずれかのサブモードを指定する必要があります。
-
ON_CHANGE
- データの更新は、データ項目の値が変更されたときにのみ送信されます。 -
SAMPLE
- データの更新は、サブスクリプション要求で指定された間隔期間に基づいて、サンプル間隔ごとに 1 回送信されます。デフォルトのサンプル間隔は 30 秒です。 -
TARGET_DEFINED
- サブスクリプション要求を受信するネットワークデバイスは、リーフごとにデータの最適な配信タイプを決定します。メッセージ内に指定されたパスがイベント ドリブン データを参照している場合は、ON_CHANGE
サブスクリプションが作成される可能性があります。カウンター値を表すデータの場合、SAMPLE
サブスクリプションが作成されることがあります。手記:構成パスに対する
TARGET_DEFINED
サブスクリプション要求は、ON_CHANGE
要求としてのみ扱われます。
ONCE
、ON_CHANGE
、およびSAMPLE
サブスクリプションの場合、コレクターは、サブスクリプション内のパスの現在の状態を含む初期更新を要求できます。この更新は初期同期とも呼ばれ、次の理由で役立ちます。
-
コレクターには、そのセンサーパスのデバイス上のすべてのフィールドの現在の状態の完全なビューがあります。
-
イベント駆動型データ (
ON_CHANGE
) は、次のイベントが検出される前に、少なくとも 1 回はコレクターによって受信されます。このようにして、コレクターは次のイベントが発生する前にデータの状態を認識します。 -
パケット転送エンジン センサーは、通常はゼロ抑制のためにストリーミング データに表示されないゼロ カウンター値を含むセンサーが送信されます。これにより、各ラインカードのすべてのフィールドがコレクターに認識されます。
ターゲットデバイスは、サブスクリプション要求に SubscribeResponse
メッセージで応答します。サブスクリプション要求で初期同期が呼び出された場合、ターゲットはデータを送信し、その後に sync_response
フラグが true
に設定された応答メッセージを送信します。初期同期の後、ターゲットデバイスはサブスクリプションモードに従ってパスの更新を続行します。
SubscribeRequest
メッセージには、updates_only
というフラグが含まれています。このフラグを true
に設定すると、ターゲット デバイスは初期同期を送信せず、次のような後続の更新のみを送信します。
-
SAMPLE
モードでサブスクリプションをSTREAM
する場合、更新は次のサンプル間隔で送信されます。 -
ON_CHANGE
モードのSTREAM
サブスクリプションの場合、次回の値が変更されたときに更新が送信されます。 -
ONCE
サブスクリプションの場合、sync_response
がfalse
に設定された状態でSubscribeResponse
のみが送信され、サブスクリプションは閉じられます。 -
TARGET_DEFINED
サブスクリプションは構成パスのON_CHANGE
として扱われ、次の値の変更時に更新が送信されます。
SubscribeRequest
メッセージとSubscribeResponse
メッセージの内容は、gnmi.proto ファイルで定義されます。サブスクライブ RPC およびサブスクリプション モードの詳細については、「gNMI 仕様: テレメトリ更新プログラムのサブスクライブ」の gNMI 仕様を参照してください。
構成パスには、次の制限が適用されます。
-
POLL
サブスクリプションはサポートされていません。 -
プレフィックス パスは、更新メッセージに含まれません。
-
gNMI 応答は、
active/inactive
、insert before/after
、comment/annotate
、protect/unprotect
などのジュニパー固有のメタデータ操作ではサポートされていません。これらはメッセージに表示されることがありますが、無効です。 -
SubscribeRequest
でサポートされていないパラメーターには、suppress_redundant
、heartbeat_level
、allow_aggregation
、およびqos
があります。 -
PROTO エンコーディングのみがサポートされています。
-
SubscribeRequest
メッセージの拡張子はサポートされていません -
サブスクリプション パスのフィルター処理は、キー レベルでのみサポートされます。
以下のコミットバリアントは、
ON_CHANGE
およびTARGET_DEFINED
サブスクリプションではサポートされていません。commit at
、commit prepare/activate
、バッチ コミット。からのコミットはサポートされていません。
edit dynamic
およびedit private
編集モードまたは構成モード。-
プレゼンス コンテナの更新メッセージは送信されません。
-
識別子またはキーが構成されている唯一のリーフであるサブスクリプション リストの場合、更新メッセージが表示されない場合があります。
例
次の例は、gNMI クライアントとターゲット デバイスによって protobuf 形式で行われたサブスクリプション要求と応答を示しています。
例: ONCE モード
次の例は、gNMI クライアントから protobuf 形式で送信されるサブスクリプション要求を示しています。サブスクリプション モードは ONCE
、OpenConfig リソース パスは /system/aaa/authentication/users です。
root@controller:~# /usr/local/bin/gnmic sub -a 10.225.0.0:32767 --mode once --path /system/aaa/authentication/users -u <username> -p <password> --format prototext
ターゲットは 1 回限りの更新で応答します。
update: { timestamp: 1676294840 update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "username" } } val: { string_val: "test1" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "password" } } val: { string_val: "$ABC123" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "role" } } val: { string_val: "superuser" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test2" } } elem: { name: "config" } elem: { name: "role" } } val: { string_val: "superuser" } } }
例: ON_CHANGE
次の例は、STREAM
モードと ON_CHANGE
サブモードでのサブスクリプション要求を示しています。OpenConfig リソースのパスは /system/aaa/authentication/users/user[username="test1"]:
root@controller:~# /usr/local/bin/gnmic sub -a 10.225.0.0:32767 --mode stream --stream-mode on-change --path /system/aaa/authentication/users -u <username> -p <password> --format prototext
サブスクリプション要求時の OpenConfig 構成:
user@root> show configuration openconfig-system:system aaa authentication | display set set openconfig-system:system aaa authentication users user test1 config password $ABC123 set openconfig-system:system aaa authentication users user test1 config role superuser
応答メッセージの例は、構成パスの値と、true
に設定された sync_response
フラグを示しています。
update: { timestamp: 1676311979 update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "password" } } val: { string_val: "$ABC123" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "role" } } val: { string_val: "superuser" } } } sync_response: true
サブスクライブされたパスに対して以下の構成変更が加えられます。
-
test1
のユーザー名を追加します。 -
test1
のパスワードを削除します。
ターゲットデバイスは、応答として次の更新を送信します。
update: { timestamp: 1676312428 update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "username" } } val: { string_val: "test1" } } delete: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "password" } } }
例: サンプル
次の例は、STREAM
モードと SAMPLE
サブモードでのサブスクリプション要求を示しています。OpenConfig リソースのパスは /system/aaa/authentication/users/user[username="test1"]:
root@controller:~# /usr/local/bin/gnmic sub -a 10.225.0.0:32767 --mode stream --stream-mode sample --sample-interval 5s --path /system/aaa/authentication/users -u <username> -p <password> --format prototext
サブスクリプション要求時の OpenConfig 構成:
user@root> show configuration openconfig-system:system aaa authentication | display set set openconfig-system:system aaa authentication users user test1 config username test1 set openconfig-system:system aaa authentication users user test1 config password "$ABC123" set openconfig-system:system aaa authentication users user test1 config role superuser
応答メッセージの例では、 sync_response
フラグを true
に設定して送信された最初の更新と、5 秒間隔で送信される後続の更新を示しています。
update: { timestamp: 1676295454 update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "username" } } val: { string_val: "test1" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "password" } } val: { string_val: "$ABC123" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "role" } } val: { string_val: "superuser" } } } sync_response: true update: { timestamp: 1676295459 update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "username" } } val: { string_val: "test1" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "password" } } val: { string_val: "$ABC123" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "role" } } val: { string_val: "superuser" } } } update: { timestamp: 1676295464 update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "username" } } val: { string_val: "test1" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "password" } } val: { string_val: "$ABC123" } } update: { path: { elem: { name: "system" } elem: { name: "aaa" } elem: { name: "authentication" } elem: { name: "users" } elem: { name: "user" key: { key: "username" value: "test1" } } elem: { name: "config" } elem: { name: "role" } } val: { string_val: "superuser" } } }