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:
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user