MicrometerMetrics

org.llm4s.metrics.MicrometerMetrics
See theMicrometerMetrics companion object
final class MicrometerMetrics(registry: MeterRegistry) extends MetricsCollector

A MetricsCollector that records into a Micrometer io.micrometer.core.instrument.MeterRegistry.

Use it when the application already has a registry (Spring Boot's Actuator registry, a Quarkus registry, a PrometheusMeterRegistry of your own) and the LLM metrics should appear next to the rest:

val metrics = new MicrometerMetrics(registry)
val client  = LLMConnect.getClient(config, metrics)

The meter names follow the series that llm4s-observability-prometheus exposes, so a dashboard built on llm4s_requests_total or llm4s_request_duration_seconds keeps working when the registry is exported as Prometheus (Micrometer's Prometheus naming turns llm4s.requests into llm4s_requests_total). See MicrometerMetrics.Names for every meter and its tags; the full table is in the monitoring guide.

Properties:

  • No global state: the registry is the only state, and two collectors on two registries are independent.
  • Safe: like every MetricsCollector, no method throws. A failure inside Micrometer (for example a MeterFilter that rejects a meter) is logged at WARN and dropped.
  • Bounded tag cardinality: tags are provider, model, a fixed outcome or error label, a fixed token type, and a fixed set of image operations and circuit-breaker states. Anything outside those sets is recorded as other, and a blank provider or model as unknown. Prompts, user ids, request ids and other unbounded values are never tags. provider and model come from the caller, so they are capped too: after 64 distinct providers or 256 distinct models on one collector, further values are recorded as other (logged once at WARN), so arbitrary model strings cannot grow the registry without limit.
  • Thread-safe: Micrometer meters are, and this class holds no mutable state.

Differences from PrometheusMetrics: this class also implements recordRetryAttempt, recordCircuitBreakerTransition and recordError, which the Prometheus collector leaves as no-ops, and it ignores negative or non-finite amounts instead of passing them to the registry.

This module is Beta: the meter names are intended to be stable, but they are not covered by the 1.x compatibility promise.

Value parameters

registry

the registry to record into; must not be null

Attributes

Companion
object
Graph
Supertypes
class Object
trait Matchable
class Any

Members list

Value members

Concrete methods

override def addTokens(provider: String, model: String, inputTokens: Long, outputTokens: Long): Unit

Record token usage.

Record token usage.

Implementations typically record input and output tokens separately so dashboards can show prompt and completion usage independently.

Value parameters

inputTokens

Number of input/prompt tokens

model

Model name

outputTokens

Number of output/completion tokens

provider

Provider name

Attributes

Definition Classes
override def observeImageGeneration(provider: String, model: String, operation: String, outcome: Outcome, duration: FiniteDuration, imageCount: Int): Unit

Record an image generation operation.

Record an image generation operation.

The outcome dimension has the same meaning as in observeRequest. imageCount records the number of generated images only for successful operations.

Value parameters

duration

Request duration

imageCount

Number of images generated

model

Model name (e.g., "gpt-image-1", "dall-e-3")

operation

Operation type: "generate" or "edit"

outcome

Success or Error with stable error kind

provider

Provider name (e.g., "openai", "stability-ai")

Attributes

Definition Classes
override def observeRequest(provider: String, model: String, outcome: Outcome, duration: FiniteDuration): Unit

Record an LLM request with its outcome and duration.

Record an LLM request with its outcome and duration.

The outcome dimension separates successful requests from failures. Error outcomes carry a stable ErrorKind such as ErrorKind.RateLimit, ErrorKind.Timeout, or ErrorKind.ServiceError so metrics backends can aggregate failures without depending on exception class names.

Value parameters

duration

Request duration

model

Model name (e.g., "gpt-4o", "claude-3-5-sonnet-latest")

outcome

Success or Error with stable error kind

provider

Provider name (e.g., "openai", "anthropic", "ollama")

Attributes

Definition Classes
override def recordCircuitBreakerTransition(provider: String, newState: String): Unit

Record circuit breaker state transition.

Record circuit breaker state transition.

Expected states are stable labels such as "open", "closed", and "half-open".

Value parameters

newState

New circuit breaker state ("open", "closed", "half-open")

provider

Provider name

Attributes

Definition Classes
override def recordCost(provider: String, model: String, costUsd: Double): Unit

Record estimated cost in USD.

Record estimated cost in USD.

Use this after pricing metadata is available for a request or image generation operation. Implementations should treat the value as an additive counter.

Value parameters

costUsd

Estimated cost in USD

model

Model name

provider

Provider name

Attributes

Definition Classes
override def recordError(errorKind: ErrorKind, provider: String): Unit

Record a generic error for metrics (when full request tracking not applicable).

Record a generic error for metrics (when full request tracking not applicable).

Use this for failures that occur outside a complete request timing scope, such as configuration, validation, or setup failures.

Value parameters

errorKind

Type of error

provider

Provider name

Attributes

Definition Classes
override def recordImageGenerationCost(provider: String, model: String, costUsd: Double, imageCount: Int): Unit

Record estimated image generation cost in USD.

Record estimated image generation cost in USD.

Value parameters

costUsd

Estimated cost in USD

imageCount

Number of images

model

Model name

provider

Provider name

Attributes

Definition Classes
override def recordRetryAttempt(provider: String, attemptNumber: Int): Unit

Record a retry attempt for reliability tracking.

Record a retry attempt for reliability tracking.

The first retry after the original request fails should use attemptNumber = 1.

Value parameters

attemptNumber

Which retry attempt (1 = first retry, 2 = second, etc.)

provider

Provider name

Attributes

Definition Classes