Skip to content

Commit 6c06fc4

Browse files
SLCORE-1783 Use TelemetryLiveAttributes for Labs flags.
1 parent b8fded6 commit 6c06fc4

File tree

16 files changed

+34
-135
lines changed

16 files changed

+34
-135
lines changed

API_CHANGES.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
# 10.37
22

3-
## Breaking Changes
4-
5-
* Add initial IDE Labs parameters to `org.sonarsource.sonarlint.core.rpc.protocol.backend.initialize.InitializeParams`. Deprecated constructor uses default parameters.
6-
73
## Deprecation
84

95
* Deprecate 4-parameter constructor and remove deprecation of 2-parameter one of `org.sonarsource.sonarlint.core.rpc.protocol.backend.config.binding.DidUpdateBindingParams`. Move back to an old constructor as not all IDEs were able to provide all data to a new one.
106
* Remove Deprecation from `org.sonarsource.sonarlint.core.rpc.protocol.backend.telemetry.TelemetryRpcService#addedManualBindings` method. It should be used again for manual binding events instead of parametrized `didUpdateBinding`.
117

128
## New features
139

14-
* Introduce 3 new methods to `org.sonarsource.sonarlint.core.rpc.protocol.backend.telemetry.TelemetryRpcService` to record Ide Labs telemetry: `toggleIdeLabsEnablement`, `externalLinkClicked`, `feedbackLinkClicked`.
10+
* Add ide labs flags to `org.sonarsource.sonarlint.core.rpc.protocol.client.telemetry.TelemetryClientLiveAttributesResponse`.
11+
* Introduce 2 new methods to `org.sonarsource.sonarlint.core.rpc.protocol.backend.telemetry.TelemetryRpcService` to record Ide Labs telemetry: `externalLinkClicked`, `feedbackLinkClicked`.
1512
* Introduce a new `org.sonarsource.sonarlint.core.rpc.protocol.backend.telemetry.TelemetryRpcService.acceptedBindingSuggestion`. It should be used to for bindings created based on suggestions and pass `org.sonarsource.sonarlint.core.rpc.protocol.backend.config.binding.BindingSuggestionOrigin` instead of parametrized `didUpdateBinding`.
1613

1714
# 10.36

backend/core/src/main/java/org/sonarsource/sonarlint/core/event/JoinIdeLabsEvent.java

Lines changed: 0 additions & 23 deletions
This file was deleted.

backend/core/src/main/java/org/sonarsource/sonarlint/core/labs/IdeLabsService.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,15 @@
2020
package org.sonarsource.sonarlint.core.labs;
2121

2222
import com.google.gson.Gson;
23-
import org.sonarsource.sonarlint.core.event.JoinIdeLabsEvent;
2423
import org.sonarsource.sonarlint.core.rpc.protocol.backend.labs.JoinIdeLabsProgramResponse;
25-
import org.springframework.context.ApplicationEventPublisher;
2624

