From fa298ebe45fc85297926fea7f88ba59211d6eb8c Mon Sep 17 00:00:00 2001 From: Francesco Renzi Date: Tue, 17 Mar 2026 14:13:18 +0000 Subject: [PATCH] Add connection telemetry --- src/Runner.Worker/JobRunner.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Runner.Worker/JobRunner.cs b/src/Runner.Worker/JobRunner.cs index 828ba67a0..bfe64cb33 100644 --- a/src/Runner.Worker/JobRunner.cs +++ b/src/Runner.Worker/JobRunner.cs @@ -29,6 +29,7 @@ namespace GitHub.Runner.Worker public sealed class JobRunner : RunnerService, IJobRunner { + private const string DebuggerConnectionTelemetryPrefix = "DebuggerConnectionResult"; private IJobServerQueue _jobServerQueue; private RunnerSettings _runnerSettings; private ITempDirectoryManager _tempDirectoryManager; @@ -193,6 +194,7 @@ namespace GitHub.Runner.Worker catch (Exception ex) { Trace.Error($"Failed to start DAP debugger: {ex.Message}"); + AddDebuggerConnectionTelemetry(jobContext, "Failed"); jobContext.Error("Failed to start debugger."); return await CompleteJobAsync(server, jobContext, message, TaskResult.Failed); } @@ -247,16 +249,19 @@ namespace GitHub.Runner.Worker try { await dapDebugger.WaitUntilReadyAsync(jobRequestCancellationToken); + AddDebuggerConnectionTelemetry(jobContext, "Connected"); } catch (OperationCanceledException) when (jobRequestCancellationToken.IsCancellationRequested) { Trace.Info("Job was cancelled before debugger client connected."); + AddDebuggerConnectionTelemetry(jobContext, "Canceled"); jobContext.Error("Job was cancelled before debugger client connected."); return await CompleteJobAsync(server, jobContext, message, TaskResult.Canceled); } catch (Exception ex) { Trace.Error($"DAP debugger failed to become ready: {ex.Message}"); + AddDebuggerConnectionTelemetry(jobContext, "Failed"); // If debugging was requested but the debugger is not available, fail the job var errorMessage = "The debugger failed to start or no debugger client connected in time."; @@ -491,6 +496,15 @@ namespace GitHub.Runner.Worker throw new AggregateException(exceptions); } + private static void AddDebuggerConnectionTelemetry(IExecutionContext jobContext, string result) + { + jobContext.Global.JobTelemetry.Add(new JobTelemetry + { + Type = JobTelemetryType.General, + Message = $"{DebuggerConnectionTelemetryPrefix}: {result}" + }); + } + private void MaskTelemetrySecrets(List jobTelemetry) { foreach (var telemetryItem in jobTelemetry)