def setUp(self):
        agent_config = base_config.get_config(sections='Main')

        self._instances = [{'name': 'test',
                            'mapping': {
                                'gauges': ['stats.(MessagesAvg)'],
                                'counters': ['MessagesTotal'],
                                'dimensions': {
                                    'index': 'index',
                                    'simple_dimension': 'simple_label',
                                    'complex_dimension': {
                                        'source_key': 'complex_label',
                                        'regex': 'k8s_([._\-a-zA-Z0-9]*)_postfix'
                                    },
                                    'complex_dimension_rest': {
                                        'source_key': 'complex_label',
                                        'regex': 'k8s_([._\-a-zA-Z0-9]*_postfix)'
                                    }
                                },
                                'groups': {
                                    'testgroup': {
                                        'dimensions': {
                                            'user': '******'
                                        },
                                        'rates': ['.*\.Responses.*', '(sec_auth_.*).stats',
                                                  '(io_service_bytes)_stats_Total']
                                    }
                                    # dimensions should be inherited from above
                                }}}]
        self.check = AgentCheck("DynCheckHelper-Teset", {}, agent_config, self._instances)  # TODO mock check
        self.helper = DynamicCheckHelper(self.check, 'dynhelper')
    def setUp(self):
        agent_config = base_config.get_config(sections='Main')

        self._instances = [{'name': 'test',
                            'mapping': {
                                'gauges': ['stats.(MessagesAvg)'],
                                'counters': ['MessagesTotal'],
                                'dimensions': {
                                    'index': 'index',
                                    'simple_dimension': 'simple_label',
                                    'complex_dimension': {
                                        'source_key': 'complex_label',
                                        'regex': 'k8s_([._\-a-zA-Z0-9]*)_postfix'
                                    },
                                    'complex_dimension_rest': {
                                        'source_key': 'complex_label',
                                        'regex': 'k8s_([._\-a-zA-Z0-9]*_postfix)'
                                    }
                                },
                                'groups': {
                                    'testgroup': {
                                        'dimensions': {
                                            'user': '******'
                                        },
                                        'rates': ['.*\.Responses.*', '(sec_auth_.*).stats',
                                                  '(io_service_bytes)_stats_Total']
                                    }
                                    # dimensions should be inherited from above
                                }}}]
        self.check = AgentCheck("DynCheckHelper-Teset", {}, agent_config, self._instances)  # TODO mock check
        self.helper = DynamicCheckHelper(self.check, 'dynhelper')
 def setUp(self):
     p = psutil.Process(os.getpid())
     self._config = {'init_config': {}, 'instances': [{'name': 'test',
                                                       'search_string': [p.name()],
                                                       'detailed': True,
                                                       'mapping': {
                                                           'gauges': ['stats.(MessagesAvg)'],
                                                           'rates': ['MessagesTotal'],
                                                           'dimensions': {
                                                               'index': 'index',
                                                               'simple_dimension': 'simple_label',
                                                               'complex_dimension': {
                                                                   'source_key': 'complex_label',
                                                                   'regex': 'k8s_([._\-a-zA-Z0-9]*)_postfix'
                                                               },
                                                               'complex_dimension_rest': {
                                                                   'source_key': 'complex_label',
                                                                   'regex': 'k8s_([._\-a-zA-Z0-9]*_postfix)'
                                                               }
                                                           },
                                                           'groups': {
                                                               'testgroup': {
                                                                   'dimensions': {
                                                                     'user': '******'
                                                                   },
                                                                   'rates': ['.*\.Responses.*', '(sec_auth_.*).stats', '(io_service_bytes)_stats_Total']
                                                               }
                                                               # dimensions should be inherited from above
                                                           }}}]}
     self.check = load_check('process', self._config)  # TODO mock check
     self.helper = DynamicCheckHelper(self.check, 'dynhelper')
