gNMI (gRPC Network Management Interface) là giao thức của OpenConfig để đọc, ghi cấu hình và stream telemetry qua gRPC (HTTP/2, thường có TLS). Dữ liệu được mô tả bằng YANG model, và mỗi giá trị được định vị bằng một path dẫn theo cây YANG đó.
Luồng RPC
sequenceDiagram participant C as Client (gnmic, Telegraf) participant R as Router (gNMI server) C->>R: CapabilitiesRequest R-->>C: models + encodings hỗ trợ C->>R: GetRequest(path, type, encoding) R-->>C: GetResponse(notification) C->>R: SetRequest(update, replace, delete) R-->>C: SetResponse (áp dụng nguyên tử) C->>R: SubscribeRequest(STREAM, SAMPLE 10s) R-->>C: Notification ... (liên tục) R-->>C: sync_response
Bốn RPC
| RPC | Mục đích | Ghi chú |
|---|---|---|
Capabilities |
Liệt kê model YANG (tên, org, version), encoding, phiên bản gNMI | Luôn chạy đầu tiên để biết thiết bị hỗ trợ gì |
Get |
Lấy snapshot | type: ALL, CONFIG, STATE, OPERATIONAL |
Set |
Ghi cấu hình | Một request gồm nhiều delete / replace / update, thiết bị áp dụng tất cả hoặc không gì cả |
Subscribe |
Telemetry | Mode STREAM, ONCE, POLL |
Subscribe mode
| Mode | Hành vi | Dùng khi |
|---|---|---|
STREAM + SAMPLE |
Gửi đều theo sample_interval |
Counter interface, CPU, memory |
STREAM + ON_CHANGE |
Gửi khi giá trị thay đổi | Trạng thái oper-status, BGP session state |
STREAM + TARGET_DEFINED |
Thiết bị tự chọn sample hay on-change theo từng leaf | Không chắc leaf nào hỗ trợ on-change |
ONCE |
Gửi một lần rồi kết thúc | Thay cho Get trên thiết bị chỉ hỗ trợ Subscribe |
POLL |
Client gửi poll thì thiết bị mới trả | Ít dùng |
Update, replace, delete trong Set
| Thao tác | Ý nghĩa |
|---|---|
update |
Merge giá trị vào path, giữ phần còn lại |
replace |
Thay toàn bộ cây con tại path (phần không khai báo bị xoá hoặc về mặc định) |
delete |
Xoá path |
YANG: OpenConfig hay native
| OpenConfig | Native (vendor) | |
|---|---|---|
| Ví dụ module | openconfig-interfaces, openconfig-network-instance, openconfig-bgp |
IOS XR: Cisco-IOS-XR-infra-statsd-oper, Cisco-IOS-XR-um-*-cfg. Junos: path theo cây CLI /interfaces/interface/..., /junos/system/... |
| Đa vendor | Cùng path cho IOS XR, Junos, EOS... | Mỗi vendor mỗi kiểu |
| Độ phủ | Thiếu một số tính năng riêng | Phủ gần đủ tính năng |
| Ổn định | Có thể khác version giữa các OS release (deviation) | Bám theo OS release |
| Nên dùng | Dashboard/alert dùng chung nhiều vendor | Tính năng không có trong OpenConfig, counter chi tiết |
Model nào được hỗ trợ và deviation của từng release: IOS XR xem repo YangModels/yang thư mục vendor/cisco/xr/<release>. Junos xem Juniper YANG Data Model Explorer. Nhanh nhất vẫn là gnmic capabilities trên chính thiết bị.
Cú pháp path
Path gNMI là chuỗi các phần tử, mỗi phần tử có thể có key trong []:
/interfaces/interface[name=GigabitEthernet0/0/0/1]/state/counters/in-octets
/network-instances/network-instance[name=default]/protocols/protocol[identifier=BGP][name=default]/bgp/neighbors/neighbor[neighbor-address=192.0.2.2]/state| Thành phần | Cú pháp | Ví dụ |
|---|---|---|
| Phần tử | /elem |
/interfaces/interface |
| Key | [key=value], nhiều key viết liên tiếp |
[identifier=BGP][name=default] |
| Wildcard key | [key=*] |
/interfaces/interface[name=*]/state/oper-status |
| Wildcard phần tử | * |
/interfaces/interface/*/counters (tuỳ thiết bị hỗ trợ) |
| Origin | origin:path hoặc trường origin riêng |
openconfig:/interfaces, Cisco-IOS-XR-infra-statsd-oper:infra-statistics |
| Prefix | Phần chung tách riêng khỏi path | prefix /interfaces/interface[name=Gi0/0/0/1], path state/counters |
Tên interface có / vẫn để nguyên trong [] vì nằm trong key. Khi gõ trên shell, bọc path trong nháy đơn để [ ] * không bị shell xử lý.
Path IOS XR native thường bắt đầu bằng <module>:<container>, ví dụ:
Cisco-IOS-XR-infra-statsd-oper:infra-statistics/interfaces/interface/latest/generic-counters
Cisco-IOS-XR-wdsysmon-fd-oper:system-monitoring/cpu-utilizationEncoding
| Encoding | Mô tả | Ghi chú |
|---|---|---|
JSON |
JSON thường | |
JSON_IETF |
JSON theo RFC 7951 (có tiền tố module ở key khi đổi namespace) | Phổ biến cho Get/Set trên IOS XR |
PROTO |
Giá trị scalar dạng protobuf TypedValue |
Gọn nhất cho Subscribe tần suất cao |
BYTES, ASCII |
Ít dùng |
Encoding nào được hỗ trợ khác nhau theo vendor và release: kiểm tra trường supported_encodings trong Capabilities, đừng đoán.
Khi nào dùng
- gNMI Subscribe thay SNMP polling cho counter tần suất cao (10s trở xuống) và trạng thái on-change. Xem Telegraf gNMI input và Model-driven telemetry IOS XR.
- gNMI Set khi muốn đẩy config có cấu trúc, nguyên tử, cùng model với telemetry. Nếu thiết bị hay quy trình đã chuẩn hoá NETCONF (candidate, commit confirmed), dùng NETCONF với ncclient.
- CLI/SSH vẫn hợp cho lệnh show một lần hoặc thiết bị cũ không có gNMI.
Lệnh thực tế: gnmic cheatsheet.