AI-Driven TelemetryでNetworkの可視化もAIにお任せできる？

この記事はシスコの有志による Cisco Systems Japan Advent Calendar 2023 の 15日目として投稿しています。

2017年版: https://qiita.com/advent-calendar/2017/cisco
2018年版: https://qiita.com/advent-calendar/2018/cisco
2019年版: https://qiita.com/advent-calendar/2019/cisco
2020年版: https://qiita.com/advent-calendar/2020/cisco
2020年版(2枚目): https://qiita.com/advent-calendar/2020/cisco2
2021年版: https://qiita.com/advent-calendar/2021/cisco
2021年版(2枚目): https://qiita.com/advent-calendar/2021/cisco2
2022年版(1,2): https://qiita.com/advent-calendar/2022/cisco
2023年版: https://qiita.com/advent-calendar/2023/cisco <=== ここ


## はじめに
IOS-XRの7.3.1以降ではIOS-XRではAI-Driven Telemetry (ADT)という機能がサポートされております。
https://www.cisco.com/c/en/us/td/docs/iosxr/cisco8000/telemetry/73x/b-telemetry-cg-8000-73x/AI-driven-telemetry.html

この機能についてずっと調べてみたい触ってみたいと思いながら積読リストに入れたままでしたので、今回Advent Calendarをよい機会として触ってみたので紹介させてください。

