@cryptotaxi247 / netdata-1 / commits / 647cc8851

mongodb: various KeyError fixes (#5931)

* ensure that `locks` key in server_status dict before in * ensure that `mapped` in server_status['mem'] + minor

Ilya Mashchenko committed May 6, 2019 at 17:13 UTC 647cc8851dfdd17e4b0f76aee100aaa47a39f8a0
1 file changed +26 -22
collectors/python.d.plugin/mongodb/mongodb.chart.py
+26 -22
@@ -469,7 +469,8 @@ class Service(SimpleService):
469 self.metrics_to_collect.extend(COMMANDS)
470 if 'wiredTiger' in server_status:
471 self.metrics_to_collect.extend(WIREDTIGER)
472 - if 'Collection' in server_status['locks']:
472 + has_locks = 'locks' in server_status
473 + if has_locks and 'Collection' in server_status['locks']:
474 self.metrics_to_collect.extend(LOCKS)
475
476 def create_charts_(self, server_status):
@@ -496,13 +497,14 @@ class Service(SimpleService):
497 self.order.remove('command_total_rate')
498 self.order.remove('command_failed_rate')
499
499 - if 'Collection' not in server_status['locks']:
500 + has_no_locks = 'locks' not in server_status
501 + if has_no_locks or 'Collection' not in server_status['locks']:
502 self.order.remove('locks_collection')
503 self.order.remove('locks_database')
504 self.order.remove('locks_global')
505 self.order.remove('locks_metadata')
506
505 - if 'oplog' not in server_status['locks']:
507 + if has_no_locks or 'oplog' not in server_status['locks']:
508 self.order.remove('locks_oplog')
509
510 for dbase in self.databases:
@@ -632,7 +634,7 @@ class Service(SimpleService):
634 if not raw_data:
635 return None
636
635 - to_netdata = dict()
637 + data = dict()
638 serverStatus = raw_data['serverStatus']
639 dbStats = raw_data.get('dbStats')
640 replSetGetStatus = raw_data.get('replSetGetStatus')
@@ -649,23 +651,22 @@ class Service(SimpleService):
651 break
652
653 if not isinstance(value, dict) and key:
652 - to_netdata[new_name or key] = value if not func else func(value)
654 + data[new_name or key] = value if not func else func(value)
655
654 - to_netdata['nonmapped'] = to_netdata['virtual'] - serverStatus['mem'].get('mappedWithJournal',
655 - to_netdata['mapped'])
656 - if to_netdata.get('maximum bytes configured'):
657 - maximum = to_netdata['maximum bytes configured']
658 - to_netdata['wiredTiger_percent_clean'] = int(to_netdata['bytes currently in the cache']
659 - * 100 / maximum * 1000)
660 - to_netdata['wiredTiger_percent_dirty'] = int(to_netdata['tracked dirty bytes in the cache']
661 - * 100 / maximum * 1000)
656 + if 'mapped' in serverStatus['mem']:
657 + data['nonmapped'] = data['virtual'] - serverStatus['mem'].get('mappedWithJournal', data['mapped'])
658 +
659 + if data.get('maximum bytes configured'):
660 + maximum = data['maximum bytes configured']
661 + data['wiredTiger_percent_clean'] = int(data['bytes currently in the cache'] * 100 / maximum * 1000)
662 + data['wiredTiger_percent_dirty'] = int(data['tracked dirty bytes in the cache'] * 100 / maximum * 1000)
663
664 # dbStats
665 if dbStats:
666 for dbase in dbStats:
667 for metric in DBSTATS:
668 key = '_'.join([dbase, metric])
668 - to_netdata[key] = dbStats[dbase][metric]
669 + data[key] = dbStats[dbase][metric]
670
671 # replSetGetStatus
672 if replSetGetStatus:
@@ -676,30 +677,33 @@ class Service(SimpleService):
677 for member in members:
678 if not member.get('self'):
679 other_hosts.append(member)
680 +
681 # Replica set time diff between current time and time when last entry from the oplog was applied
682 if member.get('optimeDate', unix_epoch) != unix_epoch:
683 member_optimedate = member['name'] + '_optimedate'
682 - to_netdata.update({member_optimedate: int(delta_calculation(delta=utc_now - member['optimeDate'],
683 - multiplier=1000))})
684 + delta = utc_now - member['optimeDate']
685 + data[member_optimedate] = int(delta_calculation(delta=delta, multiplier=1000))
686 +
687 # Replica set members state
688 member_state = member['name'] + '_state'
689 for elem in REPL_SET_STATES:
690 state = elem[0]
688 - to_netdata.update({'_'.join([member_state, state]): 0})
689 - to_netdata.update({'_'.join([member_state, str(member['state'])]): member['state']})
691 + data.update({'_'.join([member_state, state]): 0})
692 + data.update({'_'.join([member_state, str(member['state'])]): member['state']})
693 +
694 # Heartbeat lag calculation
695 for other in other_hosts:
696 if other['lastHeartbeatRecv'] != unix_epoch:
697 node = other['name'] + '_heartbeat_lag'
694 - to_netdata[node] = int(delta_calculation(delta=utc_now - other['lastHeartbeatRecv'],
695 - multiplier=1000))
698 + delta = utc_now - other['lastHeartbeatRecv']
699 + data[node] = int(delta_calculation(delta=delta, multiplier=1000))
700
701 if getReplicationInfo:
702 first_event = getReplicationInfo['ASCENDING']['ts'].as_datetime()
703 last_event = getReplicationInfo['DESCENDING']['ts'].as_datetime()
700 - to_netdata['timeDiff'] = int(delta_calculation(delta=last_event - first_event, multiplier=1000))
704 + data['timeDiff'] = int(delta_calculation(delta=last_event - first_event, multiplier=1000))
705
702 - return to_netdata
706 + return data
707
708 def _create_connection(self):
709 conn_vars = {'host': self.host, 'port': self.port}