rs-zero 0.1.1

Rust-first microservice framework inspired by go-zero engineering practices
Documentation
# Observability

rs-zero 提供 opt-in observability helpers,通过 `rs-zero` 的 `observability` feature 使用。

## Metrics

`MetricsRegistry` records HTTP request counters and duration sums. `record_metrics_middleware` integrates with axum and uses `MatchedPath` when available, so labels use route patterns such as `/users/{id}` instead of raw paths such as `/users/42`.

```rust
use axum::{Router, middleware, routing::get};
use rs_zero::observability::{
    MetricsRegistry, metrics_router, record_metrics_middleware,
};

let registry = MetricsRegistry::new();
let app = Router::new()
    .route("/ready", get(|| async { "ok" }))
    .merge(metrics_router(registry.clone()))
    .layer(middleware::from_fn_with_state(
        registry,
        record_metrics_middleware,
    ));
```

`metrics_router` exposes Prometheus text at `/metrics`.

## OpenTelemetry

`OpenTelemetryConfig` models three exporter modes:

- `Disabled`: no global subscriber is installed.
- `Stdout`: installs a local `tracing-subscriber` pipeline for span inspection.
- `Otlp { endpoint }`: validates OTLP endpoint configuration and keeps transport setup explicit for application code.

The MVP avoids requiring an external collector during tests. Applications that need production OTLP export can wrap the same config and install their preferred OpenTelemetry transport.

## OTLP traces

Milestone 4 adds `OtlpTraceConfig`, `OtlpProtocol`, `build_otlp_trace_config`, and `TraceShutdownHandle`. The default build validates config and shutdown behavior without requiring an external collector. Real transport wiring is gated behind the `otlp` feature path.