Commit 2dfebba9 authored by Marat Khabibullin's avatar Marat Khabibullin
Browse files

Add FUSMetricsSetService

parent bd209e4b
Showing with 107 additions and 2 deletions
+107 -2
......@@ -23,6 +23,7 @@ public class EventLogExternalSettingsService extends SettingsConnectionService i
private static final Logger LOG = Logger.getInstance("com.intellij.internal.statistic.eventLog.EventLogExternalSettingsService");
private static final String APPROVED_GROUPS_SERVICE = "white-list-service";
private static final String DICTIONARY_SERVICE = "dictionary-service";
private static final String METRICS_SET_SERVICE = "metrics-set";
private static final String PERCENT_TRAFFIC = "percent-traffic";
private static final long ACCEPTED_CACHE_AGE_MS = TimeUnit.MILLISECONDS.convert(7, TimeUnit.DAYS);
private static final long DONT_REQUIRE_UPDATE_AGE_MS = TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS);
......@@ -61,6 +62,12 @@ public class EventLogExternalSettingsService extends SettingsConnectionService i
return getSettingValue(DICTIONARY_SERVICE);
}
@Override
@Nullable
public String getMetricsSetServiceUrl() {
return getSettingValue(METRICS_SET_SERVICE);
}
@NotNull
public Set<String> getApprovedGroups() {
return getApprovedGroups(ApprovedGroupsCacheConfigurable.getInstance());
......
......@@ -12,6 +12,9 @@ public interface EventLogSettingsService {
@Nullable
String getDictionaryServiceUrl();
@Nullable
String getMetricsSetServiceUrl();
int getPermittedTraffic();
@NotNull
......
......@@ -13,6 +13,8 @@ import com.intellij.internal.statistic.service.fus.collectors.LegacyFUSProjectUs
import com.intellij.internal.statistic.utils.StatisticsUploadAssistant;
import com.intellij.internal.statistic.utils.metricsWhitelist.dictionaries.FUSRegexDictionaryEP;
import com.intellij.internal.statistic.utils.metricsWhitelist.dictionaries.FUSRegexDictionaryService;
import com.intellij.internal.statistic.utils.metricsWhitelist.sets.FUSMetricsSetEP;
import com.intellij.internal.statistic.utils.metricsWhitelist.sets.FUSMetricsSetService;
import com.intellij.notification.impl.NotificationsConfigurationImpl;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
......@@ -142,5 +144,8 @@ public class StatisticsJobsScheduler implements BaseComponent {
private static void preloadMetricsWhitelists() {
Set<String> dictionaryIds = FUSRegexDictionaryEP.EP_NAME.extensions().map(d -> d.id).collect(Collectors.toSet());
FUSRegexDictionaryService.getInstance().preloadDictionaries(dictionaryIds);
Set<String> setIds = FUSMetricsSetEP.EP_NAME.extensions().map(d -> d.id).collect(Collectors.toSet());
FUSMetricsSetService.getInstance().preloadSets(setIds);
}
}
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.internal.statistic.utils.metricsWhitelist.set;
package com.intellij.internal.statistic.utils.metricsWhitelist.sets;
import com.google.gson.GsonBuilder;
import com.intellij.internal.statistic.utils.metricsWhitelist.core.DefaultMetricsWhitelistHeader;
......
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.internal.statistic.utils.metricsWhitelist.sets;
import com.intellij.openapi.extensions.AbstractExtensionPointBean;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.util.xmlb.annotations.Attribute;
/**
* Metrics sets registered via this extension point are downloaded from the remote server and cached on IDE startup.
*/
public class FUSMetricsSetEP extends AbstractExtensionPointBean {
public static final ExtensionPointName<FUSMetricsSetEP> EP_NAME =
ExtensionPointName.create("com.intellij.statistics.metricsWhitelist.metricsSet");
@Attribute("id")
public String id;
}
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.internal.statistic.utils.metricsWhitelist.sets;
import com.intellij.internal.statistic.eventLog.EventLogExternalSettingsService;
import com.intellij.internal.statistic.utils.metricsWhitelist.core.loader.RemoteMetricsWhitelistLoader;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class FUSMetricsSetLoader extends RemoteMetricsWhitelistLoader<FUSMetricsSet> {
public FUSMetricsSetLoader(@NotNull FUSMetricsSet.Factory factory) {
super(factory);
}
@Nullable
@Override
protected String getWhitelistHeaderUrl(@NotNull String metricsSetId) {
String serviceUrl = EventLogExternalSettingsService.getInstance().getMetricsSetServiceUrl();
return serviceUrl != null ? serviceUrl + "header/" + metricsSetId + ".json" : null;
}
@Nullable
@Override
protected String getWhitelistUrl(@NotNull String metricsSetId) {
String serviceUrl = EventLogExternalSettingsService.getInstance().getMetricsSetServiceUrl();
return serviceUrl != null ? serviceUrl + metricsSetId + ".json" : null;
}
}
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.internal.statistic.utils.metricsWhitelist.sets;
import com.intellij.openapi.components.ServiceManager;
import org.jetbrains.annotations.NotNull;
import java.util.Set;
public interface FUSMetricsSetService {
static FUSMetricsSetService getInstance() {
return ServiceManager.getService(FUSMetricsSetService.class);
}
boolean containsMetric(@NotNull String metricsSetId, @NotNull String metric);
void preloadSets(@NotNull Set<String> ids);
}
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.internal.statistic.utils.metricsWhitelist.sets;
import com.intellij.internal.statistic.utils.metricsWhitelist.core.cache.InMemoryMetricsWhitelistCache;
import org.jetbrains.annotations.NotNull;
import java.util.Set;
public class FUSMetricsSetServiceImpl implements FUSMetricsSetService {
private final InMemoryMetricsWhitelistCache<FUSMetricsSet> myCache;
private FUSMetricsSetServiceImpl() {
myCache = new InMemoryMetricsWhitelistCache<>(new FUSMetricsSetLoader(new FUSMetricsSet.Factory()));
}
@Override
public boolean containsMetric(@NotNull String metricsSetId, @NotNull String metric) {
FUSMetricsSet metricsSet = myCache.get(metricsSetId);
return metricsSet != null && metricsSet.contains(metric);
}
@Override
public void preloadSets(@NotNull Set<String> ids) {
ids.forEach(myCache::get);
}
}
......@@ -204,6 +204,7 @@
<extensionPoint name="statistics.counterUsagesCollector" beanClass="com.intellij.internal.statistic.service.fus.collectors.CounterUsageCollectorEP"/>
<extensionPoint name="statistics.metricsWhitelist.regexDictionary" beanClass="com.intellij.internal.statistic.utils.metricsWhitelist.dictionaries.FUSRegexDictionaryEP"/>
<extensionPoint name="statistics.metricsWhitelist.metricsSet" beanClass="com.intellij.internal.statistic.utils.metricsWhitelist.sets.FUSMetricsSetEP"/>
<extensionPoint name="editorHighlighterProvider" beanClass="com.intellij.openapi.fileTypes.FileTypeExtensionPoint">
<with attribute="implementationClass" implements="com.intellij.openapi.fileTypes.EditorHighlighterProvider"/>
......
......@@ -233,6 +233,8 @@
serviceImplementation="com.intellij.internal.statistic.eventLog.FeatureUsageUiEventsImpl"/>
<applicationService serviceInterface="com.intellij.internal.statistic.utils.metricsWhitelist.dictionaries.FUSRegexDictionaryService"
serviceImplementation="com.intellij.internal.statistic.utils.metricsWhitelist.dictionaries.FUSRegexDictionaryServiceImpl"/>
<applicationService serviceInterface="com.intellij.internal.statistic.utils.metricsWhitelist.sets.FUSMetricsSetService"
serviceImplementation="com.intellij.internal.statistic.utils.metricsWhitelist.sets.FUSMetricsSetServiceImpl"/>
<applicationService serviceImplementation="com.intellij.openapi.util.DimensionService"/>
<applicationService serviceInterface="com.intellij.openapi.util.WindowStateService"
......
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.internal.statistic.utils.metricsWhitelist.set;
package com.intellij.internal.statistic.utils.metricsWhitelist.sets;
import com.intellij.internal.statistic.utils.metricsWhitelist.core.MetricsWhitelistHeader;
import org.junit.Test;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment