contrail-status, nodemgr, analytics
Tungsten Fabric では、contrail-status というコマンドで、各コンポーネントのステータスを確認することが出来る。
こちらの動作と、実際に、ステータス情報を提供するnodemgr について、ざっくりとまとめていく。
合わせて nodemgr 等からの情報を集約管理する、analytics という機能についてもまとめておく。
contrail-status, nodemgr
contrail-status の実体は以下のpython スクリプトとなっており、スクリプト内で、プロセスの有無、systemctl の結果、nodemgr の応答、等を取得し、各コンポーネントの状況を出力している。
https://github.com/Juniper/contrail-controller/blob/master/src/config/utils/contrail-status.py
[root@ip-172-31-7-53 ~]# contrail-status Pod Service Original Name State Status analytics alarm-gen contrail-analytics-alarm-gen running Up 14 minutes analytics api contrail-analytics-api running Up 14 minutes analytics collector contrail-analytics-collector running Up 14 minutes analytics nodemgr contrail-nodemgr running Up 14 minutes analytics query-engine contrail-analytics-query-engine running Up 14 minutes config api contrail-controller-config-api running Up 16 minutes config cassandra contrail-external-cassandra running Up 18 minutes config device-manager contrail-controller-config-devicemgr running Up 16 minutes config nodemgr contrail-nodemgr running Up 16 minutes config rabbitmq contrail-external-rabbitmq running Up 18 minutes config schema contrail-controller-config-schema running Up 16 minutes config svc-monitor contrail-controller-config-svcmonitor running Up 16 minutes config zookeeper contrail-external-zookeeper running Up 18 minutes control control contrail-controller-control-control running Up 15 minutes control dns contrail-controller-control-dns running Up 15 minutes control named contrail-controller-control-named running Up 15 minutes control nodemgr contrail-nodemgr running Up 15 minutes database cassandra contrail-external-cassandra running Up 14 minutes database kafka contrail-external-kafka running Up 14 minutes database nodemgr contrail-nodemgr running Up 14 minutes database zookeeper contrail-external-zookeeper running Up 14 minutes kubernetes kube-manager contrail-kubernetes-kube-manager running Up About a minute webui job contrail-controller-webui-job running Up 16 minutes webui web contrail-controller-webui-web running Up 16 minutes == Contrail control == control: active nodemgr: initializing (NTP state unsynchronized.) named: active dns: active == Contrail kubernetes == kube-manager: active == Contrail database == kafka: active nodemgr: initializing (Disk for DB is too low. NTP state unsynchronized.) zookeeper: active cassandra: active == Contrail analytics == nodemgr: initializing (NTP state unsynchronized.) api: active collector: active query-engine: active alarm-gen: active == Contrail webui == web: active job: active == Contrail config == api: active zookeeper: active svc-monitor: active nodemgr: initializing (Disk for DB is too low. NTP state unsynchronized.) device-manager: active cassandra: active rabbitmq: active schema: active [root@ip-172-31-7-53 ~]#
このうち、nodemgr は、各ノード上の常駐プロセスとして動作しており、実体としては、以下のファイルになる。
https://github.com/Juniper/contrail-controller/tree/master/src/nodemgr/common
※ プロセスの有無だけでなく、cassandra の状態、CPU, Mem, Disk の使用量、コアファイル出力の有無、ntpの設定状況、等も確認しているようである
また、contrail-status はnodemgr からNodeの状態を取得する際、以下のようなHTTPリクエストを発行している。
http://(nodemgr-ip:port)/Snh_SandeshUVECacheReq?x=NodeStatus
コマンドではなく、HTTP クライアントから情報取得を行いたい場合、上記のURLにリクエストを投げることでも、データの取得が可能となる。
※ vrouter上で、vrouter-nodemgr のポートに対して実行した場合: [root@ip-172-31-10-212 ~]# curl localhost:8085/Snh_SandeshUVECacheReq?x=NodeStatus <?xml-stylesheet type="text/xsl" href="/universal_parse.xsl"?><__NodeStatusUVE_list type="slist"><NodeStatusUVE type="sandesh"><data type="struct" identifier="1"><NodeStatus><name type="string" identifier="1" key="ObjectVRouter">ip-172-31-10-212.ap-northeast-1.compute.internal</name><process_status type="list" identifier="4" aggtype="union"><list type="struct" size="1"><ProcessStatus><module_id type="string" identifier="1">contrail-vrouter-agent</module_id><instance_id type="string" identifier="2">0</instance_id><state type="string" identifier="3">Functional</state><connection_infos type="list" identifier="4"><list type="struct" size="3"><ConnectionInfo><type type="string" identifier="1">XMPP</type><name type="string" identifier="2">control-node:172.31.7.53</name><server_addrs type="list" identifier="3"><list type="string" size="1"><element>172.31.7.53:5269</element></list></server_addrs><status type="string" identifier="4">Up</status><description type="string" identifier="5">OpenSent</description></ConnectionInfo><ConnectionInfo><type type="string" identifier="1">XMPP</type><name type="string" identifier="2">dns-server:172.31.7.53</name><server_addrs type="list" identifier="3"><list type="string" size="1"><element>172.31.7.53:53</element></list></server_addrs><status type="string" identifier="4">Up</status><description type="string" identifier="5">OpenSent</description></ConnectionInfo><ConnectionInfo><type type="string" identifier="1">Collector</type><name type="string" identifier="2"></name><server_addrs type="list" identifier="3"><list type="string" size="1"><element>172.31.7.53:8086</element></list></server_addrs><status type="string" identifier="4">Up</status><description type="string" identifier="5">Established</description></ConnectionInfo></list></connection_infos><description type="string" identifier="5"></description></ProcessStatus></list></process_status></NodeStatus></data></NodeStatusUVE><SandeshUVECacheResp type="sandesh"><returned type="u32" identifier="1">1</returned><period type="i32" identifier="2">0</period><more type="bool" identifier="0">false</more></SandeshUVECacheResp></__NodeStatusUVE_list>[root@ip-172-31-10-212 ~]# [root@ip-172-31-10-212 ~]#
また、上記のポートにブラウザでアクセスすることで、画面から同じリクエストを投げることもできるようになっている。
1. vrouterの8085番ポートにアクセスし、sandesh_uve.xml を選択

