Sổ tay kỹ thuật

gNMI telemetry – không có dữ liệu, path sai, TLS, encoding

troubleshooting#gnmi#telemetry#iosxr#junos· cập nhật 2026-11-06

Khoanh vùng khi subscribe gNMI không ra dữ liệu - kết nối/TLS, xác thực, path và origin, encoding, sample interval và đồng hồ thiết bị.

Sửa trang này
Mục lục

Triệu chứng chính: collector (Telegraf inputs.gnmi, gnmic) kết nối lỗi code = Unavailable, x509: ..., Unauthenticated; hoặc subscribe thành công nhưng không có update, thiếu interface, chu kỳ dữ liệu khác cấu hình, hoặc Grafana không thấy điểm nào dù collector đang nhận. Nguyên tắc: thử bằng gnmic từ đúng máy collector trước, rồi mới sửa config Telegraf.

Lỗi thường gặp

Triệu chứng Nguyên nhân Cách xử lý
context deadline exceeded khi kết nối Không tới được port gRPC: sai port, ACL/firewall, gRPC chạy trong VRF management nc -vz <ip> <port> từ collector; kiểm tra VRF/ACL trên router
tls: first record does not look like a TLS handshake Collector dùng TLS, router đang plaintext (no-tls / clear-text) Dùng --insecure (gnmic) / tắt enable_tls (Telegraf), hoặc bật TLS trên router
error reading server preface: EOF / connection closed before server preface received Ngược lại: router bật TLS, collector plaintext Bật TLS phía collector (--tls-ca hoặc tạm --skip-verify)
x509: certificate signed by unknown authority Collector không tin CA ký cert của router (thường là cert tự ký) Chỉ định CA bằng --tls-ca / tls_ca; lab thì --skip-verify / insecure_skip_verify = true
x509: certificate is valid for ..., not 198.51.100.11 / doesn't contain any IP SANs Kết nối bằng IP nhưng cert chỉ có hostname trong SAN Kết nối bằng hostname trong cert, --tls-server-name, hoặc cấp lại cert có IP SAN
x509: certificate has expired or is not yet valid Cert hết hạn hoặc đồng hồ lệch Kiểm tra NTP hai phía, cấp lại cert
code = Unauthenticated Sai user/pass, user không có quyền gRPC/AAA Thử SSH bằng cùng user; kiểm tra AAA/task group trên router
code = Unimplemented / InvalidArgument nhắc tới encoding Thiết bị không hỗ trợ encoding đó Xem danh sách encoding trong capabilities, đổi proto ↔ json_ietf
code = NotFound / InvalidArgument với path Sai path, sai origin, hoặc model không có trên bản OS này gnmic get từng mức path; thử bỏ hoặc đổi origin
Subscribe OK nhưng không có update nào Path đúng cú pháp nhưng rỗng (không có instance), hoặc on_change trên giá trị không đổi Thử --mode once; với on_change chỉ có bản đầu và khi giá trị thay đổi
Chỉ có vài interface Path có key cố định (interface[name=Hu0/0/0/0]) hoặc interface down không có counter Dùng interface[name=*] hoặc bỏ key
Dữ liệu đến thưa hơn sample_interval Thiết bị áp chu kỳ tối thiểu riêng hoặc bị quá tải Tăng sample_interval (≥ 10s cho counter), tách path lớn
sample_interval = 0 cho kết quả khác nhau giữa hãng Spec gNMI: 0 nghĩa là thiết bị tự chọn chu kỳ nhỏ nhất nó hỗ trợ Luôn đặt giá trị cụ thể
Collector nhận nhưng Grafana trống Timestamp thiết bị lệch (NTP sai) nên điểm nằm ngoài time range; hoặc measurement/field tên khác dự kiến So timestamp trong output gnmic với date -u; xem tên thật bằng telegraf --test
Mất kết nối định kỳ Session gRPC bị giới hạn số lượng / idle timeout của firewall Giảm số collector trùng lặp, đặt redial ở Telegraf, nới timeout firewall

