id_effect 0.4.0

Effect<A, E, R> (sync + async), capability DI, pipe — interpreter-style, no bundled executor
Documentation
# Observability and health

Part VI observability centers on [`id_effect_opentelemetry`](../../../id_effect_opentelemetry) and Axum health routes in [`id_effect_axum`](../../../id_effect_axum).

## Starter layer

Call [`install_otel_starter`](https://docs.rs/id_effect_opentelemetry/latest/id_effect_opentelemetry/fn.install_otel_starter.html) once at process startup to register traces, metrics, logs, and W3C propagation:

```rust
use id_effect_opentelemetry::{install_otel_starter, OtelStarterConfig};

let _guard = install_otel_starter(OtelStarterConfig::from_env())?;
```

For tests, use `OtelStarterConfig::in_memory_for_tests()`.

## Health and readiness

Mount [`id_effect_axum::health::observability_routes`](https://docs.rs/id_effect_axum/latest/id_effect_axum/health/fn.observability_routes.html) on your router:

```rust
use id_effect_axum::health::{observability_routes_with_state, ReadinessState};
use std::sync::Arc;

let ready = ReadinessState::new(false);
let obs = observability_routes_with_state(ready.clone());
// flip to true after DB pool warm-up
ready.set_ready(true);
```

## Axum trace middleware

[`id_effect_opentelemetry::trace_request`](https://docs.rs/id_effect_opentelemetry/latest/id_effect_opentelemetry/fn.trace_request.html) extracts W3C `traceparent` and creates a server span:

```rust
use axum::middleware;
use id_effect_opentelemetry::trace_request;

let app = router.layer(middleware::from_fn(trace_request));
```

Pair with [`id_effect_rpc::span`](../../../id_effect_rpc/src/span.rs) helpers for RPC-shaped routes.

## See also

- Part II: [OpenTelemetry chapter]../part2/ch07-12-opentelemetry.md
- Mission: `platform-observability`