fix: add _total suffix to metrics (OpenMetrics convention)

This commit is contained in:
Rajat Ahuja 2026-01-23 10:26:38 -05:00
parent dce96889bc
commit 556530366c
2 changed files with 36 additions and 32 deletions

View File

@ -254,50 +254,50 @@ class OTelMetrics:
self._dialectic_meter = get_meter("honcho.dialectic")
self._dreamer_meter = get_meter("honcho.dreamer")
# Create counters that mirror Prometheus metrics
# Create counters that mirror Prometheus metrics (_total suffix follows OpenMetrics convention)
# API requests
self._api_requests = self._api_meter.create_counter(
name="api_requests",
name="api_requests_total",
unit="requests",
description="Total API requests",
)
# Messages created
self._messages_created = self._api_meter.create_counter(
name="messages_created",
name="messages_created_total",
unit="messages",
description="Total messages created",
)
# Dialectic calls
self._dialectic_calls = self._dialectic_meter.create_counter(
name="dialectic_calls",
name="dialectic_calls_total",
unit="calls",
description="Total dialectic calls",
)
# Deriver queue items processed
self._deriver_queue_items = self._deriver_meter.create_counter(
name="deriver_queue_items_processed",
name="deriver_queue_items_processed_total",
unit="items",
description="Total deriver queue items processed",
)
# Token counters
self._deriver_tokens = self._deriver_meter.create_counter(
name="deriver_tokens_processed",
name="deriver_tokens_processed_total",
unit="tokens",
description="Total tokens processed by the deriver",
)
self._dialectic_tokens = self._dialectic_meter.create_counter(
name="dialectic_tokens_processed",
name="dialectic_tokens_processed_total",
unit="tokens",
description="Total tokens processed by the dialectic",
)
self._dreamer_tokens = self._dreamer_meter.create_counter(
name="dreamer_tokens_processed",
name="dreamer_tokens_processed_total",
unit="tokens",
description="Total tokens processed by the dreamer",
)

View File

