class TestOpenTSDBReporter(TimedTestCase):
    def setUp(self):
        super(TestOpenTSDBReporter, self).setUp()
        self.registry = MetricsRegistry(clock=self.clock)
        self.maxDiff = None

    def tearDown(self):
        super(TestOpenTSDBReporter, self).tearDown()

    def test_report_now(self):
        r = OpenTSDBReporter(application_name="app",
                             write_key="key",
                             registry=self.registry,
                             reporting_interval=1,
                             clock=self.clock,
                             prefix="prefix.",
                             url="http://opentsdb.com/api/put")
        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2**i)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)
        output = r._collect_metrics(registry=self.registry)
        self.assertEqual(len(output), 31)
        for data in output:
            assert data['metric'].startswith("prefix.")

    def test_send_request(self):
        r = OpenTSDBReporter(application_name="app",
                             write_key="key",
                             registry=self.registry,
                             reporting_interval=1,
                             clock=self.clock,
                             prefix="prefix.",
                             url="http://opentsdb.com/api/put")
        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2**i)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)
        with mock.patch("pyformance.reporters.opentsdb_reporter.urllib.urlopen"
                        ) as patch:
            r.report_now()
            patch.assert_called()
예제 #2
0
class TestCloudWatchReporter(TimedTestCase):
    def setUp(self):
        super(TestCloudWatchReporter, self).setUp()
        self.registry = MetricsRegistry(clock=self.clock)
        self.maxDiff = None

    def tearDown(self):
        super(TestCloudWatchReporter, self).tearDown()

    def test_report_now(self):
        r = CloudWatchReporter(application_name="app", tags={"host":"localhost"},
                               registry=self.registry, reporting_interval=1, clock=self.clock,
                               aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                               region=REGION)

        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2 ** i)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)
        output = r._collect_metrics(registry=self.registry)
        self.assertEqual(len(output), 31)
        for data in output:
            assert data['metric'].startswith("prefix.")

    def test_send_request(self):
        r = CloudWatchReporter(application_name="app", tags={"host":"localhost"},
                               registry=self.registry, reporting_interval=1, clock=self.clock,
                               aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
                               region="ap-south-1")
        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2 ** i)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)
        r.report_now()
        # with mock.patch("pyformance.reporters.cloudwatch_reporter.botocore.client.CloudWatch.put_metric_data") as patch:
        with mock.patch("pyformance.reporters.cloudwatch_report.CloudWatchReporter._collect_metrics") as patch:
            r.report_now()
            patch.assert_called()
예제 #3
0
class TestOpenTSDBReporter(TimedTestCase):
    def setUp(self):
        super(TestOpenTSDBReporter, self).setUp()
        self.registry = MetricsRegistry(clock=self.clock)
        self.maxDiff = None

    def tearDown(self):
        super(TestOpenTSDBReporter, self).tearDown()

    def test_report_now(self):
        r = OpenTSDBReporter(application_name="app", write_key="key", registry=self.registry, reporting_interval=1,
                             clock=self.clock, prefix="prefix.", url="http://opentsdb.com/api/put")
        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2 ** i)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)
        output = r._collect_metrics(registry=self.registry)
        self.assertEqual(len(output), 31)
        for data in output:
            assert data['metric'].startswith("prefix.")

    def test_send_request(self):
        r = OpenTSDBReporter(application_name="app", write_key="key", registry=self.registry, reporting_interval=1,
                             clock=self.clock, prefix="prefix.", url="http://opentsdb.com/api/put")
        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2 ** i)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)
        with mock.patch("pyformance.reporters.opentsdb_reporter.urllib.urlopen") as patch:
            r.report_now()
            patch.assert_called()
def test_send_negative(mock_post):
    """
        Test negative responce from Apptuit backend
    """
    mock_post.return_value.status_code = 503
    token = "asdashdsauh_8aeraerf"
    tags = {
        "host": "localhost",
        "region": "us-east-1",
        "service": "web-server"
    }
    registry = MetricsRegistry()
    reporter = ApptuitReporter(sanitize_mode=None,
                               registry=registry,
                               api_endpoint="http://localhost",
                               reporting_interval=1,
                               token=token,
                               prefix="apr.",
                               tags=tags)
    cput = registry.histogram("cpu")
    count = 0
    while True:
        cput.add(random.randint(1, 100))
        count = count + 1
        if count > 10000:
            break
    with assert_raises(ApptuitSendException):
        reporter.report_now()
def test_reporter_thread_active(mock_post):
    """
        Test that reporter thread is active even if we are not able to send data
    """
    mock_post.return_value.status_code = 503
    mock_post.side_effect = HTTPError()
    token = "asdashdsauh_8aeraerf"
    tags = {
        "host": "localhost",
        "region": "us-east-1",
        "service": "web-server"
    }
    registry = MetricsRegistry()
    reporter = ApptuitReporter(sanitize_mode=None,
                               registry=registry,
                               api_endpoint="http://localhost",
                               reporting_interval=1,
                               token=token,
                               prefix="apr.",
                               tags=tags)
    reporter.start()
    cput = registry.histogram("cpu")
    cput.add(random.randint(1, 100))
    time.sleep(3)
    assert_greater_equal(mock_post.call_count, 2)
