VMware NSXのESGのインターフェースカウンタをInfluxDBとGrafanaで可視化する

  • 7
    いいね
  • 0
    コメント

vExperts Advent Calendar 2016の20日目の記事です。

VMware NSX環境で論理的なルーターとして機能するESG(Edge Service Gateway)は仮想アプライアンスとして動作するが、各ESGはSNMPに対応していないので通常のネットワーク機器のようにSNMP経由でカウンタを取得して外部のツールによって監視することができない。
NSXのESGの各種カウンタはNSX ManagerのREST API経由で取得することが可能なので、スクリプトを使ってInfluxDBにカウンタをレコードとして書き込んでGrafanaで可視化してみる。

  • InfluxDB : 時系列データの格納に適したデータストア。
  • Grafana : Graphite/InfluxDB/Elasticsearch/Prometheus/CloudWatch等のをデータソースとして、格納されたデータを可視化するためのソフトウェア。

NSX API

NSX Managerで管理される様々なオブジェクトに対するAPIはNSX Managerによって一元的に提供される。NSXのAPIに関するドキュメントはここ。今回は以下のAPIを利用。

  • Edge一覧の取得 : https://NSX-Manager-IP-Address/api/4.0/edges/
  • 各Edgeのインターフェースカウンタの取得 : https://NSX-Manager-IP-Address/api/4.0/edges/[edgeId]/statistics/dashboard/interface?interval=range

他にもSLBやFW、VPN等に関するカウンタを取得可能。詳細はAPI Guideを参照。(※API Guideは一部誤りがあるので注意)

  • Load Balancer : /api/4.0/edges/[edgeId]/loadbalancer/statistics
  • Firewall : /api/4.0/edges/[edgeId]/statistics/dashboard/firewall?interval=range
  • IPSec : /api/4.0/edges/[edgeId]/statistics/dashboard/ipsec?interval=range
  • SSL-VPN : /api/4.0/edges/[edgeId]/statistics/dashboard/sslpvn?interval=range
  • L2VPN : /api/4.0/edges/[edgeId]/l2vpn/config/statistics

Edgeリストの取得

以下のAPIからNSX Managerが管理するEdgeリストをXML形式で取得することができる。

GET https://NSX-Manager-IP-Address/api/4.0/edges/
  • 各EdgeにはNSX Managerが一位のEdge ID(objectId)を割り当てて管理している。(<objectId>edge-xxx</objectId>)
  • NSX Managerが管理するEdgeには仮想アプライアンスとして機能するESGと、DLR(Distributed Logical Router/分散ルーター)Control VMの二種類があり、EdgeTypeタグで分類されている。DLRはハイパーバイザー内で機能するため今回はgatewayServicesのみを対象としてインターフェースカウンタを取得する。

    • Edge Service Gateway = <edgeType>gatewayServices</edgeType>
    • DLR Control VM = <edgeType>distributedRouter</edgeType>

EdgeリストのXMLレスポンスの一部

各Edgeは<edgeSummary></edgeSummary>要素として確認できる。