## そもそもTelemetryって使ってますか？
ここでいうTelemetryとはNetwork機器におけるTelemetryを意図しています。
従来のSyslogやSNMPベースのNetworkモニタリング手法と比べて、スケールしたりリアルタイムにモニタリングができたりなど、いくつかの課題を解決することができる手法となっています。
Telemetry自体についての紹介はすでに[JANOGのWG](https://www.janog.gr.jp/wg/telemetry-wg/wp-content/uploads/2018/06/20180518_Cisco_Telemetry_WG01.pdf)があったり、Web上にもたくさんの紹介記事があるので割愛します。
また、次回のJANOG53のプログラムでもいくつか可視化に関するプログラムがありますが、手前味噌な話で恐縮ですが、筆者も以下のプログラムでTelemetryを含んだ話題で発表させて頂く予定であります。
https://www.janog.gr.jp/meeting/janog53/nwviz/

個人的にはとても便利だと思っているのですが、このTelemetryは世の中でどれくらい使われているのでしょうか？
便利ではあるのですが、使うためにはいくつか準備するものがあり、RouterのConfigだけでは完結しません。
TelemetryはデータをModel化してModel Drivenで運用するのが一般的になっていると思いますが、このModelにはVendor NativeなものとOpenなものと二種類あり、Encodeの方法も様々です。
これらを集めて可視化するためにはコレクタ、データベース、ダッシュボードなどの要素が必要となります。(この準備に関しては今回の記事では触れません。)
そして、Telemetryを集められるようになったあとには、どんなデータを取得すればよいのか、どうやって取得するデータを指定すればよいのか考えなければいけません。
AI-Driven Telemetry(ADT)はそんな悩みを解決することができる可能性があると思いました。
(もちろん緻密に取得するデータを決めている方も多いと思いますし、そちらのほうが有効だと私も考えています。)

## AI-Driven Telemetry on IOS-XR
IOS-XRでは現在なんと12000以上の個別のカウンターが存在しているようです。
この中からどのデータを集めるべきか考えるのは確かに容易ではないかと思います。
トラフィックカウンターなどのような一般的に集めると思われるカウンターもありますが、他に集めておくべきカウンターってなんですか？と聞かれるとあまりベストプラクティスのようなものは公開事例としてはあまり見たことがありません。

Cisco RouterではTelemetryで出力するパラメータを指定する場合、Router上でYANG Data modelの階層内のパスを表すSensor-pathを設定することで指定します。
こちらは[Github](https://github.com/YangModels/yang/tree/main/vendor/cisco/xr)に公開されていますが、前述の通り非常に多くのカウンターが存在するため、YANG modelも非常に大量に存在していて、以下のようにIOS-XR 7.11.1に関しては1000を超えるYANG modelがある状況です。

![Screenshot 2023-12-14 at 15.47.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143031/ae9c2d87-30eb-959f-9320-c31c9cb339b4.png)

この中からSensor-pathを探すツールとしては、個人的には[YANG SUITE](https://developer.cisco.com/yangsuite/)というツールが最も使いやすいと思います。
こちらも色々紹介記事があるので詳細は割愛しますが、ほしいパラメータに関するSensor-pathを探すことはこのツールに限らず色々な手法で探すことができると思います。
しかし、このカウンターが見たいというときにそのSensor-pathを探す方法としての答えにはなりますが、そもそも12000以上あるカウンターの中からどのカウンターを見るべきか、という問いに関しての答えではないかと思います。

以下はADTのConfiguration guideからの抜粋です。
* Which sensor paths do I have to subscribe to?
* When do I know that the state of the system has changed, and which parameters do I look for troubleshooting purposes?
* How do I map between my router configuration and the sensor paths that I must monitor?
* Can I get the state changes in an automated, unsupervised, and data-driven way?
* Can I automatically filter a small set of sensor paths that properly portray an event?

AI-Driven Telemetry (ADT) is the answer to all these questions.

ということで、ADTを使うとこれらの問いに答えてくれるということで実際に試してみることにしました。

## 実際に設定してみた
設定は非常に簡単です。
最初にADTをEnableしたあとは、Sensor-pathをADT outputにして、Telemetryの転送先を設定するだけの簡素な設定です。
以下がADTのための設定例となります。

```
RP/0/RP1/CPU0:R1-NCS5504#show run adt
Thu Dec 14 18:07:13.848 JST
adt enable

RP/0/RP1/CPU0:R1-NCS5504#show run telemetry model-driven
Thu Dec 14 18:07:17.406 JST
telemetry model-driven
 destination-group ADT-DESTINATION
  vrf mgmt
  address-family ipv4 172.20.1.21 port 57000
   encoding self-describing-gpb
   protocol tcp
  !
 !
 sensor-group ADT-EVENT
  sensor-path Cisco-IOS-XR-adt-oper:adt/adt-output
 !
 subscription ADT-SUBSCRIPTION
  sensor-group-id ADT-EVENT sample-interval 0
  destination-id ADT-DESTINATION
  source-interface MgmtEth0/RP1/CPU0/0
 !
!
```

上記設定をして少し待つと、以下のようにADTがSubscribeするSensor-pathのリストを生成してくれます。

```
RP/0/RP1/CPU0:R1-NCS5504#show adt subscription details
Thu Dec 14 18:09:07.686 JST

ADT SUBSCRIPTION  Details
[Subscription ID, Cadence(in seconds), (E)xplicit/(I)mplicit] Sensor Path
*Subscription ID = 0: Not enough system resources to subscribe

Active Groups : 1

    Group: implicit
    -----------------------------------------
        [300000001,  60, I] Cisco-IOS-XR-telemetry-model-driven-oper:telemetry-model-driven/subscriptions/subscription
        [300000002,  40, I] Cisco-IOS-XR-wdsysmon-fd-oper:system-monitoring/cpu-utilization
        [300000003,  40, I] Cisco-IOS-XR-nto-misc-oper:memory-summary/nodes/node/summary
        [300000004,  40, I] Cisco-IOS-XR-procmem-oper:processes-memory/nodes/node[node-name="0/RP1/CPU0"]/process-ids/process-id[process-id="17627"]
        [300000005,  20, I] Cisco-IOS-XR-pfi-im-cmd-oper:interfaces/node-type-sets/node-type-set/interface-summary
        [300000006,  20, I] Cisco-IOS-XR-infra-statsd-oper:infra-statistics/interfaces/interface[interface-name=".*(GigE|Ethernet).*"]/latest/generic-counters
        [300000007,  20, I] Cisco-IOS-XR-ip-iarm-v6-oper:ipv6arm/router-id
        [300000008,  20, I] Cisco-IOS-XR-ipv6-io-oper:ipv6-io
        [300000009,  20, I] Cisco-IOS-XR-ip-iarm-v6-oper:ipv6arm/addresses/vrfs/vrf/networks
        [30000000a,  20, I] Cisco-IOS-XR-ip-iarm-v6-oper:ipv6arm/addresses/vrfs/vrf/interfaces
        [30000000b,  20, I] Cisco-IOS-XR-ip-iarm-v6-oper:ipv6arm/vrf-summaries
        [30000000c,  20, I] Cisco-IOS-XR-ipv6-ma-oper:ipv6-network/nodes/node/interface-data/summary
        [30000000d,  20, I] Cisco-IOS-XR-ip-iarm-v4-oper:ipv4arm/router-id
        [30000000e,  20, I] Cisco-IOS-XR-ip-iarm-v4-oper:ipv4arm/addresses/vrfs/vrf/networks
        [30000000f,  20, I] Cisco-IOS-XR-ipv4-io-oper:ipv4-network/nodes/node/statistics/traffic
        [300000010,  20, I] Cisco-IOS-XR-ip-iarm-v4-oper:ipv4arm/addresses/vrfs/vrf/interfaces
        [300000011,  20, I] Cisco-IOS-XR-ip-iarm-v4-oper:ipv4arm/vrf-summaries
        [300000012,  20, I] Cisco-IOS-XR-ipv4-arp-oper:arp/nodes/node/traffic-vrfs/traffic-vrf
        [300000013,  20, I] Cisco-IOS-XR-ip-rib-ipv4-oper:rib/vrfs/vrf/afs/af/safs/saf/ip-rib-route-table-names/ip-rib-route-table-name/protocol/isis/as/information
        [300000014,  20, I] Cisco-IOS-XR-ip-rib-ipv6-oper:ipv6-rib/vrfs/vrf/afs/af/safs/saf/ip-rib-route-table-names/ip-rib-route-table-name/protocol/isis/as/information
        [300000015,  20, I] Cisco-IOS-XR-ipv4-bgp-oc-oper:oc-bgp/bgp-rib/afi-safi-table/ipv4-unicast/open-config-neighbors/open-config-neighbor/adj-rib-in-post/num-routes
        [300000016,  20, I] Cisco-IOS-XR-ip-rib-ipv4-oper:rib/vrfs/vrf/afs/af/safs/saf/ip-rib-route-table-names/ip-rib-route-table-name/protocol/bgp/as/information
        [300000017,  20, I] Cisco-IOS-XR-fib-common-oper:mpls-forwarding/nodes/node/forwarding-summary
        [300000018,  20, I] Cisco-IOS-XR-ethernet-lldp-oper:lldp/nodes/node/statistics
        [300000019,  20, I] Cisco-IOS-XR-fib-common-oper:fib/nodes/node/global/summary/protos/proto
        [30000001a,  20, I] Cisco-IOS-XR-fib-common-oper:fib-statistics/nodes/node/drops
        [30000001b,  20, I] Cisco-IOS-XR-ip-tcp-oper:tcp/nodes/node/statistics/ipv4-traffic
        [30000001c,  20, I] Cisco-IOS-XR-ip-tcp-oper:tcp/nodes/node/statistics/ipv6-traffic
        [30000001d,  20, I] Cisco-IOS-XR-ip-udp-oper:udp/nodes/node/statistics/ipv4-traffic
        [30000001e,  20, I] Cisco-IOS-XR-ip-udp-oper:udp/nodes/node/statistics/ipv6-traffic

Missed groups = 0
```

ここで、ネットワークに変更を起こしてみます。(メインでトラフィックが流れているIFをShut/No Shutしてみました)
そうするとADT eventとして以下のように検知されます。

```
RP/0/RP0/CPU0:R4-NCS55A2#show adt events
Thu Dec 14 18:33:33.482 JST

|-------------------------------------------------------------------------------|
| Number of Events :      5                                                     |
|-------------------------------------------------------------------------------|
|  Event id |                   Timestamp | Description                         |
|-------------------------------------------------------------------------------|
|    113004 |  Wed 2023-12-13 16:13:31:622|            Addressing & Reachability|
|    113005 |  Wed 2023-12-13 16:38:41:654|            Addressing & Reachability|
|    113006 |  Wed 2023-12-13 16:53:31:660|            Addressing & Reachability|
|    113007 |  Wed 2023-12-13 17:13:31:668|            Addressing & Reachability|
|    113008 |  Wed 2023-12-13 18:24:01:703|            Addressing & Reachability|
|-------------------------------------------------------------------------------|
```
該当時間に取得されたTelemetryを見てみると以下のような出力が見えます。

![Screenshot 2023-12-14 at 18.31.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143031/1667c540-d386-1c0f-5adb-c8a38b97163d.png)

Traffic量の変化をSensor-pathを設定していないのに無事取得することができました。


## 終わりに

今回はLab環境なので、NWに関する変更は手動で行いました。
実網ではどのようなイベントが発生して見えるのか、それに対してどのようなSensor-pathが設定されるのか非常に興味があります。もし実施する機会がある方いましたら個別にぜひ教えてください。

おしまい

## 免責事項
本サイトおよび対応するコメントにおいて表明される意見は、投稿者本人の個人的意見であり、シスコの意見ではありません。本サイトの内容は、情報の提供のみを目的として掲載されており、シスコや他の関係者による推奨や表明を目的としたものではありません。各利用者は、本Webサイトへの掲載により、投稿、リンクその他の方法でアップロードした全ての情報の内容に対して全責任を負い、本Web サイトの利用に関するあらゆる責任からシスコを免責することに同意したものとします。