8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-20

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

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?