2725
public class IdeLabsService {
2826

2927
private final IdeLabsHttpClient labsHttpClient;
30-
private final ApplicationEventPublisher eventPublisher;
3128
private final Gson gson = new Gson();
3229

33-
public IdeLabsService(IdeLabsHttpClient labsHttpClient, ApplicationEventPublisher eventPublisher) {
30+
public IdeLabsService(IdeLabsHttpClient labsHttpClient) {
3431
this.labsHttpClient = labsHttpClient;
35-
this.eventPublisher = eventPublisher;
3632
}
3733

3834
public JoinIdeLabsProgramResponse joinIdeLabsProgram(String email, String ideName) {
@@ -46,7 +42,6 @@ public JoinIdeLabsProgramResponse joinIdeLabsProgram(String email, String ideNam
4642
return new JoinIdeLabsProgramResponse(false, "The provided email address is not valid. Please enter a valid email address.");
4743
}
4844

49-
eventPublisher.publishEvent(new JoinIdeLabsEvent());
5045
return new JoinIdeLabsProgramResponse(true, null);
5146
} catch (Exception e) {
5247
return new JoinIdeLabsProgramResponse(false, "An unexpected error occurred: " + e.getMessage());

backend/core/src/main/java/org/sonarsource/sonarlint/core/telemetry/TelemetryService.java

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import org.sonarsource.sonarlint.core.commons.log.SonarLintLogger;
3636
import org.sonarsource.sonarlint.core.commons.util.FailSafeExecutors;
3737
import org.sonarsource.sonarlint.core.event.FixSuggestionReceivedEvent;
38-
import org.sonarsource.sonarlint.core.event.JoinIdeLabsEvent;
3938
import org.sonarsource.sonarlint.core.event.LocalOnlyIssueStatusChangedEvent;
4039
import org.sonarsource.sonarlint.core.event.MatchingSessionEndedEvent;
4140
import org.sonarsource.sonarlint.core.event.ServerIssueStatusChangedEvent;
@@ -87,8 +86,6 @@ private void initTelemetryAndScheduleUpload(InitializeParams initializeParams) {
8786
updateTelemetry(localStorage -> {
8887
localStorage.setInitialNewCodeFocus(initializeParams.isFocusOnNewCode());
8988
localStorage.setInitialAutomaticAnalysisEnablement(initializeParams.isAutomaticAnalysisEnabled());
90-
localStorage.setLabsJoined(initializeParams.hasJoinedIdeLabs());
91-
localStorage.setLabsEnabled(initializeParams.hasEnabledIdeLabs());
9289
});
9390
var initialDelay = Integer.parseInt(System.getProperty("sonarlint.internal.telemetry.initialDelay", "1"));
9491
scheduledExecutor.scheduleWithFixedDelay(this::upload, initialDelay, TELEMETRY_UPLOAD_DELAY, MINUTES);
@@ -321,10 +318,6 @@ public void mcpServerConfigurationRequested() {
321318
updateTelemetry(TelemetryLocalStorage::incrementMcpServerConfigurationRequestedCount);
322319
}
323320

324-
public void toggleIdeLabsEnablement(boolean newValue) {
325-
updateTelemetry(storage -> storage.setLabsEnabled(newValue));
326-
}
327-
328321
public void ideLabsLinkClicked(String linkId) {
329322
updateTelemetry(storage -> storage.ideLabsLinkClicked(linkId));
330323
}
@@ -341,6 +334,11 @@ public void onMatchingSessionEnded(MatchingSessionEndedEvent event) {
341334
});
342335
}
343336

337+
@EventListener
338+
public void onAutomaticAnalysisSettingChanged(AutomaticAnalysisSettingChangedEvent event) {
339+
automaticAnalysisSettingToggled();
340+
}
341+
344342
@EventListener
345343
public void onServerIssueStatusChanged(ServerIssueStatusChangedEvent event) {
346344
issueStatusChanged(event.getFinding().getRuleKey());
@@ -381,17 +379,6 @@ public void onIssuesRaised(IssuesRaisedEvent event) {
381379
updateTelemetry(localStorage -> localStorage.addIssuesWithPossibleAiFixFromIde(issuesToReport));
382380
}
383381

384-
@EventListener
385-
public void onAutomaticAnalysisSettingChanged(AutomaticAnalysisSettingChangedEvent event) {
386-
automaticAnalysisSettingToggled();
387-
}
388-
389-
@EventListener
390-
public void onJoiningIdeLabs(JoinIdeLabsEvent event) {
391-
updateTelemetry(storage -> storage.setLabsJoined(true));
392-
updateTelemetry(storage -> storage.setLabsEnabled(true));
393-
}
394-
395382
@PreDestroy
396383
public void close() {
397384
if ((!MoreExecutors.shutdownAndAwaitTermination(scheduledExecutor, 1, TimeUnit.SECONDS)) && (InternalDebug.isEnabled())) {

backend/rpc-impl/src/main/java/org/sonarsource/sonarlint/core/rpc/impl/TelemetryRpcServiceDelegate.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import org.sonarsource.sonarlint.core.rpc.protocol.client.telemetry.IdeLabsFeedbackLinkClickedParams;
3535
import org.sonarsource.sonarlint.core.rpc.protocol.client.telemetry.HelpAndFeedbackClickedParams;
3636
import org.sonarsource.sonarlint.core.rpc.protocol.client.telemetry.McpTransportModeUsedParams;
37-
import org.sonarsource.sonarlint.core.rpc.protocol.client.telemetry.ToggleIdeLabsEnablementParams;
3837
import org.sonarsource.sonarlint.core.rpc.protocol.client.telemetry.ToolCalledParams;
3938
import org.sonarsource.sonarlint.core.telemetry.TelemetryService;
4039

@@ -179,11 +178,6 @@ public void findingsFiltered(FindingsFilteredParams params) {
179178
notify(() -> getBean(TelemetryService.class).findingsFiltered(params.getFilterType()));
180179
}
181180

182-
@Override
183-
public void toggleIdeLabsEnablement(ToggleIdeLabsEnablementParams params) {
184-
notify(() -> getBean(TelemetryService.class).toggleIdeLabsEnablement(params.getNewValue()));
185-
}
186-
187181
@Override
188182
public void ideLabsExternalLinkClicked(IdeLabsExternalLinkClickedParams params) {
189183
notify(() -> getBean(TelemetryService.class).ideLabsLinkClicked(params.getLinkId()));

backend/telemetry/src/main/java/org/sonarsource/sonarlint/core/telemetry/TelemetryLiveAttributes.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,12 @@ public List<TelemetryConnectionAttributes> getConnectionsAttributes() {
8383
public Map<String, Object> getAdditionalAttributes() {
8484
return clientAttributes.getAdditionalAttributes();
8585
}
86+
87+
public boolean hasJoinedIdeLabs() {
88+
return clientAttributes.hasJoinedIdeLabs();
89+
}
90+
91+
public boolean hasEnabledIdeLabs() {
92+
return clientAttributes.hasEnabledIdeLabs();
93+
}
8694
}

backend/telemetry/src/main/java/org/sonarsource/sonarlint/core/telemetry/TelemetryLocalStorage.java

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,6 @@ public class TelemetryLocalStorage {
100100
private boolean isMcpIntegrationEnabled;
101101
@Nullable
102102
private McpTransportMode mcpTransportModeUsed;
103-
private boolean labsEnabled;
104-
private boolean labsJoined;
105103
private final Map<String, Integer> labsLinkClickedCount;
106104
private final Map<String, Integer> labsFeedbackLinkClickedCount;
107105

@@ -742,22 +740,6 @@ public Map<String, Integer> getLabsLinkClickedCount() {
742740
return labsLinkClickedCount;
743741
}
744742

745-
public boolean isLabsJoined() {
746-
return labsJoined;
747-
}
748-
749-
public boolean isLabsEnabled() {
750-
return labsEnabled;
751-
}
752-
753-
public void setLabsJoined(boolean labsJoined) {
754-
this.labsJoined = labsJoined;
755-
}
756-
757-
public void setLabsEnabled(boolean labsEnabled) {
758-
this.labsEnabled = labsEnabled;
759-
}
760-
761743
public void ideLabsLinkClicked(String linkId) {
762744
this.labsLinkClickedCount.merge(linkId, 1, Integer::sum);
763745
}

backend/telemetry/src/main/java/org/sonarsource/sonarlint/core/telemetry/measures/payload/TelemetryMeasuresBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -228,8 +228,8 @@ private void addMCPMeasures(List<TelemetryMeasuresValue> values) {
228228
}
229229

230230
private void addLabsMeasures(ArrayList<TelemetryMeasuresValue> values) {
231-
values.add(new TelemetryMeasuresValue("ide_labs.joined", String.valueOf(storage.isLabsJoined()), BOOLEAN, DAILY));
232-
values.add(new TelemetryMeasuresValue("ide_labs.enabled", String.valueOf(storage.isLabsEnabled()), BOOLEAN, DAILY));
231+
values.add(new TelemetryMeasuresValue("ide_labs.joined", String.valueOf(liveAttributes.hasJoinedIdeLabs()), BOOLEAN, DAILY));
232+
values.add(new TelemetryMeasuresValue("ide_labs.enabled", String.valueOf(liveAttributes.hasEnabledIdeLabs()), BOOLEAN, DAILY));
233233
addAll(storage.getLabsLinkClickedCount(), LINK_CLICKED_BASE_NAME, values);
234234
addAll(storage.getLabsFeedbackLinkClickedCount(), FEEDBACK_CLICKED_BASE_NAME, values);
235235
}

backend/telemetry/src/test/java/org/sonarsource/sonarlint/core/telemetry/TelemetryHttpClientTests.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor;
4545
import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
4646
import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
47-
import static java.util.Collections.emptyMap;
4847
import static org.assertj.core.api.Assertions.assertThat;
4948
import static org.awaitility.Awaitility.await;
5049
import static org.mockito.Mockito.doReturn;
@@ -123,8 +122,6 @@ private void assertTelemetryUploaded(boolean isDebugEnabled) {
123122
telemetryLocalStorage.incrementFlightRecorderSessionsCount();
124123
telemetryLocalStorage.setMcpIntegrationEnabled(true);
125124
telemetryLocalStorage.setMcpTransportModeUsed(McpTransportMode.STDIO);
126-
telemetryLocalStorage.setLabsJoined(true);
127-
telemetryLocalStorage.setLabsEnabled(true);
128125
telemetryLocalStorage.ideLabsLinkClicked("changed_file_analysis_doc");
129126
telemetryLocalStorage.ideLabsLinkClicked("privacy_policy");
130127
telemetryLocalStorage.ideLabsLinkClicked("privacy_policy");
@@ -158,7 +155,7 @@ private void assertTelemetryUploaded(boolean isDebugEnabled) {
158155
{"key":"mcp.integration_enabled","value":"true","type":"boolean","granularity":"daily"},
159156
{"key":"mcp.transport_mode","value":"STDIO","type":"string","granularity":"daily"},
160157
{"key":"ide_labs.joined","value":"true","type":"boolean","granularity":"daily"},
161-
{"key":"ide_labs.enabled","value":"true","type":"boolean","granularity":"daily"},
158+
{"key":"ide_labs.enabled","value":"false","type":"boolean","granularity":"daily"},
162159
{"key":"ide_labs.link_clicked_count_changed_file_analysis_doc","value":"1","type":"integer","granularity":"daily"},
163160
{"key":"ide_labs.link_clicked_count_privacy_policy","value":"2","type":"integer","granularity":"daily"},
164161
{"key":"ide_labs.feedback_link_clicked_count_connected_mode","value":"1","type":"integer","granularity":"daily"},
@@ -211,7 +208,7 @@ private static TelemetryLiveAttributes getTelemetryLiveAttributesDto() {
211208
connectionsAttributes.add(new TelemetryConnectionAttributes("user-id-sqc", null, "org-id"));
212209
connectionsAttributes.add(new TelemetryConnectionAttributes(null, "server-id", null));
213210
var serverAttributes = new TelemetryServerAttributes(true, true, 1, 1, 1, 1, false, Collections.emptyList(), Collections.emptyList(), "3.1.7", connectionsAttributes);
214-
var clientAttributes = new TelemetryClientLiveAttributesResponse(emptyMap());
211+
var clientAttributes = new TelemetryClientLiveAttributesResponse(Map.of("joinedIdeLabs", true, "enabledIdeLabs", false));
215212
return new TelemetryLiveAttributes(serverAttributes, clientAttributes);
216213
}
217214
}

backend/telemetry/src/test/java/org/sonarsource/sonarlint/core/telemetry/TelemetryLocalStorageTests.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -364,22 +364,6 @@ void should_find_mcp_transport_mode_used() {
364364
assertThat(data.getMcpTransportModeUsed()).isEqualTo(McpTransportMode.HTTP);
365365
}
366366

367-
@Test
368-
void should_set_labs_joined() {
369-
var data = new TelemetryLocalStorage();
370-
assertThat(data.isLabsJoined()).isFalse();
371-
data.setLabsJoined(true);
372-
assertThat(data.isLabsJoined()).isTrue();
373-
}
374-
375-
@Test
376-
void should_set_labs_enabled() {
377-
var data = new TelemetryLocalStorage();
378-
assertThat(data.isLabsEnabled()).isFalse();
379-
data.setLabsEnabled(true);
380-
assertThat(data.isLabsEnabled()).isTrue();
381-
}
382-
383367
@Test
384368
void should_increment_link_clicked_count_for_each_link_separately() {
385369
var data = new TelemetryLocalStorage();

0 commit comments

Comments
 (0)