GNMI / TELEMETRY_CLIENT テーブル¶
概要¶
SONiC の gNMI サブシステムは dial-in サーバ (クライアントからの Subscribe/Get/Set を受け付ける) と dial-out クライアント (テレメトリデータを外部コレクターへ push する) の 2 コンポーネントから構成される。いずれも docker-sonic-gnmi コンテナ内で動作し、それぞれの設定を CONFIG_DB から読み出す。
データフロー (自動生成)¶
flowchart LR
GNMI_DB[("CONFIG_DB\nGNMI / GNMI_CLIENT_CERT\nTELEMETRY_CLIENT")]
SH["gnmi-native.sh\n(起動スクリプト)"]
TEL["/usr/sbin/telemetry\n(gNMI server)"]
DC["/usr/sbin/dialout_client_cli\n(dial-out client)"]
GNMI_DB --> SH --> TEL
GNMI_DB --> DC
凡例
CONFIG_DB から SAI までの典型経路を docs/reference/config-db-orch-map.md から機械生成したミニ図。詳細・例外は本ページ本文と対応表を参照。
テーブル: GNMI|certs — TLS 証明書パス¶
key 構造¶
フィールド¶
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
ca_crt |
string (.cer パス) |
なし (省略可) | CA 証明書のローカルパス。クライアント証明書検証に使用 |
server_crt |
string (.cer パス) |
なし (必須) | サーバ TLS 証明書のパス |
server_key |
string (.key パス) |
なし (必須) | サーバ TLS 秘密鍵のパス |
server_crt / server_key が未設定かつ noTLS=false の場合、telemetry プロセスは起動時にエラー終了する1。ca_crt は省略可能だが、省略すると client_auth=cert モードが無効化される2。
コード由来デフォルト:
ca_crt: デフォルトなし。未設定時、起動スクリプトは--ca_crtオプションを渡さない。telemetryflag デフォルト:""(telemetry.go:198)server_crt: デフォルトなし。未設定時に TLS モードでは起動失敗 (telemetry.go:253-257)server_key: デフォルトなし。未設定時に TLS モードでは起動失敗 (telemetry.go:255-257)
証明書シンボリックリンクのデフォルトパス (コード由来):
| パラメータ | flag デフォルト |
|---|---|
ca_cert_lnk |
/keys/ca_cert.lnk |
server_cert_lnk |
/keys/server_cert.lnk |
server_key_lnk |
/keys/server_key.lnk |
テーブル: GNMI|gnmi — gNMI サーバ設定¶
key 構造¶
フィールド¶
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
port |
uint16 (inet:port-number) | 8080 (GNMI エントリ未設定時) |
gNMI サーバ TCP listen ポート |
log_level |
uint8 (0–100) | 2 |
glog ログレベル (-v 値) |
client_auth |
boolean | false |
クライアント証明書を要求するか否か |
user_auth |
string (password/jwt/cert/none) |
"cert" (gnmi docker) |
認証モード |
threshold |
uint32 | 100 |
同時接続最大数 |
idle_conn_duration |
uint32 (秒) | 5 |
アイドル接続クローズまでの秒数 (0 = 無限) |
save_on_set |
boolean | false |
Set RPC 実行時に startup-config を自動保存するか否か |
enable_crl |
boolean | false |
証明書失効リスト (CRL) チェックを有効化 |
crl_expire_duration |
uint32 (秒) | 86400 (24 時間) |
CRL キャッシュの有効期間 |
コード由来デフォルト詳細 (各フィールドの決定経路):
port¶
# gnmi-native.sh:64-72
if [ -z "$GNMI" ]; then
PORT=8080
else
PORT=$(extract_field "$GNMI" '.port')
if ! [[ $PORT =~ ^[0-9]+$ ]]; then
exit $INCORRECT_TELEMETRY_VALUE
fi
fi
8080。エントリが存在するが port キーが欠けている場合は起動エラー (exit 2)。
log_level¶
# gnmi-native.sh:81-86
if [[ $LOG_LEVEL =~ ^[0-9]+$ ]]; then
TELEMETRY_ARGS+=" -v=$LOG_LEVEL"
else
TELEMETRY_ARGS+=" -v=2" # デフォルト
fi
telemetry.go:176): fs.Int("v", 2, ...). 負値の場合もコード側で 2 に補正 (telemetry.go:247-250).
client_auth¶
# gnmi-native.sh:76-79
if [ -z $CLIENT_AUTH ] || [ $CLIENT_AUTH == "false" ]; then
TELEMETRY_ARGS+=" --allow_no_client_auth"
fi
"false" → --allow_no_client_auth 付与 (証明書なしでも接続可)。
user_auth¶
未設定 (null) の場合 "cert" にフォールバック。cert モード選択時は --config_table_name GNMI_CLIENT_CERT も自動付与。
threshold¶
flag デフォルト (telemetry.go:187): fs.Int("threshold", 100, ...).
スクリプト側も null / GNMI エントリ未設定時に --threshold 100 を付与。
idle_conn_duration¶
flag デフォルト (telemetry.go:190): fs.Int("idle_conn_duration", 5, ...).
スクリプト側も null / GNMI エントリ未設定時に --idle_conn_duration 5 を付与。
save_on_set¶
# telemetry.sh:110-113
readonly SAVE_ON_SET=$(echo $GNMI | jq -r '.save_on_set // empty')
if [ ! -z "$SAVE_ON_SET" ]; then
TELEMETRY_ARGS+=" --with-save-on-set=$SAVE_ON_SET"
fi
empty) はフラグ非付与 → flag デフォルト false (telemetry.go:189).
enable_crl¶
user_auth == "cert" ブロック内でのみ評価。"true" でない場合 --enable_crl フラグは付与されない。
flag デフォルト (telemetry.go:193): false.
crl_expire_duration¶
未設定時はフラグ非付与 → flag デフォルト 86400 秒 (telemetry.go:194).
テーブル: GNMI_CLIENT_CERT — クライアント証明書認可マッピング¶
key 構造¶
<cert_cname> はクライアント証明書の CommonName (CN)。
フィールド¶
| フィールド | 型 | 説明 |
|---|---|---|
role |
list\<string> | このクライアントに付与するロール (readwrite / readonly / noaccess) |
user_auth=cert 時、clientCertAuth.go の PopulateAuthStructByCommonName() が証明書 CN をキーにこのテーブルを参照してロールを決定する3。
コード由来デフォルト: エントリが存在しない場合、認証は通過するが role が空 → ReadOnlyMode として扱われる (アクセス制限は実装依存)。
テーブル: TELEMETRY_CLIENT — Dial-out テレメトリクライアント設定¶
Dial-out (push 型) テレメトリの設定。CONFIG_DB キースペース通知 (__keyspace@*__:TELEMETRY_CLIENT*) を監視してリアルタイムに設定変更を反映する。
key 構造¶
TELEMETRY_CLIENT|Global
TELEMETRY_CLIENT|DestinationGroup_<name>
TELEMETRY_CLIENT|Subscription_<name>
TELEMETRY_CLIENT|Global¶
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
src_ip |
IP address | "" (空文字列) |
送信元 IP アドレス |
retry_interval |
uint32 (秒) | 30 |
接続再試行間隔 |
encoding |
string | JSON_IETF (固定) |
エンコーディング (現在変更不可) |
unidirectional |
boolean | true (固定) |
サーバ応答なし一方向モード (現在変更不可) |
コード由来デフォルト:
// dialout_client.go:19-25
clientCfg = dc.ClientConfig{
SrcIp: "",
RetryInterval: 30 * time.Second,
Encoding: gpb.Encoding_JSON_IETF,
Unidirectional: true,
}
encoding と unidirectional は DB から読んでも強制上書きされる (dialout_client.go:501-505)。
TELEMETRY_CLIENT|DestinationGroup_\<name>¶
| フィールド | 型 | 説明 |
|---|---|---|
dst_addr |
string (IP:PORT,...) |
送信先アドレス一覧 (カンマ区切り) |
TELEMETRY_CLIENT|Subscription_\<name>¶
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
dst_group |
string | なし (必須) | 参照する DestinationGroup 名 |
report_type |
string (periodic/stream/once) |
stream |
レポート種別 |
report_interval |
uint32 (ミリ秒) | 5000 |
定期レポート間隔 (periodic モード時) |
path_target |
string | なし (省略可) | gNMI パスターゲット DB 名 |
paths |
string (カンマ区切り) | なし (省略可) | サブスクライブするパスリスト |
コード由来デフォルト:
// dialout_client.go:581-582
cs := clientSubscription{
interval: 5000, // default to 5000 milliseconds
name: name,
}
dst_group が空の場合、クライアントは起動しない (silent no-op, dialout_client.go:622-625)。
VRF / SmartSwitch 自動連携¶
gnmi-native.sh は CONFIG_DB から直接 VRF / SmartSwitch 情報を取得し、起動引数に自動付与する。GNMI テーブルに設定フィールドは存在しない。
| 条件 | 付与されるフラグ |
|---|---|
DEVICE_METADATA\|localhost.subtype == "SmartSwitch" |
--zmq_port 8100 |
MGMT_VRF_CONFIG\|vrf_global.mgmtVrfEnabled == "true" |
--vrf mgmt |
制約¶
portは YANG 型inet:port-number(1–65535)log_levelは YANG 型uint8(0–100)user_authは YANG patternpassword|jwt|cert|noneに限定ca_crt/server_crtの YANG pattern:(/[a-zA-Z0-9_-]+)*/([a-zA-Z0-9_-]+).cerserver_keyの YANG pattern:(/[a-zA-Z0-9_-]+)*/([a-zA-Z0-9_-]+).key
購読者¶
gnmi-native.sh→/usr/sbin/telemetry(docker-sonic-gnmi): gNMI server (dial-in)dialout_client_cli(docker-sonic-gnmi): dial-out クライアント、TELEMETRY_CLIENTをキースペース通知で監視
関連 CONFIG_DB / YANG / CLI¶
- 関連 CONFIG_DB:
DEVICE_METADATA,MGMT_VRF_CONFIG - 関連 YANG:
sonic-gnmi - 関連 CLI:
config gnmi
例外条件・特殊挙動¶
| 条件 | 挙動 |
|---|---|
GNMI エントリ未設定かつ port 未指定 |
port=8080 でサーバ起動 |
GNMI エントリ存在するが port キー欠落 |
起動スクリプトが exit 2 で異常終了 |
server_crt / server_key 未設定 (TLS モード) |
telemetry プロセスがエラー終了 |
ca_crt 未設定かつ user_auth=cert |
cert モードが自動無効化 (allow_no_client_auth 付与) |
user_auth 未設定 (null) |
gnmi docker では "cert" にフォールバック |
log_level が負値 |
コード側で 2 に補正 |
idle_conn_duration=0 |
無限待機 (接続を閉じない) |
encoding を DB で変更 |
読み取られるが JSON_IETF に強制上書き |
unidirectional を DB で変更 |
読み取られるが true に強制上書き |
Subscription_* で dst_group 未設定 |
クライアント起動せず silent no-op |