gitdataai/libs/rpc/build.rs
ZhenYi 962bf0312d feat(observability): Phase 6 OTLP tracing + Prometheus metrics endpoint
OTLP tracing:
- libs/observability/otlp.rs: SdkTracerProvider via HTTP/proto OTLP exporter
- libs/observability/tracing_middleware.rs: Actix-web span with trace_id propagation
- libs/observability/tracing_fmt.rs: JSON fmt + registry.try_init for layered init
- libs/rpc: gRPC method spans via info_span
- libs/agent, libs/room, libs/service, libs/api: structured tracing throughout

Prometheus metrics:
- libs/observability/prometheus_exporter.rs: /metrics HTTP handler + metrics crate
- libs/observability/metrics_middleware.rs: HttpMetrics middleware + AtomicU64
- libs/observability/redis_metrics.rs: Redis counter poller via RedisMetrics
- libs/room/metrics.rs: RoomMetrics (connections, messages, presence counters)

Config env vars: APP_OTEL_ENABLED, APP_OTEL_ENDPOINT, APP_OTEL_SERVICE_NAME
2026-04-22 10:27:54 +08:00

112 lines
4.8 KiB
Rust

fn main() -> Result<(), Box<dyn std::error::Error>> {
let proto_file = "proto/admin.proto";
let out_dir = "admin/generated";
std::fs::create_dir_all(out_dir)?;
tonic_prost_build::configure()
.out_dir(out_dir)
.compile_protos(&[proto_file], &["proto/"])?;
let service = tonic_prost_build::manual::Service::builder()
.name("SessionAdmin")
.package("admin")
.method(
tonic_prost_build::manual::Method::builder()
.name("list_workspace_sessions")
.route_name("ListWorkspaceSessions")
.input_type("crate::admin::generated::admin::ListWorkspaceSessionsRequest")
.output_type("crate::admin::generated::admin::ListWorkspaceSessionsResponse")
.codec_path("tonic_prost::ProstCodec")
.build(),
)
.method(
tonic_prost_build::manual::Method::builder()
.name("list_user_sessions")
.route_name("ListUserSessions")
.input_type("crate::admin::generated::admin::ListUserSessionsRequest")
.output_type("crate::admin::generated::admin::ListUserSessionsResponse")
.codec_path("tonic_prost::ProstCodec")
.build(),
)
.method(
tonic_prost_build::manual::Method::builder()
.name("kick_user_from_workspace")
.route_name("KickUserFromWorkspace")
.input_type("crate::admin::generated::admin::KickUserFromWorkspaceRequest")
.output_type("crate::admin::generated::admin::KickUserFromWorkspaceResponse")
.codec_path("tonic_prost::ProstCodec")
.build(),
)
.method(
tonic_prost_build::manual::Method::builder()
.name("kick_user")
.route_name("KickUser")
.input_type("crate::admin::generated::admin::KickUserRequest")
.output_type("crate::admin::generated::admin::KickUserResponse")
.codec_path("tonic_prost::ProstCodec")
.build(),
)
.method(
tonic_prost_build::manual::Method::builder()
.name("get_user_status")
.route_name("GetUserStatus")
.input_type("crate::admin::generated::admin::GetUserStatusRequest")
.output_type("crate::admin::generated::admin::GetUserStatusResponse")
.codec_path("tonic_prost::ProstCodec")
.build(),
)
.method(
tonic_prost_build::manual::Method::builder()
.name("get_user_info")
.route_name("GetUserInfo")
.input_type("crate::admin::generated::admin::GetUserInfoRequest")
.output_type("crate::admin::generated::admin::GetUserInfoResponse")
.codec_path("tonic_prost::ProstCodec")
.build(),
)
.method(
tonic_prost_build::manual::Method::builder()
.name("get_workspace_online_users")
.route_name("GetWorkspaceOnlineUsers")
.input_type("crate::admin::generated::admin::GetWorkspaceOnlineUsersRequest")
.output_type("crate::admin::generated::admin::GetWorkspaceOnlineUsersResponse")
.codec_path("tonic_prost::ProstCodec")
.build(),
)
.method(
tonic_prost_build::manual::Method::builder()
.name("is_user_online")
.route_name("IsUserOnline")
.input_type("crate::admin::generated::admin::IsUserOnlineRequest")
.output_type("crate::admin::generated::admin::IsUserOnlineResponse")
.codec_path("tonic_prost::ProstCodec")
.build(),
)
.method(
tonic_prost_build::manual::Method::builder()
.name("get_metrics")
.route_name("GetMetrics")
.input_type("crate::admin::generated::admin::GetMetricsRequest")
.output_type("crate::admin::generated::admin::GetMetricsResponse")
.codec_path("tonic_prost::ProstCodec")
.build(),
)
.method(
tonic_prost_build::manual::Method::builder()
.name("export_metrics_csv")
.route_name("ExportMetricsCsv")
.input_type("crate::admin::generated::admin::ExportMetricsCsvRequest")
.output_type("crate::admin::generated::admin::ExportMetricsCsvResponse")
.codec_path("tonic_prost::ProstCodec")
.build(),
)
.build();
tonic_prost_build::manual::Builder::new()
.out_dir(out_dir)
.build_transport(true)
.compile(&[service]);
Ok(())
}