# # sfive # # sfive - spreadspace streaming statistics suite is a generic # statistic collection tool for streaming server infrastuctures. # The system collects and stores meta data like number of views # and throughput from a number of streaming servers and stores # it in a global data store. # The data acquisition is designed to be generic and extensible in # order to support different streaming software. # sfive also contains tools and applications to filter and visualize # live and recorded data. # # # Copyright (C) 2014 Christian Pointner # Markus Grueneis # # This file is part of sfive. # # sfive is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License version 3 # as published by the Free Software Foundation. # # sfive is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with sfive. If not, see . # import os from flumotion.component.plugs import base from flumotion.common import messages, i18n, log from flumotion.common.poller import Poller from flumotion.common.i18n import N_ T_ = i18n.gettexter() _DEFAULT_POLL_INTERVAL = 5 # in seconds __version__ = "$Rev$" class ComponentSFivePlug(base.ComponentPlug): """Class to send statistics to the spreadspace streaming statistic suite""" ### ComponentPlug methods def start(self, component): self.debug('SFive: plug loaded') self._sfivepoller = None self._component = component properties = self.args['properties'] self._socket = properties['socket'] self._hostename = properties['hostname'] self._content_id = properties.get('content-id') self._format = properties.get('format') self._quality = properties.get('quality') self._duration = properties.get('duration', _DEFAULT_POLL_INTERVAL) self._sfivepoller = Poller(self._updateSFive, self._duration, start=False) self._old_bytes_received = -1 self._old_bytes_sent = -1 self._initSocket() def stop(self, component): if self._sfivepoller: self._sfivepoller.stop() ## TODO: close unix socket def _initSocket(self): self.debug('SFive: connecting to %s...', self._socket) ## TODO: init unix socket and call _socketReady when socket is ready ## TODO: how handle connection drop??? self._socketReady() def _socketError(self): self.warning('SFive: connection lost... trying reconnect') ## TODO: try reconnect... def _socketReady(self): self.info('SFive: connection to sfive hub established') if self._sfivepoller: self._sfivepoller.start() def _sendInit(self): self.debug('SFive: sending init message') # TODO: create json and send it out # { # "hostname": "myhostname", # "streamer-id": { "content-id": "av-orig", "format": "flash", "quality": "medium" }, # "tags": [ "elevate", "2014", "discourse" ] # } def _updateSFive(self): client_count = self._component.getClients() bytes_received = self._component.getBytesReceived() bytes_sent = self._component.getBytesSent() bytes_received_diff = bytes_received - self._old_bytes_received if self._old_bytes_received > 0 else 0; self._old_bytes_received = bytes_received bytes_sent_diff = bytes_sent - self._old_bytes_sent if self._old_bytes_sent > 0 else 0; self._old_bytes_sent = bytes_sent self.debug('SFive: sending data (client-count: %d, bytes_received: %d, bytes_sent: %d)', client_count, bytes_received_diff, bytes_sent_diff) # TODO: create json and send it out # { # "start-time": "2014-08-03Z12:34:56.123", # "duration-ms": 5000, # "data": { # "clients": [ # { "ip": "127.0.0.1:2345", "bytes-transferred": 12094, "user-agent": "Mozilla Version 28", .... }, # ..... # ], # "client-count": 12, # "bytes-received": 12345, # "bytes-sent": 921734098, # .... # }