From 515d45528d1b95e45336c151cc9eff303551ccea Mon Sep 17 00:00:00 2001 From: Jedd Morgan <45512892+JR-Morgan@users.noreply.github.com> Date: Wed, 11 Mar 2026 14:51:58 +0000 Subject: [PATCH] feat(otel): traces for new send pipeline (#457) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 😃 extra traces * default --- .../GraphQL/Inputs/ModelIngestionInputs.cs | 3 ++- src/Speckle.Sdk/Pipelines/Send/DiskStore.cs | 15 ++++++++++++--- src/Speckle.Sdk/Pipelines/Send/Uploader.cs | 19 ++++++++++++------- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/Speckle.Sdk/Api/GraphQL/Inputs/ModelIngestionInputs.cs b/src/Speckle.Sdk/Api/GraphQL/Inputs/ModelIngestionInputs.cs index 1215d034..87cbde66 100644 --- a/src/Speckle.Sdk/Api/GraphQL/Inputs/ModelIngestionInputs.cs +++ b/src/Speckle.Sdk/Api/GraphQL/Inputs/ModelIngestionInputs.cs @@ -14,7 +14,8 @@ public record ModelIngestionCreateInput( string modelId, string projectId, string progressMessage, - SourceDataInput sourceData + SourceDataInput sourceData, + int? maxIdleTimeoutSeconds = null ); public record ModelIngestionUpdateInput(string ingestionId, string projectId, string progressMessage, double? progress); diff --git a/src/Speckle.Sdk/Pipelines/Send/DiskStore.cs b/src/Speckle.Sdk/Pipelines/Send/DiskStore.cs index cc808450..88443633 100644 --- a/src/Speckle.Sdk/Pipelines/Send/DiskStore.cs +++ b/src/Speckle.Sdk/Pipelines/Send/DiskStore.cs @@ -3,13 +3,15 @@ using Microsoft.Extensions.Logging; using Speckle.InterfaceGenerator; using Speckle.Sdk.Dependencies; using Speckle.Sdk.Helpers; +using Speckle.Sdk.Logging; namespace Speckle.Sdk.Pipelines.Send; [GenerateAutoInterface] -public sealed class DiskStoreFactory(ILogger logger) : IDiskStoreFactory +public sealed class DiskStoreFactory(ILogger logger, ISdkActivityFactory activityFactory) : IDiskStoreFactory { - public DiskStore CreateInstance(CancellationToken cancellationToken) => new(logger, cancellationToken); + public DiskStore CreateInstance(CancellationToken cancellationToken) => + new(logger, activityFactory, cancellationToken); } public sealed class DiskStore @@ -17,11 +19,17 @@ public sealed class DiskStore private readonly RepackedChannel _channel; private readonly Task _writeToDiskTask; private readonly ILogger _logger; + private readonly ISdkActivityFactory _activityFactory; private readonly CancellationToken _cancellationToken; - internal DiskStore(ILogger logger, CancellationToken cancellationToken) + internal DiskStore( + ILogger logger, + ISdkActivityFactory activityFactory, + CancellationToken cancellationToken + ) { _logger = logger; + _activityFactory = activityFactory; _cancellationToken = cancellationToken; _channel = new RepackedChannel(1000, true, false); @@ -33,6 +41,7 @@ public sealed class DiskStore public async Task CompleteAsync() { + using var a = _activityFactory.Start("Waiting for DiskStore to complete"); _channel.CompleteWriter(); return await _writeToDiskTask.ConfigureAwait(false); } diff --git a/src/Speckle.Sdk/Pipelines/Send/Uploader.cs b/src/Speckle.Sdk/Pipelines/Send/Uploader.cs index 1cd4f8f4..0b7f2126 100644 --- a/src/Speckle.Sdk/Pipelines/Send/Uploader.cs +++ b/src/Speckle.Sdk/Pipelines/Send/Uploader.cs @@ -1,16 +1,17 @@ using System.Net.Http.Headers; using System.Text; -using Microsoft.Extensions.Logging; using Speckle.InterfaceGenerator; using Speckle.Newtonsoft.Json; using Speckle.Sdk.Credentials; using Speckle.Sdk.Helpers; +using Speckle.Sdk.Logging; using Speckle.Sdk.Pipelines.Progress; namespace Speckle.Sdk.Pipelines.Send; [GenerateAutoInterface] -public sealed class UploaderFactory(ISpeckleHttp httpClientFactory, ILogger logger) : IUploaderFactory +public sealed class UploaderFactory(ISpeckleHttp httpClientFactory, ISdkActivityFactory activityFactory) + : IUploaderFactory { public Uploader CreateInstance( string projectId, @@ -18,7 +19,7 @@ public sealed class UploaderFactory(ISpeckleHttp httpClientFactory, ILogger progress, CancellationToken cancellationToken - ) => new(projectId, ingestionId, logger, httpClientFactory, account, progress, cancellationToken); + ) => new(projectId, ingestionId, activityFactory, httpClientFactory, account, progress, cancellationToken); } public sealed class Uploader : IDisposable @@ -28,13 +29,13 @@ public sealed class Uploader : IDisposable private readonly CancellationToken _cancellationToken; private readonly HttpClient _speckleClient; private readonly HttpClient _s3Client; - private readonly ILogger _logger; + private readonly ISdkActivityFactory _activity; private readonly IProgress _progress; internal Uploader( string projectId, string ingestionId, - ILogger logger, + ISdkActivityFactory activity, ISpeckleHttp httpClientFactory, Account speckleAccount, IProgress progress, @@ -43,7 +44,7 @@ public sealed class Uploader : IDisposable { _projectId = projectId; _ingestionId = ingestionId; - _logger = logger; + _activity = activity; _cancellationToken = cancellationToken; _progress = progress; _speckleClient = httpClientFactory.CreateHttpClient(authorizationToken: speckleAccount.token); @@ -62,6 +63,8 @@ public sealed class Uploader : IDisposable private async Task GetPresignedUrl() { + using var a = _activity.Start("Get Presigned Url"); + var signUri = new Uri($"projects/{_projectId}/modelingestion/{_ingestionId}/uploads/sign", UriKind.Relative); using var signResponse = await _speckleClient.PostAsync(signUri, null, _cancellationToken).ConfigureAwait(false); @@ -80,7 +83,7 @@ public sealed class Uploader : IDisposable private async Task UploadToS3(Stream fileStream, PresignedUploadResponse presignedUploadResponse) { - _logger.LogInformation("Uploading file to pre-signed url"); + using var a = _activity.Start("Uploading file to pre-signed url"); Stream progressStream = new ProgressStream(fileStream, _progress); @@ -107,6 +110,8 @@ public sealed class Uploader : IDisposable private async Task TriggerProcessing(TriggerUploadRequest request) { + using var a = _activity.Start("Triggering Processing"); + Uri processUri = new($"projects/{_projectId}/modelingestion/{_ingestionId}/uploads/process", UriKind.Relative); string requestBody = JsonConvert.SerializeObject(request); using var content = new StringContent(requestBody, Encoding.UTF8, "application/json");