SplunkでCisco 製品の統合ダッシュボードを作成しよう！(ThousandEyes / Meraki)

# はじめに
:::note info
この記事は Cisco Systems 合同会社 社員有志による Cisco Systems Japan Advent Calendar 2024 の 24日目として投稿しています。
:::

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年版②: https://qiita.com/advent-calendar/2020/cisco2
2021年版①: https://qiita.com/advent-calendar/2021/cisco
2021年版②: https://qiita.com/advent-calendar/2021/cisco2
2022年版①②: https://qiita.com/advent-calendar/2022/cisco
2023年版: https://qiita.com/advent-calendar/2023/cisco
**2024年版: https://qiita.com/advent-calendar/2024/cisco**


:::note info
また Splunk 社員やユーザー有志による Splunk Advent Calendar 2024 もありますのでそちらもぜひご覧ください！
https://qiita.com/xnmhuveb/items/0b16f2db5e8fc7aefa6a
:::

# Cisco が Splunk 買収してから早9ヶ月！
Cisco が Splunk を2024年3月に買収してから早9ヶ月が経ちました。
Splunk 買収により、IT 環境の End-to-End & Full-stack での可視化を Cisco x Splunk で実現していくことが期待されますが、開発はまだ発展途上中です。そこでひと足先にサクッと簡易的に Splunk による Cisco 製品の可視化を検証してみました。

# Splunk で複数の Cisco 製品を可視化してみる
## 環境
今回は以下のような環境を構築しました。
複数の Meraki 機器を設置し、MR44 へ Windows PC と Cisco Desk　が接続し、それぞれが同じ Webex Meeting に接続します。
Windows PC と Cisco Desk には ThousandEyes Endpoint Agent がそれぞれインストールされており、Webex との通信状況やその他主要アプリケーション (MS Teams, MS365等) へ ping/traceroute 等のアクティブテストを実行します。

また Splunk は Splunk Enterprise を利用し、Splunk Enterprise へ Meraki と ThousandEyes が収集しているデータを格納し、統合ダッシュボードを作成してみます。


![スクリーンショット 2024-12-22 16.17.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355483/bb3d300e-8e38-2fd3-6d28-03286afcf971.png)

