feat(cluster): implement Raft consensus with tracing and HTTP support

- Add Raft log and snapshot mechanisms for distributed consensus
- Integrate hyper HTTP server and client libraries for network communication
- Enhance tracing capabilities with structured logging and spans
- Add dependency tracking for new consensus-related crates
- Implement snapshot storage with serialization and persistence
- Add remote repository synchronization via Raft commands
- Include comprehensive tracing instrumentation across services
This commit is contained in:
zhenyi
2026-06-10 18:33:42 +08:00
parent 0207cde234
commit c32a7cad2f
10 changed files with 453 additions and 6 deletions
+36
View File
@@ -283,8 +283,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/FindCommit");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.find_commit", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.find_commit(inner).map_err(into_status)?;
tracing::info!(%repo, "find_commit done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -296,8 +300,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/ListCommitsByOid");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.list_commits_by_oid", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.list_commits_by_oid(inner).map_err(into_status)?;
tracing::info!(%repo, count = resp.commits.len(), "list_commits_by_oid done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -309,8 +317,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/CommitIsAncestor");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.commit_is_ancestor", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.commit_is_ancestor(inner).map_err(into_status)?;
tracing::info!(%repo, is_ancestor = resp.is_ancestor, "commit_is_ancestor done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -322,8 +334,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/CheckObjectsExist");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.check_objects_exist", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.check_objects_exist(inner).map_err(into_status)?;
tracing::info!(%repo, "check_objects_exist done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -335,8 +351,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/CommitsByMessage");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.commits_by_message", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.commits_by_message(inner).map_err(into_status)?;
tracing::info!(%repo, count = resp.commits.len(), "commits_by_message done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -348,8 +368,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/GetCommitStats");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.get_commit_stats", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.get_commit_stats(inner).map_err(into_status)?;
tracing::info!(%repo, additions = resp.additions, deletions = resp.deletions, changed_files = resp.changed_files, "get_commit_stats done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -361,8 +385,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/LastCommitForPath");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.last_commit_for_path", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.last_commit_for_path(inner).map_err(into_status)?;
tracing::info!(%repo, "last_commit_for_path done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -374,8 +402,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/CountCommits");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.count_commits", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.count_commits(inner).map_err(into_status)?;
tracing::info!(%repo, count = resp.count, "count_commits done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -387,8 +419,12 @@ impl commit_service_server::CommitService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.CommitService/CountDivergingCommits");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("commit.count_diverging_commits", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.count_diverging_commits(inner).map_err(into_status)?;
tracing::info!(%repo, left = resp.left_count, right = resp.right_count, "count_diverging_commits done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
+12
View File
@@ -182,8 +182,12 @@ impl diff_service_server::DiffService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.DiffService/RawDiff");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("diff.raw_diff", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let chunks = gb.raw_diff(inner).map_err(into_status)?;
tracing::info!(%repo, "raw_diff streaming started");
m.record("ok");
Ok(tonic::Response::new(into_stream(chunks)))
}
@@ -195,8 +199,12 @@ impl diff_service_server::DiffService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.DiffService/RawPatch");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("diff.raw_patch", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let chunks = gb.raw_patch(inner).map_err(into_status)?;
tracing::info!(%repo, "raw_patch streaming started");
m.record("ok");
Ok(tonic::Response::new(into_stream(chunks)))
}
@@ -208,8 +216,12 @@ impl diff_service_server::DiffService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.DiffService/FindChangedPaths");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("diff.find_changed_paths", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.find_changed_paths(inner).map_err(into_status)?;
tracing::info!(%repo, paths = resp.paths.len(), "find_changed_paths done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
+30
View File
@@ -12,8 +12,12 @@ impl RefService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.RefService/FindDefaultBranchName");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("ref.find_default_branch_name", %repo);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.find_default_branch_name().map_err(super::into_status)?;
tracing::info!(%repo, "find_default_branch_name done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -25,8 +29,13 @@ impl RefService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.RefService/RefExists");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let ref_name = inner.ref_name.clone();
let span = tracing::info_span!("ref.ref_exists", %repo, %ref_name);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.ref_exists(inner).map_err(super::into_status)?;
tracing::info!(%repo, %ref_name, exists = resp.exists, "ref_exists done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -38,8 +47,13 @@ impl RefService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.RefService/UpdateReferences");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let updates_count = inner.updates.len();
let span = tracing::info_span!("ref.update_references", %repo, %updates_count);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.update_references(inner).map_err(super::into_status)?;
tracing::info!(%repo, %updates_count, failed = resp.failed_refs.len(), "update_references done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -51,8 +65,13 @@ impl RefService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.RefService/DeleteRefs");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let ref_count = inner.ref_names.len();
let span = tracing::info_span!("ref.delete_refs", %repo, %ref_count);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.delete_refs(inner).map_err(super::into_status)?;
tracing::info!(%repo, %ref_count, failed = resp.failed_refs.len(), "delete_refs done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -64,8 +83,13 @@ impl RefService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.RefService/FindRefsByOID");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let oid = inner.oid.clone();
let span = tracing::info_span!("ref.find_refs_by_oid", %repo, %oid);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.find_refs_by_oid(inner).map_err(super::into_status)?;
tracing::info!(%repo, %oid, count = resp.refs.len(), "find_refs_by_oid done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -77,8 +101,14 @@ impl RefService for GitksService {
let m = crate::metrics::RequestMetrics::new("gitks.RefService/ListRefs");
let inner = request.into_inner();
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let repo = self.repo_label(inner.repository.as_ref());
let prefixes = inner.prefixes.len();
let pattern = inner.pattern.clone();
let span = tracing::info_span!("ref.list_refs", %repo, %prefixes, %pattern);
let _enter = span.enter();
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.list_all_refs(inner).map_err(super::into_status)?;
tracing::info!(%repo, count = resp.refs.len(), "list_refs done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
+13
View File
@@ -12,7 +12,11 @@ impl RemoteService for GitksService {
) -> Result<tonic::Response<FindRemoteRepositoryResponse>, tonic::Status> {
let m = crate::metrics::RequestMetrics::new("gitks.RemoteService/FindRemoteRepository");
let inner = request.into_inner();
let span = tracing::info_span!("remote.find_remote_repository", remote_url = %inner.remote_url);
let _enter = span.enter();
tracing::info!(remote_url = %inner.remote_url, "find_remote_repository");
let resp = find_remote_repository(inner).map_err(super::into_status)?;
tracing::info!(refs_count = resp.refs.len(), exists = resp.exists, "find_remote_repository done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -23,7 +27,11 @@ impl RemoteService for GitksService {
) -> Result<tonic::Response<FindRemoteRootRefResponse>, tonic::Status> {
let m = crate::metrics::RequestMetrics::new("gitks.RemoteService/FindRemoteRootRef");
let inner = request.into_inner();
let span = tracing::info_span!("remote.find_remote_root_ref", remote_url = %inner.remote_url);
let _enter = span.enter();
tracing::info!(remote_url = %inner.remote_url, "find_remote_root_ref");
let resp = find_remote_root_ref(inner).map_err(super::into_status)?;
tracing::info!(ref_name = %resp.ref_name, target_oid = %resp.target_oid, "find_remote_root_ref done");
m.record("ok");
Ok(tonic::Response::new(resp))
}
@@ -34,9 +42,14 @@ impl RemoteService for GitksService {
) -> Result<tonic::Response<UpdateRemoteMirrorResponse>, tonic::Status> {
let m = crate::metrics::RequestMetrics::new("gitks.RemoteService/UpdateRemoteMirror");
let inner = request.into_inner();
let repo = self.repo_label(inner.repository.as_ref());
let span = tracing::info_span!("remote.update_remote_mirror", %repo);
let _enter = span.enter();
tracing::info!(repo = %repo, remote_url = %inner.remote_url, force = inner.force, prune = inner.prune, "update_remote_mirror");
let _rate = self.acquire_rate_limit(inner.repository.as_ref()).await?;
let gb = self.resolve(inner.repository.as_ref())?;
let resp = gb.update_remote_mirror(inner).map_err(super::into_status)?;
tracing::info!(ok = resp.ok, "update_remote_mirror done");
m.record("ok");
Ok(tonic::Response::new(resp))
}