예제 #6
0
class TestSysLogReporter(TimedTestCase):

    def setUp(self):
        super(TestSysLogReporter, self).setUp()
        self.registry = MetricsRegistry(clock=self.clock)
        self.maxDiff = None
        self.clock.now = 0

    def tearDown(self):
        super(TestSysLogReporter, self).tearDown()
        self.clock.now = 0

    def test_report_now(self):
        #connect to a logal rsyslog server
        r = SysLogReporter(registry=self.registry, reporting_interval=1, clock=self.clock)
        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2 ** i)
        gcb = self.registry.gauge("gcb", lambda: 123)
        gsimple = self.registry.gauge("gsimple").set_value(42)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)
        with mock.patch("pyformance.reporters.syslog_reporter.logging.Logger.info") as patch:
            r.report_now()
            expected = '{"c1.count": 1, "counter-2.count": -2, "gcb.value": 123, "gsimple.value": 42, "hist.75_percentile": 160.0, "hist.95_percentile": 512, "hist.999_percentile": 512, "hist.99_percentile": 512, "hist.avg": 102.3, "hist.count": 10.0, "hist.max": 512, "hist.min": 1, "hist.std_dev": 164.94851048466947, "m1.15m_rate": 0, "m1.1m_rate": 0, "m1.5m_rate": 0, "m1.count": 1.0, "m1.mean_rate": 1.0, "t1.15m_rate": 0, "t1.1m_rate": 0, "t1.50_percentile": 1, "t1.5m_rate": 0, "t1.75_percentile": 1, "t1.95_percentile": 1, "t1.999_percentile": 1, "t1.99_percentile": 1, "t1.avg": 1.0, "t1.count": 1.0, "t1.max": 1, "t1.mean_rate": 1.0, "t1.min": 1, "t1.std_dev": 0.0, "t1.sum": 1.0, "timestamp": 1}'
 
            patch.assert_called_with(expected)
예제 #7
0
class TestSysLogReporter(TimedTestCase):

    def setUp(self):
        super(TestSysLogReporter, self).setUp()
        self.registry = MetricsRegistry(clock=self.clock)
        self.maxDiff = None
        self.clock.now = 0

    def tearDown(self):
        super(TestSysLogReporter, self).tearDown()
        self.clock.now = 0

    def test_report_now(self):
        # connect to a local rsyslog server
        r = SysLogReporter(registry=self.registry, reporting_interval=1, clock=self.clock)
        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2 ** i)
        gcb = self.registry.gauge("gcb", lambda: 123)
        gsimple = self.registry.gauge("gsimple").set_value(42)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)
        with mock.patch("pyformance.reporters.syslog_reporter.logging.Logger.info") as patch:
            r.report_now()
            expected = '{"c1.count": 1, "counter-2.count": -2, "gcb.value": 123, "gsimple.value": 42, "hist.75_percentile": 160.0, "hist.95_percentile": 512, "hist.999_percentile": 512, "hist.99_percentile": 512, "hist.avg": 102.3, "hist.count": 10.0, "hist.max": 512, "hist.min": 1, "hist.std_dev": 164.94851048466944, "m1.15m_rate": 0, "m1.1m_rate": 0, "m1.5m_rate": 0, "m1.count": 1.0, "m1.mean_rate": 1.0, "t1.15m_rate": 0, "t1.1m_rate": 0, "t1.50_percentile": 1, "t1.5m_rate": 0, "t1.75_percentile": 1, "t1.95_percentile": 1, "t1.999_percentile": 1, "t1.99_percentile": 1, "t1.avg": 1.0, "t1.count": 1.0, "t1.max": 1, "t1.mean_rate": 1.0, "t1.min": 1, "t1.std_dev": 0.0, "t1.sum": 1.0, "timestamp": 1}'
 
            patch.assert_called_with(expected)
예제 #8
0
class TestCarbonReporter(TimedTestCase):
    def setUp(self):
        super(TestCarbonReporter, self).setUp()
        self.output = StringIO()
        self.registry = MetricsRegistry(clock=self.clock)
        self.maxDiff = None

    def connect(self, *args):
        # part of fake socket interface
        pass

    def sendall(self, data):
        # part of fake socket interface
        self.output.write(data)

    def close(self):
        # part of fake socket interface
        pass

    def tearDown(self):
        super(TestCarbonReporter, self).tearDown()

    def test_report_now(self):
        r = CarbonReporter(registry=self.registry,
                           reporting_interval=1,
                           clock=self.clock,
                           socket_factory=lambda: self)
        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2**i)
        gcb = self.registry.gauge("gcb", lambda: 123)
        gsimple = self.registry.gauge("gsimple").set_value(42)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)
        r.report_now()
        self.assertEqual(self.output.getvalue().splitlines(), [
            'counter-2.count -2 1', 'gsimple.value 42 1', 'gcb.value 123 1',
            't1.1m_rate 0 1', 't1.999_percentile 1 1', 't1.15m_rate 0 1',
            't1.99_percentile 1 1', 't1.mean_rate 1.0 1',
            't1.95_percentile 1 1', 't1.min 1 1', 't1.5m_rate 0 1',
            't1.count 1.0 1', 't1.75_percentile 1 1', 't1.std_dev 0.0 1',
            't1.max 1 1', 't1.avg 1.0 1', 'hist.count 10.0 1',
            'hist.999_percentile 512 1', 'hist.99_percentile 512 1',
            'hist.min 1 1', 'hist.95_percentile 512 1',
            'hist.75_percentile 160.0 1', 'hist.std_dev 164.948510485 1',
            'hist.max 512 1', 'hist.avg 102.3 1', 'm1.1m_rate 0 1',
            'm1.15m_rate 0 1', 'm1.5m_rate 0 1', 'm1.mean_rate 1.0 1',
            'c1.count 1 1'
        ])
