Files
stonks-oracle/tests/test_metrics.py
T

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