From a2400fcf121a30f9fe78bef1c73e32b5eed48ea6 Mon Sep 17 00:00:00 2001 From: Doug Szumski Date: Thu, 21 May 2020 21:42:20 +0100 Subject: [PATCH] Fix parsing of StatsD metrics with Py3 When running with Py3 we compare a byte string to a unicode string when parsing StatsD metrics. This patch adds some unit tests to reproduce the bug and decodes the bytestring to make the existing comparisons valid under Py3. When backporting to Train we can use Oslo encodeutils. Clearly we could have more unit tests, but this makes a start. Change-Id: I6341f96f5c186428d2d829cabf618a6f84f40ce2 Story: 2007684 Task: 39796 --- monasca_agent/statsd/udp.py | 1 + tests/test_statsd.py | 49 +++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 tests/test_statsd.py diff --git a/monasca_agent/statsd/udp.py b/monasca_agent/statsd/udp.py index d105ddb3..5e135552 100644 --- a/monasca_agent/statsd/udp.py +++ b/monasca_agent/statsd/udp.py @@ -159,6 +159,7 @@ class Server(object): def submit_packets(self, packets): for packet in packets.split(b"\n"): + packet = packet.decode("utf-8") if not packet.strip(): continue diff --git a/tests/test_statsd.py b/tests/test_statsd.py new file mode 100644 index 00000000..26c37df9 --- /dev/null +++ b/tests/test_statsd.py @@ -0,0 +1,49 @@ +from unittest import mock +import unittest + +import monasca_agent.common.metrics as metrics_pkg +import monasca_agent.statsd.udp as udp + + +class TestStatsd(unittest.TestCase): + def testSubmitPacket(self): + mock_aggregator = mock.Mock() + srv = udp.Server(mock_aggregator, 'localhost', 1234) + test_packet = b"monasca.log.out_logs_truncated_bytes:0|g|#" \ + b"{'service': 'monitoring', 'component': 'monasca-log-api'}" + srv.submit_packets(test_packet) + mock_aggregator.submit_metric.assert_called_once_with( + 'monasca.log.out_logs_truncated_bytes', + 0, + metrics_pkg.Gauge, + dimensions={ + 'service': 'monitoring', + 'component': 'monasca-log-api'}, + sample_rate=1) + + def testSubmitPackets(self): + mock_aggregator = mock.Mock() + srv = udp.Server(mock_aggregator, 'localhost', 1234) + test_packet = b"monasca.log.out_logs_truncated_bytes:0|g|#" \ + b"{'service': 'monitoring', 'component': 'monasca-log-api'}\n" \ + b"application_metric:10|c|#{'service': 'workload'}" + srv.submit_packets(test_packet) + mock_aggregator.submit_metric.assert_has_calls([ + mock.call( + 'monasca.log.out_logs_truncated_bytes', + 0, + metrics_pkg.Gauge, + dimensions={ + 'service': 'monitoring', + 'component': 'monasca-log-api'}, + sample_rate=1 + ), + mock.call( + 'application_metric', + 10, + metrics_pkg.Counter, + dimensions={ + 'service': 'workload'}, + sample_rate=1 + ) + ])