Beispiel #1
0
def doImageRender(graphClass, graphOptions):
  pngData = BytesIO()
  t = time()
  img = graphClass(**graphOptions)
  img.output(pngData)
  log.rendering('Rendered PNG in %.6f seconds' % (time() - t))
  imageData = pngData.getvalue()
  pngData.close()
  return imageData
Beispiel #2
0
def doImageRender(graphClass, graphOptions):
    pngData = BytesIO()
    t = time()
    img = graphClass(**graphOptions)
    img.output(pngData)
    log.rendering('Rendered PNG in %.6f seconds' % (time() - t))
    imageData = pngData.getvalue()
    pngData.close()
    return imageData
    def test_get_index(self, http_request):
        finder = RemoteFinder('127.0.0.1')

        data = [
            'a.b.c',
            'a.b.c.d',
        ]
        responseObject = HTTPResponse(body=BytesIO(
            json.dumps(data).encode('utf-8')),
                                      status=200,
                                      preload_content=False)
        http_request.return_value = responseObject

        result = finder.get_index({})

        self.assertIsInstance(result, list)

        self.assertEqual(http_request.call_args[0], (
            'POST',
            'http://127.0.0.1/metrics/index.json',
        ))
        self.assertEqual(
            http_request.call_args[1], {
                'fields': [
                    ('local', '1'),
                ],
                'headers': None,
                'preload_content': False,
                'timeout': 10,
            })

        self.assertEqual(len(result), 2)

        self.assertEqual(result[0], 'a.b.c')
        self.assertEqual(result[1], 'a.b.c.d')

        # non-json response
        responseObject = HTTPResponse(body=BytesIO(b'error'),
                                      status=200,
                                      preload_content=False)
        http_request.return_value = responseObject

        with self.assertRaisesRegexp(
                Exception,
                'Error decoding index response from http://[^ ]+: .+'):
            result = finder.get_index({})
Beispiel #4
0
def renderLocalView(request):
  try:
    start = time()
    reqParams = BytesIO(request.body)
    graphType = reqParams.readline().strip()
    optionsPickle = reqParams.read()
    reqParams.close()
    graphClass = GraphTypes[graphType]
    options = unpickle.loads(optionsPickle)
    image = doImageRender(graphClass, options)
    log.rendering("Delegated rendering request took %.6f seconds" % (time() -  start))
    response = buildResponse(image)
    add_never_cache_headers(response)
    return response
  except:
    log.exception("Exception in graphite.render.views.rawrender")
    return HttpResponseServerError()
    def test_RemoteFinder_fetch(self, http_request):
        test_finders = RemoteFinder.factory()
        finder = test_finders[0]
        startTime = 1496262000
        endTime = 1496262060

        data = [
            {
                'start': startTime,
                'step': 60,
                'end': endTime,
                'values': [1.0, 0.0, 1.0, 0.0, 1.0],
                'name': 'a.b.c.d',
            },
        ]
        responseObject = HTTPResponse(body=BytesIO(pickle.dumps(data)),
                                      status=200,
                                      preload_content=False)
        http_request.return_value = responseObject

        result = finder.fetch(['a.b.c.d'], startTime, endTime)
        expected_response = [
            {
                'pathExpression': 'a.b.c.d',
                'name': 'a.b.c.d',
                'time_info': (1496262000, 1496262060, 60),
                'values': [1.0, 0.0, 1.0, 0.0, 1.0],
            },
        ]
        self.assertEqual(result, expected_response)
        self.assertEqual(http_request.call_args[0], (
            'POST',
            'https://127.0.0.1/render/',
        ))
        self.assertEqual(
            http_request.call_args[1], {
                'fields': [
                    ('format', 'pickle'),
                    ('local', '1'),
                    ('noCache', '1'),
                    ('from', startTime),
                    ('until', endTime),
                    ('target', 'a.b.c.d'),
                ],
                'headers':
                None,
                'preload_content':
                False,
                'timeout':
                10,
            })
Beispiel #6
0
def renderLocalView(request):
  try:
    start = time()
    reqParams = BytesIO(request.body)
    graphType = reqParams.readline().strip()
    optionsPickle = reqParams.read()
    reqParams.close()
    graphClass = GraphTypes[graphType]
    options = unpickle.loads(optionsPickle)
    image = doImageRender(graphClass, options)
    log.rendering("Delegated rendering request took %.6f seconds" % (time() -  start))
    response = buildResponse(image)
    add_never_cache_headers(response)
    return response
  except Exception:
    log.exception("Exception in graphite.render.views.rawrender")
    return HttpResponseServerError()