<?xml version="1.0" encoding="UTF-8"?>
<pagedEdgeList>
  <edgePage>
    <pagingInfo>
      <pageSize>256</pageSize>
      <startIndex>0</startIndex>
      <totalCount>3</totalCount>
      <sortOrderAscending>true</sortOrderAscending>
      <sortBy>id</sortBy>
    </pagingInfo>
    <edgeSummary>
      <objectId>edge-1</objectId>
      <objectTypeName>Edge</objectTypeName>
      <vsmUuid>422CC825-5AC5-EEE6-E4DE-2FDF7F2AF278</vsmUuid>
      <nodeId>3a86d15e-a821-4221-88a4-15225c6c965e</nodeId>
      <revision>78</revision>
      <type>
        <typeName>Edge</typeName>
      </type>
      <name>ESG-VLA159</name>
      <clientHandle/>
      <extendedAttributes/>
      <isUniversal>false</isUniversal>
      <universalRevision>0</universalRevision>
      <id>edge-1</id>
      <state>deployed</state>
      <edgeType>gatewayServices</edgeType>
      <datacenterMoid>datacenter-2</datacenterMoid>
      <datacenterName>DC</datacenterName>
      <tenantId>default</tenantId>
      <apiVersion>4.0</apiVersion>
      <recentJobInfo>
        ...
      </recentJobInfo>
      <edgeStatus>GREEN</edgeStatus>
      <numberOfConnectedVnics>5</numberOfConnectedVnics>
      <appliancesSummary>
        ...
      </appliancesSummary>
      <hypervisorAssist>false</hypervisorAssist>
      <allowedActions>
        ...
      </allowedActions>
    </edgeSummary>
    <edgeSummary>
      <objectId>edge-224</objectId>
      ...
    </edgeSummary>
  </edgePage>
</pagedEdgeList>

Edgeのインターフェースカウンタの取得

各Edgeのインターフェースカウンタは以下のリクエストで取得可能。

GET https://NSX-Manager-IP-Address/api/4.0/edges/[edgeId]/statistics/dashboard/interface?interval=range
  • [edgeId]にはインターフェースカウンタを取得する対象のEdgeのobjectIdを指定する。
  • レスポンスボディのXMLはmeta要素と、data要素で構成され、各インターフェースに関して入力パケット数、入力バイト数、出力パケット数、出力バイト数が含まれる。(なお、カウンタ名がinbytes/outbytesとなっているが、実際のトラフィックを確認すると、どうやらkbpsが正しい単位の模様。)

EdgeのインターフェースカウンタのXMLレスポンス

data要素に各インターフェースのinpkt/outpkt/inbytes/outbytesデータが入っている。

<?xml version="1.0" encoding="UTF-8"?>
<dashboardStatistics>
    <meta>
        <startTime>1480911320</startTime>
        <endTime>1480911360</endTime>
        <interval>20</interval>
        <vnics>
            <vnic>
                <name>vnic0</name>
                <index>0</index>
            </vnic>
            <vnic>
            ...
            </vnic>
        </vnics>
    </meta>
    <data>
    <interfaces>
            <vNic__0__in__pkt>
                <dashboardStatistic>
                    <timestamp>1480911320</timestamp>
                    <value>24.19482774794</value>
                </dashboardStatistic>
                <dashboardStatistic>
                    <timestamp>1480911340</timestamp>
                    <value>46.188073834689995</value>
                </dashboardStatistic>
            </vNic__0__in__pkt>
            <vNic__0__in__byte>
                <dashboardStatistic>
                    <timestamp>1480911320</timestamp>
                    <value>23.480170347359998</value>
                </dashboardStatistic>
                <dashboardStatistic>
                    <timestamp>1480911340</timestamp>
                    <value>65.00158679382001</value>
                </dashboardStatistic>
            </vNic__0__in__byte>
            <vNic__0__out__pkt>
                <dashboardStatistic>
                    <timestamp>1480911320</timestamp>
                    <value>17.026659284</value>
                </dashboardStatistic>
                <dashboardStatistic>
                    <timestamp>1480911340</timestamp>
                    <value>37.182411631</value>
                </dashboardStatistic>
            </vNic__0__out__pkt>
            <vNic__0__out__byte>
                <dashboardStatistic>
                    <timestamp>1480911320</timestamp>
                    <value>28.310770795</value>
                </dashboardStatistic>
                <dashboardStatistic>
                    <timestamp>1480911340</timestamp>
                    <value>72.218770663</value>
                </dashboardStatistic>
            </vNic__0__out__byte>
            <vNic__1__in__pkt>
                ....
            </vNic__0__in__pkt>
            ....
        </interfaces>
    </data>
</dashboardStatistics>

