示例#1
0
    def test_build_times_queries(self):
        where = "time >= 1515404366123400000 and time < 1515423565456000000"
        queries = list(
            self.source._build_times_queries(
                bucket_interval=self.model.bucket_interval,
                features=self.model.features,
                from_date=1515404366.1234,
                to_date="2018-01-08T14:59:25.456Z",
            ))
        self.assertEqual(
            queries,
            [
                "select MEAN(\"foo\") as \"avg_foo\" from \"measure1\" "
                "where {} group by time(3000ms);".format(where),
                "select COUNT(\"bar\") as \"count_bar\" from \"measure2\" "
                "where {} group by time(3000ms);".format(where),
                "select MEAN(\"baz\") as \"avg_baz\" from \"measure1\" "
                "where {} and \"mytag\"='myvalue' group by time(3000ms);".
                format(where),
            ],
        )

        source = InfluxBucket({
            'name': 'test',
            'addr': ADDR,
            'database': self.db,
            'retention_policy': 'custom',
            'measurement': 'nosetests',
        })

        queries = list(
            source._build_times_queries(
                bucket_interval=self.model.bucket_interval,
                features=self.model.features,
                from_date=1515404366.1234,
                to_date="2018-01-08T14:59:25.456Z",
            ))
        from_prefix = '"{}"."custom".'.format(self.db)
        self.assertEqual(
            queries,
            [
                "select MEAN(\"foo\") as \"avg_foo\" from {}\"measure1\" "
                "where {} group by time(3000ms);".format(from_prefix, where),
                "select COUNT(\"bar\") as \"count_bar\" from {}\"measure2\" "
                "where {} group by time(3000ms);".format(from_prefix, where),
                "select MEAN(\"baz\") as \"avg_baz\" from {}\"measure1\" "
                "where {} and \"mytag\"='myvalue' group by time(3000ms);".
                format(from_prefix, where),
            ],
        )