예제 #9
0
def report_metrics(host, server, token):
    reg = MetricsRegistry()

    wf_proxy_reporter = WavefrontProxyReporter(
        host=host,
        port=2878,
        registry=reg,
        source="wavefront-pyformance-example",
        tags={
            "key1": "val1",
            "key2": "val2"
        },
        prefix="python.proxy.")
    wf_direct_reporter = WavefrontDirectReporter(
        server=server,
        token=token,
        registry=reg,
        source="wavefront-pyformance-exmaple",
        tags={
            "key1": "val1",
            "key2": "val2"
        },
        prefix="python.direct.")

    # counter
    c1 = reg.counter("foo_count")
    c1.inc()

    # delta counter
    d1 = delta.delta_counter(reg, "foo_delta_count")
    d1.inc()
    d1.inc()

    # gauge
    g1 = reg.gauge("foo_gauge")
    g1.set_value(2)

    # meter
    m1 = reg.meter("foo_meter")
    m1.mark()

    # timer
    t1 = reg.timer("foo_timer")
    timer_ctx = t1.time()
    time.sleep(3)
    timer_ctx.stop()

    # histogram
    h1 = reg.histogram("foo_histogram")
    h1.add(1.0)
    h1.add(1.5)

    wf_proxy_reporter.report_now()
    wf_proxy_reporter.stop()
    wf_direct_reporter.report_now()
class TestConsoleReporter(TimedTestCase):
    def setUp(self):
        super(TestConsoleReporter, self).setUp()
        self.output = StringIO()
        self.registry = MetricsRegistry(clock=self.clock)
        self.maxDiff = None
        self.clock.now = 0

    def tearDown(self):
        super(TestConsoleReporter, self).tearDown()
        self.clock.now = 0

    def test_report_now(self):
        r = ConsoleReporter(registry=self.registry,
                            reporting_interval=1,
                            stream=self.output,
                            clock=self.clock)
        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2**i)
        gcb = self.registry.gauge("gcb", lambda: 123)
        gsimple = self.registry.gauge("gsimple").set_value(42)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)
        r.report_now()
        self.assertEqual(self.output.getvalue().splitlines(), [
            '== 1970-01-01 00:00:01 ===================================',
            'counter-2:', '               count = -2', 'gsimple:',
            '               value = 42', 'gcb:', '               value = 123',
            't1:', '             1m_rate = 0', '      999_percentile = 1',
            '            15m_rate = 0', '       99_percentile = 1',
            '           mean_rate = 1.0', '       95_percentile = 1',
            '                 min = 1', '             5m_rate = 0',
            '               count = 1.0', '       75_percentile = 1',
            '             std_dev = 0.0', '                 max = 1',
            '                 avg = 1.0', 'hist:',
            '               count = 10.0', '      999_percentile = 512',
            '       99_percentile = 512', '                 min = 1',
            '       95_percentile = 512', '       75_percentile = 160.0',
            '             std_dev = 164.948510485',
            '                 max = 512', '                 avg = 102.3',
            'm1:', '             1m_rate = 0', '            15m_rate = 0',
            '             5m_rate = 0', '           mean_rate = 1.0', 'c1:',
            '               count = 1', ''
        ])
def test_tags_with_key(mock_post):
    """
        Test that additions tags work
    """
    mock_post.return_value.status_code = 204
    token = "asdashdsauh_8aeraerf"
    tags = {
        "host": "localhost",
        "region": "us-east-1",
        "service": "web-server"
    }
    registry = MetricsRegistry()
    reporter = ApptuitReporter(sanitize_mode=None,
                               registry=registry,
                               api_endpoint="http://localhost",
                               reporting_interval=1,
                               token=token,
                               prefix="apr.",
                               tags=tags)
    cpu = registry.histogram('cpu {"tagk1":22,"tagk2":"tagv2"}')
    for i in range(1, 10):
        cpu.add(random.randint(i, 100))
    reporter.report_now()
def test_invalid_tag(mock_post):
    """
        Test for invalid tag key when reporting data
    """
    token = "asdashdsauh_8aeraerf"
    tags = {
        "h\\ost": "localhost",
        "region": "us-east-1",
        "service": "web-server"
    }
    registry = MetricsRegistry()
    reporter = ApptuitReporter(sanitize_mode=None,
                               registry=registry,
                               api_endpoint="http://localhost",
                               reporting_interval=1,
                               token=token,
                               prefix="apr.",
                               tags=tags)
    cpu = registry.histogram("cpu")
    for i in range(1, 10):
        cpu.add(random.randint(i, 100))
    with assert_raises(ValueError) as ex:
        reporter.report_now()
