普罗米修斯仪表指标的单元测试
Unittests for prometheus gauge metrics
这是我的指标代码:
from prometheus_client import Gauge
probe = Gauge('probe_success', '1 - probe success, 0 - probe failure'
['probe_type', 'target', 'timeout', 'service', 'namespace', 'reason'])
如果地址请求成功则最终值为1,如果发生错误则值为0。
def probe_success(probe_type, target, timeout, service, namespace, reason, value):
probe.labels(probe_type, target, timeout, service, namespace, reason).set(value)
这就是我的指标:
probe_success{namespace="test",probe_type="http",reason="MissingSchema",service="servicename",target="ddress-test1",timeout="5"} 0.0
probe_success{namespace="test",probe_type="http",reason="ConnectionError",service="servicename",target="http://address-test2",timeout="10"} 0.0
probe_success{namespace="test-2",probe_type="http",reason="",service="servicename",target="https://www.google.com",timeout="5"} 1.0
那么我该如何测试这些指标。我阅读了有关 REGISTRY.get_sample_value 的信息,但我没有看到如何在仪表组方法上使用它。一般来说,我不知道如何构建合适的测试用例。如果有人有建议,我会很乐意阅读。
这是我的解决方案:
from prometheus_client import REGISTRY
from utils.metrics import probe_success
def test_probe_success_metric_when_the_probe_fails():
# calling the metrics function, passing the needed parameters
# setting the gauges value to be equal to 0 (which means 'False', by default it is 1 'True')
probe_success(
'http',
'http://127.0.0.1:8000/',
1,
'test_service',
'test_namespace',
'Timeout',
0,
)
# searching in prometheus_client REGISTRY by metrics function name, and certain arguments (passed above)
after = REGISTRY.get_sample_value(
'probe_success',
{
'probe_type': 'http',
'target': 'http://127.0.0.1:8000/',
'timeout': '1',
'service': 'test_service',
'namespace': 'test_namespace',
'reason': 'Timeout',
},
)
# assert whether found gauge value of after is equal to 0.0 (the value which we passed above)
assert 0.0 == after
# Here the procedure is the same as above, but with the difference that here the gauge value is set to 1 'True'.
def test_probe_success_metric_when_the_probe_success():
probe_success(
'http', 'http://127.0.0.1:8000/', 1, 'test_service',
'test_namespace', '', 1
)
after = REGISTRY.get_sample_value(
'probe_success',
{
'probe_type': 'http',
'target': 'http://127.0.0.1:8000/',
'timeout': '1',
'service': 'test_service',
'namespace': 'test_namespace',
'reason': '',
},
)
assert 1.0 == after
这是一个带有解释但带有计数器指标的示例:
https://www.robustperception.io/how-to-unit-test-prometheus-instrumentation
这是我的指标代码:
from prometheus_client import Gauge
probe = Gauge('probe_success', '1 - probe success, 0 - probe failure'
['probe_type', 'target', 'timeout', 'service', 'namespace', 'reason'])
如果地址请求成功则最终值为1,如果发生错误则值为0。
def probe_success(probe_type, target, timeout, service, namespace, reason, value):
probe.labels(probe_type, target, timeout, service, namespace, reason).set(value)
这就是我的指标:
probe_success{namespace="test",probe_type="http",reason="MissingSchema",service="servicename",target="ddress-test1",timeout="5"} 0.0
probe_success{namespace="test",probe_type="http",reason="ConnectionError",service="servicename",target="http://address-test2",timeout="10"} 0.0
probe_success{namespace="test-2",probe_type="http",reason="",service="servicename",target="https://www.google.com",timeout="5"} 1.0
那么我该如何测试这些指标。我阅读了有关 REGISTRY.get_sample_value 的信息,但我没有看到如何在仪表组方法上使用它。一般来说,我不知道如何构建合适的测试用例。如果有人有建议,我会很乐意阅读。
这是我的解决方案:
from prometheus_client import REGISTRY
from utils.metrics import probe_success
def test_probe_success_metric_when_the_probe_fails():
# calling the metrics function, passing the needed parameters
# setting the gauges value to be equal to 0 (which means 'False', by default it is 1 'True')
probe_success(
'http',
'http://127.0.0.1:8000/',
1,
'test_service',
'test_namespace',
'Timeout',
0,
)
# searching in prometheus_client REGISTRY by metrics function name, and certain arguments (passed above)
after = REGISTRY.get_sample_value(
'probe_success',
{
'probe_type': 'http',
'target': 'http://127.0.0.1:8000/',
'timeout': '1',
'service': 'test_service',
'namespace': 'test_namespace',
'reason': 'Timeout',
},
)
# assert whether found gauge value of after is equal to 0.0 (the value which we passed above)
assert 0.0 == after
# Here the procedure is the same as above, but with the difference that here the gauge value is set to 1 'True'.
def test_probe_success_metric_when_the_probe_success():
probe_success(
'http', 'http://127.0.0.1:8000/', 1, 'test_service',
'test_namespace', '', 1
)
after = REGISTRY.get_sample_value(
'probe_success',
{
'probe_type': 'http',
'target': 'http://127.0.0.1:8000/',
'timeout': '1',
'service': 'test_service',
'namespace': 'test_namespace',
'reason': '',
},
)
assert 1.0 == after
这是一个带有解释但带有计数器指标的示例: https://www.robustperception.io/how-to-unit-test-prometheus-instrumentation