Skip to content

Commit c517dcd

Browse files
committed
Allow retrying telemetry probes
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4f0e93ff-d320-454d-b00a-865dac727d0c
1 parent 05bb0d7 commit c517dcd

13 files changed

Lines changed: 151 additions & 5 deletions

File tree

docs/TELEMETRY.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ If users need authenticated collectors, prefer a local collector or proxy that h
107107

108108
Plain `http://` endpoints are useful for local development collectors such as `localhost`. Prefer `https://` for remote collectors unless the user intentionally controls and trusts the network path.
109109

110+
Automatic startup and settings application should deduplicate an unchanged endpoint. The diagnostics UI may offer an explicit resend action so users can repeat the bounded probe after a collector outage; local SDK flush completion must not be described as collector acknowledgement.
111+
110112
## Adding new instrumentation
111113

112114
Before adding new exported telemetry:

src/OpenClaw.Tray.WinUI/App.xaml.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1717,6 +1717,19 @@ private void ApplyOpenTelemetryEndpointSettings()
17171717
"[App] Failed to apply OpenTelemetry endpoint settings");
17181718
}
17191719

1720+
private async Task<bool> ResendOpenTelemetryProbeAsync()
1721+
{
1722+
var connection = _openTelemetryConnection;
1723+
var settings = _settings;
1724+
if (connection == null || settings == null)
1725+
return false;
1726+
1727+
var options = OpenTelemetryEndpointOptions.FromSettings(settings);
1728+
await connection.ProbeAsync(options);
1729+
return connection.State == OpenTelemetryEndpointConnectionState.ProbeFlushed &&
1730+
connection.CurrentOptions == options;
1731+
}
1732+
17201733
private OpenClaw.Connection.GatewayCredential? ResolveStartupOperatorCredential(
17211734
GatewayRecord record,
17221735
CredentialResolver resolver,
@@ -4021,6 +4034,7 @@ void IAppCommands.Disconnect()
40214034
void IAppCommands.ShowGatewayWizard() => _ = ShowGatewayWizardAsync();
40224035
void IAppCommands.ShowConnectionStatus() => ShowConnectionStatusWindow();
40234036
void IAppCommands.NotifySettingsSaved() => OnSettingsSaved(this, EventArgs.Empty);
4037+
Task<bool> IAppCommands.ResendOpenTelemetryProbeAsync() => ResendOpenTelemetryProbeAsync();
40244038

40254039
private void ToggleChannel(string channelName) =>
40264040
AsyncEventHandlerGuard.Run(

src/OpenClaw.Tray.WinUI/Pages/DebugPage.xaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,11 @@
351351
Content="Save connection"
352352
Click="OnSaveOpenTelemetryEndpoint"
353353
AutomationProperties.AutomationId="DiagnosticsSaveOpenTelemetryEndpoint"/>
354+
<Button x:Uid="DiagnosticsPage_ResendOpenTelemetryProbeButton"
355+
x:Name="ResendOpenTelemetryProbeButton"
356+
Content="Send probe again"
357+
Click="OnResendOpenTelemetryProbe"
358+
AutomationProperties.AutomationId="DiagnosticsResendOpenTelemetryProbe"/>
354359
<Button x:Uid="DiagnosticsPage_ClearOpenTelemetryEndpointButton"
355360
x:Name="ClearOpenTelemetryEndpointButton"
356361
Content="Clear"

src/OpenClaw.Tray.WinUI/Pages/DebugPage.xaml.cs

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -741,7 +741,30 @@ private void OnClearOpenTelemetryEndpoint(object sender, RoutedEventArgs e)
741741
UpdateOpenTelemetryEndpointStatus(cleared: true);
742742
}
743743

744-
private void UpdateOpenTelemetryEndpointStatus(bool saved = false, bool cleared = false)
744+
private void OnResendOpenTelemetryProbe(object sender, RoutedEventArgs e) =>
745+
AsyncEventHandlerGuard.Run(
746+
ResendOpenTelemetryProbeAsync,
747+
new OpenClawTray.AppLogger(),
748+
nameof(OnResendOpenTelemetryProbe));
749+
750+
private async Task ResendOpenTelemetryProbeAsync()
751+
{
752+
ResendOpenTelemetryProbeButton.IsEnabled = false;
753+
bool? probeFlushed = null;
754+
try
755+
{
756+
probeFlushed = await ((IAppCommands)CurrentApp).ResendOpenTelemetryProbeAsync();
757+
}
758+
finally
759+
{
760+
UpdateOpenTelemetryEndpointStatus(probeFlushed: probeFlushed);
761+
}
762+
}
763+
764+
private void UpdateOpenTelemetryEndpointStatus(
765+
bool saved = false,
766+
bool cleared = false,
767+
bool? probeFlushed = null)
745768
{
746769
var current = CurrentApp.Settings?.OpenTelemetryEndpoint ?? string.Empty;
747770
var currentProtocol = OpenTelemetryEndpointProtocol.Normalize(CurrentApp.Settings?.OpenTelemetryProtocol);
@@ -755,6 +778,7 @@ private void UpdateOpenTelemetryEndpointStatus(bool saved = false, bool cleared
755778
!string.Equals(currentProtocol, selectedProtocol, StringComparison.Ordinal);
756779

757780
SaveOpenTelemetryEndpointButton.IsEnabled = valid && dirty;
781+
ResendOpenTelemetryProbeButton.IsEnabled = valid && hasEndpoint && !dirty;
758782
ClearOpenTelemetryEndpointButton.IsEnabled = hasEndpoint || !string.IsNullOrWhiteSpace(current);
759783
OpenTelemetryEndpointSummary.Text = string.IsNullOrWhiteSpace(current)
760784
? LocalizationHelper.GetString("DiagnosticsPage_OpenTelemetrySummary_NotConfigured")
@@ -781,6 +805,17 @@ private void UpdateOpenTelemetryEndpointStatus(bool saved = false, bool cleared
781805
return;
782806
}
783807

808+
if (probeFlushed.HasValue)
809+
{
810+
OpenTelemetryEndpointStatusText.Foreground =
811+
probeFlushed.Value ? DimTextBrush : WarnTextBrush;
812+
OpenTelemetryEndpointStatusText.Text = LocalizationHelper.GetString(
813+
probeFlushed.Value
814+
? "DiagnosticsPage_OpenTelemetryEndpointStatus_ProbeFlushedMessage"
815+
: "DiagnosticsPage_OpenTelemetryEndpointStatus_ProbeFailedMessage");
816+
return;
817+
}
818+
784819
OpenTelemetryEndpointStatusText.Text = dirty
785820
? LocalizationHelper.GetString("DiagnosticsPage_OpenTelemetryEndpointStatus_UnsavedMessage")
786821
: string.Empty;

src/OpenClaw.Tray.WinUI/Services/IAppCommands.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,5 @@ internal interface IAppCommands
1818
void ShowGatewayWizard();
1919
void ShowConnectionStatus();
2020
void NotifySettingsSaved();
21+
Task<bool> ResendOpenTelemetryProbeAsync();
2122
}

src/OpenClaw.Tray.WinUI/Services/OpenTelemetryEndpointConnection.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,26 @@ public void Apply(SettingsManager? settings) =>
6161
Apply(OpenTelemetryEndpointOptions.FromSettings(settings));
6262

6363
public Task ApplyAsync(OpenTelemetryEndpointOptions options)
64+
=> ApplyAsync(options, forceProbe: false);
65+
66+
public Task ProbeAsync(OpenTelemetryEndpointOptions options)
67+
=> ApplyAsync(options, forceProbe: true);
68+
69+
private Task ApplyAsync(OpenTelemetryEndpointOptions options, bool forceProbe)
6470
{
6571
if (_disposed)
6672
return Task.CompletedTask;
6773

6874
var generation = Interlocked.Increment(ref _applyGeneration);
69-
return Task.Run(() => Apply(options, generation));
75+
return Task.Run(() => Apply(options, generation, forceProbe));
7076
}
7177

7278
internal void Apply(OpenTelemetryEndpointOptions options)
7379
{
74-
Apply(options, generation: null);
80+
Apply(options, generation: null, forceProbe: false);
7581
}
7682

77-
private void Apply(OpenTelemetryEndpointOptions options, long? generation)
83+
private void Apply(OpenTelemetryEndpointOptions options, long? generation, bool forceProbe)
7884
{
7985
lock (_gate)
8086
{
@@ -96,7 +102,10 @@ private void Apply(OpenTelemetryEndpointOptions options, long? generation)
96102
return;
97103
}
98104

99-
if (_sink != null && State == OpenTelemetryEndpointConnectionState.ProbeFlushed && options == _currentOptions)
105+
if (!forceProbe &&
106+
_sink != null &&
107+
State == OpenTelemetryEndpointConnectionState.ProbeFlushed &&
108+
options == _currentOptions)
100109
return;
101110

102111
DisposeSink();

src/OpenClaw.Tray.WinUI/Strings/en-us/Resources.resw

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3969,6 +3969,9 @@ Commands are blocked while sandboxing is unavailable because strict fallback blo
39693969
<data name="DiagnosticsPage_SaveOpenTelemetryEndpointButton.Content" xml:space="preserve">
39703970
<value>Save connection</value>
39713971
</data>
3972+
<data name="DiagnosticsPage_ResendOpenTelemetryProbeButton.Content" xml:space="preserve">
3973+
<value>Send probe again</value>
3974+
</data>
39723975
<data name="DiagnosticsPage_ClearOpenTelemetryEndpointButton.Content" xml:space="preserve">
39733976
<value>Clear</value>
39743977
</data>
@@ -4002,6 +4005,12 @@ Commands are blocked while sandboxing is unavailable because strict fallback blo
40024005
<data name="DiagnosticsPage_OpenTelemetryEndpointStatus_UnsavedMessage" xml:space="preserve">
40034006
<value>Save to apply this connection.</value>
40044007
</data>
4008+
<data name="DiagnosticsPage_OpenTelemetryEndpointStatus_ProbeFlushedMessage" xml:space="preserve">
4009+
<value>Probe flushed locally; collector receipt is not confirmed.</value>
4010+
</data>
4011+
<data name="DiagnosticsPage_OpenTelemetryEndpointStatus_ProbeFailedMessage" xml:space="preserve">
4012+
<value>Probe did not finish for the saved endpoint. Verify the settings and try again.</value>
4013+
</data>
40054014
<data name="DiagnosticsPage_Expander_ChatOverrides.Header" xml:space="preserve">
40064015
<value>Chat surface overrides</value>
40074016
</data>

src/OpenClaw.Tray.WinUI/Strings/fr-fr/Resources.resw

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3922,6 +3922,9 @@ Les commandes sont bloquées tant que le sandboxing est indisponible, car le blo
39223922
<data name="DiagnosticsPage_SaveOpenTelemetryEndpointButton.Content" xml:space="preserve">
39233923
<value>Save connection</value>
39243924
</data>
3925+
<data name="DiagnosticsPage_ResendOpenTelemetryProbeButton.Content" xml:space="preserve">
3926+
<value>Send probe again</value>
3927+
</data>
39253928
<data name="DiagnosticsPage_ClearOpenTelemetryEndpointButton.Content" xml:space="preserve">
39263929
<value>Clear</value>
39273930
</data>
@@ -3955,6 +3958,12 @@ Les commandes sont bloquées tant que le sandboxing est indisponible, car le blo
39553958
<data name="DiagnosticsPage_OpenTelemetryEndpointStatus_UnsavedMessage" xml:space="preserve">
39563959
<value>Save to apply this connection.</value>
39573960
</data>
3961+
<data name="DiagnosticsPage_OpenTelemetryEndpointStatus_ProbeFlushedMessage" xml:space="preserve">
3962+
<value>Probe flushed locally; collector receipt is not confirmed.</value>
3963+
</data>
3964+
<data name="DiagnosticsPage_OpenTelemetryEndpointStatus_ProbeFailedMessage" xml:space="preserve">
3965+
<value>Probe did not finish for the saved endpoint. Verify the settings and try again.</value>
3966+
</data>
39583967
<data name="DiagnosticsPage_Expander_ChatOverrides.Header" xml:space="preserve">
39593968
<value>Chat surface overrides</value>
39603969
</data>

src/OpenClaw.Tray.WinUI/Strings/nl-nl/Resources.resw

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3923,6 +3923,9 @@ Opdrachten worden geblokkeerd zolang sandboxing niet beschikbaar is, omdat strik
39233923
<data name="DiagnosticsPage_SaveOpenTelemetryEndpointButton.Content" xml:space="preserve">
39243924
<value>Save connection</value>
39253925
</data>
3926+
<data name="DiagnosticsPage_ResendOpenTelemetryProbeButton.Content" xml:space="preserve">
3927+
<value>Send probe again</value>
3928+
</data>
39263929
<data name="DiagnosticsPage_ClearOpenTelemetryEndpointButton.Content" xml:space="preserve">
39273930
<value>Clear</value>
39283931
</data>
@@ -3956,6 +3959,12 @@ Opdrachten worden geblokkeerd zolang sandboxing niet beschikbaar is, omdat strik
39563959
<data name="DiagnosticsPage_OpenTelemetryEndpointStatus_UnsavedMessage" xml:space="preserve">
39573960
<value>Save to apply this connection.</value>
39583961
</data>
3962+
<data name="DiagnosticsPage_OpenTelemetryEndpointStatus_ProbeFlushedMessage" xml:space="preserve">
3963+
<value>Probe flushed locally; collector receipt is not confirmed.</value>
3964+
</data>
3965+
<data name="DiagnosticsPage_OpenTelemetryEndpointStatus_ProbeFailedMessage" xml:space="preserve">
3966+
<value>Probe did not finish for the saved endpoint. Verify the settings and try again.</value>
3967+
</data>
39593968
<data name="DiagnosticsPage_Expander_ChatOverrides.Header" xml:space="preserve">
39603969
<value>Chat surface overrides</value>
39613970
</data>

src/OpenClaw.Tray.WinUI/Strings/zh-cn/Resources.resw

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3922,6 +3922,9 @@
39223922
<data name="DiagnosticsPage_SaveOpenTelemetryEndpointButton.Content" xml:space="preserve">
39233923
<value>Save connection</value>
39243924
</data>
3925+
<data name="DiagnosticsPage_ResendOpenTelemetryProbeButton.Content" xml:space="preserve">
3926+
<value>Send probe again</value>
3927+
</data>
39253928
<data name="DiagnosticsPage_ClearOpenTelemetryEndpointButton.Content" xml:space="preserve">
39263929
<value>Clear</value>
39273930
</data>
@@ -3955,6 +3958,12 @@
39553958
<data name="DiagnosticsPage_OpenTelemetryEndpointStatus_UnsavedMessage" xml:space="preserve">
39563959
<value>Save to apply this connection.</value>
39573960
</data>
3961+
<data name="DiagnosticsPage_OpenTelemetryEndpointStatus_ProbeFlushedMessage" xml:space="preserve">
3962+
<value>Probe flushed locally; collector receipt is not confirmed.</value>
3963+
</data>
3964+
<data name="DiagnosticsPage_OpenTelemetryEndpointStatus_ProbeFailedMessage" xml:space="preserve">
3965+
<value>Probe did not finish for the saved endpoint. Verify the settings and try again.</value>
3966+
</data>
39583967
<data name="DiagnosticsPage_Expander_ChatOverrides.Header" xml:space="preserve">
39593968
<value>Chat surface overrides</value>
39603969
</data>

0 commit comments

Comments
 (0)