feat(tvix): add instance_name to instrumentation of *Services
Currently it is not possible to distinguish between tracing of the same *Service type whenever there are multiple of them. Now the instance_name of ServiceBuilder is passed into the *Service and used in the existing instrument as the `instance_name` field. Places that did not already have a instance_name in its context use `"default"`. In tests I used `"test"`. Change-Id: Ia20bf2a7bb849a781e370d087ba7ddb3be79f654 Reviewed-on: https://cl.tvl.fyi/c/depot/+/12739 Tested-by: BuildkiteCI Autosubmit: Bob van der Linden <bobvanderlinden@gmail.com> Reviewed-by: flokli <flokli@flokli.de>
This commit is contained in:
parent
951d25676b
commit
cfa4154131
23 changed files with 270 additions and 137 deletions
|
|
@ -17,6 +17,8 @@ use tvix_castore::Node;
|
|||
/// Connects to a (remote) tvix-store PathInfoService over gRPC.
|
||||
#[derive(Clone)]
|
||||
pub struct GRPCPathInfoService<T> {
|
||||
instance_name: String,
|
||||
|
||||
/// The internal reference to a gRPC client.
|
||||
/// Cloning it is cheap, and it internally handles concurrent requests.
|
||||
grpc_client: proto::path_info_service_client::PathInfoServiceClient<T>,
|
||||
|
|
@ -26,9 +28,13 @@ impl<T> GRPCPathInfoService<T> {
|
|||
/// construct a [GRPCPathInfoService] from a [proto::path_info_service_client::PathInfoServiceClient].
|
||||
/// panics if called outside the context of a tokio runtime.
|
||||
pub fn from_client(
|
||||
instance_name: String,
|
||||
grpc_client: proto::path_info_service_client::PathInfoServiceClient<T>,
|
||||
) -> Self {
|
||||
Self { grpc_client }
|
||||
Self {
|
||||
instance_name,
|
||||
grpc_client,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -40,7 +46,7 @@ where
|
|||
<T::ResponseBody as tonic::codegen::Body>::Error: Into<tonic::codegen::StdError> + Send,
|
||||
T::Future: Send,
|
||||
{
|
||||
#[instrument(level = "trace", skip_all, fields(path_info.digest = nixbase32::encode(&digest)))]
|
||||
#[instrument(level = "trace", skip_all, fields(path_info.digest = nixbase32::encode(&digest), instance_name = %self.instance_name))]
|
||||
async fn get(&self, digest: [u8; 20]) -> Result<Option<PathInfo>, Error> {
|
||||
let path_info = self
|
||||
.grpc_client
|
||||
|
|
@ -62,7 +68,7 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
#[instrument(level = "trace", skip_all, fields(path_info.root_node = ?path_info.node))]
|
||||
#[instrument(level = "trace", skip_all, fields(path_info.root_node = ?path_info.node, instance_name = %self.instance_name))]
|
||||
async fn put(&self, path_info: PathInfo) -> Result<PathInfo, Error> {
|
||||
let path_info = self
|
||||
.grpc_client
|
||||
|
|
@ -99,6 +105,7 @@ where
|
|||
#[instrument(level = "trace", skip_all)]
|
||||
fn nar_calculation_service(&self) -> Option<Box<dyn NarCalculationService>> {
|
||||
Some(Box::new(GRPCPathInfoService {
|
||||
instance_name: self.instance_name.clone(),
|
||||
grpc_client: self.grpc_client.clone(),
|
||||
}) as Box<dyn NarCalculationService>)
|
||||
}
|
||||
|
|
@ -163,13 +170,16 @@ impl ServiceBuilder for GRPCPathInfoServiceConfig {
|
|||
type Output = dyn PathInfoService;
|
||||
async fn build<'a>(
|
||||
&'a self,
|
||||
_instance_name: &str,
|
||||
instance_name: &str,
|
||||
_context: &CompositionContext,
|
||||
) -> Result<Arc<dyn PathInfoService>, Box<dyn std::error::Error + Send + Sync + 'static>> {
|
||||
let client = proto::path_info_service_client::PathInfoServiceClient::new(
|
||||
tvix_castore::tonic::channel_from_url(&self.url.parse()?).await?,
|
||||
);
|
||||
Ok(Arc::new(GRPCPathInfoService::from_client(client)))
|
||||
Ok(Arc::new(GRPCPathInfoService::from_client(
|
||||
instance_name.to_string(),
|
||||
client,
|
||||
)))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue