コード例 #1
0
    def __init__(self, argv=(), env={}, debug=False):
        """Populate Munin Plugin with MuninGraph instances.
        
        @param argv:  List of command line arguments.
        @param env:   Dictionary of environment variables.
        @param debug: Print debugging messages if True. (Default: False)
        
        """
        MuninPlugin.__init__(self, argv, env, debug)

        self.envRegisterFilter('queues', '^[\w\-]+$')
        self._amihost = self.envGet('amihost')
        self._amiport = self.envGet('amiport')
        self._amiuser = self.envGet('amiuser')
        self._amipass = self.envGet('amipass')
        self._ami = None

        self._codecList = (self.envGetList('codecs')
                           or ['alaw', 'ulaw', 'gsm', 'g729'])

        self._chanList = []
        for chanstr in (self.envGetList('channels')
                        or ['dahdi', 'zap', 'sip', 'iax2', 'local']):
            chan = chanstr.lower()
            if chan in ('zap', 'dahdi'):
                if 'dahdi' not in self._chanList:
                    self._chanList.append('dahdi')
            else:
                self._chanList.append(chan)

        self._trunkList = []
        for trunk_entry in self.envGetList('trunks', None):
            mobj = (re.match('(.*)=(.*)=(\d+)-(\d+)$', trunk_entry,
                             re.IGNORECASE)
                    or re.match('(.*)=(.*)$', trunk_entry, re.IGNORECASE))
            if mobj:
                self._trunkList.append(mobj.groups())

        if self.graphEnabled('asterisk_calls'):
            graph = MuninGraph('Asterisk - Call Stats',
                               'Asterisk',
                               info='Asterisk - Information on Calls.',
                               period='minute',
                               args='--base 1000 --lower-limit 0')
            graph.addField('active_calls',
                           'active_calls',
                           type='GAUGE',
                           draw='LINE2',
                           info='Active Calls')
            graph.addField('calls_per_min',
                           'calls_per_min',
                           type='DERIVE',
                           min=0,
                           draw='LINE2',
                           info='Calls per minute')
            self.appendGraph('asterisk_calls', graph)

        if self.graphEnabled('asterisk_channels'):
            graph = MuninGraph(
                'Asterisk - Active Channels',
                'Asterisk',
                info='Asterisk - Information on Active Channels.',
                args='--base 1000 --lower-limit 0')
            for field in self._chanList:
                graph.addField(field, field, type='GAUGE', draw='AREASTACK')
            if 'dahdi' in self._chanList:
                graph.addField('mix', 'mix', type='GAUGE', draw='LINE2')
            self.appendGraph('asterisk_channels', graph)

        if self.graphEnabled('asterisk_peers_sip'):
            graph = MuninGraph(
                'Asterisk - VoIP Peers - SIP',
                'Asterisk',
                info='Asterisk - Information on SIP VoIP Peers.',
                args='--base 1000 --lower-limit 0')
            for field in ('online', 'unmonitored', 'unreachable', 'lagged',
                          'unknown'):
                graph.addField(field, field, type='GAUGE', draw='AREASTACK')
            self.appendGraph('asterisk_peers_sip', graph)

        if self.graphEnabled('asterisk_peers_iax2'):
            graph = MuninGraph(
                'Asterisk - VoIP Peers - IAX2',
                'Asterisk',
                info='Asterisk - Information on IAX2 VoIP Peers.',
                args='--base 1000 --lower-limit 0')
            for field in ('online', 'unmonitored', 'unreachable', 'lagged',
                          'unknown'):
                graph.addField(field, field, type='GAUGE', draw='AREASTACK')
            self.appendGraph('asterisk_peers_iax2', graph)

        if self.graphEnabled('asterisk_voip_codecs'):
            graph = MuninGraph(
                'Asterisk - VoIP Codecs for Active Channels',
                'Asterisk',
                info='Asterisk - Codecs for Active VoIP Channels (SIP/IAX2)',
                args='--base 1000 --lower-limit 0')
            for field in self._codecList:
                graph.addField(field, field, type='GAUGE', draw='AREASTACK')
            graph.addField('other', 'other', type='GAUGE', draw='AREASTACK')
            self.appendGraph('asterisk_voip_codecs', graph)

        if self.graphEnabled('asterisk_conferences'):
            graph = MuninGraph(
                'Asterisk - Conferences',
                'Asterisk',
                info='Asterisk - Information on Meetme Conferences',
                args='--base 1000 --lower-limit 0')
            graph.addField('rooms',
                           'rooms',
                           type='GAUGE',
                           draw='LINE2',
                           info='Active conference rooms.')
            graph.addField('users',
                           'users',
                           type='GAUGE',
                           draw='LINE2',
                           info='Total number of users in conferences.')
            self.appendGraph('asterisk_conferences', graph)

        if self.graphEnabled('asterisk_voicemail'):
            graph = MuninGraph(
                'Asterisk - Voicemail',
                'Asterisk',
                info='Asterisk - Information on Voicemail Accounts',
                args='--base 1000 --lower-limit 0')
            graph.addField('accounts',
                           'accounts',
                           type='GAUGE',
                           draw='LINE2',
                           info='Number of voicemail accounts.')
            graph.addField(
                'msg_avg',
                'msg_avg',
                type='GAUGE',
                draw='LINE2',
                info='Average number of messages per voicemail account.')
            graph.addField(
                'msg_max',
                'msg_max',
                type='GAUGE',
                draw='LINE2',
                info='Maximum number of messages in one voicemail account.')
            graph.addField(
                'msg_total',
                'msg_total',
                type='GAUGE',
                draw='LINE2',
                info='Total number of messages in all voicemail accounts.')
            self.appendGraph('asterisk_voicemail', graph)

        if self.graphEnabled('asterisk_trunks') and len(self._trunkList) > 0:
            graph = MuninGraph('Asterisk - Trunks',
                               'Asterisk',
                               info='Asterisk - Active calls on trunks.',
                               args='--base 1000 --lower-limit 0',
                               autoFixNames=True)
            for trunk in self._trunkList:
                graph.addField(trunk[0],
                               trunk[0],
                               type='GAUGE',
                               draw='AREASTACK')
            self.appendGraph('asterisk_trunks', graph)

        self._queues = None
        self._queue_list = None
        if (self.graphEnabled('asterisk_queue_len')
                or self.graphEnabled('asterisk_queue_avg_hold')
                or self.graphEnabled('asterisk_queue_avg_talk')
                or self.graphEnabled('asterisk_queue_calls')
                or self.graphEnabled('asterisk_queue_abandon_pcent')):
            if self._ami is None:
                self._ami = AsteriskInfo(self._amihost, self._amiport,
                                         self._amiuser, self._amipass)
            self._queues = self._ami.getQueueStats()
            self._queue_list = [
                queue for queue in self._queues.keys()
                if self.envCheckFilter('queues', queue)
            ]
            self._queue_list.sort()
            if self.graphEnabled('asterisk_queue_abandon_pcent'):
                self._queues_prev = self.restoreState()
                if self._queues_prev is None:
                    self._queues_prev = self._queues
                self.saveState(self._queues)

        if self._queues is not None and len(self._queue_list) > 0:
            if self.graphEnabled('asterisk_queue_len'):
                graph = MuninGraph(
                    'Asterisk - Queues - Calls in Queue',
                    'Asterisk',
                    info='Asterisk - Queues - Number of calls in queues.',
                    args='--base 1000 --lower-limit 0')
                for queue in self._queue_list:
                    graph.addField(queue,
                                   queue,
                                   type='GAUGE',
                                   draw='AREASTACK',
                                   info='Number of calls in queue %s.' % queue)
                self.appendGraph('asterisk_queue_len', graph)
            if self.graphEnabled('asterisk_queue_avg_hold'):
                graph = MuninGraph(
                    'Asterisk - Queues - Average Hold Time (sec)',
                    'Asterisk',
                    info='Asterisk - Queues - Average Hold Time.',
                    args='--base 1000 --lower-limit 0')
                for queue in self._queue_list:
                    graph.addField(queue,
                                   queue,
                                   type='GAUGE',
                                   draw='LINE2',
                                   info='Average hold time for queue %s.' %
                                   queue)
                self.appendGraph('asterisk_queue_avg_hold', graph)
            if self.graphEnabled('asterisk_queue_avg_talk'):
                graph = MuninGraph(
                    'Asterisk - Queues - Average Talk Time (sec)',
                    'Asterisk',
                    info='Asterisk - Queues - Average Talk Time.).',
                    args='--base 1000 --lower-limit 0')
                for queue in self._queue_list:
                    graph.addField(queue,
                                   queue,
                                   type='GAUGE',
                                   draw='LINE2',
                                   info='Average talk time for queue %s.' %
                                   queue)
                self.appendGraph('asterisk_queue_avg_talk', graph)
            if self.graphEnabled('asterisk_queue_calls'):
                graph = MuninGraph(
                    'Asterisk - Queues - Calls per Minute',
                    'Asterisk',
                    period='minute',
                    info=
                    'Asterisk - Queues - Abandoned/Completed Calls per minute.',
                    args='--base 1000 --lower-limit 0')
                graph.addField('abandon',
                               'abandon',
                               type='DERIVE',
                               draw='AREASTACK',
                               info='Abandoned calls per minute.')
                graph.addField('answer',
                               'answer',
                               type='DERIVE',
                               draw='AREASTACK',
                               info='Answered calls per minute.')
                self.appendGraph('asterisk_queue_calls', graph)
            if self.graphEnabled('asterisk_queue_abandon_pcent'):
                graph = MuninGraph(
                    'Asterisk - Queues - Abandoned Calls (%)',
                    'Asterisk',
                    info='Asterisk - Queues - Abandoned calls vs, total calls.',
                    args='--base 1000 --lower-limit 0')
                for queue in self._queue_list:
                    graph.addField(
                        queue,
                        queue,
                        type='GAUGE',
                        draw='LINE2',
                        info='Abandoned vs. total calls for queue %s.' % queue)
                self.appendGraph('asterisk_queue_abandon_pcent', graph)

        self._fax_stats = None
        if (self.graphEnabled('asterisk_fax_attempts')
                or self.graphEnabled('asterisk_fax_errors')):
            if self._ami is None:
                self._ami = AsteriskInfo(self._amihost, self._amiport,
                                         self._amiuser, self._amipass)
            self._fax_stats = self._ami.getFaxStatsCounters()

        if self._fax_stats:
            if self.graphEnabled('asterisk_fax_stats'):
                graph = MuninGraph(
                    'Asterisk - Fax Stats',
                    'Asterisk',
                    period='minute',
                    info=
                    'Asterisk - Fax - Fax Recv / Send Attempts per minute.',
                    args='--base 1000 --lower-limit 0')
                graph.addField('send',
                               'send',
                               type='DERIVE',
                               draw='AREASTACK',
                               info='Fax send attempts per minute.')
                graph.addField('recv',
                               'recv',
                               type='DERIVE',
                               draw='AREASTACK',
                               info='Fax receive attempts per minute.')
                graph.addField('fail',
                               'fail',
                               type='DERIVE',
                               draw='LINE2',
                               info='Failed fax attempts per minute.')
                self.appendGraph('asterisk_fax_attempts', graph)
