From 6e1fdaab2846a52cadc79e1032d948dc994bbdfd Mon Sep 17 00:00:00 2001 From: Per Minborg Date: Wed, 18 Nov 2020 19:00:29 +0100 Subject: [PATCH] Add analytics --- pom.xml | 18 ++++++++++ .../chronicle/map/ChronicleMapBuilder.java | 2 ++ .../chronicle/map/VanillaChronicleMap.java | 10 ++++++ .../map/internal/AnalyticsHolder.java | 22 ++++++++++++ .../chronicle/map/internal/AnalyticsMain.java | 35 +++++++++++++++++++ .../chronicle/map/internal/package-info.java | 16 +++++++++ 6 files changed, 103 insertions(+) create mode 100644 src/main/java/net/openhft/chronicle/map/internal/AnalyticsHolder.java create mode 100644 src/main/java/net/openhft/chronicle/map/internal/AnalyticsMain.java create mode 100644 src/main/java/net/openhft/chronicle/map/internal/package-info.java diff --git a/pom.xml b/pom.xml index 4f18e9e27..d3cd8fb0d 100644 --- a/pom.xml +++ b/pom.xml @@ -414,6 +414,24 @@ + + org.codehaus.mojo + exec-maven-plugin + 3.0.0 + + + AnalyticsMain + + java + + + net.openhft.chronicle.map.internal.AnalyticsMain + compile + + + + + diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java index 044113c45..b8f366c5d 100644 --- a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java +++ b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java @@ -36,6 +36,7 @@ import net.openhft.chronicle.hash.serialization.impl.BytesMarshallableReaderWrit import net.openhft.chronicle.hash.serialization.impl.MarshallableReaderWriter; import net.openhft.chronicle.hash.serialization.impl.SerializationBuilder; import net.openhft.chronicle.hash.serialization.impl.TypedMarshallableReaderWriter; +import net.openhft.chronicle.map.internal.AnalyticsHolder; import net.openhft.chronicle.map.replication.MapRemoteOperations; import net.openhft.chronicle.set.ChronicleSetBuilder; import net.openhft.chronicle.values.ValueModel; @@ -1626,6 +1627,7 @@ public final class ChronicleMapBuilder implements public ChronicleMap recoverPersistedTo(@NotNull final File file, final boolean sameBuilderConfigAndLibraryVersion, @Nullable final ChronicleHashCorruption.Listener corruptionListener) throws IOException { + AnalyticsHolder.instance().sendEvent("recover"); return clone().createWithFile(file, true, sameBuilderConfigAndLibraryVersion, corruptionListener); } diff --git a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java index 1a902bf33..7218aa6ce 100644 --- a/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java +++ b/src/main/java/net/openhft/chronicle/map/VanillaChronicleMap.java @@ -36,6 +36,7 @@ import net.openhft.chronicle.hash.serialization.SizedReader; import net.openhft.chronicle.hash.serialization.impl.SerializationBuilder; import net.openhft.chronicle.map.impl.*; import net.openhft.chronicle.map.impl.ret.InstanceReturnValue; +import net.openhft.chronicle.map.internal.AnalyticsHolder; import net.openhft.chronicle.set.ChronicleSet; import net.openhft.chronicle.wire.WireIn; import net.openhft.chronicle.wire.WireOut; @@ -45,6 +46,8 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Map; import java.util.Set; import java.util.function.BiFunction; import java.util.function.Function; @@ -109,6 +112,13 @@ public class VanillaChronicleMap initTransientsFromBuilder(builder); initTransients(); + + final Map additionalEventParameters = new HashMap<>(); + additionalEventParameters.put("key_type", keyClass.getTypeName()); + additionalEventParameters.put("value_type", valueClass.getTypeName()); + additionalEventParameters.put("entries", Long.toString(builder.entries())); + + AnalyticsHolder.instance().sendEvent("started", additionalEventParameters); } public static long alignAddr(final long addr, final long alignment) { diff --git a/src/main/java/net/openhft/chronicle/map/internal/AnalyticsHolder.java b/src/main/java/net/openhft/chronicle/map/internal/AnalyticsHolder.java new file mode 100644 index 000000000..f9886dff5 --- /dev/null +++ b/src/main/java/net/openhft/chronicle/map/internal/AnalyticsHolder.java @@ -0,0 +1,22 @@ +package net.openhft.chronicle.map.internal; + +import net.openhft.chronicle.core.analytics.AnalyticsFacade; +import net.openhft.chronicle.core.pom.PomProperties; + +public enum AnalyticsHolder {; + + // Todo: VERSION is "unknown" for some reason + private static final String VERSION = PomProperties.version("net.openhft", "chronicle-map"); + + private static final AnalyticsFacade ANALYTICS = AnalyticsFacade.standardBuilder( + "G-TDTJG5CT6G", + "J8qsWGHgQP6CLs43mQ10KQ", + VERSION) + .withReportDespiteJUnit() + .build(); + + public static AnalyticsFacade instance() { + return ANALYTICS; + } + +} \ No newline at end of file diff --git a/src/main/java/net/openhft/chronicle/map/internal/AnalyticsMain.java b/src/main/java/net/openhft/chronicle/map/internal/AnalyticsMain.java new file mode 100644 index 000000000..647b57e98 --- /dev/null +++ b/src/main/java/net/openhft/chronicle/map/internal/AnalyticsMain.java @@ -0,0 +1,35 @@ +package net.openhft.chronicle.map.internal; + +import net.openhft.chronicle.map.ChronicleMap; +import net.openhft.chronicle.map.ChronicleMapBuilder; + +public final class AnalyticsMain { + + public static final String BASE_MAP_NAME = "analytics_test_map"; + public static final String MAP_NAME1 = BASE_MAP_NAME + "1"; + public static final String MAP_NAME2 = BASE_MAP_NAME + "2"; + + public static void main(String[] args) { + System.out.println("Creating two maps and sending analytics..."); + System.out.println("Currently, there is a limit of one message per h per JVM instance so only one analytics message will be sent upstream."); + + try (ChronicleMap m1 = createMap(CharSequence.class, CharSequence.class, MAP_NAME1)) { + try (ChronicleMap m2 = createMap(Long.class, CharSequence.class, MAP_NAME2)) { + m1.put("A", "1"); + m2.put(2L, "Two"); + } + } + System.out.println("Completed successfully"); + System.exit(0); + } + + private static ChronicleMap createMap(Class keyType, Class valueType, String name) { + return ChronicleMapBuilder.of(keyType, valueType) + .name(name) + .averageKeySize(32) + .averageValueSize(32) + .entries(1_000) + .create(); + } + +} \ No newline at end of file diff --git a/src/main/java/net/openhft/chronicle/map/internal/package-info.java b/src/main/java/net/openhft/chronicle/map/internal/package-info.java new file mode 100644 index 000000000..856944f44 --- /dev/null +++ b/src/main/java/net/openhft/chronicle/map/internal/package-info.java @@ -0,0 +1,16 @@ +/** + * This package and any and all sub-packages contains strictly internal classes for this Chronicle library. + * Internal classes shall never be used directly. + *

+ * Specifically, the following actions (including, but not limited to) are not allowed + * on internal classes and packages: + *

    + *
  • Casting to
  • + *
  • Reflection of any kind
  • + *
  • Explicit Serialize/deserialize
  • + *
+ *

+ * The classes in this package and any sub-package are subject to + * changes at any time for any reason. + */ +package net.openhft.chronicle.map.internal;