gNMI를 사용하여 텔레메트리 데이터 구독
gNMI 프로토콜은 텔레메트리 데이터를 구독하기 위한 RPC를 정의합니다 Subscribe
. 텔레메트리 수집기는 이 RPC를 사용하여 네트워크 디바이스에서 상태 및 구성 데이터에 대한 업데이트를 요청합니다.
새 구독에 대한 요청은 하나 이상의 리소스 경로를 포함하는 메시지 내에 SubscribeRequest
캡슐화됩니다. 구독 경로는 대상 네트워크 디바이스의 특정 데이터 인스턴스와 관련이 있습니다. 요청에는 OpenConfig 또는 네이티브 Junos 스키마를 기반으로 하는 경로가 포함될 수 있습니다.
구독 요청에는 다음 모드 중 하나도 포함되어야 합니다.
-
ONCE
- 데이터에 대한 일회성 요청. -
POLL
- 주기적인 온디맨드 데이터 검색용. -
STREAM
- 지정된 트리거에 따라 데이터를 스트리밍하는 수명이 긴 구독입니다.
모드의 STREAM
구독은 다음 하위 모드 중 하나를 지정해야 합니다.
-
ON_CHANGE
- 데이터 업데이트는 데이터 항목의 값이 변경될 때만 전송됩니다. -
SAMPLE
- 데이터 업데이트는 구독 요청에 지정된 간격 기간을 기준으로 샘플 간격당 한 번 전송됩니다. 기본 샘플 간격은 30초입니다. -
TARGET_DEFINED
- 구독 요청을 수신하는 네트워크 디바이스는 리프별로 데이터에 가장 적합한 전송 유형을 결정합니다. 메시지 내에 지정된 경로가 이벤트 구동 데이터를 참조하는 경우 구독이ON_CHANGE
작성될 수 있습니다. 카운터 값을SAMPLE
나타내는 데이터의 경우 구독을 만들 수 있습니다.메모:TARGET_DEFINED
구성 경로에 대한 구독 요청은 요청으로만 처리됩니다ON_CHANGE
.
, ON_CHANGE
및 SAMPLE
구독의 경우 ONCE
수집기는 구독에 있는 경로의 현재 상태를 포함하는 초기 업데이트를 요청할 수 있습니다. 초기 동기화라고도 하는 이 업데이트는 다음과 같은 이유로 중요합니다.
-
컬렉터는 해당 센서 경로에 대한 디바이스에 있는 모든 필드의 현재 상태를 전체적으로 볼 수 있습니다.
-
이벤트 기반 데이터(
ON_CHANGE
)는 다음 이벤트가 표시되기 전에 수집기에 의해 한 번 이상 수신됩니다. 이러한 방식으로 수집기는 다음 이벤트가 발생하기 전에 데이터 상태를 인식합니다. -
일반적으로 제로 억제로 인해 스트리밍된 데이터에 표시되지 않는 제로 카운터 값을 포함하는 패킷 전달 엔진 센서가 전송됩니다. 이렇게 하면 각 라인 카드의 모든 필드가 컬렉터에 알려집니다.
대상 장치는 메시지로 구독 요청에 응답합니다SubscribeResponse
. 구독 요청이 초기 동기화를 호출하는 경우 대상은 데이터를 전송한 다음 플래그가 로 true
설정된 응답 메시지를 sync_response
보냅니다. 초기 동기화 후 대상 장치는 구독 모드에 따라 경로에 대한 업데이트를 진행합니다.
메시지에는 라는 플래그updates_only
가 SubscribeRequest
포함되어 있습니다. 이 플래그가 로 설정true
되면 대상 디바이스는 초기 동기화를 보내지 않고 다음과 같이 후속 업데이트만 보냅니다.
-
모드 구독의
SAMPLE
경우STREAM
다음 샘플 간격으로 업데이트가 전송됩니다. -
모드 구독의
ON_CHANGE
경우STREAM
다음 값 변경 시 업데이트가 전송됩니다. -
구독의 경우
ONCE
을(를) 로 설정하여 을SubscribeResponse
(를)false
전송sync_response
하고 구독이 닫힙니다. -
TARGET_DEFINED
구독은 구성 경로에 대한 것으로 처리ON_CHANGE
되며 다음 값 변경 시 업데이트가 전송됩니다.
및 SubscribeResponse
메시지의 내용은 SubscribeRequest
gnmi.proto 파일에 정의되어 있습니다. 구독 RPC 및 구독 모드에 대한 자세한 내용은 gNMI 사양: 원격 분석 업데이트 구독에서 gNMI 사양을 참조하세요.
구성 경로에 다음과 같은 제한 사항이 적용됩니다.
-
POLL
구독은 지원되지 않습니다. -
접두사 경로는 업데이트 메시지에 포함되지 않습니다.
-
gNMI 응답은 ,
insert before/after
,comment/annotate
, 및protect/unprotect
와 같은active/inactive
주니퍼 고유의 메타데이터 작업에 대해 지원되지 않습니다. 메시지에 나타날 수 있지만 유효하지 않습니다. -
, ,
allow_aggregation
, 및qos
에서SubscribeRequest
suppress_redundant
heartbeat_level
지원되지 않는 매개 변수. -
PROTO 인코딩만 지원됩니다.
-
SubscribeRequest
메시지의 확장은 지원되지 않습니다. -
구독 경로 필터링은 키 수준에서만 지원됩니다.
다음 커밋 변형은 및
TARGET_DEFINED
구독에 대해ON_CHANGE
지원되지 않습니다.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
대상은 일회성 업데이트로 응답합니다.
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
다음 예제에서는 하위 모드가 있는 ON_CHANGE
모드의 STREAM
구독 요청을 보여 줍니다. 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
예제 응답 메시지는 구성 경로에 대한 값과 다음으로 설정된 플래그를 sync_response
보여줍니다.true
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" } } }
예: SAMPLE
다음 예제에서는 mode 및 SAMPLE
sub-mode의 STREAM
구독 요청을 보여 줍니다. 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
전송된 초기 업데이트와 5초 간격으로 전송된 후속 업데이트를 보여줍니다.true
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" } } }