# Copyright (C) The Arvados Authors. All rights reserved. # # SPDX-License-Identifier: AGPL-3.0 try: from html import escape except ImportError: from cgi import escape import json import pkg_resources class WebChart(object): """Base class for a web chart. Subclasses must assign JSLIB and JSASSETS, and override the chartdata() method. """ JSLIB = None JSASSET = None def __init__(self, label, summarizers): self.label = label self.summarizers = summarizers def html(self): return ''' {} stats {} '''.format(escape(self.label), self.JSLIB, self.js(), self.headHTML()) def js(self): return 'var chartdata = {};\n{}'.format( json.dumps(self.sections()), '\n'.join([pkg_resources.resource_string('crunchstat_summary', jsa).decode('utf-8') for jsa in self.JSASSETS])) def sections(self): return [ { 'label': s.long_label(), 'charts': [ self.chartdata(s.label, s.tasks, stat) for stat in (('cpu', ['user+sys__rate', 'user__rate', 'sys__rate']), ('mem', ['rss']), ('net:eth0', ['tx+rx__rate','rx__rate','tx__rate']), ('net:keep0', ['tx+rx__rate','rx__rate','tx__rate']), ('statfs', ['used', 'total']), ) ], } for s in self.summarizers] def chartdata(self, label, tasks, stat): """Return chart data for the given tasks. The returned value will be available on the client side as an element of the "chartdata" array. """ raise NotImplementedError() def headHTML(self): """Return extra HTML text to include in HEAD.""" return ''