예제 #13
0
class TestNewRelicReporter(TimedTestCase):
    def setUp(self):
        super(TestNewRelicReporter, self).setUp()
        self.registry = MetricsRegistry(clock=self.clock, sink=NewRelicSink)
        self.maxDiff = None

    def tearDown(self):
        super(TestNewRelicReporter, self).tearDown()

    def test_report_now(self):
        r = NewRelicReporter('license_key',
                             registry=self.registry,
                             reporting_interval=1,
                             clock=self.clock,
                             name='foo')
        h1 = self.registry.histogram("hist", 'a/b')
        for i in range(10):
            h1.add(2**i)
        t1 = self.registry.timer("t1")
        gauge = self.registry.gauge('g1', SimpleGauge(unit='g'))
        gauge_value = 10
        gauge.set_value(gauge_value)

        m = self.registry.meter('m1', 'u1')
        m.mark()

        with t1.time():
            m.mark()
            c1 = self.registry.counter("counter-1", 'c')
            c2 = self.registry.counter("counter-2", 'c')
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)
            m.mark()
        output = json.loads(r.collect_metrics(self.registry))
        expected = {
            "agent": {
                "host": socket.gethostname(),
                "pid": os.getpid(),
                "version": "0.3.3"
            },
            "components": [{
                "duration": 1,
                "guid": "com.github.pyformance",
                "metrics": {
                    "Component/hist/raw": {
                        "max": 512,
                        "total": 1023,
                        "min": 1,
                        "count": 10,
                        "sum_of_squares": 349525
                    },
                    "Component/t1/95_percentile": 1.,
                    "Component/hist/999_percentile": 512,
                    "Component/counter-2/raw": {
                        "total": -3,
                        "max": -1,
                        "count": 2,
                        "sum_of_squares": 5,
                        "min": -2
                    },
                    "Component/t1/mean_rate": {
                        "max": 1,
                        "count": 1,
                        "total": 1.,
                        "min": 1,
                        "sum_of_squares": 1.
                    },
                    "Component/t1/999_percentile": 1.,
                    "Component/m1/1m_rate": {
                        "min": 0,
                        "total": 0,
                        "max": 0,
                        "sum_of_squares": 0,
                        "count": 0
                    },
                    "Component/t1/15m_rate": {
                        "total": 0,
                        "min": 0,
                        "max": 0,
                        "sum_of_squares": 0,
                        "count": 0
                    },
                    "Component/hist/99_percentile": 512,
                    "Component/t1/raw": {
                        "min": 1.,
                        "count": 1,
                        "sum_of_squares": 1.,
                        "max": 1.,
                        "total": 1.
                    },
                    "Component/m1/mean_rate": {
                        "sum_of_squares": 3.,
                        "count": 3,
                        "total": 3.,
                        "min": 1,
                        "max": 1
                    },
                    "Component/hist/std_dev": 164.94851048466947,
                    "Component/counter-1/raw": {
                        "count": 1,
                        "sum_of_squares": 1,
                        "min": 1,
                        "max": 1,
                        "total": 1
                    },
                    "Component/t1/50_percentile": 1.,
                    "Component/t1/99_percentile": 1.,
                    "Component/hist/95_percentile": 512,
                    "Component/m1/15m_rate": {
                        "count": 0,
                        "sum_of_squares": 0,
                        "max": 0,
                        "min": 0,
                        "total": 0
                    },
                    "Component/hist/75_percentile": 160.,
                    "Component/t1/5m_rate": {
                        "count": 0,
                        "min": 0,
                        "total": 0,
                        "sum_of_squares": 0,
                        "max": 0
                    },
                    "Component/hist/mean_rate": {
                        "count": 103,
                        "max": 1,
                        "sum_of_squares": 102.09,
                        "min": 0.29999999999999716,
                        "total": 102.3
                    },
                    "Component/t1/count": 1.,
                    "Component/g1/gauge": 10,
                    "Component/t1/1m_rate": {
                        "count": 0,
                        "total": 0,
                        "min": 0,
                        "max": 0,
                        "sum_of_squares": 0
                    },
                    "Component/t1/75_percentile": 1.,
                    "Component/t1/std_dev": 0.,
                    "Component/m1/raw": {
                        "min": 1,
                        "sum_of_squares": 3,
                        "count": 3,
                        "total": 3,
                        "max": 1
                    },
                    "Component/m1/5m_rate": {
                        "count": 0,
                        "min": 0,
                        "total": 0,
                        "sum_of_squares": 0,
                        "max": 0
                    }
                },
                "name": "foo"
            }]
        }

        self.assertEqual(json.loads(json.dumps(expected)),
                         json.loads(json.dumps(output)))