コード例 #2
0
    def retrieveVals(self):
        """Retrieve values for graphs."""
        if self._ami is None:
            self._ami = AsteriskInfo(self._amihost, self._amiport,
                                     self._amiuser, self._amipass)

        if self.hasGraph('asterisk_calls') or self.hasGraph(
                'asterisk_channels'):
            stats = self._ami.getChannelStats(self._chanList)
            if self.hasGraph('asterisk_calls') and stats:
                self.setGraphVal('asterisk_calls', 'active_calls',
                                 stats.get('active_calls'))
                self.setGraphVal('asterisk_calls', 'calls_per_min',
                                 stats.get('calls_processed'))
            if self.hasGraph('asterisk_channels') and stats:
                for field in self._chanList:
                    self.setGraphVal('asterisk_channels', field,
                                     stats.get(field))
                if 'dahdi' in self._chanList:
                    self.setGraphVal('asterisk_channels', 'mix',
                                     stats.get('mix'))

        if self.hasGraph('asterisk_peers_sip'):
            stats = self._ami.getPeerStats('sip')
            if stats:
                for field in ('online', 'unmonitored', 'unreachable', 'lagged',
                              'unknown'):
                    self.setGraphVal('asterisk_peers_sip', field,
                                     stats.get(field))

        if self.hasGraph('asterisk_peers_iax2'):
            stats = self._ami.getPeerStats('iax2')
            if stats:
                for field in ('online', 'unmonitored', 'unreachable', 'lagged',
                              'unknown'):
                    self.setGraphVal('asterisk_peers_iax2', field,
                                     stats.get(field))

        if self.hasGraph('asterisk_voip_codecs'):
            sipstats = self._ami.getVoIPchanStats('sip', self._codecList)
            iax2stats = self._ami.getVoIPchanStats('iax2', self._codecList)
            if stats:
                for field in self._codecList:
                    self.setGraphVal(
                        'asterisk_voip_codecs', field,
                        sipstats.get(field) + iax2stats.get(field))
                self.setGraphVal(
                    'asterisk_voip_codecs', 'other',
                    sipstats.get('other') + iax2stats.get('other'))

        if self.hasGraph('asterisk_conferences'):
            stats = self._ami.getConferenceStats()
            if stats:
                self.setGraphVal('asterisk_conferences', 'rooms',
                                 stats.get('active_conferences'))
                self.setGraphVal('asterisk_conferences', 'users',
                                 stats.get('conference_users'))

        if self.hasGraph('asterisk_voicemail'):
            stats = self._ami.getVoicemailStats()
            if stats:
                self.setGraphVal('asterisk_voicemail', 'accounts',
                                 stats.get('accounts'))
                self.setGraphVal('asterisk_voicemail', 'msg_avg',
                                 stats.get('avg_messages'))
                self.setGraphVal('asterisk_voicemail', 'msg_max',
                                 stats.get('max_messages'))
                self.setGraphVal('asterisk_voicemail', 'msg_total',
                                 stats.get('total_messages'))

        if self.hasGraph('asterisk_trunks') and len(self._trunkList) > 0:
            stats = self._ami.getTrunkStats(self._trunkList)
            for trunk in self._trunkList:
                self.setGraphVal('asterisk_trunks', trunk[0],
                                 stats.get(trunk[0]))

        if self._queues is not None:
            total_answer = 0
            total_abandon = 0
            for queue in self._queue_list:
                stats = self._queues[queue]
                if self.hasGraph('asterisk_queue_len'):
                    self.setGraphVal('asterisk_queue_len', queue,
                                     stats.get('queue_len'))
                if self.hasGraph('asterisk_queue_avg_hold'):
                    self.setGraphVal('asterisk_queue_avg_hold', queue,
                                     stats.get('avg_holdtime'))
                if self.hasGraph('asterisk_queue_avg_talk'):
                    self.setGraphVal('asterisk_queue_avg_talk', queue,
                                     stats.get('avg_talktime'))
                if self.hasGraph('asterisk_queue_calls'):
                    total_abandon += stats.get('calls_abandoned')
                    total_answer += stats.get('calls_completed')
                if self.hasGraph('asterisk_queue_abandon_pcent'):
                    prev_stats = self._queues_prev.get(queue)
                    val = 0
                    if prev_stats is not None:
                        abandon = (stats.get('calls_abandoned', 0) -
                                   prev_stats.get('calls_abandoned', 0))
                        answer = (stats.get('calls_completed', 0) -
                                  prev_stats.get('calls_completed', 0))
                        if answer >= 0 and abandon >= 0:
                            total = abandon + answer
                            if total > 0:
                                val = 100.0 * float(abandon) / float(total)
                    self.setGraphVal('asterisk_queue_abandon_pcent', queue,
                                     val)
            if self.hasGraph('asterisk_queue_calls'):
                self.setGraphVal('asterisk_queue_calls', 'abandon',
                                 total_abandon)
                self.setGraphVal('asterisk_queue_calls', 'answer',
                                 total_answer)

        if self._fax_stats is not None:
            if self.hasGraph('asterisk_fax_attempts'):
                stats = self._fax_stats.get('general')
                if stats is not None:
                    self.setGraphVal('asterisk_fax_attempts', 'send',
                                     stats.get('transmit attempts'))
                    self.setGraphVal('asterisk_fax_attempts', 'recv',
                                     stats.get('receive attempts'))
                    self.setGraphVal('asterisk_fax_attempts', 'fail',
                                     stats.get('failed faxes'))