2. SandeshUVECacheReq に tname: NodeStatus を入力

3. 上記と同じ情報が出力される

analytics
また、上記のNodeStatus の結果を含む、各コンポーネントの状態や、パフォーマンス値は、Sandesh というプロトコル (実体はThrift) で、Tungsten Fabric のanalytics に送付されている。
http://www.opencontrail.org/sandesh-a-sdn-analytics-interface/
analytics では、contrail-collector というプロセスが動いており、送付された値を cassandra に書き込む動作となっている。
このため、各ノードのNodeStatus をまとめて確認したい場合、analyticsに対して処理を投げることでも、確認が可能となる。
analytics への処理の投げ方は、cli経由, webui経由, API経由の3つがある。
cli経由で値を取得する場合、contrail-flows, contrail-logs, contrail-stats などのコマンドが用意されており、それぞれ、analytics 内のflow, log, stat といった情報を取得出来る。
https://github.com/Juniper/contrail-controller/wiki/Contrail-utility-scripts-for-getting-logs,-stats-and-flows-from-analytics
※ 実体は、以下の3ファイルに対応する
https://github.com/Juniper/contrail-analytics/blob/master/contrail-opserver/flow.py
https://github.com/Juniper/contrail-analytics/blob/master/contrail-opserver/log.py
https://github.com/Juniper/contrail-analytics/blob/master/contrail-opserver/stats.py
※※ ちなみに、4.1以降では、session という値が追加され、contrail-sessions というコマンドも追加されていた
https://github.com/Juniper/contrail-specs/blob/master/session_collection.md
webui では、Query の画面内に、Flow, Log, Stat といったタブが存在しており、上記のcli に対応した内容が取得出来る。

