2026-03-10 00:00:00 -07:00
# Observe Mode
Runtime visibility and drift detection without blocking by default.
2026-03-10 00:00:00 -07:00
Observe extends the invariant framework from [Invariant-Driven Automated Testing ](https://arxiv.org/abs/2602.23922 ) (Malhado Ribeiro, 2021) to production environments: contracts run continuously against live traffic to detect behavioral drift without affecting requests.
2026-03-10 00:00:00 -07:00
## What Observe Does
`apophis observe` validates your runtime observe configuration:
1. Checks that observe mode is allowed in the current environment
2. Validates reporting sink setup (logs, metrics, traces)
3. Confirms non-blocking semantics
4. Reports what would be observed and why it is safe
## When to Use It
- **Staging**: Validate observe config before promoting to production
- **Production**: Monitor contract drift without affecting requests
- **Platform teams**: Centralized visibility across services
## Safety Boundaries
Observe mode is non-blocking by default:
- **Non-blocking by default**: Contract violations are logged, not thrown
- **No request failures in non-blocking mode**: Violations are reported instead of thrown
- **Explicit opt-in for blocking**: Requires `allowBlocking: true` in environment policy
- **Production gating**: Blocking behavior is blocked in production by default
## Sink Configuration
Observe mode requires a reporting sink. Configure it in your environment policy:
``` javascript
environments : {
staging : {
name : 'staging' ,
allowVerify : true ,
allowObserve : true ,
allowQualify : false ,
allowChaos : false ,
allowBlocking : false ,
requireSink : true
}
}
```
APOPHIS supports these sink types:
- **Logs**: Structured logging of contract violations
- **Metrics**: Counter and histogram metrics for violation rates
- **Traces**: Distributed tracing integration for violation context
## Sampling
Control observation overhead with sampling:
``` javascript
profiles : {
'staging-observe' : {
name : 'staging-observe' ,
mode : 'observe' ,
preset : 'platform-observe' ,
routes : [ ]
}
}
```
2026-03-10 00:00:00 -07:00
The `platform-observe` preset enables sampling. Configure the rate explicitly:
``` javascript
profiles : {
'staging-observe' : {
mode : 'observe' ,
preset : 'platform-observe' ,
routes : [ ] ,
sampling : 1.0 // 100% of requests observed
}
}
```
2026-03-10 00:00:00 -07:00
## Staging vs Production
| Environment | Blocking | Sampling | Sink Required |
|---|---|---|---|
2026-03-10 00:00:00 -07:00
| Staging | No (default) | 100% | Yes |
| Production | No (default) | 100% | Yes |
Default is `1.0` (100%). Configure lower rates for production explicitly:
``` javascript
profiles : {
'prod-observe' : {
mode : 'observe' ,
preset : 'platform-observe' ,
routes : [ ] ,
sampling : 0.1 // 10% of requests observed
}
}
```
2026-03-10 00:00:00 -07:00
## `--check-config` Flag
Validate config without activating observe mode:
``` bash
apophis observe --profile staging-observe --check-config
```
This is useful in CI to ensure observe config is valid before deployment.
## Exit Codes
| Code | Meaning |
|---|---|
| 0 | Observe config is valid and safe |
| 2 | Safety violation or invalid config |
## Config Example
``` javascript
// apophis.config.js
export default {
mode : 'observe' ,
profile : 'staging-observe' ,
profiles : {
'staging-observe' : {
name : 'staging-observe' ,
mode : 'observe' ,
preset : 'platform-observe' ,
routes : [ ]
}
} ,
presets : {
'platform-observe' : {
name : 'platform-observe' ,
timeout : 10000 ,
parallel : true ,
chaos : false ,
observe : true
}
} ,
environments : {
staging : {
name : 'staging' ,
allowVerify : true ,
allowObserve : true ,
allowQualify : false ,
allowChaos : false ,
allowBlocking : false ,
requireSink : true
} ,
production : {
name : 'production' ,
allowVerify : true ,
allowObserve : true ,
allowQualify : false ,
allowChaos : false ,
allowBlocking : false ,
requireSink : true
}
}
} ;
```
2026-03-10 00:00:00 -07:00
## Sink Endpoint Configuration
Configure the reporting sink endpoint in your observe config:
``` javascript
observe : {
sink : {
endpoint : 'http://collector.internal:4318'
}
}
```
## Monorepo Validation
For monorepos, use `apophis doctor --workspace` to validate observe configuration across all workspace packages. `observe` itself does not support `--workspace` ; use `doctor` to check config in each package.
## Mode Mismatch
Profiles configured for `verify` mode will be rejected by `apophis observe` . Only profiles with `mode: 'observe'` are valid.
```