예제 #14
0
class TestCarbonReporter(TimedTestCase):
    def setUp(self):
        super(TestCarbonReporter, self).setUp()
        self.output = BytesIO()
        self.registry = MetricsRegistry(clock=self.clock)
        self.maxDiff = None

    def connect(self, *args):
        # part of fake socket interface
        pass

    def sendall(self, data):
        # part of fake socket interface
        self.output.write(data)

    def close(self):
        # part of fake socket interface
        pass

    def tearDown(self):
        super(TestCarbonReporter, self).tearDown()

    def capture_test_metrics(self):
        self.clock.now = 1
        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2**i)
        gcb = self.registry.gauge("gcb", lambda: 123)
        gsimple = self.registry.gauge("gsimple").set_value(42)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)

    def test_report_now_plain(self):
        r = CarbonReporter(registry=self.registry,
                           reporting_interval=1,
                           clock=self.clock,
                           socket_factory=lambda: self)
        self.capture_test_metrics()
        r.report_now()
        test_data = sorted(self.output.getvalue().decode().splitlines())
        expected_data = sorted([
            'counter-2.count -2 2',
            'c1.count 1 2',
            'gsimple.value 42 2',
            'gcb.value 123 2',
            't1.1m_rate 0 2',
            't1.999_percentile 1 2',
            't1.15m_rate 0 2',
            't1.99_percentile 1 2',
            't1.mean_rate 1.0 2',
            't1.95_percentile 1 2',
            't1.min 1 2',
            't1.50_percentile 1 2',
            't1.5m_rate 0 2',
            't1.count 1.0 2',
            't1.75_percentile 1 2',
            't1.std_dev 0.0 2',
            't1.max 1 2',
            't1.sum 1.0 2',
            't1.avg 1.0 2',
            'hist.count 10.0 2',
            'hist.999_percentile 512 2',
            'hist.99_percentile 512 2',
            'hist.min 1 2',
            'hist.95_percentile 512 2',
            'hist.75_percentile 160.0 2',
            'hist.50_percentile 24.0 2',
            'hist.std_dev 164.94851048466947 2' \
                if PY3 else 'hist.std_dev 164.948510485 2',
            'hist.max 512 2',
            'hist.avg 102.3 2',
            'm1.count 1.0 2',
            'm1.1m_rate 0 2',
            'm1.15m_rate 0 2',
            'm1.5m_rate 0 2',
            'm1.mean_rate 1.0 2',
        ])
        self.assertEqual(test_data, expected_data)

    def test_report_now_pickle(self):
        r = CarbonReporter(registry=self.registry,
                           reporting_interval=1,
                           clock=self.clock,
                           socket_factory=lambda: self,
                           pickle_protocol=True)
        self.capture_test_metrics()
        r.report_now()
        test_data = sorted(pickle.loads(self.output.getvalue()[4:]))
        expected_data = sorted([('counter-2.count', (2, -2.0)),
                                ('c1.count', (2, 1)),
                                ('gsimple.value', (2, 42.0)),
                                ('gcb.value', (2, 123.0)),
                                ('t1.1m_rate', (2, 0.0)),
                                ('t1.999_percentile', (2, 1)),
                                ('t1.15m_rate', (2, 0.0)),
                                ('t1.99_percentile', (2, 1)),
                                ('t1.mean_rate', (2, 1)),
                                ('t1.95_percentile', (2, 1)),
                                ('t1.min', (2, 1)),
                                ('t1.50_percentile', (2, 1)),
                                ('t1.5m_rate', (2, 0.0)), ('t1.count', (2, 1)),
                                ('t1.75_percentile', (2, 1)),
                                ('t1.std_dev', (2, 0.0)), ('t1.max', (2, 1)),
                                ('t1.sum', (2, 1)), ('t1.avg', (2, 1)),
                                ('hist.count', (2, 10.0)),
                                ('hist.999_percentile', (2, 512.0)),
                                ('hist.99_percentile', (2, 512.0)),
                                ('hist.min', (2, 1)),
                                ('hist.95_percentile', (2, 512.0)),
                                ('hist.75_percentile', (2, 160.0)),
                                ('hist.50_percentile', (2, 24.0)),
                                ('hist.std_dev', (2, 164.94851048466947)),
                                ('hist.max', (2, 512.0)),
                                ('hist.avg', (2, 102.3)), ('m1.count', (2, 1)),
                                ('m1.1m_rate', (2, 0.0)),
                                ('m1.15m_rate', (2, 0.0)),
                                ('m1.5m_rate', (2, 0.0)),
                                ('m1.mean_rate', (2, 1))])
        self.assertEqual(test_data, expected_data)
