blob: 55ec07b20418ae1833587dffa5fe98f00768fad5 [file] [log] [blame]
#!/usr/bin/env python
#
# Copyright 2017 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
"""
Voltha internal diagnostics
"""
import arrow
import gc
import structlog
import resource
from simplejson import dumps
from twisted.internet.defer import Deferred
from twisted.internet.task import LoopingCall
from zope.interface import implementer
from common.event_bus import EventBusClient
from voltha.registry import IComponent, registry
log = structlog.get_logger()
@implementer(IComponent)
class Diagnostics(object):
def __init__(self, config):
self.config = config
self.periodic_check_interval = config.get(
'periodic_check_interval', 15)
self.periodic_checks = None
self.event_bus = EventBusClient()
self.instance_id = registry('main').get_args().instance_id
def start(self):
log.debug('starting')
self.periodic_checks = LoopingCall(self.run_periodic_checks)
self.periodic_checks.start(self.periodic_check_interval)
log.info('started')
return self
def stop(self):
log.debug('stopping')
if self.periodic_checks is not None:
self.periodic_checks.stop()
log.info('stopped')
def run_periodic_checks(self):
ts = arrow.utcnow().timestamp
def deferreds():
return len(gc.get_referrers(Deferred))
def rss_mb():
return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024/1024
data = dict(
type='slice',
ts=ts,
data={
'voltha.internal.{}'.format(self.instance_id): {
'deferreds': deferreds(),
'rss-mb': rss_mb(),
}
}
)
self.event_bus.publish('kpis', dumps(data))
log.debug('periodic-check', ts=ts)