Exemple #1
0
    def test_multiple_instances_raise_ValueError(self, get_workers_stats, get_jobs_by_queue):
        """Creating multiple instances of `RQCollector` registers duplicate summary metric in the registry."""
        RQCollector()

        with self.assertRaises(ValueError) as error:
            RQCollector()

        self.assertTrue('Duplicated timeseries in CollectorRegistry' in str(error.exception))
Exemple #2
0
    def test_passed_connection_is_used(self, get_workers_stats, get_jobs_by_queue):
        """Test that the connection passed to `RQCollector` is used to get the workers and jobs."""
        get_workers_stats.return_value = []
        get_jobs_by_queue.return_value = {}

        connection = Mock()
        collector = RQCollector(connection)

        with patch('rq_exporter.collector.Connection') as Connection:
            list(collector.collect())

        Connection.assert_called_once_with(connection)
        get_workers_stats.assert_called_once_with()
        get_jobs_by_queue.assert_called_once_with()
Exemple #3
0
    def test_summary_metric(self, get_workers_stats, get_jobs_by_queue):
        """Test the summary metric that tracks the requests count and time."""
        collector = RQCollector()

        # Initial values before calling the `collect` method
        self.assertEqual(0, self.registry.get_sample_value(f'{self.summary_metric}_count'))
        self.assertEqual(0, self.registry.get_sample_value(f'{self.summary_metric}_sum'))

        # The `collect` method is a generator
        # Exhaust the generator to get the recorded samples
        list(collector.collect())

        self.assertEqual(1, self.registry.get_sample_value(f'{self.summary_metric}_count'))
        self.assertTrue(self.registry.get_sample_value(f'{self.summary_metric}_sum') > 0)
Exemple #4
0
    def test_passed_rq_classes_are_used(self, get_workers_stats,
                                        get_jobs_by_queue):
        """Test that the RQ classes passed to `RQCollector` are used to get the workers and jobs."""
        get_workers_stats.return_value = []
        get_jobs_by_queue.return_value = {}

        worker_class = Mock()
        queue_class = Mock()

        collector = RQCollector(worker_class=worker_class,
                                queue_class=queue_class)

        with patch('rq_exporter.collector.Connection') as Connection:
            list(collector.collect())

        get_workers_stats.assert_called_once_with(worker_class)
        get_jobs_by_queue.assert_called_once_with(queue_class)
Exemple #5
0
    def test_metrics_with_data(self, get_workers_stats, get_jobs_by_queue):
        """Test the workers and jobs metrics when there is data available."""
        workers = [{
            'name': 'worker_one',
            'queues': ['default'],
            'state': 'idle'
        }, {
            'name': 'worker_two',
            'queues': ['high', 'default', 'low'],
            'state': 'busy'
        }]

        jobs_by_queue = {
            'default': {
                JobStatus.QUEUED: 2,
                JobStatus.STARTED: 3,
                JobStatus.FINISHED: 15,
                JobStatus.FAILED: 5,
                JobStatus.DEFERRED: 1,
                JobStatus.SCHEDULED: 4
            },
            'high': {
                JobStatus.QUEUED: 10,
                JobStatus.STARTED: 4,
                JobStatus.FINISHED: 25,
                JobStatus.FAILED: 22,
                JobStatus.DEFERRED: 5,
                JobStatus.SCHEDULED: 1
            }
        }

        get_workers_stats.return_value = workers
        get_jobs_by_queue.return_value = jobs_by_queue

        # On registration the `collect` method is called
        self.registry.register(RQCollector())

        get_workers_stats.assert_called_once_with(None)
        get_jobs_by_queue.assert_called_once_with(None)

        for w in workers:
            self.assertEqual(
                1,
                self.registry.get_sample_value(
                    self.workers_metric, {
                        'name': w['name'],
                        'state': w['state'],
                        'queues': ','.join(w['queues'])
                    }))

        for (queue, jobs) in jobs_by_queue.items():
            for (status, value) in jobs.items():
                self.assertEqual(
                    value,
                    self.registry.get_sample_value(self.jobs_metric, {
                        'queue': queue,
                        'status': status
                    }))
Exemple #6
0
    def test_metrics_with_empty_data(self, get_workers_stats, get_jobs_by_queue):
        """Test the workers and jobs metrics when there's no data."""
        get_workers_stats.return_value = []
        get_jobs_by_queue.return_value = {}

        self.registry.register(RQCollector())

        self.assertEqual(None, self.registry.get_sample_value(self.workers_metric))
        self.assertEqual(None, self.registry.get_sample_value(self.jobs_metric))