def _create_dbs(self, ts=None): ts = ts or int(time.time()) for db in ( ('test', 'foo.wsp'), ('test', 'wat', 'welp.wsp'), ('test', 'bar', 'baz.wsp'), ): db_path = os.path.join(WHISPER_DIR, *db) os.makedirs(os.path.dirname(db_path)) whisper.create(db_path, [(1, 60)]) whisper.update(db_path, 1, ts) whisper.update(db_path, 2, ts)
def create_db(self): whisper.create(self.db, [(1, 60)]) self.ts = int(time.time()) whisper.update(self.db, 0.5, self.ts - 2) whisper.update(self.db, 0.4, self.ts - 1) whisper.update(self.db, 0.6, self.ts)
def test_templates(self): ts = int(time.time()) value = 1 for db in ( ('hosts', 'worker1', 'cpu.wsp'), ('hosts', 'worker2', 'cpu.wsp'), ): db_path = os.path.join(WHISPER_DIR, *db) if not os.path.exists(os.path.dirname(db_path)): os.makedirs(os.path.dirname(db_path)) whisper.create(db_path, [(1, 60)]) whisper.update(db_path, value, ts) value += 1 for query, expected in [ ({'target': 'template(hosts.worker1.cpu)'}, 'hosts.worker1.cpu'), ({'target': 'template(constantLine($1),12)'}, '12'), ({'target': 'template(constantLine($1))', 'template[1]': '12'}, '12.0'), ({'target': 'template(constantLine($num),num=12)'}, '12'), ({'target': 'template(constantLine($num))', 'template[num]': '12'}, '12.0'), ({'target': 'template(time($1),"nameOfSeries")'}, 'nameOfSeries'), ({'target': 'template(time($1))', 'template[1]': 'nameOfSeries'}, 'nameOfSeries'), ({'target': 'template(time($name),name="nameOfSeries")'}, 'nameOfSeries'), ({'target': 'template(time($name))', 'template[name]': 'nameOfSeries'}, 'nameOfSeries'), ({'target': 'template(sumSeries(hosts.$1.cpu),"worker1")'}, 'sumSeries(hosts.worker1.cpu)'), ({'target': 'template(sumSeries(hosts.$1.cpu))', 'template[1]': 'worker*'}, 'sumSeries(hosts.worker*.cpu)'), ({'target': 'template(sumSeries(hosts.$host.cpu))', 'template[host]': 'worker*'}, 'sumSeries(hosts.worker*.cpu)'), ]: query['format'] = 'json' response = self.app.get(self.url, query_string=query) data = json.loads(response.data.decode('utf-8')) self.assertEqual(data[0]['target'], expected)
def test_render_options(self): self.create_db() db2 = os.path.join(WHISPER_DIR, 'foo.wsp') whisper.create(db2, [(1, 60)]) ts = int(time.time()) whisper.update(db2, 0.5, ts - 2) for qs in [ {'logBase': 'e'}, {'logBase': 1}, {'logBase': 0.5}, {'margin': -1}, {'colorList': 'orange,green,blue,#0f0'}, {'bgcolor': 'orange'}, {'bgcolor': 'aaabbb'}, {'bgcolor': '#aaabbb'}, {'bgcolor': '#aaabbbff'}, {'fontBold': 'true'}, {'title': 'Hellò'}, {'title': 'true'}, {'vtitle': 'Hellò'}, {'title': 'Hellò', 'yAxisSide': 'right'}, {'uniqueLegend': 'true', '_expr': 'secondYAxis({0})'}, {'uniqueLegend': 'true', 'vtitleRight': 'foo', '_expr': 'secondYAxis({0})'}, {'graphOnly': 'true', 'yUnitSystem': 'si'}, {'lineMode': 'staircase'}, {'lineMode': 'slope'}, {'lineMode': 'connected'}, {'min': 1, 'max': 1, 'thickness': 2, 'yUnitSystem': 'welp'}, {'yMax': 5, 'yLimit': 0.5, 'yStep': 0.1}, {'yMax': 'max', 'yUnitSystem': 'binary'}, {'areaMode': 'stacked', '_expr': 'stacked({0})'}, {'lineMode': 'staircase', '_expr': 'stacked({0})'}, {'areaMode': 'first', '_expr': 'stacked({0})'}, {'areaMode': 'all', '_expr': 'stacked({0})'}, {'areaMode': 'stacked', 'areaAlpha': 0.5, '_expr': 'stacked({0})'}, {'areaMode': 'stacked', 'areaAlpha': 'a', '_expr': 'stacked({0})'}, {'_expr': 'dashed(lineWidth({0}, 5))'}, {'target': 'areaBetween(*)'}, {'drawNullAsZero': 'true'}, {'_expr': 'drawAsInfinite({0})'}, {'graphType': 'pie', 'pieMode': 'average', 'title': 'Pie'}, {'graphType': 'pie', 'pieMode': 'average', 'hideLegend': 'true'}, {'graphType': 'pie', 'pieMode': 'average', 'valueLabels': 'none'}, {'graphType': 'pie', 'pieMode': 'average', 'valueLabels': 'number'}, {'graphType': 'pie', 'pieMode': 'average', 'pieLabels': 'rotated'}, {'noCache': 'true'}, {'cacheTimeout': 5}, {'cacheTimeout': 5}, # cache hit ]: if qs.setdefault('target', ['foo', 'test']) == ['foo', 'test']: if '_expr' in qs: expr = qs.pop('_expr') qs['target'] = [expr.format(t) for t in qs['target']] response = self.app.get(self.url, query_string=qs) self.assertEqual(response.status_code, 200) self.assertEqual(response.headers['Content-Type'], 'image/png') if Cache is None or qs.get('noCache'): self.assertEqual(response.headers['Pragma'], 'no-cache') self.assertEqual(response.headers['Cache-Control'], 'no-cache') self.assertFalse('Expires' in response.headers) else: self.assertEqual(response.headers['Cache-Control'], 'max-age={0}'.format( qs.get('cacheTimeout', 60))) self.assertNotEqual(response.headers['Cache-Control'], 'no-cache') self.assertFalse('Pragma' in response.headers) for qs in [ {'bgcolor': 'foo'}, ]: qs['target'] = 'test' with self.assertRaises(ValueError): response = self.app.get(self.url, query_string=qs) for qs in [ {'lineMode': 'stacked'}, ]: qs['target'] = 'test' with self.assertRaises(AssertionError): response = self.app.get(self.url, query_string=qs)
def test_render_options(self): self.create_db() db2 = os.path.join(WHISPER_DIR, 'foo.wsp') whisper.create(db2, [(1, 60)]) ts = int(time.time()) whisper.update(db2, 0.5, ts - 2) for qs in [ {'logBase': 'e'}, {'logBase': 1}, {'logBase': 0.5}, {'margin': -1}, {'colorList': 'orange,green,blue,#0f0'}, {'bgcolor': 'orange'}, {'bgcolor': 'aaabbb'}, {'bgcolor': '#aaabbb'}, {'bgcolor': '#aaabbbff'}, {'fontBold': 'true'}, {'title': 'Hellò'}, {'title': 'true'}, {'vtitle': 'Hellò'}, {'title': 'Hellò', 'yAxisSide': 'right'}, {'uniqueLegend': 'true', '_expr': 'secondYAxis({0})'}, {'uniqueLegend': 'true', 'vtitleRight': 'foo', '_expr': 'secondYAxis({0})'}, {'graphOnly': 'true', 'yUnitSystem': 'si'}, {'lineMode': 'staircase'}, {'lineMode': 'slope'}, {'lineMode': 'connected'}, {'min': 1, 'max': 1, 'thickness': 2, 'yUnitSystem': 'welp'}, {'yMax': 5, 'yLimit': 0.5, 'yStep': 0.1}, {'yMax': 'max', 'yUnitSystem': 'binary'}, {'areaMode': 'stacked', '_expr': 'stacked({0})'}, {'lineMode': 'staircase', '_expr': 'stacked({0})'}, {'areaMode': 'first', '_expr': 'stacked({0})'}, {'areaMode': 'all', '_expr': 'stacked({0})'}, {'areaMode': 'stacked', 'areaAlpha': 0.5, '_expr': 'stacked({0})'}, {'areaMode': 'stacked', 'areaAlpha': 'a', '_expr': 'stacked({0})'}, {'_expr': 'dashed(lineWidth({0}, 5))'}, {'target': 'areaBetween(*)'}, {'drawNullAsZero': 'true'}, {'_expr': 'drawAsInfinite({0})'}, {'graphType': 'pie', 'pieMode': 'average', 'title': 'Pie'}, {'graphType': 'pie', 'pieMode': 'average', 'hideLegend': 'true'}, {'graphType': 'pie', 'pieMode': 'average', 'valueLabels': 'none'}, {'graphType': 'pie', 'pieMode': 'average', 'valueLabels': 'number'}, {'graphType': 'pie', 'pieMode': 'average', 'pieLabels': 'rotated'}, {'noCache': 'true'}, {'cacheTimeout': 5}, {'cacheTimeout': 5}, # cache hit ]: if qs.setdefault('target', ['foo', 'test']) == ['foo', 'test']: if '_expr' in qs: expr = qs.pop('_expr') qs['target'] = [expr.format(t) for t in qs['target']] response = self.app.get(self.url, query_string=qs) self.assertEqual(response.status_code, 200) self.assertEqual(response.headers['Content-Type'], 'image/png') for qs in [ {'bgcolor': 'foo'}, ]: qs['target'] = 'test' with self.assertRaises(ValueError): response = self.app.get(self.url, query_string=qs) for qs in [ {'lineMode': 'stacked'}, ]: qs['target'] = 'test' with self.assertRaises(AssertionError): response = self.app.get(self.url, query_string=qs)
def test_render_options(self): self.create_db() db2 = os.path.join(WHISPER_DIR, 'foo.wsp') whisper.create(db2, [(1, 60)]) ts = int(time.time()) whisper.update(db2, 0.5, ts - 2) for qs in [ { 'logBase': 'e' }, { 'logBase': 1 }, { 'logBase': 0.5 }, { 'logBase': 10 }, { 'margin': -1 }, { 'colorList': 'orange,green,blue,#0f00f0' }, { 'bgcolor': 'orange' }, { 'bgcolor': '000000' }, { 'bgcolor': '#000000' }, { 'bgcolor': '123456' }, { 'bgcolor': '#123456' }, { 'bgcolor': '#12345678' }, { 'bgcolor': 'aaabbb' }, { 'bgcolor': '#aaabbb' }, { 'bgcolor': '#aaabbbff' }, { 'fontBold': 'true' }, { 'title': 'Hellò' }, { 'title': 'true' }, { 'vtitle': 'Hellò' }, { 'title': 'Hellò', 'yAxisSide': 'right' }, { 'uniqueLegend': 'true', '_expr': 'secondYAxis({0})' }, { 'uniqueLegend': 'true', 'vtitleRight': 'foo', '_expr': 'secondYAxis({0})' }, { 'rightWidth': '1', '_expr': 'secondYAxis({0})' }, { 'rightDashed': '1', '_expr': 'secondYAxis({0})' }, { 'rightColor': 'black', '_expr': 'secondYAxis({0})' }, { 'leftWidth': '1', 'target': ['secondYAxis(foo)', 'test'] }, { 'leftDashed': '1', 'target': ['secondYAxis(foo)', 'test'] }, { 'leftColor': 'black', 'target': ['secondYAxis(foo)', 'test'] }, { 'width': '10', '_expr': 'secondYAxis({0})' }, { 'logBase': 'e', 'target': ['secondYAxis(foo)', 'test'] }, { 'graphOnly': 'true', 'yUnitSystem': 'si' }, { 'graphOnly': 'true', 'yUnitSystem': 'wat' }, { 'lineMode': 'staircase' }, { 'lineMode': 'slope' }, { 'lineMode': 'slope', 'from': '-1s' }, { 'lineMode': 'connected' }, { 'min': 1, 'max': 2, 'thickness': 2, 'yUnitSystem': 'none' }, { 'yMax': 5, 'yLimit': 0.5, 'yStep': 0.1 }, { 'yMax': 'max', 'yUnitSystem': 'binary' }, { 'yMaxLeft': 5, 'yLimitLeft': 0.5, 'yStepLeft': 0.1, '_expr': 'secondYAxis({0})' }, { 'yMaxRight': 5, 'yLimitRight': 0.5, 'yStepRight': 0.1, '_expr': 'secondYAxis({0})' }, { 'yMin': 0, 'yLimit': 0.5, 'yStep': 0.1 }, { 'yMinLeft': 0, 'yLimitLeft': 0.5, 'yStepLeft': 0.1, '_expr': 'secondYAxis({0})' }, { 'yMinRight': 0, 'yLimitRight': 0.5, 'yStepRight': 0.1, '_expr': 'secondYAxis({0})' }, { 'areaMode': 'stacked', '_expr': 'stacked({0})' }, { 'lineMode': 'staircase', '_expr': 'stacked({0})' }, { 'areaMode': 'first', '_expr': 'stacked({0})' }, { 'areaMode': 'all', '_expr': 'stacked({0})' }, { 'areaMode': 'all', 'areaAlpha': 0.5, '_expr': 'secondYAxis({0})' }, { 'areaMode': 'all', 'areaAlpha': 0.5, 'target': ['secondYAxis(foo)', 'test'] }, { 'areaMode': 'stacked', 'areaAlpha': 0.5, '_expr': 'stacked({0})' }, { 'areaMode': 'stacked', 'areaAlpha': 'a', '_expr': 'stacked({0})' }, { 'areaMode': 'stacked', '_expr': 'drawAsInfinite({0})' }, { '_expr': 'dashed(lineWidth({0}, 5))' }, { 'target': 'areaBetween(*)' }, { 'drawNullAsZero': 'true' }, { '_expr': 'drawAsInfinite({0})' }, { 'graphType': 'pie', 'pieMode': 'average', 'title': 'Pie' }, { 'graphType': 'pie', 'pieMode': 'maximum', 'title': 'Pie' }, { 'graphType': 'pie', 'pieMode': 'minimum', 'title': 'Pie' }, { 'graphType': 'pie', 'pieMode': 'average', 'hideLegend': 'true' }, { 'graphType': 'pie', 'pieMode': 'average', 'valueLabels': 'none' }, { 'graphType': 'pie', 'pieMode': 'average', 'valueLabels': 'number' }, { 'graphType': 'pie', 'pieMode': 'average', 'pieLabels': 'rotated' }, { 'graphType': 'pie', 'pieMode': 'average', 'areaAlpha': '0.1' }, { 'graphType': 'pie', 'pieMode': 'average', 'areaAlpha': 'none' }, { 'graphType': 'pie', 'pieMode': 'average', 'valueLabelsColor': 'white' }, { 'noCache': 'true' }, { 'cacheTimeout': 5 }, { 'cacheTimeout': 5 }, # cache hit { 'tz': 'Europe/Berlin' }, ]: if qs.setdefault('target', ['foo', 'test']) == ['foo', 'test']: if '_expr' in qs: expr = qs.pop('_expr') qs['target'] = [expr.format(t) for t in qs['target']] response = self.app.get(self.url, query_string=qs) self.assertEqual(response.status_code, 200) self.assertEqual(response.headers['Content-Type'], 'image/png') if Cache is None or qs.get('noCache'): self.assertEqual(response.headers['Pragma'], 'no-cache') self.assertEqual(response.headers['Cache-Control'], 'no-cache') self.assertFalse('Expires' in response.headers) else: self.assertEqual( response.headers['Cache-Control'], 'max-age={0}'.format(qs.get('cacheTimeout', 60))) self.assertNotEqual(response.headers['Cache-Control'], 'no-cache') self.assertFalse('Pragma' in response.headers) for qs in [ { 'bgcolor': 'foo' }, ]: qs['target'] = 'test' with self.assertRaises(ValueError): response = self.app.get(self.url, query_string=qs) for qs in [ { 'lineMode': 'stacked' }, ]: qs['target'] = 'test' with self.assertRaises(AssertionError): response = self.app.get(self.url, query_string=qs)
def test_render_options(self): self.create_db() db2 = os.path.join(WHISPER_DIR, "foo.wsp") whisper.create(db2, [(1, 60)]) ts = int(time.time()) whisper.update(db2, 0.5, ts - 2) for qs in [ {"logBase": "e"}, {"logBase": 1}, {"logBase": 0.5}, {"margin": -1}, {"colorList": "orange,green,blue,#0f0"}, {"bgcolor": "orange"}, {"bgcolor": "aaabbb"}, {"bgcolor": "#aaabbb"}, {"bgcolor": "#aaabbbff"}, {"fontBold": "true"}, {"title": "Hellò"}, {"title": "true"}, {"vtitle": "Hellò"}, {"title": "Hellò", "yAxisSide": "right"}, {"uniqueLegend": "true", "_expr": "secondYAxis({0})"}, {"uniqueLegend": "true", "vtitleRight": "foo", "_expr": "secondYAxis({0})"}, {"graphOnly": "true", "yUnitSystem": "si"}, {"lineMode": "staircase"}, {"lineMode": "slope"}, {"lineMode": "connected"}, {"min": 1, "max": 1, "thickness": 2, "yUnitSystem": "welp"}, {"yMax": 5, "yLimit": 0.5, "yStep": 0.1}, {"yMax": "max", "yUnitSystem": "binary"}, {"areaMode": "stacked", "_expr": "stacked({0})"}, {"lineMode": "staircase", "_expr": "stacked({0})"}, {"areaMode": "first", "_expr": "stacked({0})"}, {"areaMode": "all", "_expr": "stacked({0})"}, {"areaMode": "stacked", "areaAlpha": 0.5, "_expr": "stacked({0})"}, {"areaMode": "stacked", "areaAlpha": "a", "_expr": "stacked({0})"}, {"_expr": "dashed(lineWidth({0}, 5))"}, {"target": "areaBetween(*)"}, {"drawNullAsZero": "true"}, {"_expr": "drawAsInfinite({0})"}, {"graphType": "pie", "pieMode": "average", "title": "Pie"}, {"graphType": "pie", "pieMode": "average", "hideLegend": "true"}, {"graphType": "pie", "pieMode": "average", "valueLabels": "none"}, {"graphType": "pie", "pieMode": "average", "valueLabels": "number"}, {"graphType": "pie", "pieMode": "average", "pieLabels": "rotated"}, {"noCache": "true"}, {"cacheTimeout": 5}, {"cacheTimeout": 5}, # cache hit ]: if qs.setdefault("target", ["foo", "test"]) == ["foo", "test"]: if "_expr" in qs: expr = qs.pop("_expr") qs["target"] = [expr.format(t) for t in qs["target"]] response = self.app.get(self.url, query_string=qs) self.assertEqual(response.status_code, 200) self.assertEqual(response.headers["Content-Type"], "image/png") for qs in [{"bgcolor": "foo"}]: qs["target"] = "test" with self.assertRaises(ValueError): response = self.app.get(self.url, query_string=qs) for qs in [{"lineMode": "stacked"}]: qs["target"] = "test" with self.assertRaises(AssertionError): response = self.app.get(self.url, query_string=qs)