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,
    )
Exemple #2
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,
    )
Exemple #4
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
Exemple #6
0
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