class TestDynamicCheckHelper(unittest.TestCase):
    def setUp(self):
        agent_config = base_config.get_config(sections='Main')

        self._instances = [{'name': 'test',
                            'mapping': {
                                'gauges': ['stats.(MessagesAvg)'],
                                'counters': ['MessagesTotal'],
                                'dimensions': {
                                    'index': 'index',
                                    'simple_dimension': 'simple_label',
                                    'complex_dimension': {
                                        'source_key': 'complex_label',
                                        'regex': 'k8s_([._\-a-zA-Z0-9]*)_postfix'
                                    },
                                    'complex_dimension_rest': {
                                        'source_key': 'complex_label',
                                        'regex': 'k8s_([._\-a-zA-Z0-9]*_postfix)'
                                    }
                                },
                                'groups': {
                                    'testgroup': {
                                        'dimensions': {
                                            'user': '******'
                                        },
                                        'rates': ['.*\.Responses.*', '(sec_auth_.*).stats',
                                                  '(io_service_bytes)_stats_Total']
                                    }
                                    # dimensions should be inherited from above
                                }}}]
        self.check = AgentCheck("DynCheckHelper-Teset", {}, agent_config, self._instances)  # TODO mock check
        self.helper = DynamicCheckHelper(self.check, 'dynhelper')

    def run_check(self):
        self.check.run()
        metric_dict = {"sec": {"auth": [{"user": "******", "total.stats": 10}, {"user": "******", "total.stats": 15}]},
                       "io_service_bytes": {"stats": {"Total": 10}}}
        self.helper.push_metric_dict(self._instances[0], metric_dict, group="testgroup",
                                     labels={'simple_label': 'simple_label_test',
                                             'complex_label': 'k8s_monasca-api-a8109321_postfix'}, max_depth=3)
        self.helper.push_metric(self._instances[0], metric='req.ResponsesOk', value=10.0,
                                group="testgroup",
                                labels={'simple_label': 'simple_label_test',
                                        'complex_label': 'k8s_monasca-api-a8109321_postfix'})
        self.helper.push_metric(self._instances[0], metric='stats.MessagesAvg', value=5.0,
                                labels={'simple_label': 'simple_label_test',
                                        'complex_label': 'k8s_monasca-api-a8109321_postfix'})
        self.helper.push_metric(self._instances[0], metric='MessagesTotal', value=1)
        time.sleep(1)
        self.helper.push_metric_dict(self._instances[0], metric_dict, group="testgroup",
                                     labels={'simple_label': 'simple_label_test',
                                             'complex_label': 'k8s_monasca-api-a8109321_postfix'}, max_depth=3)
        self.helper.push_metric(self._instances[0], metric='req.ResponsesOk', value=15.0,
                                group="testgroup",
                                labels={'simple_label': 'simple_label_test',
                                        'complex_label': 'k8s_monasca-api-a8109321_postfix'})
        self.helper.push_metric(self._instances[0], metric='MessagesTotal', value=100)
        metrics = self.check.get_metrics()

        return metrics

    def testMeasurements(self):
        metrics = self.run_check()
        for m in metrics:
            print "metric: {0}, dimensions: {1}".format(m['measurement']['name'], repr(m['measurement']['dimensions']))
        metric1 = sorted(filter(lambda m: m['measurement']['name'] == 'dynhelper.messages_avg', metrics))
        metric2 = sorted(filter(lambda m: m['measurement']['name'] == 'dynhelper.messages_total', metrics))
        metric3 = sorted(filter(lambda m: m['measurement']['name'] == 'dynhelper.testgroup.req_responses_ok', metrics))
        metric4 = sorted(filter(lambda m: m['measurement']['name'] == 'dynhelper.testgroup.sec_auth_total', metrics))
        self.assertTrue(len(metric1) > 0,
                        'gauge dynhelper.messages_avg missing in metric list {0}'.format(repr(metrics)))
        self.assertEqual(metric1[0]['measurement']['dimensions'],
                          {'simple_dimension': 'simple_label_test', 'complex_dimension': 'monasca-api-a8109321',
                           'complex_dimension_rest': 'monasca-api-a8109321_postfix',
                           'hostname': metric1[0]['measurement']['dimensions'].get('hostname')})
        self.assertTrue(len(metric2) > 0,
                        'rate dynhelper.messages_total missing in metric list {0}'.format(repr(metrics)))
        self.assertEqual(metric2[0]['measurement']['dimensions'],
                          {'hostname': metric2[0]['measurement']['dimensions'].get('hostname')})
        self.assertTrue(len(metric3) > 0,
                        'rate dynhelper.testgroup.req_responses_ok missing in metric list {0}'.format(repr(metrics)))
        self.assertEqual(metric3[0]['measurement']['dimensions'],
                          {'simple_dimension': 'simple_label_test', 'complex_dimension': 'monasca-api-a8109321',
                           'complex_dimension_rest': 'monasca-api-a8109321_postfix',
                           'hostname': metric3[0]['measurement']['dimensions'].get('hostname')})
        self.assertTrue(len(metric4) == 2,
                        'rate dynhelper.testgroup.sec_auth_total missing in metric list {0}'.format(repr(metrics)))
        self.assertEqual(metric4[0]['measurement']['dimensions'],
                          {'simple_dimension': 'simple_label_test', 'complex_dimension': 'monasca-api-a8109321',
                           'complex_dimension_rest': 'monasca-api-a8109321_postfix',
                           'user': '******', 'hostname': metric4[0]['measurement']['dimensions'].get('hostname')})
        self.assertEqual(metric4[1]['measurement']['dimensions'],
                          {'simple_dimension': 'simple_label_test', 'complex_dimension': 'monasca-api-a8109321',
                           'complex_dimension_rest': 'monasca-api-a8109321_postfix',
                           'user': '******', 'hostname': metric4[1]['measurement']['dimensions'].get('hostname')})