※ APIで投げる場合は、以下のリンクを参照
https://github.com/Juniper/contrail-controller/wiki/Contrail-Analytics-Documentation
NodeStatus については、UVEという扱いになっており、上記のcli の中では、contrail-logs で、ステータス変化時のログを取得出来る。
※ UVE の動作については、以下を参照
http://www.opencontrail.org/operational-state-in-the-opencontrail-system-uve-user-visible-entities-through-analytics-api/
https://github.com/Juniper/contrail-analytics/blob/master/contrail-opserver/docs/opserver.rst
※ control-node の場合
[root@ip-172-31-7-53 ~]# docker exec -it analytics_api_1 contrail-logs --object-type control-node --last 1m
2018 May 19 09:50:19.426686 ip-172-31-7-53.ap-northeast-1.compute.internal [:contrail-control-nodemgr:] : NodeStatusUVE: [NodeStatus: name = ip-172-31-7-53.ap-northeast-1.compute.internal, disk_usage_info: {/dev/xvda1: [partition_type = xfs, partition_space_used_1k = 5917572, partition_space_available_1k = 25528424, percentage_partition_space_used = 19], }, process_mem_cpu_usage: {contrail-control: [mem_virt = 34528, cpu_share = 0.05, mem_res = 16832], contrail-control-nodemgr: [mem_virt = 45792, cpu_share = 0.57, mem_res = 26360], contrail-dns: [mem_virt = 32068, cpu_share = 0.04, mem_res = 14544], contrail-named: [mem_virt = 21168, cpu_share = 0.0, mem_res = 21160], }, [SysMemInfo: total = 16265888, used = 12171632, free = 262316, buffers = 2600, cached = 3829340, node_type = control-node], [SysCpuInfo: one_min_avg = 0.92, five_min_avg = 1.36, fifteen_min_avg = 1.42, cpu_share = 6.26, node_type = control-node]]
[root@ip-172-31-7-53 ~]#
※ vrouter の場合
[root@ip-172-31-7-53 ~]# docker exec -it analytics_api_1 contrail-logs --object-type vrouter --last 1m --message-type NodeStatusUVE
2018 May 19 09:53:32.427291 ip-172-31-10-212.ap-northeast-1.compute.internal [:contrail-vrouter-nodemgr:] : NodeStatusUVE: [NodeStatus: name = ip-172-31-10-212.ap-northeast-1.compute.internal, disk_usage_info: {/dev/xvda1: [partition_type = xfs, partition_space_used_1k = 3161708, partition_space_available_1k = 28284288, percentage_partition_space_used = 10], }, process_mem_cpu_usage: {contrail-vrouter-agent: [mem_virt = 218252, cpu_share = 0.47, mem_res = 122904], contrail-vrouter-nodemgr: [mem_virt = 60320, cpu_share = 0.4, mem_res = 26260], }, [SysMemInfo: total = 16265888, used = 705984, free = 14651512, buffers = 2600, cached = 905792, node_type = vrouter], [SysCpuInfo: one_min_avg = 0.07, five_min_avg = 0.09, fifteen_min_avg = 0.08, cpu_share = 0.35, node_type = vrouter]]
[root@ip-172-31-7-53 ~]#
また、UVEについて、最新のステータスを確認する場合には、curl 等を使って、以下のようにanalytics-nodeの8081番ポートにHTTP GETを投げることで、状態を取得することができる。
※ UVEのリストを確認
[root@ip-172-31-7-53 ~]# curl localhost:8081/analytics/uves | python -m json.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 3108 100 3108 0 0 381k 0 --:--:-- --:--:-- --:--:-- 433k
[
{
"href": "http://localhost:8081/analytics/uves/storage-pools",
"name": "storage-pools"
},
{
"href": "http://localhost:8081/analytics/uves/xmpp-peers",
"name": "xmpp-peers"
},
{
"href": "http://localhost:8081/analytics/uves/storage-clusters",
"name": "storage-clusters"
},
(snip)
※ control node のリストを確認
[root@ip-172-31-7-53 ~]# curl localhost:8081/analytics/uves/control-nodes | python -m json.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 173 100 173 0 0 19983 0 --:--:-- --:--:-- --:--:-- 21625
[
{
"href": "http://localhost:8081/analytics/uves/control-node/ip-172-31-7-53.ap-northeast-1.compute.internal?flat",
"name": "ip-172-31-7-53.ap-northeast-1.compute.internal"
}
]
※ 特定のcontrol node について、値を取得
[root@ip-172-31-7-53 ~]# curl localhost:8081/analytics/uves/control-node/ip-172-31-7-53.ap-northeast-1.compute.internal?flat | python -m json.tool
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 6547 0 6547 0 0 790k 0 --:--:-- --:--:-- --:--:-- 913k
{
"BgpRouterState": {
"__T": 1526722031429953,
"admin_down": false,
"amqp_conn_info": {
"connection_status": true,
"connection_status_change_at": "2018-May-19 09:12:10.534881",
"url": "amqp://guest:guest@172.31.7.53:5672"
},
"bgp_router_ip_list": [
"172.31.7.53"
],
(snip)
"NodeStatus": {
"__T": 1526729660881411,
"build_info": "{\"build-info\" : [{\"build-version\" : \"5.1.0\", \"build-time\" : \"2018-05-19 02:35:01.870887\", \"build-user\" : \"zuul\", \"build-hostname\" : \"centos-7-4-builder-juniper-contrail-ci-c-0000046385.novalocal\", \"build-id\" : \"5.1.0-107.el7\", \"build-number\" : \"@contrail\"}]}",
"deleted": false,
"disk_usage_info": {
"/dev/xvda1": {
"partition_space_available_1k": 25205956,
"partition_space_used_1k": 6240040,
"partition_type": "xfs",
"percentage_partition_space_used": 20
}
},
"installed_package_version": "5.1.0-107.el7",
(snip)
"process_status": [
{
"description": "NTP state unsynchronized.",
"instance_id": "0",
"module_id": "contrail-control-nodemgr",
"state": "Non-Functional"
},
{
"connection_infos": [
{
"description": "Established",
(snip) また、NodeStatus を webui から確認する場合、
Monitor > Infrastructure > (ノード種別) > (ノード名) で、'Advanced View' を選ぶことでも確認可能となる。
※ 下記では、Analytics Nodes で process status を確認し、process reporting as non-functional となっている原因を確認している