Beispiel #7
0
    def test_send_email(self, mock_smtp, http_response, http_request):
        url = reverse('composer_send_email')
        request = {
            "to":
            "noreply@localhost",
            "url":
            'https://localhost:8000/render?target=sumSeries(a.b.c.d)&title=Test&width=500&from=-55minutes&until=now&height=400'
        }

        response = self.client.get(reverse('render'), {'target': 'test'})
        self.assertEqual(response['Content-Type'], 'image/png')
        data = response.content
        responseObject = HTTPResponse(body=BytesIO(data),
                                      status=200,
                                      preload_content=False)
        http_request.return_value = responseObject
        http_response.return_value = responseObject

        instance = mock_smtp.return_value
        instance.sendmail.return_value = {}

        response = self.client.get(url, request)
        self.assertEqual(response.content, b'OK')
    def test_find_nodes(self, http_request):
        finder = RemoteFinder('127.0.0.1')

        startTime = 1496262000
        endTime = 1496262060

        data = [
            {
                'path': 'a.b.c',
                'is_leaf': False,
            },
            {
                'path': 'a.b.c.d',
                'is_leaf': True,
            },
        ]
        responseObject = HTTPResponse(body=BytesIO(pickle.dumps(data)),
                                      status=200,
                                      preload_content=False)
        http_request.return_value = responseObject

        query = FindQuery('a.b.c', startTime, endTime)
        result = finder.find_nodes(query)

        self.assertIsInstance(result, types.GeneratorType)

        nodes = list(result)

        self.assertEqual(http_request.call_args[0], (
            'POST',
            'http://127.0.0.1/metrics/find/',
        ))
        self.assertEqual(
            http_request.call_args[1], {
                'fields': [
                    ('local', '1'),
                    ('format', 'pickle'),
                    ('query', 'a.b.c'),
                    ('from', startTime),
                    ('until', endTime),
                ],
                'headers':
                None,
                'preload_content':
                False,
                'timeout':
                10,
            })

        self.assertEqual(len(nodes), 2)

        self.assertIsInstance(nodes[0], BranchNode)
        self.assertEqual(nodes[0].path, 'a.b.c')

        self.assertIsInstance(nodes[1], LeafNode)
        self.assertEqual(nodes[1].path, 'a.b.c.d')

        finder = RemoteFinder('https://127.0.0.1?format=msgpack')

        data = [
            {
                'path': 'a.b.c',
                'is_leaf': False,
            },
            {
                'path': 'a.b.c.d',
                'is_leaf': True,
            },
        ]
        responseObject = HTTPResponse(
            body=BytesIO(msgpack.dumps(data, use_bin_type=True)),
            status=200,
            preload_content=False,
            headers={'Content-Type': 'application/x-msgpack'})
        http_request.return_value = responseObject

        query = FindQuery('a.b.c', None, None)
        result = finder.find_nodes(query)

        self.assertIsInstance(result, types.GeneratorType)

        nodes = list(result)

        self.assertEqual(http_request.call_args[0], (
            'POST',
            'https://127.0.0.1/metrics/find/',
        ))
        self.assertEqual(
            http_request.call_args[1], {
                'fields': [
                    ('local', '1'),
                    ('format', 'msgpack'),
                    ('query', 'a.b.c'),
                ],
                'headers':
                None,
                'preload_content':
                False,
                'timeout':
                10,
            })

        self.assertEqual(len(nodes), 2)

        self.assertIsInstance(nodes[0], BranchNode)
        self.assertEqual(nodes[0].path, 'a.b.c')

        self.assertIsInstance(nodes[1], LeafNode)
        self.assertEqual(nodes[1].path, 'a.b.c.d')

        # non-pickle response
        responseObject = HTTPResponse(body=BytesIO(b'error'),
                                      status=200,
                                      preload_content=False)
        http_request.return_value = responseObject

        result = finder.find_nodes(query)

        with self.assertRaisesRegexp(
                Exception,
                'Error decoding find response from https://[^ ]+: .+'):
            list(result)
    def test_auto_complete_values(self, http_request):
        finder = RemoteFinder('127.0.0.1')

        data = [
            'value1',
            'value2',
        ]

        responseObject = HTTPResponse(body=BytesIO(
            json.dumps(data).encode('utf-8')),
                                      status=200,
                                      preload_content=False)
        http_request.return_value = responseObject

        result = finder.auto_complete_values(['name=test'], 'tag1', 'value')

        self.assertIsInstance(result, list)

        self.assertEqual(http_request.call_args[0], (
            'POST',
            'http://127.0.0.1/tags/autoComplete/values',
        ))
        self.assertEqual(
            http_request.call_args[1], {
                'fields': [
                    ('tag', 'tag1'),
                    ('valuePrefix', 'value'),
                    ('limit', '100'),
                    ('expr', 'name=test'),
                ],
                'headers':
                None,
                'preload_content':
                False,
                'timeout':
                10,
            })

        self.assertEqual(len(result), 2)

        self.assertEqual(result[0], 'value1')
        self.assertEqual(result[1], 'value2')

        # explicit limit & forward headers
        responseObject = HTTPResponse(body=BytesIO(
            json.dumps(data).encode('utf-8')),
                                      status=200,
                                      preload_content=False)
        http_request.return_value = responseObject

        result = finder.auto_complete_values(
            ['name=test', 'tag3=value3'],
            'tag1',
            'value',
            limit=5,
            requestContext={'forwardHeaders': {
                'X-Test': 'test'
            }})

        self.assertIsInstance(result, list)

        self.assertEqual(http_request.call_args[0], (
            'POST',
            'http://127.0.0.1/tags/autoComplete/values',
        ))
        self.assertEqual(
            http_request.call_args[1], {
                'fields': [
                    ('tag', 'tag1'),
                    ('valuePrefix', 'value'),
                    ('limit', '5'),
                    ('expr', 'name=test'),
                    ('expr', 'tag3=value3'),
                ],
                'headers': {
                    'X-Test': 'test'
                },
                'preload_content':
                False,
                'timeout':
                10,
            })

        self.assertEqual(len(result), 2)

        self.assertEqual(result[0], 'value1')
        self.assertEqual(result[1], 'value2')

        # non-json response
        responseObject = HTTPResponse(body=BytesIO(b'error'),
                                      status=200,
                                      preload_content=False)
        http_request.return_value = responseObject

        with self.assertRaisesRegexp(
                Exception,
                'Error decoding autocomplete values response from http://[^ ]+: .+'
        ):
            result = finder.auto_complete_values(['name=test'], 'tag1',
                                                 'value')
    def test_RemoteReader_fetch_multi(self, http_request):
        test_finders = RemoteFinder.factory()
        finder = test_finders[0]

        startTime = 1496262000
        endTime = 1496262060

        # no path or bulk_query
        reader = RemoteReader(finder, {})
        self.assertEqual(reader.bulk_query, [])
        result = reader.fetch_multi(startTime, endTime)
        self.assertEqual(result, [])
        self.assertEqual(http_request.call_count, 0)

        # path
        reader = RemoteReader(finder, {'intervals': [], 'path': 'a.b.c.d'})

        data = [{
            'start': startTime,
            'step': 60,
            'end': endTime,
            'values': [1.0, 0.0, 1.0, 0.0, 1.0],
            'name': 'a.b.c.d'
        }]
        responseObject = HTTPResponse(body=BytesIO(pickle.dumps(data)),
                                      status=200,
                                      preload_content=False)
        http_request.return_value = responseObject

        result = reader.fetch_multi(startTime, endTime)
        expected_response = [{
            'pathExpression': 'a.b.c.d',
            'name': 'a.b.c.d',
            'time_info': (1496262000, 1496262060, 60),
            'values': [1.0, 0.0, 1.0, 0.0, 1.0],
        }]
        self.assertEqual(result, expected_response)
        self.assertEqual(http_request.call_args[0], (
            'GET',
            'http://127.0.0.1/render/',
        ))
        self.assertEqual(
            http_request.call_args[1], {
                'fields': [
                    ('format', 'pickle'),
                    ('local', '1'),
                    ('noCache', '1'),
                    ('from', startTime),
                    ('until', endTime),
                    ('target', 'a.b.c.d'),
                ],
                'headers':
                None,
                'preload_content':
                False,
                'timeout':
                10,
            })

        # bulk_query & now
        finder = test_finders[1]
        reader = RemoteReader(finder, {
            'intervals': [],
            'path': 'a.b.c.d'
        },
                              bulk_query=['a.b.c.d'])

        data = [{
            'start': startTime,
            'step': 60,
            'end': endTime,
            'values': [1.0, 0.0, 1.0, 0.0, 1.0],
            'name': 'a.b.c.d'
        }]
        responseObject = HTTPResponse(
            body=BytesIO(msgpack.dumps(data, use_bin_type=True)),
            status=200,
            preload_content=False,
            headers={'Content-Type': 'application/x-msgpack'})
        http_request.return_value = responseObject

        result = reader.fetch_multi(
            startTime,
            endTime,
            now=endTime,
            requestContext={'forwardHeaders': {
                'Authorization': 'Basic xxxx'
            }})
        expected_response = [{
            'pathExpression': 'a.b.c.d',
            'name': 'a.b.c.d',
            'time_info': (1496262000, 1496262060, 60),
            'values': [1.0, 0.0, 1.0, 0.0, 1.0],
        }]
        self.assertEqual(result, expected_response)
        self.assertEqual(http_request.call_args[0], (
            'GET',
            'http://8.8.8.8/graphite/render/',
        ))
        self.assertEqual(
            http_request.call_args[1], {
                'fields': [
                    ('format', 'msgpack'),
                    ('local', '0'),
                    ('noCache', '1'),
                    ('from', startTime),
                    ('until', endTime),
                    ('target', 'a.b.c.d'),
                    ('now', endTime),
                ],
                'headers': {
                    'Authorization': 'Basic xxxx'
                },
                'preload_content':
                False,
                'timeout':
                10,
            })

        # non-pickle response
        responseObject = HTTPResponse(body=BytesIO(b'error'),
                                      status=200,
                                      preload_content=False)
        http_request.return_value = responseObject

        with self.assertRaisesRegexp(
                Exception, 'Error decoding response from http://[^ ]+: .+'):
            reader.fetch(startTime, endTime)

        # invalid response data
        data = [
            {},
        ]
        responseObject = HTTPResponse(
            body=BytesIO(msgpack.dumps(data, use_bin_type=True)),
            status=200,
            preload_content=False,
            headers={'Content-Type': 'application/x-msgpack'})
        http_request.return_value = responseObject

        with self.assertRaisesRegexp(
                Exception,
                r'Invalid render response from http://[^ ]+: KeyError\(\'name\',?\)'
        ):
            reader.fetch(startTime, endTime)

        # non-200 response
        responseObject = HTTPResponse(body=BytesIO(b'error'),
                                      status=500,
                                      preload_content=False)
        http_request.return_value = responseObject

        with self.assertRaisesRegexp(Exception,
                                     'Error response 500 from http://[^ ]+'):
            reader.fetch(startTime, endTime)

        # exception raised by request()
        http_request.side_effect = Exception('error')

        with self.assertRaisesRegexp(Exception,
                                     'Error requesting http://[^ ]+: error'):
            reader.fetch(startTime, endTime)
    def test_RemoteReader_fetch(self, http_request):
        test_finders = RemoteFinder.factory()
        finder = test_finders[0]

        startTime = 1496262000
        endTime = 1496262060

        # no path or bulk_query
        reader = RemoteReader(finder, {})
        self.assertEqual(reader.bulk_query, [])
        result = reader.fetch(startTime, endTime)
        self.assertEqual(result, None)
        self.assertEqual(http_request.call_count, 0)

        # path & bulk_query
        reader = RemoteReader(finder, {
            'intervals': [],
            'path': 'a.b.c.d'
        },
                              bulk_query=['a.b.c.*'])

        data = [{
            'start': startTime,
            'step': 60,
            'end': endTime,
            'values': [1.0, 0.0, 1.0, 0.0, 1.0],
            'name': 'a.b.c.c'
        }, {
            'start': startTime,
            'step': 60,
            'end': endTime,
            'values': [1.0, 0.0, 1.0, 0.0, 1.0],
            'name': 'a.b.c.d'
        }]
        responseObject = HTTPResponse(body=BytesIO(pickle.dumps(data)),
                                      status=200,
                                      preload_content=False)
        http_request.return_value = responseObject
        result = reader.fetch(startTime, endTime)
        expected_response = ((1496262000, 1496262060, 60),
                             [1.0, 0.0, 1.0, 0.0, 1.0])
        self.assertEqual(result, expected_response)
        self.assertEqual(http_request.call_args[0], (
            'GET',
            'http://127.0.0.1/render/',
        ))
        self.assertEqual(
            http_request.call_args[1], {
                'fields': [
                    ('format', 'pickle'),
                    ('local', '1'),
                    ('noCache', '1'),
                    ('from', startTime),
                    ('until', endTime),
                    ('target', 'a.b.c.*'),
                ],
                'headers':
                None,
                'preload_content':
                False,
                'timeout':
                10,
            })