mirror of
https://github.com/dkmstr/openuds.git
synced 2025-01-03 01:17:56 +03:00
* Added basic charting to server (used nowhere right now, but it's now available :-), posiblily used in a future when adding REST api)
* Added basic counter stats retrieval to xmlrpc api (for charts on administration client)
This commit is contained in:
parent
8a35b7bd69
commit
d1d2a1cbe8
@ -200,6 +200,8 @@ encoding//src/uds/xmlrpc/services/Publications.py=utf-8
|
||||
encoding//src/uds/xmlrpc/services/ServiceProviders.py=utf-8
|
||||
encoding//src/uds/xmlrpc/services/Services.py=utf-8
|
||||
encoding//src/uds/xmlrpc/services/UserDeployedServices.py=utf-8
|
||||
encoding//src/uds/xmlrpc/stats/__init__.py=utf-8
|
||||
encoding//src/uds/xmlrpc/stats/stats.py=utf-8
|
||||
encoding//src/uds/xmlrpc/tools/Cache.py=utf-8
|
||||
encoding//src/uds/xmlrpc/tools/Config.py=utf-8
|
||||
encoding//src/uds/xmlrpc/transports/Networks.py=utf-8
|
||||
|
@ -29,9 +29,12 @@
|
||||
'''
|
||||
@author: Adolfo Gómez, dkmaster at dkmon dot com
|
||||
'''
|
||||
|
||||
import datetime
|
||||
import cairo
|
||||
import pycha.line
|
||||
import StringIO
|
||||
import time
|
||||
|
||||
from uds.models import getSqlDatetime
|
||||
|
||||
@ -56,7 +59,7 @@ def make(obj, counterType, **kwargs):
|
||||
|
||||
limit = width
|
||||
|
||||
dataset1 = tuple(counters.getCounters(obj, counterType, since=since, to=to, limit=limit, use_max = kwargs.get('use_max', False)))
|
||||
dataset1 = tuple((int(time.mktime(x[0].timetuple())), x[1]) for x in counters.getCounters(obj, counterType, since=since, to=to, limit=limit, use_max = kwargs.get('use_max', False)))
|
||||
|
||||
if len(dataset1) == 0:
|
||||
dataset1 = ( (getSqlDatetime(True)-3600, 0), (getSqlDatetime(True), 0) )
|
||||
@ -72,7 +75,7 @@ def make(obj, counterType, **kwargs):
|
||||
|
||||
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
|
||||
|
||||
dataset = ( ( counters.getCounterTitle(counterType).encode('ascii'), dataset1 ),)
|
||||
dataset = ( ( counters.getCounterTitle(counterType).encode('iso-8859-1', errors='ignore'), dataset1 ),)
|
||||
|
||||
options = {
|
||||
'axis': {
|
||||
@ -108,11 +111,11 @@ def make(obj, counterType, **kwargs):
|
||||
|
||||
chart = pycha.line.LineChart(surface, options)
|
||||
chart.addDataset(dataset)
|
||||
chart.minxval = dataset1[0][0]
|
||||
chart.render()
|
||||
surface.write_to_png('/tmp/test.png')
|
||||
|
||||
def _initialize():
|
||||
global __typeTitles
|
||||
output = StringIO.StringIO()
|
||||
|
||||
surface.write_to_png(output)
|
||||
|
||||
return output.getvalue()
|
||||
|
@ -31,6 +31,7 @@
|
||||
'''
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from uds.core.managers import statsManager
|
||||
import datetime
|
||||
|
||||
import logging
|
||||
|
||||
@ -102,7 +103,7 @@ def getCounters(obj, counterType, **kwargs):
|
||||
owner_ids = fnc(obj)
|
||||
|
||||
for i in statsManager().getCounters(__transDict[type(obj)], counterType, owner_ids, since, to, limit, use_max):
|
||||
val = (i.stamp, i.value)
|
||||
val = (datetime.datetime.fromtimestamp(i.stamp), i.value)
|
||||
yield val
|
||||
|
||||
def getCounterTitle(counterType):
|
||||
|
@ -111,6 +111,7 @@ def needs_credentials(xmlrpc_func):
|
||||
cred = validateCredentials(request, credentials)
|
||||
if cred is not None:
|
||||
logger.debug('Credentials valid, executing')
|
||||
logger.debug('args: {0}'.format(args))
|
||||
return xmlrpc_func(cred, *args, **kwargs)
|
||||
raise AuthException(_('Credentials no longer valid'))
|
||||
return _wrapped_xmlrcp_func
|
||||
|
0
server/src/uds/xmlrpc/stats/__init__.py
Normal file
0
server/src/uds/xmlrpc/stats/__init__.py
Normal file
64
server/src/uds/xmlrpc/stats/stats.py
Normal file
64
server/src/uds/xmlrpc/stats/stats.py
Normal file
@ -0,0 +1,64 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
#
|
||||
# Copyright (c) 2013 Virtual Cable S.L.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without modification,
|
||||
# are permitted provided that the following conditions are met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright notice,
|
||||
# this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||
# this list of conditions and the following disclaimer in the documentation
|
||||
# and/or other materials provided with the distribution.
|
||||
# * Neither the name of Virtual Cable S.L. nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
'''
|
||||
@author: Adolfo Gómez, dkmaster at dkmon dot com
|
||||
'''
|
||||
|
||||
from django.utils.translation import ugettext as _
|
||||
from ..auths.AdminAuth import needs_credentials
|
||||
from ..util.Exceptions import FindException
|
||||
from uds.core.util.stats import counters
|
||||
from uds.core.util.Cache import Cache
|
||||
|
||||
from uds.models import DeployedService
|
||||
|
||||
import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
cache = Cache('StatsDispatcher')
|
||||
|
||||
@needs_credentials
|
||||
def getDeployedServiceCounters(credentials, id, counter_type, since, to, points, use_max):
|
||||
try:
|
||||
us = DeployedService.objects.get(pk=id)
|
||||
logger.debug(us)
|
||||
res = []
|
||||
for x in counters.getCounters(us, counter_type, since=since, to=to, limit=points, use_max=use_max):
|
||||
res.append({ 'stamp': x[0], 'value': x[1] })
|
||||
return { 'title': counters.getCounterTitle(counter_type), 'data': res }
|
||||
return ()
|
||||
except:
|
||||
logger.exception('exception')
|
||||
raise FindException(_('Service does not exists'))
|
||||
|
||||
# Registers XML RPC Methods
|
||||
def registerStatsFunctions(dispatcher):
|
||||
dispatcher.register_function(getDeployedServiceCounters, 'getDeployedServiceCounters')
|
@ -58,10 +58,10 @@ def DuplicateEntryException(msg):
|
||||
return Fault(DUPLICATE_FAIL, msg)
|
||||
|
||||
def InsertException(msg):
|
||||
return Fault(FIND_FAIL, msg)
|
||||
return Fault(INSERT_FAIL, msg)
|
||||
|
||||
def FindException(msg):
|
||||
return Fault()
|
||||
return Fault(FIND_FAIL, msg)
|
||||
|
||||
def DeleteException(msg):
|
||||
return Fault(DELETE_FAIL, msg)
|
||||
|
@ -53,6 +53,7 @@ from auths.UserPreferences import registerPreferencesFunctions
|
||||
from tools.Cache import registerCacheFunctions
|
||||
from tools.Config import registerConfigurationFunctions
|
||||
from log.logs import registerLogFunctions
|
||||
from stats.stats import registerStatsFunctions
|
||||
|
||||
import logging
|
||||
|
||||
@ -144,3 +145,4 @@ registerPreferencesFunctions(dispatcher)
|
||||
registerCacheFunctions(dispatcher)
|
||||
registerConfigurationFunctions(dispatcher)
|
||||
registerLogFunctions(dispatcher)
|
||||
registerStatsFunctions(dispatcher)
|
||||
|
Loading…
Reference in New Issue
Block a user