---
title: Observability
description: Built-in metrics extension with lifecycle counters.
---

The `observability` package provides a `MetricsExtension` that records counters for all evaluation lifecycle events using the `go-utils` MetricFactory.

## Setup

```go
import "github.com/xraph/sentinel/observability"

// Using default metrics collector
metricsExt := observability.NewMetricsExtension()

// Or with a custom factory
factory := metrics.NewMetricsCollector("my-app")
metricsExt := observability.NewMetricsExtensionWithFactory(factory)

// Register with engine
eng, err := engine.New(
    engine.WithExtension(metricsExt),
)
```

## Counters

The extension records counters for evaluation lifecycle events:

| Counter name | Hook | Description |
|-------------|------|-------------|
| `sentinel.eval.run.started` | `OnEvalRunStarted` | Evaluation runs initiated |
| `sentinel.eval.run.completed` | `OnEvalRunCompleted` | Runs completed successfully |
| `sentinel.eval.run.failed` | `OnEvalRunFailed` | Runs that failed |
| `sentinel.case.started` | `OnCaseStarted` | Case evaluations initiated |
| `sentinel.case.completed` | `OnCaseCompleted` | Case evaluations completed |
| `sentinel.case.failed` | `OnCaseFailed` | Case evaluations failed |
| `sentinel.regression.detected` | `OnRegressionDetected` | Regressions detected |
| `sentinel.baseline.saved` | `OnBaselineSaved` | Baselines saved |
| `sentinel.redteam.started` | `OnRedTeamStarted` | Red team evaluations started |
| `sentinel.redteam.completed` | `OnRedTeamCompleted` | Red team evaluations completed |

## Interface compliance

The `MetricsExtension` implements the relevant hook interfaces plus the base `plugin.Extension`:

```go
var _ plugin.Extension        = (*MetricsExtension)(nil)
var _ plugin.EvalRunStarted   = (*MetricsExtension)(nil)
var _ plugin.EvalRunCompleted = (*MetricsExtension)(nil)
var _ plugin.EvalRunFailed    = (*MetricsExtension)(nil)
var _ plugin.CaseStarted      = (*MetricsExtension)(nil)
var _ plugin.CaseCompleted     = (*MetricsExtension)(nil)
var _ plugin.CaseFailed        = (*MetricsExtension)(nil)
var _ plugin.RegressionDetected = (*MetricsExtension)(nil)
var _ plugin.BaselineSaved      = (*MetricsExtension)(nil)
var _ plugin.RedTeamStarted     = (*MetricsExtension)(nil)
var _ plugin.RedTeamCompleted   = (*MetricsExtension)(nil)
```