## 公式の Splunk Add-on を使わずに Add-on Builder を使用してデータ収集
### Add-on とは？
Splunk Enterprise/Cloud には、機能拡張するための Add-on/App が Splunk や Splunk 以外の 3rd party より提供されています。([参考](https://splunkbase.splunk.com/))
私の理解だと、Add-on が Splunk にデータを格納するためのモジュール、App が Add-on で格納したデータを App で用意されたダッシュボードで表示します。(中には Add-on/App の明確な区切りがなく、Add-on でダッシュボード表示まで実施してくれるものもあります。)

### ThousandEyes/Meraki の Add-on はどうなっている？
2024年12月24日現在、ThousandEyes の Add-on は有償しかなく、また Meraki Add-on は [Splunk 公式の Add-on](https://splunkbase.splunk.com/app/5580) がありますが、一部収集していないデータもあるため、今回は Splunk Add-on Builder を利用することにしました！

### Splunk Add-on Builder で自由気ままに Add-on を作成！
[Splunk Add-on Builder](https://splunkbase.splunk.com/app/2962) はその名の通り、好きなように Add-on を作成できます。こちらにより、好きなデータを Cisco 問わず、色々なベンダーや OSS からデータ取得が可能です。

Splunk Add-on Builder の詳細は[公式ドキュメント](https://docs.splunk.com/Documentation/AddonBuilder/4.3.0/UserGuide/Overview)をご覧いただければと思いますが、端的に記載するとデータを取得しにいく宛先 (今回だと Meraki/ThousandEyes) の API を利用してデータを収集します。

### Splunk Add-on Builder の利用方法 (本環境での例)
1. Splunk Enterprise において Splunk Add-on Builder を追加
    1. 私は Splunkbase より [Splunk Add-on Builder](https://splunkbase.splunk.com/app/2962) をダウンロードし (Splunkアカウント必要)、Splunk Enterprise において Home → App → ファイルからAppをインストール、で追加しました。
![スクリーンショット 2024-12-23 17.23.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355483/e44ae0f5-ba79-62e2-2c0b-0e0426d698de.png)
    2. 上記以外に、他のAppを参照、より Splunk Add-on Builder の追加もできるはずです。私は Proxy 環境の影響で手動で追加しました。
1. Splunk Add-on Builder を開き、Add-on を作成
    1. 他の方の記事ですが、[こちら](https://dev.classmethod.jp/articles/splunk-add-on-builder-python/) をご参照ください。
    1. Splunk Enterprise へのデータ挿入方法は REST API、Shell commands、Python code の 3 つがあるのですが、私は Python code を選択しました。
![スクリーンショット 2024-12-23 11.02.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355483/fbfe4fdd-f744-d778-13be-8ab5378c250a.png)
    1. 例えばですが、以下は Meraki API を利用し、 Meraki のアクセスポイント (MR シリーズ) に接続した無線クライアントのヘルススコアを取得し、Splunk に保存するコードです。このように Splunk Add-on Builder を利用すると、欲しいデータを意のままに収集できます。Splunk には  ```ew.write_event(event)``` でデータを保存していますが、json のまま保存することも可能ですので、簡単にデータを Splunk へ挿入できます。この非構造化データをなんでも取り込めることが Splunk の大きな売りの 1 つです！
```
def collect_events(helper, ew):
    """
    Merakiの無線クライアントのヘルススコアを取得してSplunkに保存します。
    """
    # 入力値を取得
    api_key = helper.get_arg('api_key')
    network_id = helper.get_arg('network_id')
    splunk_host = "Meraki Wireless Clients Health"

    # Meraki APIのベースURL
    base_url = f"https://api.meraki.com/api/v1/networks/{network_id}/wireless/clients/healthScores"

    # HTTPヘッダーの設定
    headers = {
        'Authorization': f"Bearer {api_key}",
        'Accept': 'application/json'
    }

    # ヘルススコア取得開始ログ
    helper.log_info(f"Fetching wireless clients health scores for Network ID: {network_id}")

    try:
        # Meraki APIへのリクエスト
        response = helper.send_http_request(
            url=base_url,
            method="GET",
            headers=headers,
            verify=True,
            use_proxy=True
        )
        response.raise_for_status()
        health_scores = response.json()

        # ヘルススコアが空の場合の処理
        if not health_scores:
            helper.log_warning("No wireless client health scores found for the specified network.")
            return

        # 各クライアントのヘルススコアをSplunkイベントとして保存
        for client in health_scores:
            event_data = {
                "client_mac": client.get("mac"),
                "health_score_latest": client.get("performance")["latest"],
                "health_score_currentConnection": client.get("performance")["currentConnection"],
                "clientId": client.get("clientId")
            }

            # Splunkイベントとして保存
            event = helper.new_event(
                data=json.dumps(event_data),
                time=None,
                host=splunk_host,
                index=helper.get_output_index(),
                sourcetype=helper.get_sourcetype(),
                done=True,
                unbroken=True
            )
            ew.write_event(event)

        # 完了ログ
        helper.log_info(f"Successfully fetched and saved wireless clients health scores for Network ID: {network_id}")

    except Exception as e:
        # エラー処理
        helper.log_error(f"Error fetching wireless clients health scores: {str(e)}")
        raise
```

このようなコードをいくつか作成し、Meraki と ThousandEyes からデータを収集しました。

## Splunk Dashboard Studio で自由自在にダッシュボード作成！
Splunk ダッシュボードには、Classic ダッシュボードと Dashboard Studio の 2 種類があります。
ダッシュボードを直感的に編集し、自由自在に図を配置するには Dashboard Studio の方が便利です。その Dashboard Studio を利用して以下のようなダッシュボードを作成してみました！
![スクリーンショット 2024-12-22 16.35.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355483/04450458-1698-5c9f-7e37-34b9cb507f22.png)
画面上部には ThousandEyes によりテストしたデータ、下部には Meraki 機器より収集したデータを表示しています。筆者の本記事を執筆する時間がないという自己中な都合でこれ以上の詳細は割愛しますが、皆様もAPIを活用しながらじゃんじゃん可視化しちゃいましょう！

# 補足: Add-on Builder 以外の可視化方法
今回は Splunk Add-on Builder を利用しましたが、もちろん紹介した Meraki Add-on を利用したり、また Splunk Cloud や Public IP を持つ Splunk Enterprise を利用する場合は、ThousandEyes から Splunk Cloud/Enterprise へ [Open Telemetry を利用したメトリック情報の連携](https://docs.thousandeyes.com/product-documentation/integration-guides/custom-built-integrations/opentelemetry/splunk-integration)も簡単に実施できますのでそちらもぜひお試しください！

また ThousandEyes には HTML の iframe を活用したダッシュボードの流用ができます↓↓↓
## iframe を活用して Splunk Enterprise で ThousandEyes のダッシュボードを見せれる！？
[Embedded widgets](https://docs.thousandeyes.com/product-documentation/dashboards/embedding-dashboard-widgets-in-external-web-sites) により、ThousandEyes のダッシュボードを Splunk Enterprise の Classic ダッシュボードで簡単に利用できます。

利用方法を以下に示します。
① ThousandEyes の Dashboards より、Splunk Enterprise で利用したいダッシュボードの "Embed Widget" をクリックします
![スクリーンショット 2024-12-24 3.43.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355483/a5f23836-8720-92a4-05d2-f5d53e3be905.png)
② "Embed Widget" をクリックすると HTML コードが発行されるため、このコードをコピーします。
![スクリーンショット 2024-12-24 3.45.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355483/24667dc7-f5f4-d7eb-883e-947548eee816.png)
③ 筆者の環境では、ThousandEyes の iframe を Splunk Enterprise で表示できるように ```/usr/local/splunk/etc/system/default/web.conf``` を以下のように編集しました。(web.confの場所は皆様の Splunk をインストールした場所や方法に依存します。) 
```dashboard_html_allow_inline_styles = true
dashboard_html_allow_iframes = true
dashboard_html_allow_embeddable_content = true
dashboard_html_wrap_embed = true
dashboard_html_allowed_domains = *.thousandeyes.com # allowで指定しないと sandbox属性でスクリプト実行等の制限がかかるため
```

④ Splunk Enterprise の Classic ダッシュボードにおいて、ソースより編集 (HTMLから編集) し以下のように記載
```
<dashboard version="1.1" theme="dark">
  <label>AdventCalendar2024 Normal Dashboard</label>
  <row>
    <panel>​<title>ThousandEyes by iframe</title>
      <html>
        <code>​
          <iframe frameborder="0" width="100%" height="500px" src="https://embed.thousandeyes.com/e/00aa:6b05e0c6-a749-4163-8b7b-87516040449d"></iframe>
        </code>​
      </html>
    </panel>
  </row>
</dashboard>
```

⑤ ダッシュボードを保存すると ThousandEyes のダッシュボードが表示される！
![スクリーンショット 2024-12-24 4.00.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355483/f7b99c22-4714-edc6-96e6-695e5e946824.png)

:::note warn
ご紹介したこの iframe を活用したダッシュボードの流用は、Splunk Enterprise ではコンフィグファイル (web.conf) を容易に編集できるため実現できますが、Splunk Cloud (SaaS) ではセキュリティ上の問題から設定変更の申請が必要になります。
:::

# まとめ
本内容は、2024年12月11日にシスコシステムズ合同会社が主催した[次世代 IT インフラエンジニア育成ワークショップ](https://www.cisco.com/c/m/ja_jp/training-events/events-webinars/postevent/2024-y746h89j.html)にて発表した内容となっております。
発表時の資料は [こちら](https://www.cisco.com/c/dam/m/ja_jp/training-events/events-webinars/postevent/2024-y746h89j/it-2.pdf) となります。
Splunk における Cisco 製品の統合可視化に向けた実装はどんどん進んでますので、お楽しみに！

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