예제 #15
0
class TestConsoleReporter(TimedTestCase):
    def setUp(self):
        super(TestConsoleReporter, self).setUp()
        self.output = StringIO()
        self.registry = MetricsRegistry(clock=self.clock)
        self.maxDiff = None
        self.clock.now = 0

    def tearDown(self):
        super(TestConsoleReporter, self).tearDown()
        self.clock.now = 0

    def test_report_now(self):
        r = ConsoleReporter(
            registry=self.registry,
            reporting_interval=1,
            stream=self.output,
            clock=self.clock,
        )
        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2**i)
        gcb = self.registry.gauge("gcb", lambda: 123)
        gsimple = self.registry.gauge("gsimple").set_value(42)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)
        r.report_now()
        self.assertEqual(
            self.output.getvalue().splitlines().sort(),
            [
                "== 1970-01-01 00:00:01 ===================================",
                "counter-2:",
                "               count = -2",
                "gsimple:",
                "               value = 42",
                "gcb:",
                "               value = 123",
                "t1:",
                "             1m_rate = 0",
                "      999_percentile = 1",
                "            15m_rate = 0",
                "       99_percentile = 1",
                "           mean_rate = 1.0",
                "       95_percentile = 1",
                "                 min = 1",
                "             5m_rate = 0",
                "               count = 1.0",
                "       75_percentile = 1",
                "             std_dev = 0.0",
                "                 max = 1",
                "                 avg = 1.0",
                "hist:",
                "               count = 10.0",
                "      999_percentile = 512",
                "       99_percentile = 512",
                "                 min = 1",
                "       95_percentile = 512",
                "       75_percentile = 160.0",
                "             std_dev = 164.94851048466944",
                "                 max = 512",
                "                 avg = 102.3",
                "m1:",
                "               count = 1.0",
                "             1m_rate = 0",
                "            15m_rate = 0",
                "             5m_rate = 0",
                "           mean_rate = 1.0",
                "c1:",
                "               count = 1",
                "",
            ].sort(),
        )
예제 #16
0
class TestCarbonReporter(TimedTestCase):
    def setUp(self):
        super(TestCarbonReporter, self).setUp()
        self.output = BytesIO()
        self.registry = MetricsRegistry(clock=self.clock)
        self.maxDiff = None

    def connect(self, *args):
        # part of fake socket interface
        pass

    def sendall(self, data):
        # part of fake socket interface
        self.output.write(data)

    def close(self):
        # part of fake socket interface
        pass

    def tearDown(self):
        super(TestCarbonReporter, self).tearDown()

    def capture_test_metrics(self):
        self.clock.now = 1
        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2 ** i)
        gcb = self.registry.gauge("gcb", lambda: 123)
        gsimple = self.registry.gauge("gsimple").set_value(42)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)

    def test_report_now_plain(self):
        r = CarbonReporter(
            registry=self.registry,
            reporting_interval=1,
            clock=self.clock,
            socket_factory=lambda: self,
        )
        self.capture_test_metrics()
        r.report_now()
        test_data = sorted(self.output.getvalue().decode().splitlines())
        expected_data = sorted(
            [
                "counter-2.count -2 2",
                "c1.count 1 2",
                "gsimple.value 42 2",
                "gcb.value 123 2",
                "t1.1m_rate 0 2",
                "t1.999_percentile 1 2",
                "t1.15m_rate 0 2",
                "t1.99_percentile 1 2",
                "t1.mean_rate 1.0 2",
                "t1.95_percentile 1 2",
                "t1.min 1 2",
                "t1.50_percentile 1 2",
                "t1.5m_rate 0 2",
                "t1.count 1.0 2",
                "t1.75_percentile 1 2",
                "t1.std_dev 0.0 2",
                "t1.max 1 2",
                "t1.sum 1.0 2",
                "t1.avg 1.0 2",
                "hist.count 10.0 2",
                "hist.999_percentile 512 2",
                "hist.99_percentile 512 2",
                "hist.min 1 2",
                "hist.95_percentile 512 2",
                "hist.75_percentile 160.0 2",
                "hist.std_dev 164.94851048466944 2"
                if PY3
                else "hist.std_dev 164.948510485 2",
                "hist.max 512 2",
                "hist.avg 102.3 2",
                "m1.count 1.0 2",
                "m1.1m_rate 0 2",
                "m1.15m_rate 0 2",
                "m1.5m_rate 0 2",
                "m1.mean_rate 1.0 2",
            ]
        )
        self.assertEqual(test_data, expected_data)

    def test_report_now_pickle(self):
        r = CarbonReporter(
            registry=self.registry,
            reporting_interval=1,
            clock=self.clock,
            socket_factory=lambda: self,
            pickle_protocol=True,
        )
        self.capture_test_metrics()
        r.report_now()
        test_data = sorted(pickle.loads(self.output.getvalue()[4:]))
        expected_data = sorted(
            [
                ("counter-2.count", (2, -2.0)),
                ("c1.count", (2, 1)),
                ("gsimple.value", (2, 42.0)),
                ("gcb.value", (2, 123.0)),
                ("t1.1m_rate", (2, 0.0)),
                ("t1.999_percentile", (2, 1)),
                ("t1.15m_rate", (2, 0.0)),
                ("t1.99_percentile", (2, 1)),
                ("t1.mean_rate", (2, 1)),
                ("t1.95_percentile", (2, 1)),
                ("t1.min", (2, 1)),
                ("t1.50_percentile", (2, 1)),
                ("t1.5m_rate", (2, 0.0)),
                ("t1.count", (2, 1)),
                ("t1.75_percentile", (2, 1)),
                ("t1.std_dev", (2, 0.0)),
                ("t1.max", (2, 1)),
                ("t1.sum", (2, 1)),
                ("t1.avg", (2, 1)),
                ("hist.count", (2, 10.0)),
                ("hist.999_percentile", (2, 512.0)),
                ("hist.99_percentile", (2, 512.0)),
                ("hist.min", (2, 1)),
                ("hist.95_percentile", (2, 512.0)),
                ("hist.75_percentile", (2, 160.0)),
                ("hist.std_dev", (2, 164.94851048466944)),
                ("hist.max", (2, 512.0)),
                ("hist.avg", (2, 102.3)),
                ("m1.count", (2, 1)),
                ("m1.1m_rate", (2, 0.0)),
                ("m1.15m_rate", (2, 0.0)),
                ("m1.5m_rate", (2, 0.0)),
                ("m1.mean_rate", (2, 1)),
            ]
        )
        self.assertEqual(test_data, expected_data)
