diff --git a/telegraf/files/script/ovs_parse_bridge.py b/telegraf/files/script/ovs_parse_bridge.py
index c694dfd..76c34ca 100644
--- a/telegraf/files/script/ovs_parse_bridge.py
+++ b/telegraf/files/script/ovs_parse_bridge.py
@@ -1,79 +1,106 @@
-#!/usr/bin/env python2
-import subprocess
-import json
+#!/usr/bin/env python3
+
+'''
+Check status description:
+
+# General
+
+## Check failed
+ovs_bridge check=0
+
+## Check succeeded
+ovs_bridge check=1
+
+# Interface, port, bridge
+
+## Interface is down
+ovs_bridge,interface=xxx,type=zzz,bridge=yyy,port=aaa status=0
+
+## Interface is up
+ovs_bridge,interface=xxx,type=zzz,bridge=yyy,port=aaa status=1
+
+## Interface error
+ovs_bridge,interface=xxx,type=zzz,bridge=yyy,port=aaa status=2
+
+# Special errors tracking
+
+## Bridge has no ports
+ovs_bridge_port,bridge=yyy count=0
+
+## Bridge port has no interface
+ovs_bridge_port_iface,bridge=yyy,port=aaa count=0
+'''
+
+import sys
+
+from ovsdbapp.backend.ovs_idl import connection
+from ovsdbapp.schema.ovn_northbound import impl_idl
 
 
-def call_process(cmd):
-    p = subprocess.Popen(
-        cmd.split(),
-        stdout=subprocess.PIPE,
-        stderr=subprocess.PIPE)
-    output = p.communicate()
-    return output
+SOCKET_PATH = 'unix:/run/openvswitch/db.sock'
+DB_NAME = 'Open_vSwitch'
+CONN_TIMEOUT = 5
+
+CHK_TMPL = 'ovs_bridge check={}'
+BR_CHK_TMPL = '{},{} status={}'
+BR_CNT_TMPL = '{},{} count={}'
 
 
-def ovsctl_json(cmd):
-    cmd = "ovs-vsctl -f json " + cmd
-    result = call_process(cmd)
-    headings = json.loads(result[0])["headings"]
-    datas = json.loads(result[0])["data"]
-
-    uuid_index = headings.index("_uuid")
-
-    obj = {}
-
-    for data in datas:
-        obj_data = {}
-        for d, h in zip(data, headings):
-            if isinstance(d, list):
-                _type, value = d[0], d[1]
-                if _type == "uuid":
-                    obj_data[h] = [d]
-                elif _type == "map":
-                    obj_data[h] = {v[0]: v[1] for v in value}
-                elif _type == "set":
-                    obj_data[h] = value
-            else:
-                obj_data[h] = d
-        obj[data[uuid_index][1]] = obj_data
-    return obj
+def format_labels(bridge, port=None, interface=None):
+    label_obj = {
+        'bridge': bridge.name
+    }
+    if port is not None:
+        label_obj.update({
+            'port': port.name
+        })
+    if interface is not None:
+        label_obj.update({
+            'interface': interface.name,
+            'type': interface.type,
+            'peer': interface.options.get('peer')
+        })
+    labels = ','.join(['{}={}'.format(key, value)
+                       for key, value in label_obj.iteritems()
+                       if not (value is None or len(value) == 0)])
+    return labels
 
 
 def gather():
-    bridges = ovsctl_json("list bridge")
-    ports = ovsctl_json("list port")
-    interfaces = ovsctl_json("list interface")
+    idl = connection.OvsdbIdl.from_server(SOCKET_PATH, DB_NAME)
+    conn = connection.Connection(idl=idl, timeout=CONN_TIMEOUT)
 
-    for bridge_uuid, bridge in bridges.iteritems():
-        for bridge_port in bridge['ports']:
-            port = ports[bridge_port[1]]
-            interface = interfaces[port['interfaces'][0][1]]
+    api = impl_idl.OvnNbApiIdlImpl(conn)
 
-            label_obj = {
-                "bridge": bridge.get('name'),
-                "port": port.get('name'),
-                "interface": interface.get('name'),
-                "type": interface.get('type'),
-                "peer": interface.get('options', {}).get('peer'),
-            }
+    for br_id, bridge in api.tables['Bridge'].rows.items():
 
-            labels = ','.join(["{}={}".format(key, value)
-                               for key, value in label_obj.iteritems()
-                               if not (value is None or len(value) == 0)])
+        print(BR_CNT_TMPL.format('ovs_bridge_port',
+                                 format_labels(bridge),
+                                 len(bridge.ports)))
 
-            if interface['link_state'] == "up":
-                status = 1
-                if len(interface['error']) > 0:
-                    status = 2
-            else:
-                status = 0
+        for port in bridge.ports:
+            print(BR_CNT_TMPL.format('ovs_bridge_port_iface',
+                                     format_labels(bridge, port),
+                                     len(port.interfaces)))
 
-            print "ovs_bridge,{} status={}".format(labels, status)
+            for iface in port.interfaces:
+                labels = format_labels(bridge, port, iface)
+
+                if iface.link_state == 'up':
+                    status = 1
+                    if len(iface.error) > 0:
+                        status = 2
+                else:
+                    status = 0
+
+                print(BR_CHK_TMPL.format('ovs_bridge', labels, status))
 
 
 if __name__ == "__main__":
     try:
         gather()
-        print "ovs_bridge check=1"
-    except Exception:
-        print "ovs_bridge check=0"
+        print(CHK_TMPL.format(1))
+    except Exception as e:
+        print(CHK_TMPL.format(0))
+        sys.stderr.write(str(e))
+        sys.exit(1)