Các bước khoanh vùng

  1. Mạng: tới được IP:port gRPC từ collector chưa (nc -vz).
  2. TLS: router đang plaintext hay TLS, cert có SAN đúng không (openssl s_client).
  3. Xác thực và năng lực: gnmic capabilities cho biết user/pass đúng, model và encoding hỗ trợ.
  4. Path: gnmic get với path cần dùng; nếu lỗi, lùi lên mức cha để tìm chỗ sai.
  5. Subscribe: --mode once trước, rồi stream + sample; so chu kỳ thực tế với cấu hình.
  6. Phía thiết bị: xem subscription và lỗi trên router.
  7. Collector → kho: telegraf --test, rồi query kho dữ liệu với time range rộng.

Cú pháp path và origin xem gNMI và YANG path; các lệnh gnmic khác xem gnmic cheatsheet.

Cấu hình đúng

Telegraf với TLS (router dùng cert do CA nội bộ ký):

/etc/telegraf/telegraf.d/gnmi.conf
[[inputs.gnmi]]
  addresses = ["pe1-hni.example.net:57400"]   # hostname khớp SAN trong cert
  username = "${NET_USER}"
  password = "${NET_PASS}"
  encoding = "proto"
  redial = "10s"
  enable_tls = true
  tls_ca = "/etc/telegraf/pki/ca.pem"
  # insecure_skip_verify = true                # chỉ dùng tạm để khoanh vùng
 
  [[inputs.gnmi.subscription]]
    name = "interfaces"
    origin = "openconfig"
    path = "/interfaces/interface/state/counters"
    subscription_mode = "sample"
    sample_interval = "10s"

IOS XR có thể dùng cert tự ký do router sinh ra khi bật TLS cho gRPC (thường nằm ở /misc/config/grpc/ems.pem); chép file này về collector làm tls_ca và kết nối bằng tên/IP có trong cert. Cấu hình phía router xem MDT trên IOS XR và Telegraf gNMI.

Kiểm tra nhanh

export GNMIC_USERNAME=$NET_USER GNMIC_PASSWORD=$NET_PASS   # gnmic đọc biến GNMIC_<FLAG>
T=198.51.100.11:57400
 
# 1. Mạng
nc -vz 198.51.100.11 57400
 
# 2. TLS: xem cert router trả về, SAN và hạn dùng
openssl s_client -connect $T -showcerts </dev/null 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates -ext subjectAltName
 
# 3. Capabilities: model + encoding hỗ trợ
gnmic -a $T --insecure capabilities                       # router plaintext
gnmic -a $T --tls-ca ca.pem capabilities                  # router TLS, kiểm cert
gnmic -a $T --skip-verify capabilities                    # router TLS, bỏ kiểm cert (khoanh vùng)
 
# 4. Path
gnmic -a $T --insecure -e json_ietf get --path "openconfig:/interfaces/interface[name=*]/state/oper-status"
 
# 5. Subscribe một lần, rồi stream theo chu kỳ
gnmic -a $T --insecure -e proto subscribe --mode once \
  --path "/interfaces/interface/state/counters"
gnmic -a $T --insecure -e proto subscribe --mode stream --stream-mode sample \
  --sample-interval 10s --path "/interfaces/interface[name=*]/state/counters/in-octets" --format event
 
# Xem request thật gửi đi và log gRPC
gnmic -a $T --insecure --print-request --debug subscribe --mode once --path "/system/state"
 
# 7. Collector
telegraf --config /etc/telegraf/telegraf.conf --config-directory /etc/telegraf/telegraf.d \
  --input-filter gnmi --test --test-wait 30

Trên thiết bị:

! IOS XR: subscription gNMI dial-in hiện với tên GNMI__<số>
show running-config grpc
show telemetry model-driven subscription
show telemetry model-driven subscription <tên> internal
 
# Junos
show extension-service request-response servers
show system connections | match 32767
show agent sensors