예제 #17
0
class TestCarbonReporter(TimedTestCase):

    def setUp(self):
        super(TestCarbonReporter, self).setUp()
        self.output = StringIO()
        self.registry = MetricsRegistry(clock=self.clock)
        self.maxDiff = None

    def connect(self, *args):
        # part of fake socket interface
        pass

    def sendall(self, data):
        # part of fake socket interface
        self.output.write(data)

    def close(self):
        # part of fake socket interface
        pass

    def tearDown(self):
        super(TestCarbonReporter, self).tearDown()

    def test_report_now(self):
        r = CarbonReporter(
            registry=self.registry, reporting_interval=1, clock=self.clock,
            socket_factory=lambda: self)
        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2 ** i)
        gcb = self.registry.gauge("gcb", lambda: 123)
        gsimple = self.registry.gauge("gsimple").set_value(42)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)
        r.report_now()
        self.assertEqual(self.output.getvalue().splitlines(), [
            'counter-2.count -2 1',
            'gsimple.value 42 1',
            'gcb.value 123 1',
            't1.1m_rate 0 1',
            't1.999_percentile 1 1',
            't1.15m_rate 0 1',
            't1.99_percentile 1 1',
            't1.mean_rate 1.0 1',
            't1.95_percentile 1 1',
            't1.min 1 1',
            't1.5m_rate 0 1',
            't1.count 1.0 1',
            't1.75_percentile 1 1',
            't1.std_dev 0.0 1',
            't1.max 1 1',
            't1.avg 1.0 1',
            'hist.count 10.0 1',
            'hist.999_percentile 512 1',
            'hist.99_percentile 512 1',
            'hist.min 1 1',
            'hist.95_percentile 512 1',
            'hist.75_percentile 160.0 1',
            'hist.std_dev 164.948510485 1',
            'hist.max 512 1',
            'hist.avg 102.3 1',
            'm1.1m_rate 0 1',
            'm1.15m_rate 0 1',
            'm1.5m_rate 0 1',
            'm1.mean_rate 1.0 1',
            'c1.count 1 1'
        ])
class TestConsoleReporter(TimedTestCase):

    def setUp(self):
        super(TestConsoleReporter, self).setUp()
        self.output = StringIO()
        self.registry = MetricsRegistry(clock=self.clock)
        self.maxDiff = None
        self.clock.now = 0

    def tearDown(self):
        super(TestConsoleReporter, self).tearDown()
        self.clock.now = 0

    def test_report_now(self):
        r = ConsoleReporter(
            registry=self.registry, reporting_interval=1, stream=self.output, clock=self.clock)
        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2 ** i)
        gcb = self.registry.gauge("gcb", lambda: 123)
        gsimple = self.registry.gauge("gsimple").set_value(42)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)
        r.report_now()
        self.assertEqual(self.output.getvalue().splitlines(), [
                         '== 1970-01-01 00:00:01 ===================================',
                         'counter-2:', '               count = -2',
                         'gsimple:', '               value = 42',
                         'gcb:', '               value = 123',
                         't1:', '             1m_rate = 0',
                         '      999_percentile = 1',
                         '            15m_rate = 0',
                         '       99_percentile = 1',
                         '           mean_rate = 1.0',
                         '       95_percentile = 1',
                         '                 min = 1',
                         '             5m_rate = 0',
                         '               count = 1.0',
                         '       75_percentile = 1',
                         '             std_dev = 0.0',
                         '                 max = 1',
                         '                 avg = 1.0',
                         'hist:', '               count = 10.0',
                         '      999_percentile = 512',
                         '       99_percentile = 512',
                         '                 min = 1',
                         '       95_percentile = 512',
                         '       75_percentile = 160.0',
                         '             std_dev = 164.948510485',
                         '                 max = 512',
                         '                 avg = 102.3',
                         'm1:', '             1m_rate = 0',
                         '            15m_rate = 0',
                         '             5m_rate = 0',
                         '           mean_rate = 1.0',
                         'c1:', '               count = 1', ''])
