152 lines
5.3 KiB
Python
152 lines
5.3 KiB
Python
"""Tests for Prometheus metrics definitions and instrumentation."""
|
|
from prometheus_client import Counter, Gauge, Histogram, Info
|
|
|
|
from services.shared.metrics import (
|
|
ACTIVE_JOBS,
|
|
AGGREGATION_CONTRADICTION_SCORE,
|
|
AGGREGATION_DURATION,
|
|
AGGREGATION_SIGNALS_PROCESSED,
|
|
AGGREGATION_WINDOWS_COMPUTED,
|
|
ALERT_ACTIVE,
|
|
ALERT_CHECK_DURATION,
|
|
ALERTS_FIRED,
|
|
ALERTS_RESOLVED,
|
|
EXTRACTION_ATTEMPTS,
|
|
EXTRACTION_CONFIDENCE,
|
|
EXTRACTION_DURATION,
|
|
EXTRACTION_JOBS_TOTAL,
|
|
EXTRACTION_RETRIES,
|
|
EXTRACTION_TOKEN_ESTIMATE,
|
|
EXTRACTION_VALIDATION_ERRORS,
|
|
INGESTION_ADAPTER_DURATION,
|
|
INGESTION_ERRORS,
|
|
INGESTION_ITEMS_DEDUPED,
|
|
INGESTION_ITEMS_FETCHED,
|
|
INGESTION_ITEMS_NEW,
|
|
INGESTION_JOBS_TOTAL,
|
|
LAKE_FACTS_PUBLISHED,
|
|
LAKE_PUBLISH_BYTES,
|
|
LAKE_PUBLISH_DURATION,
|
|
LAKE_PUBLISH_ERRORS,
|
|
ORDERS_DUPLICATES_PREVENTED,
|
|
ORDERS_FILLED,
|
|
ORDERS_REJECTED,
|
|
ORDERS_SUBMITTED,
|
|
PARSE_DURATION,
|
|
PARSE_JOBS_TOTAL,
|
|
PARSE_LOW_QUALITY_TOTAL,
|
|
PARSE_QUALITY_SCORE,
|
|
POSITIONS_SYNCED,
|
|
RECOMMENDATION_CONFIDENCE,
|
|
RECOMMENDATION_GENERATED,
|
|
RECOMMENDATION_SUPPRESSED,
|
|
RISK_CHECK_FAILURES,
|
|
RISK_EVALUATIONS_TOTAL,
|
|
SERVICE_INFO,
|
|
)
|
|
|
|
|
|
def test_ingestion_metrics_are_correct_types():
|
|
assert isinstance(INGESTION_JOBS_TOTAL, Counter)
|
|
assert isinstance(INGESTION_ITEMS_FETCHED, Counter)
|
|
assert isinstance(INGESTION_ITEMS_NEW, Counter)
|
|
assert isinstance(INGESTION_ITEMS_DEDUPED, Counter)
|
|
assert isinstance(INGESTION_ERRORS, Counter)
|
|
assert isinstance(INGESTION_ADAPTER_DURATION, Histogram)
|
|
|
|
|
|
def test_parse_metrics_are_correct_types():
|
|
assert isinstance(PARSE_JOBS_TOTAL, Counter)
|
|
assert isinstance(PARSE_QUALITY_SCORE, Histogram)
|
|
assert isinstance(PARSE_LOW_QUALITY_TOTAL, Counter)
|
|
assert isinstance(PARSE_DURATION, Histogram)
|
|
|
|
|
|
def test_extraction_metrics_are_correct_types():
|
|
assert isinstance(EXTRACTION_JOBS_TOTAL, Counter)
|
|
assert isinstance(EXTRACTION_ATTEMPTS, Counter)
|
|
assert isinstance(EXTRACTION_RETRIES, Counter)
|
|
assert isinstance(EXTRACTION_DURATION, Histogram)
|
|
assert isinstance(EXTRACTION_CONFIDENCE, Histogram)
|
|
assert isinstance(EXTRACTION_VALIDATION_ERRORS, Counter)
|
|
assert isinstance(EXTRACTION_TOKEN_ESTIMATE, Counter)
|
|
|
|
|
|
def test_aggregation_metrics_are_correct_types():
|
|
assert isinstance(AGGREGATION_WINDOWS_COMPUTED, Counter)
|
|
assert isinstance(AGGREGATION_SIGNALS_PROCESSED, Counter)
|
|
assert isinstance(AGGREGATION_CONTRADICTION_SCORE, Histogram)
|
|
assert isinstance(AGGREGATION_DURATION, Histogram)
|
|
|
|
|
|
def test_recommendation_metrics_are_correct_types():
|
|
assert isinstance(RECOMMENDATION_GENERATED, Counter)
|
|
assert isinstance(RECOMMENDATION_SUPPRESSED, Counter)
|
|
assert isinstance(RECOMMENDATION_CONFIDENCE, Histogram)
|
|
|
|
|
|
def test_lake_metrics_are_correct_types():
|
|
assert isinstance(LAKE_FACTS_PUBLISHED, Counter)
|
|
assert isinstance(LAKE_PUBLISH_DURATION, Histogram)
|
|
assert isinstance(LAKE_PUBLISH_ERRORS, Counter)
|
|
assert isinstance(LAKE_PUBLISH_BYTES, Counter)
|
|
|
|
|
|
def test_trading_metrics_are_correct_types():
|
|
assert isinstance(ORDERS_SUBMITTED, Counter)
|
|
assert isinstance(ORDERS_REJECTED, Counter)
|
|
assert isinstance(ORDERS_FILLED, Counter)
|
|
assert isinstance(ORDERS_DUPLICATES_PREVENTED, Counter)
|
|
assert isinstance(RISK_EVALUATIONS_TOTAL, Counter)
|
|
assert isinstance(RISK_CHECK_FAILURES, Counter)
|
|
assert isinstance(POSITIONS_SYNCED, Counter)
|
|
|
|
|
|
def test_active_jobs_gauge():
|
|
assert isinstance(ACTIVE_JOBS, Gauge)
|
|
|
|
|
|
def test_alerting_metrics_are_correct_types():
|
|
assert isinstance(ALERTS_FIRED, Counter)
|
|
assert isinstance(ALERTS_RESOLVED, Counter)
|
|
assert isinstance(ALERT_CHECK_DURATION, Histogram)
|
|
assert isinstance(ALERT_ACTIVE, Gauge)
|
|
|
|
|
|
def test_service_info():
|
|
assert isinstance(SERVICE_INFO, Info)
|
|
|
|
|
|
def test_counter_labels_work():
|
|
"""Verify labeled counters can be incremented without error."""
|
|
INGESTION_JOBS_TOTAL.labels(source_type="news_api", status="success").inc()
|
|
INGESTION_ITEMS_FETCHED.labels(source_type="market_api").inc(5)
|
|
EXTRACTION_JOBS_TOTAL.labels(status="success").inc()
|
|
AGGREGATION_WINDOWS_COMPUTED.labels(window="7d").inc()
|
|
RECOMMENDATION_GENERATED.labels(action="buy", mode="paper_eligible").inc()
|
|
LAKE_FACTS_PUBLISHED.labels(table_name="trade_signals").inc()
|
|
ORDERS_SUBMITTED.labels(side="buy", order_type="market", mode="paper").inc()
|
|
ORDERS_REJECTED.labels(reason_category="risk_engine").inc()
|
|
RISK_EVALUATIONS_TOTAL.labels(result="passed").inc()
|
|
|
|
|
|
def test_histogram_observe_works():
|
|
"""Verify histograms accept observations without error."""
|
|
INGESTION_ADAPTER_DURATION.labels(source_type="news_api").observe(1.5)
|
|
PARSE_QUALITY_SCORE.observe(0.85)
|
|
PARSE_DURATION.observe(0.3)
|
|
EXTRACTION_DURATION.observe(5.2)
|
|
EXTRACTION_CONFIDENCE.observe(0.9)
|
|
AGGREGATION_CONTRADICTION_SCORE.observe(0.15)
|
|
AGGREGATION_DURATION.labels(window="7d").observe(0.8)
|
|
RECOMMENDATION_CONFIDENCE.observe(0.72)
|
|
LAKE_PUBLISH_DURATION.labels(table_name="market_bars").observe(0.05)
|
|
|
|
|
|
def test_metrics_endpoint_import():
|
|
"""Verify the prometheus_client generate_latest works."""
|
|
from prometheus_client import generate_latest
|
|
output = generate_latest()
|
|
assert isinstance(output, bytes)
|
|
assert b"stonks_" in output
|