def test_rounding(): app = create_app() Instrumentator(should_round_latency_decimals=True).add( metrics.latency(buckets=( 1, 2, 3, ))).instrument(app).expose(app) client = TestClient(app) get_response(client, "/") get_response(client, "/") get_response(client, "/") _ = get_response(client, "/metrics") result = REGISTRY.get_sample_value( "http_request_duration_seconds_sum", { "handler": "/", "method": "GET", "status": "2xx" }, ) entropy = calc_entropy(str(result).split(".")[1][4:]) assert entropy < 10
def test_excluded_handlers_none(): app = create_app() exporter = (Instrumentator(excluded_handlers=None).add( metrics.latency()).instrument(app)) expose_metrics(app) assert len(exporter.excluded_handlers) == 0 assert isinstance(exporter.excluded_handlers, list) assert exporter.excluded_handlers is not None
def test_multiprocess_env_folder(monkeypatch, tmp_path): monkeypatch.setenv("prometheus_multiproc_dir", "DOES/NOT/EXIST") app = create_app() with pytest.raises(Exception): Instrumentator(buckets=( 1, 2, 3, )).add(metrics.latency()).instrument(app).expose(app)
def test_should_respect_env_var_existence_exists(): app = create_app() Instrumentator(should_respect_env_var=True, env_var_name="eoioerwjioGFIUONEIO").add( metrics.latency()).instrument(app).expose(app) client = TestClient(app) get_response(client, "/") response = get_response(client, "/metrics") assert response.status_code == 404
def test_default_without_add(): app = create_app() Instrumentator(excluded_handlers=["/metrics"]).add( metrics.latency()).instrument(app) expose_metrics(app) client = TestClient(app) get_response(client, "/") response = get_response(client, "/metrics") assert_is_not_multiprocess(response) assert_request_count(1) assert b"http_request_duration_seconds" in response.content
def test_metrics_endpoint_availability(): app = create_app() Instrumentator(excluded_handlers=["/metrics"]).add( metrics.latency()).instrument(app) expose_metrics(app) client = TestClient(app) get_response(client, "/") get_response(client, "/") response = get_response(client, "/metrics") assert_is_not_multiprocess(response) assert_request_count(2)
def test_multiprocess_reg_is_not(monkeypatch, tmp_path): monkeypatch.setenv("prometheus_multiproc_dir", str(tmp_path)) app = create_app() Instrumentator(excluded_handlers=["/metrics"]).add( metrics.latency()).instrument(app).expose(app) client = TestClient(app) get_response(client, "/") response = get_response(client, "/metrics") assert response.status_code == 200 assert b"" == response.content
def test_ungrouped_status_codes(): app = create_app() Instrumentator(should_group_status_codes=False).add( metrics.latency()).instrument(app) expose_metrics(app) client = TestClient(app) get_response(client, "/") response = get_response(client, "/metrics") assert_is_not_multiprocess(response) assert_request_count(1, status="200") assert b'status="2xx"' not in response.content assert b'status="200"' in response.content
def test_custom_metric_name(): app = create_app() Instrumentator(excluded_handlers=["/metrics"]).add( metrics.latency(metric_name="fastapi_latency")).instrument(app) expose_metrics(app) client = TestClient(app) get_response(client, "/") response = get_response(client, "/metrics") assert_is_not_multiprocess(response) assert_request_count(1, name="fastapi_latency_count") assert b"fastapi_latency" in response.content assert b"http_request_duration_seconds" not in response.content
def test_bucket_without_inf(): app = create_app() Instrumentator(excluded_handlers=["/metrics"]).add( metrics.latency(buckets=( 1, 2, 3, ))).instrument(app).expose(app) client = TestClient(app) get_response(client, "/") response = get_response(client, "/metrics") assert_is_not_multiprocess(response) assert b"http_request_duration_seconds" in response.content
def test_grouping_untemplated(): app = create_app() Instrumentator(excluded_handlers=["/metrics"]).add( metrics.latency()).instrument(app) expose_metrics(app) client = TestClient(app) get_response(client, "/") get_response(client, "/items/678?q=43243") get_response(client, "/does_not_exist") response = get_response(client, "/metrics") assert_is_not_multiprocess(response) assert_request_count(1) assert b'handler="/does_not_exist"' not in response.content assert b'handler="none"' in response.content
def test_excluding_handlers_regex(): app = create_app() Instrumentator(excluded_handlers=["^/$"]).add( metrics.latency()).instrument(app) expose_metrics(app) client = TestClient(app) get_response(client, "/ignore") get_response(client, "/ignore") get_response(client, "/") response = get_response(client, "/metrics") assert b'handler="/"' not in response.content assert b'handler="none"' not in response.content assert b'handler="/ignore"' in response.content
def test_latency_all_labels(): app = create_app() Instrumentator().add(metrics.latency()).instrument(app).expose(app) client = TestClient(app) client.get("/") _ = get_response(client, "/metrics") assert (REGISTRY.get_sample_value( "http_request_duration_seconds_sum", { "handler": "/", "method": "GET", "status": "2xx" }, ) > 0)
def test_multiprocess_reg(): app = create_app() Instrumentator(excluded_handlers=["/metrics"]).add( metrics.latency(buckets=( 1, 2, 3, ))).instrument(app).expose(app) client = TestClient(app) get_response(client, "/") response = get_response(client, "/metrics") assert response.status_code == 200 assert b"Multiprocess" in response.content assert b"# HELP process_cpu_seconds_total" not in response.content assert b"http_request_duration_seconds" in response.content
def test_excluding_handlers(): app = create_app() Instrumentator(excluded_handlers=["fefefwefwe"]).add( metrics.latency()).instrument(app) expose_metrics(app) client = TestClient(app) get_response(client, "/") get_response(client, "/metrics") get_response(client, "/fefefwefwe") response = get_response(client, "/metrics") assert_is_not_multiprocess(response) assert_request_count(1) assert b'handler="/metrics"' in response.content assert b'handler="/fefefwefwe"' not in response.content assert b'handler="none"' not in response.content
def test_latency_no_labels(): app = create_app() Instrumentator().add( metrics.latency( should_include_handler=False, should_include_method=False, should_include_status=False, )).instrument(app).expose(app) client = TestClient(app) client.get("/") _ = get_response(client, "/metrics") assert (REGISTRY.get_sample_value( "http_request_duration_seconds_sum", {}, ) > 0)
def test_dont_ignore_untemplated_ungrouped(): app = create_app() Instrumentator(should_ignore_untemplated=False, should_group_untemplated=False).add( metrics.latency()).instrument(app) expose_metrics(app) client = TestClient(app) get_response(client, "/") get_response(client, "/") get_response(client, "/items/678?q=43243") get_response(client, "/does_not_exist") response = get_response(client, "/metrics") assert_is_not_multiprocess(response) assert_request_count(2) assert b'handler="/does_not_exist"' in response.content assert b'handler="none"' not in response.content
metric_namespace=NAMESPACE, metric_subsystem=SUBSYSTEM, )) instrumentator.add( metrics.response_size( should_include_handler=True, should_include_method=True, should_include_status=True, metric_namespace=NAMESPACE, metric_subsystem=SUBSYSTEM, )) instrumentator.add( metrics.latency( should_include_handler=True, should_include_method=True, should_include_status=True, metric_namespace=NAMESPACE, metric_subsystem=SUBSYSTEM, )) instrumentator.add( metrics.requests( should_include_handler=True, should_include_method=True, should_include_status=True, metric_namespace=NAMESPACE, metric_subsystem=SUBSYSTEM, )) # buckets = (*np.arange(0, 10.5, 0.5).tolist(), float("inf")) # instrumentator.add( # regression_model_output(metric_namespace=NAMESPACE, metric_subsystem=SUBSYSTEM, buckets=buckets)