예제 #19
0
class BackupRequestHA(object):
    def __init__(self, url):
        self.url = url
        self.name = "backupRequestHA"

        self.curRoundTotalCount = 0
        self.curRoundRetryCount = 0

        self.init()

    def init(self):
        self.registry = MetricsRegistry()
        self.lastResetTime = time_ns()

    def call(self, request, lb):
        ep_list = lb.select_list(request)
        if not ep_list:
            return Response(exception=RemoteError('no available endpoint'))
        retries = self.url.get_method_int_value(request.method, 'retries', 0)
        if retries == 0:
            return self.do_call(request, ep_list[0])

        backupRequestDelayRatio = self.url.get_method_positive_int_value(
            request.method, "backupRequestDelayRatio",
            defaultBackupRequestDelayRatio)
        backupRequestMaxRetryRatio = self.url.get_method_positive_int_value(
            request.method, "backupRequestMaxRetryRatio",
            defaultBackupRequestMaxRetryRatio)
        requestTimeout = self.url.get_method_positive_int_value(
            request.method, "requestTimeout", defaultRequestTimeout)

        histogram = self.registry.histogram(request.method)
        delay = int(histogram.get_snapshot().get_percentile(
            backupRequestDelayRatio / 100.0))
        if delay < 10:
            delay = 10

        logger.debug('service: %s method: %s ha delay: %s' %
                     (request.service, request.method, str(delay)))

        with gevent.Timeout(requestTimeout / 1000.0, False):
            i = 0
            while i <= retries and i < len(ep_list):
                ep = ep_list[i]
                if i == 0:
                    self.update_call_record(counterRoundCount)
                if i > 0 and not self.try_acquirePermit(
                        backupRequestMaxRetryRatio):
                    break

                def func():
                    start = time_ns()
                    res = self.do_call(request, ep)
                    if not res.exception:
                        histogram.add(float(time_ns() - start) / 1e6)
                        return res

                g = gevent.spawn(func)
                try:
                    res = g.get(timeout=(delay / 1000.0))
                    if res: return res
                except gevent.timeout.Timeout:
                    pass

                i += 1

        return Response(exception=RemoteError('request timeout'))

    def do_call(self, request, ep):
        return ep.call(request)

    def update_call_record(self, threshold_limit):
        if self.curRoundTotalCount > threshold_limit or (
                time_ns() - self.lastResetTime) >= counterScaleThreshold:
            self.curRoundTotalCount = 1
            self.curRoundRetryCount = 0
            self.lastResetTime = time_ns()
        else:
            self.curRoundTotalCount += 1

    def try_acquirePermit(self, threshold_limit):
        if self.curRoundRetryCount >= threshold_limit:
            return False
        self.curRoundRetryCount += 1
        return True
class TestSysLogReporter(TimedTestCase):
    def setUp(self):
        super(TestSysLogReporter, self).setUp()
        self.registry = MetricsRegistry(clock=self.clock)
        self.maxDiff = None
        self.clock.now = 0

    def tearDown(self):
        super(TestSysLogReporter, self).tearDown()
        self.clock.now = 0

    def test_report_now(self):
        # connect to a local rsyslog server
        r = SysLogReporter(registry=self.registry,
                           reporting_interval=1,
                           clock=self.clock)
        h1 = self.registry.histogram("hist")
        for i in range(10):
            h1.add(2**i)
        gcb = self.registry.gauge("gcb", lambda: 123)
        gsimple = self.registry.gauge("gsimple").set_value(42)
        t1 = self.registry.timer("t1")
        m1 = self.registry.meter("m1")
        m1.mark()
        e1 = self.registry.event("e1")
        e1.add({"field": 1})
        with t1.time():
            c1 = self.registry.counter("c1")
            c2 = self.registry.counter("counter-2")
            c1.inc()
            c2.dec()
            c2.dec()
            self.clock.add(1)
        with mock.patch(
                "pyformance.reporters.syslog_reporter.logging.Logger.info"
        ) as patch:
            r.report_now()

            self.assertEqual(patch.call_count, 2)
            calls = patch.call_args_list

            expected = (
                '{"c1.count": 1, "counter-2.count": -2, '
                '"gcb.value": 123, "gsimple.value": 42, '
                '"hist.75_percentile": 160.0, "hist.95_percentile": 512, '
                '"hist.999_percentile": 512, "hist.99_percentile": 512, '
                '"hist.avg": 102.3, "hist.count": 10.0, "hist.max": 512, '
                '"hist.min": 1, "hist.std_dev": 164.94851048466944, '
                '"m1.15m_rate": 0, "m1.1m_rate": 0, "m1.5m_rate": 0, "m1.count": 1.0, '
                '"m1.mean_rate": 1.0, "t1.15m_rate": 0, "t1.1m_rate": 0, '
                '"t1.50_percentile": 1, "t1.5m_rate": 0, "t1.75_percentile": 1, '
                '"t1.95_percentile": 1, "t1.999_percentile": 1, "t1.99_percentile": 1, '
                '"t1.avg": 1.0, "t1.count": 1.0, "t1.max": 1, "t1.mean_rate": 1.0, '
                '"t1.min": 1, "t1.std_dev": 0.0, "t1.sum": 1.0, "timestamp": 1}'
            )

            # First call should be event free because events are reported based on submission
            # rather than report timestamp. And a single line contains a single timestamp.
            self.assertEqual(calls[0][0][0], expected)

            # Second call should only be events
            self.assertEqual(calls[1][0][0], '{"e1.field": 1, "timestamp": 0}')