示例#2
0
class TestInfluxQuick(unittest.TestCase):
    def setUp(self):
        bucket_interval = 3

        t0 = int(datetime.datetime.now().timestamp())

        # XXX Bucket returned by InfluxDB are aligned on
        # modulo(bucket_interval), that's why
        # timestamp must be aligned for unit tests.
        t0 -= t0 % bucket_interval

        self.t0 = t0

        self.db = 'test-{}'.format(t0)
        logging.info("creating database %s", self.db)
        self.source = InfluxBucket({
            'name': 'test',
            'addr': ADDR,
            'database': self.db,
            'measurement': 'nosetests',
        })
        self.source.drop()
        self.source.init()

        self.model = Model(
            dict(
                name="test-model",
                offset=30,
                span=300,
                bucket_interval=3,
                interval=60,
                features=FEATURES,
            ))

        data = [
            # (foo, bar, timestamp)
            (1, 33, t0 - 1),  # excluded
            (2, 120, t0),
            (3, 312, t0 + 1),
            # empty
            (4, 18, t0 + 7),
            (5, 78, t0 + 9),  # excluded
        ]
        for foo, bar, ts in data:
            self.source.insert_times_data(measurement='measure1',
                                          ts=ts,
                                          data={
                                              'foo': foo,
                                          })
            self.source.insert_times_data(measurement='measure2',
                                          ts=ts,
                                          data={
                                              'bar': bar,
                                          })
            self.source.insert_times_data(measurement='measure3',
                                          ts=ts,
                                          tags={
                                              'tag_kw': 'tag1',
                                              'tag_int': 9,
                                              'tag_bool': False,
                                          },
                                          data={
                                              'baz': bar,
                                          })
            self.source.insert_times_data(measurement='measure3',
                                          ts=ts,
                                          tags={
                                              'tag_kw': 'tag2',
                                              'tag_int': 7,
                                              'tag_bool': True,
                                          },
                                          data={
                                              'baz': -bar,
                                          })

        self.source.commit()

    def tearDown(self):
        self.source.drop()

    def test_validation(self):
        with self.assertRaises(errors.Invalid):
            InfluxBucket({
                'addr': 'localhost',
            })
        with self.assertRaises(errors.Invalid):
            InfluxBucket({
                'database': 'foo',
            })

    def test_build_time_predicates(self):
        self.assertEqual(
            _build_time_predicates(),
            [],
        )
        self.assertEqual(
            _build_time_predicates(
                from_date=1515404366.1234,
                to_date="2018-01-08T14:59:25.456Z",
            ),
            [
                "time >= 1515404366123400000",
                "time < 1515423565456000000",
            ],
        )

    def test_build_tags_predicates(self):
        self.assertEqual(
            _build_tags_predicates(),
            [],
        )
        self.assertEqual(
            _build_tags_predicates([
                {
                    'tag': 'foo',
                    'value': 'bar'
                },
                {
                    'tag': 'a "',
                    'value': 'b \''
                },
                {
                    'tag': 'int',
                    'value': 42
                },
                {
                    'tag': 'bool',
                    'value': True
                },
            ]), [
                "\"foo\"='bar'",
                "\"a \\\"\"='b \\''",
                "(\"int\"='42' OR \"int\"=42)",
                "(\"bool\"='True' OR \"bool\"=True)",
            ])

    def test_build_times_queries(self):
        where = "time >= 1515404366123400000 and time < 1515423565456000000"
        queries = list(
            self.source._build_times_queries(
                bucket_interval=self.model.bucket_interval,
                features=self.model.features,
                from_date=1515404366.1234,
                to_date="2018-01-08T14:59:25.456Z",
            ))
        self.assertEqual(
            queries,
            [
                "select MEAN(\"foo\") as \"avg_foo\" from \"measure1\" "
                "where {} group by time(3000ms);".format(where),
                "select COUNT(\"bar\") as \"count_bar\" from \"measure2\" "
                "where {} group by time(3000ms);".format(where),
                "select MEAN(\"baz\") as \"avg_baz\" from \"measure1\" "
                "where {} and \"mytag\"='myvalue' group by time(3000ms);".
                format(where),
            ],
        )

        source = InfluxBucket({
            'name': 'test',
            'addr': ADDR,
            'database': self.db,
            'retention_policy': 'custom',
            'measurement': 'nosetests',
        })

        queries = list(
            source._build_times_queries(
                bucket_interval=self.model.bucket_interval,
                features=self.model.features,
                from_date=1515404366.1234,
                to_date="2018-01-08T14:59:25.456Z",
            ))
        from_prefix = '"{}"."custom".'.format(self.db)
        self.assertEqual(
            queries,
            [
                "select MEAN(\"foo\") as \"avg_foo\" from {}\"measure1\" "
                "where {} group by time(3000ms);".format(from_prefix, where),
                "select COUNT(\"bar\") as \"count_bar\" from {}\"measure2\" "
                "where {} group by time(3000ms);".format(from_prefix, where),
                "select MEAN(\"baz\") as \"avg_baz\" from {}\"measure1\" "
                "where {} and \"mytag\"='myvalue' group by time(3000ms);".
                format(from_prefix, where),
            ],
        )

    def test_get_times_data(self):
        logging.info("[%d %d]", self.t0, self.t0)
        res = self.source.get_times_data(
            bucket_interval=self.model.bucket_interval,
            features=self.model.features,
            from_date=self.t0,
            to_date=self.t0 + 8,
        )

        foo_avg = []
        bar_count = []

        for line in res:
            foo_avg.append(nan_to_none(line[1][0]))
            bar_count.append(nan_to_none(line[1][1]))

        self.assertEqual(foo_avg, [2.5, None, 4.0])
        self.assertEqual(bar_count, [2.0, 0, 1.0])

    def test_get_times_data2(self):
        res = self.source.get_times_data(
            bucket_interval=self.model.bucket_interval,
            features=self.model.features,
            from_date=self.t0,
            to_date=self.t0 + 8,
        )

        # _source to write aggregate data to RAM
        _source = MemBucket()
        _features = copy.deepcopy(self.model.features)
        for _, feature in enumerate(self.model.features):
            feature.metric = 'avg'

        i = None
        for i, (_, val, timeval) in enumerate(res):
            bucket = {
                feature.field: val[i]
                for i, feature in enumerate(self.model.features)
            }
            bucket.update({'timestamp': make_ts(timeval)})
            _source.insert_times_data(bucket)

        res2 = _source.get_times_data(
            bucket_interval=self.model.bucket_interval,
            features=self.model.features,
            from_date=self.t0,
            to_date=self.t0 + 8,
        )
        self.model.features = _features

        for i, (_, val2, timeval2) in enumerate(res2):
            (_, val, timeval) = res[i]
            np.testing.assert_allclose(val, val2)

    def test_match_all(self):
        model = Model(
            dict(
                name="test-model",
                offset=30,
                span=300,
                bucket_interval=3,
                interval=60,
                features=FEATURES_MATCH_ALL_TAG1,
            ))
        res = self.source.get_times_data(
            bucket_interval=model.bucket_interval,
            features=model.features,
            from_date=self.t0,
            to_date=self.t0 + 8,
        )
        baz_avg = []
        for line in res:
            baz_avg.append(line[1][0])

        np.testing.assert_allclose(
            np.array(baz_avg),
            np.array([216.0, np.nan, 18.0]),
            rtol=0,
            atol=0,
        )

        model = Model(
            dict(
                name="test-model",
                offset=30,
                span=300,
                bucket_interval=3,
                interval=60,
                features=FEATURES_MATCH_ALL_TAG2,
            ))

        res = self.source.get_times_data(
            bucket_interval=model.bucket_interval,
            features=model.features,
            from_date=self.t0,
            to_date=self.t0 + 8,
        )
        baz_avg = []
        for line in res:
            baz_avg.append(line[1][0])

        np.testing.assert_allclose(
            np.array(baz_avg),
            np.array([-216.0, np.nan, -18.0]),
            rtol=0,
            atol=0,
        )