InfluxDBとGrafanaのセットアップ

dockerで簡単にセットアップ

docker run -itd -p 3000:3000 --name grafana grafana/grafana
docker run -itd -p 8083:8083 -p 8086:8086 -e INFLUXDB_ADMIN_ENABLED=true -v $PWD:/var/lib/influxdb influxdb

InfluxDB 1.1から管理用インターフェース(Port 8083)はデフォルトで利用できなくなっているので注意。

環境変数INFLUXDB_ADMIN_ENABLED=trueを指定しないと、InfluxDBの管理画面を表示することができない。(https://docs.influxdata.com/influxdb/v1.1/administration/config/#enabled-false)


InfluxDBのデータベース作成

InfluxDBのAPIからESGのカウンタを格納するためのデータベース(nsx_db)を作成する。

curl -X POST http://localhost:8086/query?q=create+database+%22nsx_db%22

Edgeリストを取得し、各ESGのインターフェースカウンタをInfluxDBへ格納

以下のPythonのスクリプトを作成して、NSX APIから取得したESGのインターフェースカウンタを、InfluxDB上のデータベースに対して、NSX Manager毎にmeasurementを指定、ESGのobjectIdとインターフェース名をTagとして、influxdb-pythonによりInfluxDBのレコードとして追加。

これをcronで5分毎に実行して、InfluxDBにレコードを追加。


InfluxDBに追加するデータのフォーマット

実際にレコードを追加する際のデータは以下のような形。

[
  {
    "fields": {
      "inbyte": 71.46487064655,
      "inpkt": 50.95460165519,
      "outbyte": 82.579703146,
      "outpkt": 43.43723174
    },
    "tags": {
      "vnic": "vNic0",
      "edge_id": "edge-1"
    },
    "time": "2016-12-14T11:30:40+00:00",
    "measurement": "10.44.59.208"
  },
  {
    "fields": {
      "inbyte": 91.3446508269,
      "inpkt": 68.23450442,
      "outbyte": 74.1757490272,
      "outpkt": 67.2185983652
    },
    "tags": {
      "vnic": "vNic1",
      "edge_id": "edge-1"
    },
    "time": "2016-12-14T11:30:40+00:00",
    "measurement": "10.44.59.208"
  },
  
]

InfluxDBに追加されたレコードの確認

管理画面のQueryを使ってレコードが追加されたかどうかを確認することができる。

measurementの確認

show measurementsにより、NSX Manager毎にmeasurementが作成されたことを確認できる。

Kobito.laxM98.png


レコードの確認

select * from "10.44.59.208" where edge_id='edge-1'により、measurement内のレコードを確認できる。各レコードは、ESGのobjectIdやESGのvnicをタグとして、APIから取得したカウンタを格納している。

Kobito.rPJu5C.png


Grafanaによる可視化

Deta Sourceの登録

GrafanaがInfluxDBのレコードを参照できるように、Data Sourceを登録する。

Kobito.GtDJQa.png


Templating

ESGには10個のvnicがついていこれを一つ一つグラフを作るのは大変なので、GrafanaのTemplatingとRepeat Graph機能を使ってグラフを作成する。

DashboardのTemplatingで、NSX Managerの一覧($nsxmgr)、ESGの一覧($edges)、vnicの一覧($vnic)を動的な変数として定義する。

Kobito.y9PzvY.png


Graphの作成

メトリックとして、Templatingで定義した変数に関する、inbyte/outbyteをプロットする。

Kobito.KBeFKG.png


Repeat Panelとして、vnicを指定して、Templatingで選択可能にした変数の内、$vnicに関してパネルを繰り返すよう指定する。

Kobito.ahRvO1.png


Graphの表示

Templating機能を使うとこんな感じで、インタラクティブなグラフを表示することができ、Repeat Panelで各ESGの全てのインターフェースのカウンタをまとめて表示することができる。

grafana.gif

nsnnnnnn