@ -309,7 +309,7 @@ class TestDeriverIngestionMetrics:
"token_type": "output",
"component": "output_total",
}
before = metric_checker.capture("deriver_tokens_processed", labels)
before = metric_checker.capture("deriver_tokens_processed_total", labels)
# Mock the LLM call and save_representation (we're testing metrics, not DB writes)
with (
@ -332,7 +332,7 @@ class TestDeriverIngestionMetrics:
# Verify output tokens metric
metric_checker.assert_delta(
"deriver_tokens_processed",
"deriver_tokens_processed_total",
labels,
before,
expected_output_tokens,
@ -367,7 +367,7 @@ class TestDeriverIngestionMetrics:
"token_type": "input",
"component": "prompt",
}
before = metric_checker.capture("deriver_tokens_processed", labels)
before = metric_checker.capture("deriver_tokens_processed_total", labels)
with (
patch(
@ -388,7 +388,7 @@ class TestDeriverIngestionMetrics:
)
metric_checker.assert_delta(
"deriver_tokens_processed",
"deriver_tokens_processed_total",
labels,
before,
expected_prompt_tokens,
@ -424,7 +424,7 @@ class TestDeriverIngestionMetrics:
"token_type": "input",
"component": "messages",
}
before = metric_checker.capture("deriver_tokens_processed", labels)
before = metric_checker.capture("deriver_tokens_processed_total", labels)
with (
patch(
@ -445,7 +445,9 @@ class TestDeriverIngestionMetrics:
)
# Verify messages tokens were tracked (should be > 0)
delta = metric_checker.get_delta("deriver_tokens_processed", labels, before)
delta = metric_checker.get_delta(
"deriver_tokens_processed_total", labels, before
)
assert delta > 0, f"Expected messages input tokens > 0, got {delta}"
@ -491,7 +493,7 @@ class TestDeriverSummaryMetrics:
"token_type": "output",
"component": "output_total",
}
before = metric_checker.capture("deriver_tokens_processed", labels)
before = metric_checker.capture("deriver_tokens_processed_total", labels)
with (
patch(
@ -517,7 +519,7 @@ class TestDeriverSummaryMetrics:
# Verify output tokens match the summary token_count
metric_checker.assert_delta(
"deriver_tokens_processed",
"deriver_tokens_processed_total",
labels,
before,
expected_output_tokens,
@ -555,7 +557,7 @@ class TestDeriverSummaryMetrics:
"token_type": "input",
"component": "prompt",
}
before = metric_checker.capture("deriver_tokens_processed", labels)
before = metric_checker.capture("deriver_tokens_processed_total", labels)
with (
patch(
@ -580,7 +582,7 @@ class TestDeriverSummaryMetrics:
)
metric_checker.assert_delta(
"deriver_tokens_processed",
"deriver_tokens_processed_total",
labels,
before,
expected_prompt_tokens,
@ -627,7 +629,7 @@ class TestDeriverSummaryMetrics:
"token_type": "input",
"component": "messages",
}
before = metric_checker.capture("deriver_tokens_processed", labels)
before = metric_checker.capture("deriver_tokens_processed_total", labels)
with (
patch(
@ -652,7 +654,9 @@ class TestDeriverSummaryMetrics:
)
# Verify messages tokens match what summarizer actually computed
delta = metric_checker.get_delta("deriver_tokens_processed", labels, before)
delta = metric_checker.get_delta(
"deriver_tokens_processed_total", labels, before
)
assert (
delta == expected_messages_tokens
), f"Expected messages input tokens {expected_messages_tokens}, got {delta}"
@ -695,10 +699,10 @@ class TestDeriverSummaryMetrics:
"component": "prompt",
}
before_output = metric_checker.capture(
"deriver_tokens_processed", output_labels
"deriver_tokens_processed_total", output_labels
)
before_prompt = metric_checker.capture(
"deriver_tokens_processed", prompt_labels
"deriver_tokens_processed_total", prompt_labels
)
with patch(
@ -719,10 +723,10 @@ class TestDeriverSummaryMetrics:
# Verify NO change in metrics when fallback
output_delta = metric_checker.get_delta(
"deriver_tokens_processed", output_labels, before_output
"deriver_tokens_processed_total", output_labels, before_output
)
prompt_delta = metric_checker.get_delta(
"deriver_tokens_processed", prompt_labels, before_prompt
"deriver_tokens_processed_total", prompt_labels, before_prompt
)
assert (
@ -766,7 +770,7 @@ class TestDialecticTokenMetrics:
"component": "total",
"reasoning_level": "low",
}
before = metric_checker.capture("dialectic_tokens_processed", labels)
before = metric_checker.capture("dialectic_tokens_processed_total", labels)
agent = DialecticAgent(
db=db_session,
@ -783,7 +787,7 @@ class TestDialecticTokenMetrics:
await agent.answer("What do you know about this user?")
metric_checker.assert_delta(
"dialectic_tokens_processed",
"dialectic_tokens_processed_total",
labels,
before,
expected_input_tokens,
@ -814,7 +818,7 @@ class TestDialecticTokenMetrics:
"component": "total",
"reasoning_level": "low",
}
before = metric_checker.capture("dialectic_tokens_processed", labels)
before = metric_checker.capture("dialectic_tokens_processed_total", labels)
agent = DialecticAgent(
db=db_session,
@ -831,7 +835,7 @@ class TestDialecticTokenMetrics:
await agent.answer("What do you know about this user?")
metric_checker.assert_delta(
"dialectic_tokens_processed",
"dialectic_tokens_processed_total",
labels,
before,
expected_output_tokens,
@ -874,10 +878,10 @@ class TestDialecticTokenMetrics:
"reasoning_level": "low",
}
before_input = metric_checker.capture(
"dialectic_tokens_processed", input_labels
"dialectic_tokens_processed_total", input_labels
)
before_output = metric_checker.capture(
"dialectic_tokens_processed", output_labels
"dialectic_tokens_processed_total", output_labels
)
agent = DialecticAgent(
@ -896,10 +900,10 @@ class TestDialecticTokenMetrics:
# Verify NO change in metrics
input_delta = metric_checker.get_delta(
"dialectic_tokens_processed", input_labels, before_input
"dialectic_tokens_processed_total", input_labels, before_input
)
output_delta = metric_checker.get_delta(
"dialectic_tokens_processed", output_labels, before_output
"dialectic_tokens_processed_total", output_labels, before_output
)
assert (