From c37fbee0d760207a0257f542f37dc6712bd32e55 Mon Sep 17 00:00:00 2001 From: "Dennis.Scheffer" Date: Thu, 4 Sep 2025 11:05:00 +0200 Subject: [PATCH] AP-7517 Add additional logging of error scenarios to dictionary update. When `dictionaries.json` cannot be loaded from the CDN for any reason during dictionary updates, we are now logging a `dictionary.update.failed` event. GitOrigin-RevId: 16047217e88718e05085d2699431ae9420b9a92a --- .../storage/EventLogMetadataLoader.java | 2 +- .../storage/EventLogServerMetadataLoader.java | 2 +- .../ValidationRulesPersistedStorage.java | 20 ++++++++++++++++++- .../metadata/EventLogMetadataUtils.java | 12 ++++++++--- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/storage/EventLogMetadataLoader.java b/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/storage/EventLogMetadataLoader.java index 53e9233693bd..c1f5430d1a2e 100644 --- a/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/storage/EventLogMetadataLoader.java +++ b/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/storage/EventLogMetadataLoader.java @@ -14,7 +14,7 @@ public interface EventLogMetadataLoader { String loadMetadataFromServer() throws EventLogMetadataLoadException; @NotNull - Map getDictionariesLastModifiedOnServer(String recorderId); + Map getDictionariesLastModifiedOnServer(String recorderId) throws EventLogMetadataLoadException; @NotNull String loadDictionaryFromServer(String recorderId, String dictionaryName) throws EventLogMetadataLoadException; diff --git a/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/storage/EventLogServerMetadataLoader.java b/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/storage/EventLogServerMetadataLoader.java index 55680df0fdc4..3020c442fc48 100644 --- a/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/storage/EventLogServerMetadataLoader.java +++ b/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/storage/EventLogServerMetadataLoader.java @@ -35,7 +35,7 @@ public class EventLogServerMetadataLoader implements EventLogMetadataLoader { } @Override - public @NotNull Map getDictionariesLastModifiedOnServer(String recorderId) { + public @NotNull Map getDictionariesLastModifiedOnServer(String recorderId) throws EventLogMetadataLoadException { StatsConnectionSettings settings = mySettingsClient.getApplicationInfo().getConnectionSettings(); return EventLogMetadataUtils.dictionariesLastModified(mySettingsClient.provideDictionaryServiceUrl(), recorderId, settings); } diff --git a/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/storage/ValidationRulesPersistedStorage.java b/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/storage/ValidationRulesPersistedStorage.java index 99408edca2cf..459151f30e95 100644 --- a/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/storage/ValidationRulesPersistedStorage.java +++ b/platform/statistics/src/com/intellij/internal/statistic/eventLog/validator/storage/ValidationRulesPersistedStorage.java @@ -142,9 +142,27 @@ public class ValidationRulesPersistedStorage implements IntellijValidationRulesS } } + private Map getDictionariesModifiedOnServer() { + try { + return myMetadataLoader.getDictionariesLastModifiedOnServer(myRecorderId); + } + catch (EventLogMetadataLoadException e) { + eventLogSystemCollector.logDictionaryUpdateFailed(e); + } + return null; + } + private void updateDictionaries() { var dictionariesLastModifiedLocally = myMetadataPersistence.getDictionariesLastModified(); - var dictionariesLastModifiedOnServer = myMetadataLoader.getDictionariesLastModifiedOnServer(myRecorderId); + Map dictionariesLastModifiedOnServer = getDictionariesModifiedOnServer(); + + if (dictionariesLastModifiedOnServer == null) { + if (LOG.isTraceEnabled()) { + LOG.trace("Error occurred loading dictionaries list from server"); + } + return; + } + if (LOG.isTraceEnabled()) { LOG.trace( "Loading dictionaries, last modified cached=" + dictionariesLastModifiedLocally + diff --git a/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/metadata/EventLogMetadataUtils.java b/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/metadata/EventLogMetadataUtils.java index 7294879fc973..c2a03ba36480 100644 --- a/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/metadata/EventLogMetadataUtils.java +++ b/platform/statistics/uploader/src/com/intellij/internal/statistic/eventLog/connection/metadata/EventLogMetadataUtils.java @@ -117,17 +117,23 @@ public final class EventLogMetadataUtils { } } - public static Map dictionariesLastModified(@Nullable String serviceUrl, @NotNull String recorderId, @NotNull StatsConnectionSettings settings) { - if (isEmptyOrSpaces(serviceUrl)) return Map.of(); + public static Map dictionariesLastModified(@Nullable String serviceUrl, @NotNull String recorderId, @NotNull StatsConnectionSettings settings) + throws EventLogMetadataLoadException { + if (isEmptyOrSpaces(serviceUrl)) { + throw new EventLogMetadataLoadException(EventLogMetadataLoadErrorType.EMPTY_SERVICE_URL); + } String baseUrl = serviceUrl + recorderId + "/"; RemoteDictionaryList dictionaryList; try { StatsRequestResult result = StatsHttpRequests.request( baseUrl + "dictionaries.json", settings).send(r -> r.readAsString()); + if (!result.isSucceed()) { + throw new EventLogMetadataLoadException(EventLogMetadataLoadErrorType.UNREACHABLE_SERVICE, result.getError()); + } dictionaryList = parseRemoteDictionaryList(result.getResult()); } catch (StatsResponseException | IOException | EventLogMetadataParseException e) { - return Map.of(); + throw new EventLogMetadataLoadException(EventLogMetadataLoadErrorType.ERROR_ON_LOAD, e); } Map lastModifiedMap = new HashMap<>();