class TestDynamicCheckHelper(unittest.TestCase):
    def setUp(self):
        agent_config = base_config.get_config(sections='Main')

        self._instances = [{
            'name': 'test',
            'mapping': {
                'gauges': ['stats.(MessagesAvg)'],
                'counters': ['MessagesTotal'],
                'dimensions': {
                    'index': 'index',
                    'simple_dimension': 'simple_label',
                    'complex_dimension': {
                        'source_key': 'complex_label',
                        'regex': 'k8s_([._\-a-zA-Z0-9]*)_postfix'
                    },
                    'complex_dimension_rest': {
                        'source_key': 'complex_label',
                        'regex': 'k8s_([._\-a-zA-Z0-9]*_postfix)'
                    }
                },
                'groups': {
                    'testgroup': {
                        'dimensions': {
                            'user': '******'
                        },
                        'rates': [
                            '.*\.Responses.*', '(sec_auth_.*).stats',
                            '(io_service_bytes)_stats_Total'
                        ]
                    }
                    # dimensions should be inherited from above
                }
            }
        }]
        self.check = AgentCheck("DynCheckHelper-Teset", {}, agent_config,
                                self._instances)  # TODO mock check
        self.helper = DynamicCheckHelper(self.check, 'dynhelper')

    def run_check(self):
        self.check.run()
        metric_dict = {
            "sec": {
                "auth": [{
                    "user": "******",
                    "total.stats": 10
                }, {
                    "user": "******",
                    "total.stats": 15
                }]
            },
            "io_service_bytes": {
                "stats": {
                    "Total": 10
                }
            }
        }
        self.helper.push_metric_dict(self._instances[0],
                                     metric_dict,
                                     group="testgroup",
                                     labels={
                                         'simple_label':
                                         'simple_label_test',
                                         'complex_label':
                                         'k8s_monasca-api-a8109321_postfix'
                                     },
                                     max_depth=3)
        self.helper.push_metric(self._instances[0],
                                metric='req.ResponsesOk',
                                value=10.0,
                                group="testgroup",
                                labels={
                                    'simple_label':
                                    'simple_label_test',
                                    'complex_label':
                                    'k8s_monasca-api-a8109321_postfix'
                                })
        self.helper.push_metric(self._instances[0],
                                metric='stats.MessagesAvg',
                                value=5.0,
                                labels={
                                    'simple_label':
                                    'simple_label_test',
                                    'complex_label':
                                    'k8s_monasca-api-a8109321_postfix'
                                })
        self.helper.push_metric(self._instances[0],
                                metric='MessagesTotal',
                                value=1)
        time.sleep(1)
        self.helper.push_metric_dict(self._instances[0],
                                     metric_dict,
                                     group="testgroup",
                                     labels={
                                         'simple_label':
                                         'simple_label_test',
                                         'complex_label':
                                         'k8s_monasca-api-a8109321_postfix'
                                     },
                                     max_depth=3)
        self.helper.push_metric(self._instances[0],
                                metric='req.ResponsesOk',
                                value=15.0,
                                group="testgroup",
                                labels={
                                    'simple_label':
                                    'simple_label_test',
                                    'complex_label':
                                    'k8s_monasca-api-a8109321_postfix'
                                })
        self.helper.push_metric(self._instances[0],
                                metric='MessagesTotal',
                                value=100)
        metrics = self.check.get_metrics()

        return metrics

    def testMeasurements(self):
        metrics = self.run_check()
        for m in metrics:
            print "metric: {0}, dimensions: {1}".format(
                m['measurement']['name'], repr(m['measurement']['dimensions']))
        metric1 = sorted(
            filter(
                lambda m: m['measurement']['name'] == 'dynhelper.messages_avg',
                metrics))
        metric2 = sorted(
            filter(
                lambda m: m['measurement']['name'] ==
                'dynhelper.messages_total', metrics))
        metric3 = sorted(
            filter(
                lambda m: m['measurement']['name'] ==
                'dynhelper.testgroup.req_responses_ok', metrics))
        metric4 = sorted(
            filter(
                lambda m: m['measurement']['name'] ==
                'dynhelper.testgroup.sec_auth_total', metrics))
        self.assertTrue(
            len(metric1) > 0,
            'gauge dynhelper.messages_avg missing in metric list {0}'.format(
                repr(metrics)))
        self.assertEqual(
            metric1[0]['measurement']['dimensions'], {
                'simple_dimension': 'simple_label_test',
                'complex_dimension': 'monasca-api-a8109321',
                'complex_dimension_rest': 'monasca-api-a8109321_postfix',
                'hostname':
                metric1[0]['measurement']['dimensions'].get('hostname')
            })
        self.assertTrue(
            len(metric2) > 0,
            'rate dynhelper.messages_total missing in metric list {0}'.format(
                repr(metrics)))
        self.assertEqual(metric2[0]['measurement']['dimensions'], {
            'hostname':
            metric2[0]['measurement']['dimensions'].get('hostname')
        })
        self.assertTrue(
            len(metric3) > 0,
            'rate dynhelper.testgroup.req_responses_ok missing in metric list {0}'
            .format(repr(metrics)))
        self.assertEqual(
            metric3[0]['measurement']['dimensions'], {
                'simple_dimension': 'simple_label_test',
                'complex_dimension': 'monasca-api-a8109321',
                'complex_dimension_rest': 'monasca-api-a8109321_postfix',
                'hostname':
                metric3[0]['measurement']['dimensions'].get('hostname')
            })
        self.assertTrue(
            len(metric4) == 2,
            'rate dynhelper.testgroup.sec_auth_total missing in metric list {0}'
            .format(repr(metrics)))
        self.assertEqual(
            metric4[0]['measurement']['dimensions'], {
                'simple_dimension': 'simple_label_test',
                'complex_dimension': 'monasca-api-a8109321',
                'complex_dimension_rest': 'monasca-api-a8109321_postfix',
                'user': '******',
                'hostname':
                metric4[0]['measurement']['dimensions'].get('hostname')
            })
        self.assertEqual(
            metric4[1]['measurement']['dimensions'], {
                'simple_dimension': 'simple_label_test',
                'complex_dimension': 'monasca-api-a8109321',
                'complex_dimension_rest': 'monasca-api-a8109321_postfix',
                'user': '******',
                'hostname':
                metric4[1]['measurement']['dimensions'].get('hostname')
            })