def test_experimental_labels(aggregator, instance): check = KubernetesState(CHECK_NAME, {}, {}, [instance]) check.poll = mock.MagicMock(return_value=MockResponse( mock_from_file("prometheus.txt"), 'text/plain')) for _ in range(2): check.check(instance) assert aggregator.metrics(NAMESPACE + '.hpa.spec_target_metric') == [] instance['experimental_metrics'] = True check = KubernetesState(CHECK_NAME, {}, {}, [instance]) check.poll = mock.MagicMock(return_value=MockResponse( mock_from_file("prometheus.txt"), 'text/plain')) for _ in range(2): check.check(instance) aggregator.assert_metric( NAMESPACE + '.hpa.spec_target_metric', tags=[ 'hpa:dummy-nginx-ingress-controller', 'kube_namespace:default', 'metric_name:cpu', 'metric_target_type:utilization', 'namespace:default', 'optional:tag1', ], value=80.0, )
def check(instance): check = KubernetesState(CHECK_NAME, {}, {}, [instance]) with open(os.path.join(HERE, 'fixtures', 'prometheus.txt'), 'rb') as f: check.poll = mock.MagicMock( return_value=MockResponse(f.read(), 'text/plain')) return check
def test_telemetry(aggregator, instance): instance['telemetry'] = True instance['experimental_metrics'] = True check = KubernetesState(CHECK_NAME, {}, [instance]) check.poll = mock.MagicMock(return_value=MockResponse(mock_from_file("prometheus.txt"), 'text/plain')) endpoint = instance['kube_state_url'] scraper_config = check.config_map[endpoint] scraper_config['_text_filter_blacklist'] = ['resourcequota'] for _ in range(2): check.check(instance) aggregator.assert_metric(NAMESPACE + '.telemetry.payload.size', tags=['optional:tag1'], value=91486.0) aggregator.assert_metric(NAMESPACE + '.telemetry.metrics.processed.count', tags=['optional:tag1'], value=926.0) aggregator.assert_metric(NAMESPACE + '.telemetry.metrics.input.count', tags=['optional:tag1'], value=1300.0) aggregator.assert_metric(NAMESPACE + '.telemetry.metrics.blacklist.count', tags=['optional:tag1'], value=24.0) aggregator.assert_metric(NAMESPACE + '.telemetry.metrics.ignored.count', tags=['optional:tag1'], value=374.0) aggregator.assert_metric( NAMESPACE + '.telemetry.collector.metrics.count', tags=['resource_name:pod', 'resource_namespace:default', 'optional:tag1'], value=540.0, ) aggregator.assert_metric( NAMESPACE + '.telemetry.collector.metrics.count', tags=['resource_name:hpa', 'resource_namespace:ns1', 'optional:tag1'], value=8.0, )
def test_telemetry(aggregator, instance): instance['telemetry'] = True check = KubernetesState(CHECK_NAME, {}, {}, [instance]) with open(os.path.join(HERE, 'fixtures', 'prometheus.txt'), 'rb') as f: check.poll = mock.MagicMock( return_value=MockResponse(f.read(), 'text/plain')) endpoint = instance['kube_state_url'] scraper_config = check.config_map[endpoint] scraper_config['_text_filter_blacklist'] = ['resourcequota'] for _ in range(2): check.check(instance) aggregator.assert_metric(NAMESPACE + '.telemetry.payload.size', tags=['optional:tag1'], value=87416.0) aggregator.assert_metric(NAMESPACE + '.telemetry.metrics.processed.count', tags=['optional:tag1'], value=154.0) aggregator.assert_metric(NAMESPACE + '.telemetry.metrics.input.count', tags=['optional:tag1'], value=230.0) aggregator.assert_metric(NAMESPACE + '.telemetry.metrics.blacklist.count', tags=['optional:tag1'], value=24.0) aggregator.assert_metric(NAMESPACE + '.telemetry.metrics.ignored.count', tags=['optional:tag1'], value=76.0)
def test_disabling_hostname_override(instance): endpoint = instance['kube_state_url'] check = KubernetesState(CHECK_NAME, {}, {}, [instance]) scraper_config = check.config_map[endpoint] assert scraper_config['label_to_hostname'] == "node" instance["hostname_override"] = False check = KubernetesState(CHECK_NAME, {}, {}, [instance]) scraper_config = check.config_map[endpoint] assert scraper_config['label_to_hostname'] is None
def test_job_counts(aggregator, instance): check = KubernetesState(CHECK_NAME, {}, {}, [instance]) payload = mock_from_file("prometheus.txt") check.poll = mock.MagicMock( return_value=MockResponse(payload, 'text/plain')) for _ in range(2): check.check(instance) aggregator.assert_metric( NAMESPACE + '.job.failed', tags=['namespace:default', 'job:hello', 'optional:tag1'], value=0) aggregator.assert_metric( NAMESPACE + '.job.succeeded', tags=['namespace:default', 'job:hello', 'optional:tag1'], value=3) # Re-run check to make sure we don't count the same jobs check.check(instance) aggregator.assert_metric( NAMESPACE + '.job.failed', tags=['namespace:default', 'job:hello', 'optional:tag1'], value=0) aggregator.assert_metric( NAMESPACE + '.job.succeeded', tags=['namespace:default', 'job:hello', 'optional:tag1'], value=3) # Edit the payload and rerun the check payload = payload.replace( b'kube_job_status_succeeded{job="hello-1509998340",namespace="default"} 1', b'kube_job_status_succeeded{job="hello-1509998500",namespace="default"} 1', ) payload = payload.replace( b'kube_job_status_failed{job="hello-1509998340",namespace="default"} 0', b'kube_job_status_failed{job="hello-1509998510",namespace="default"} 1', ) check.poll = mock.MagicMock( return_value=MockResponse(payload, 'text/plain')) check.check(instance) aggregator.assert_metric( NAMESPACE + '.job.failed', tags=['namespace:default', 'job:hello', 'optional:tag1'], value=1) aggregator.assert_metric( NAMESPACE + '.job.succeeded', tags=['namespace:default', 'job:hello', 'optional:tag1'], value=4)
def test_keep_ksm_labels_desactivated(aggregator, instance): instance['keep_ksm_labels'] = False check = KubernetesState(CHECK_NAME, {}, [instance]) check.poll = mock.MagicMock(return_value=MockResponse(mock_from_file("prometheus.txt"), 'text/plain')) check.check(instance) for _ in range(2): check.check(instance) aggregator.assert_metric( NAMESPACE + '.pod.status_phase', tags=['kube_namespace:default', 'pod_phase:running', 'optional:tag1'], value=3 )
def test_job_counts(aggregator, instance): check = KubernetesState(CHECK_NAME, {}, {}, [instance]) payload = mock_from_file("prometheus.txt") check.poll = mock.MagicMock( return_value=MockResponse(payload, 'text/plain')) for _ in range(2): check.check(instance) # Test cron jobs aggregator.assert_metric( NAMESPACE + '.job.failed', tags=[ 'namespace:default', 'kube_namespace:default', 'kube_job:hello', 'job:hello', 'optional:tag1' ], value=0, ) aggregator.assert_metric( NAMESPACE + '.job.succeeded', tags=[ 'namespace:default', 'kube_namespace:default', 'kube_job:hello', 'job:hello', 'optional:tag1' ], value=3, ) # Test jobs aggregator.assert_metric( NAMESPACE + '.job.failed', tags=[ 'namespace:default', 'kube_namespace:default', 'job_name:test', 'optional:tag1' ], value=0, ) aggregator.assert_metric( NAMESPACE + '.job.succeeded', tags=[ 'namespace:default', 'kube_namespace:default', 'job_name:test', 'optional:tag1' ], value=1, ) # Re-run check to make sure we don't count the same jobs check.check(instance) # Test cron jobs aggregator.assert_metric( NAMESPACE + '.job.failed', tags=[ 'namespace:default', 'kube_namespace:default', 'kube_job:hello', 'job:hello', 'optional:tag1' ], value=0, ) aggregator.assert_metric( NAMESPACE + '.job.succeeded', tags=[ 'namespace:default', 'kube_namespace:default', 'kube_job:hello', 'job:hello', 'optional:tag1' ], value=3, ) # Test jobs aggregator.assert_metric( NAMESPACE + '.job.failed', tags=[ 'namespace:default', 'kube_namespace:default', 'job_name:test', 'optional:tag1' ], value=0, ) aggregator.assert_metric( NAMESPACE + '.job.succeeded', tags=[ 'namespace:default', 'kube_namespace:default', 'job_name:test', 'optional:tag1' ], value=1, ) # Edit the payload and rerun the check payload = payload.replace( b'kube_job_status_succeeded{job="hello-1509998340",namespace="default"} 1', b'kube_job_status_succeeded{job="hello-1509998500",namespace="default"} 1', ) payload = payload.replace( b'kube_job_status_failed{job="hello-1509998340",namespace="default"} 0', b'kube_job_status_failed{job="hello-1509998510",namespace="default"} 1', ) payload = payload.replace( b'kube_job_status_succeeded{job_name="test",namespace="default"} 1', b'kube_job_status_succeeded{job_name="test",namespace="default"} 0', ) check.poll = mock.MagicMock( return_value=MockResponse(payload, 'text/plain')) check.check(instance) aggregator.assert_metric( NAMESPACE + '.job.failed', tags=[ 'namespace:default', 'kube_namespace:default', 'job:hello', 'kube_job:hello', 'optional:tag1' ], value=1, ) aggregator.assert_metric( NAMESPACE + '.job.succeeded', tags=[ 'namespace:default', 'kube_namespace:default', 'job:hello', 'kube_job:hello', 'optional:tag1' ], value=4, ) # Edit the payload to mimick a job running and rerun the check payload = payload.replace( b'kube_job_status_succeeded{job="hello-1509998500",namespace="default"} 1', b'kube_job_status_succeeded{job="hello-1509998600",namespace="default"} 0', ) # Edit the payload to mimick a job re-creation payload = payload.replace( b'kube_job_status_succeeded{job_name="test",namespace="default"} 0', b'kube_job_status_succeeded{job_name="test",namespace="default"} 1', ) check.poll = mock.MagicMock( return_value=MockResponse(payload, 'text/plain')) check.check(instance) # Test if we now have two as the value for the same job aggregator.assert_metric( NAMESPACE + '.job.succeeded', tags=[ 'namespace:default', 'kube_namespace:default', 'job_name:test', 'optional:tag1' ], value=2, ) # Edit the payload to mimick a job that stopped running and rerun the check payload = payload.replace( b'kube_job_status_succeeded{job="hello-1509998600",namespace="default"} 0', b'kube_job_status_succeeded{job="hello-1509998600",namespace="default"} 1', ) check.poll = mock.MagicMock( return_value=MockResponse(payload, 'text/plain')) check.check(instance) aggregator.assert_metric( NAMESPACE + '.job.succeeded', tags=[ 'namespace:default', 'kube_namespace:default', 'job:hello', 'kube_job:hello', 'optional:tag1' ], value=5, )
def _check(instance, mock_file="prometheus.txt"): check = KubernetesState(CHECK_NAME, {}, {}, [instance]) check.poll = mock.MagicMock( return_value=MockResponse(mock_from_file(mock_file), 'text/plain')) return check
def test_disabling_hostname_override(instance): check = KubernetesState(CHECK_NAME, {}, {}, [instance]) assert check.label_to_hostname == "node" instance["hostname_override"] = False check = KubernetesState(CHECK_NAME, {}, {}, [instance]) assert check.label_to_hostname is None