Skip to content

Evaluation & Observability

Minions provides comprehensive evaluation and observability features, including memory-specific metrics and monitoring capabilities.

Memory Metrics

Performance Metrics

@Component
public class MemoryMetrics {
    private final MeterRegistry registry;

    public void recordMemoryOperation(
            String operation,
            MemorySubsystem subsystem,
            long duration) {
        registry.timer("memory.operation", 
            "operation", operation,
            "subsystem", subsystem.name())
            .record(duration, TimeUnit.MILLISECONDS);
    }
}

Memory Health

@Component
public class MemoryHealthIndicator implements HealthIndicator {
    private final MemoryManager memoryManager;

    @Override
    public Health health() {
        return Health.builder()
            .withDetail("episodic", checkSubsystem(MemorySubsystem.EPISODIC))
            .withDetail("vector", checkSubsystem(MemorySubsystem.VECTOR))
            .build();
    }
}

Memory Monitoring

Query Monitoring

@Aspect
@Component
public class MemoryQueryMonitor {
    @Around("execution(* com.minionslab.core.memory.MemoryManager.query(..))")
    public Object monitorQuery(ProceedingJoinPoint pjp) {
        // Monitor query performance
        // Track query patterns
        // Alert on anomalies
    }
}

Storage Monitoring

@Aspect
@Component
public class MemoryStorageMonitor {
    @Around("execution(* com.minionslab.core.memory.MemoryManager.store(..))")
    public Object monitorStorage(ProceedingJoinPoint pjp) {
        // Monitor storage operations
        // Track storage patterns
        // Alert on capacity issues
    }
}

Memory Evaluation

Query Evaluation

@Component
public class MemoryQueryEvaluator {
    public QueryEvaluationResult evaluateQuery(
            MemoryQuery query,
            List<Message> results) {
        return QueryEvaluationResult.builder()
            .relevance(calculateRelevance(results))
            .completeness(calculateCompleteness(results))
            .build();
    }
}

Summarization Evaluation

@Component
public class MemorySummarizationEvaluator {
    public SummarizationEvaluationResult evaluateSummary(
            List<Message> original,
            Message summary) {
        return SummarizationEvaluationResult.builder()
            .coverage(calculateCoverage(original, summary))
            .accuracy(calculateAccuracy(original, summary))
            .build();
    }
}

Observability Integration

Prometheus Metrics

management:
  endpoints:
    web:
      exposure:
        include: health,metrics,prometheus
  metrics:
    export:
      prometheus:
        enabled: true

Grafana Dashboards

{
  "dashboard": {
    "panels": [
      {
        "title": "Memory Operations",
        "type": "graph",
        "targets": [
          {
            "expr": "rate(memory_operation_seconds_count[5m])",
            "legendFormat": "{{operation}} - {{subsystem}}"
          }
        ]
      }
    ]
  }
}

Testing Observability

@Test
void testMemoryMetrics() {
    MemoryManager manager = new MemoryManager(memories, strategies);
    manager.store(MemorySubsystem.EPISODIC, message);

    // Verify metrics
    assertThat(registry.find("memory.operation")
        .tag("operation", "store")
        .tag("subsystem", "EPISODIC")
        .timer())
        .isNotNull();
}

Minions supports observability hooks throughout the agent lifecycle:

  • Step-level evaluations
  • Memory inspection
  • Custom evaluators for response scoring or compliance
  • Audit trails and trace IDs

Observers can be attached declaratively in recipes or dynamically at runtime.