amplitude / experiment-jvm-server

Amplitude Experiment Server-side SDK for the Java and Kotlin
MIT License
2 stars 2 forks source link

Exception when starting LocalEvaluationClient when there is a Flag segment that uses User ID or Device ID #14

Closed mpomorski closed 10 months ago

mpomorski commented 10 months ago

Amplitude UI allows you to configure different segments of targeted users.

In a segment you can filter by either User ID or Device ID.

Screenshot 2023-11-27 at 13 55 45

When there is a locally evaluated flag in a project that uses segmentation filter like the above it throws an unhandled exception when performing

    LocalEvaluationClient localEvaluationClient = Experiment.initializeLocal(apiKey);
    localEvaluationClient.start();

It makes the client totally unusable.

Stack trace:

Exception in thread "OkHttp Dispatcher" java.lang.NoClassDefFoundError: kotlinx/serialization/internal/EnumsKt
    at com.amplitude.experiment.evaluation.serialization.SerialOperator$Companion$$cachedSerializer$delegate$1.invoke(Serialization.kt:138)
    at com.amplitude.experiment.evaluation.serialization.SerialOperator$Companion$$cachedSerializer$delegate$1.invoke(Serialization.kt:138)
    at kotlin.SafePublicationLazyImpl.getValue(LazyJVM.kt:107)
    at com.amplitude.experiment.evaluation.serialization.SerialOperator$Companion.serializer(Serialization.kt:138)
    at com.amplitude.experiment.evaluation.serialization.SerialUserPropertyFilter$$serializer.childSerializers(Serialization.kt:163)
    at kotlinx.serialization.internal.PluginGeneratedSerialDescriptor$childSerializers$2.invoke(PluginGeneratedSerialDescriptor.kt:36)
    at kotlinx.serialization.internal.PluginGeneratedSerialDescriptor$childSerializers$2.invoke(PluginGeneratedSerialDescriptor.kt:36)
    at kotlin.SafePublicationLazyImpl.getValue(LazyJVM.kt:107)
    at kotlinx.serialization.internal.PluginGeneratedSerialDescriptor.getChildSerializers(PluginGeneratedSerialDescriptor.kt:36)
    at kotlinx.serialization.internal.PluginGeneratedSerialDescriptor.getElementDescriptor(PluginGeneratedSerialDescriptor.kt:76)
    at kotlinx.serialization.descriptors.SerialDescriptorKt$elementDescriptors$1$1.next(SerialDescriptor.kt:284)
    at kotlinx.serialization.descriptors.SerialDescriptorKt$elementDescriptors$1$1.next(SerialDescriptor.kt:279)
    at kotlinx.serialization.internal.PluginGeneratedSerialDescriptorKt.hashCodeImpl(PluginGeneratedSerialDescriptor.kt:137)
    at kotlinx.serialization.internal.PluginGeneratedSerialDescriptor$_hashCode$2.invoke(PluginGeneratedSerialDescriptor.kt:44)
    at kotlinx.serialization.internal.PluginGeneratedSerialDescriptor$_hashCode$2.invoke(PluginGeneratedSerialDescriptor.kt:44)
    at kotlin.SafePublicationLazyImpl.getValue(LazyJVM.kt:107)
    at kotlinx.serialization.internal.PluginGeneratedSerialDescriptor.get_hashCode(PluginGeneratedSerialDescriptor.kt:44)
    at kotlinx.serialization.internal.PluginGeneratedSerialDescriptor.hashCode(PluginGeneratedSerialDescriptor.kt:97)
    at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:936)
    at kotlinx.serialization.json.internal.DescriptorSchemaCache.get(SchemaCache.kt:35)
    at kotlinx.serialization.json.internal.DescriptorSchemaCache.getOrPut(SchemaCache.kt:27)
    at kotlinx.serialization.json.internal.JsonNamesMapKt.getJsonNameIndex(JsonNamesMap.kt:52)
    at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeObjectIndex(StreamingJsonDecoder.kt:139)
    at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeElementIndex(StreamingJsonDecoder.kt:92)
    at com.amplitude.experiment.evaluation.serialization.SerialUserPropertyFilter$$serializer.deserialize(Serialization.kt:163)
    at com.amplitude.experiment.evaluation.serialization.SerialUserPropertyFilter$$serializer.deserialize(Serialization.kt:163)
    at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59)
    at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:36)
    at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43)
    at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70)
    at kotlinx.serialization.encoding.CompositeDecoder$DefaultImpls.decodeSerializableElement$default(Decoding.kt:535)
    at kotlinx.serialization.internal.ListLikeSerializer.readElement(CollectionSerializers.kt:80)
    at kotlinx.serialization.internal.AbstractCollectionSerializer.readElement$default(CollectionSerializers.kt:51)
    at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(CollectionSerializers.kt:36)
    at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(CollectionSerializers.kt:43)
    at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59)
    at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:36)
    at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43)
    at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70)
    at com.amplitude.experiment.evaluation.serialization.SerialSegmentTargetingConfig$$serializer.deserialize(Serialization.kt:116)
    at com.amplitude.experiment.evaluation.serialization.SerialSegmentTargetingConfig$$serializer.deserialize(Serialization.kt:116)
    at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59)
    at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:36)
    at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43)
    at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70)
    at kotlinx.serialization.encoding.CompositeDecoder$DefaultImpls.decodeSerializableElement$default(Decoding.kt:535)
    at kotlinx.serialization.internal.ListLikeSerializer.readElement(CollectionSerializers.kt:80)
    at kotlinx.serialization.internal.AbstractCollectionSerializer.readElement$default(CollectionSerializers.kt:51)
    at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(CollectionSerializers.kt:36)
    at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(CollectionSerializers.kt:43)
    at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59)
    at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:36)
    at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43)
    at kotlinx.serialization.encoding.AbstractDecoder.decodeNullableSerializableElement(AbstractDecoder.kt:79)
    at com.amplitude.experiment.evaluation.serialization.SerialFlagConfig$$serializer.deserialize(Serialization.kt:36)
    at com.amplitude.experiment.evaluation.serialization.SerialFlagConfig$$serializer.deserialize(Serialization.kt:36)
    at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59)
    at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:36)
    at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43)
    at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableElement(AbstractDecoder.kt:70)
    at kotlinx.serialization.encoding.CompositeDecoder$DefaultImpls.decodeSerializableElement$default(Decoding.kt:535)
    at kotlinx.serialization.internal.ListLikeSerializer.readElement(CollectionSerializers.kt:80)
    at kotlinx.serialization.internal.AbstractCollectionSerializer.readElement$default(CollectionSerializers.kt:51)
    at kotlinx.serialization.internal.AbstractCollectionSerializer.merge(CollectionSerializers.kt:36)
    at kotlinx.serialization.internal.AbstractCollectionSerializer.deserialize(CollectionSerializers.kt:43)
    at kotlinx.serialization.json.internal.PolymorphicKt.decodeSerializableValuePolymorphic(Polymorphic.kt:59)
    at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:36)
    at kotlinx.serialization.json.Json.decodeFromString(Json.kt:100)
    at com.amplitude.experiment.flag.FlagConfigApiImpl$getFlagConfigs$$inlined$request$1.onResponse(Request.kt:45)
    at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:750)
Caused by: java.lang.ClassNotFoundException: kotlinx.serialization.internal.EnumsKt
    at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
    ... 73 more
tyiuhc commented 10 months ago

@mpomorski Many thanks for raising this issue, this has been addressed in v1.2.3. Please let us know if you continue to encounter this error.

mpomorski commented 10 months ago

Nice one, thanks! I confirm I can't reproduce the issue with the latest version of the lib. The desired segmentation works as expected.