METRON-1757 Storm Profiler Serialization Exception (nickwallen) closes 
apache/metron#1178


Project: http://git-wip-us.apache.org/repos/asf/metron/repo
Commit: http://git-wip-us.apache.org/repos/asf/metron/commit/661e23e2
Tree: http://git-wip-us.apache.org/repos/asf/metron/tree/661e23e2
Diff: http://git-wip-us.apache.org/repos/asf/metron/diff/661e23e2

Branch: refs/remotes/apache/feature/METRON-1699-create-batch-profiler
Commit: 661e23e274d2bf88370d8feb5e5dbf1b82f15124
Parents: 29cbdcc
Author: nickwallen <n...@nickallen.org>
Authored: Wed Aug 29 12:51:05 2018 -0400
Committer: nickallen <nickal...@apache.org>
Committed: Wed Aug 29 12:51:05 2018 -0400

----------------------------------------------------------------------
 metron-analytics/metron-profiler-common/pom.xml | 26 +++------------
 .../metron/profiler/ProfileMeasurement.java     | 35 ++++++++++++++++++++
 .../apache/metron/profiler/ProfilePeriod.java   |  3 ++
 .../metron/profiler/ProfileMeasurementTest.java | 28 +++++++++++++---
 .../metron/profiler/ProfilePeriodTest.java      | 23 ++++++++++---
 .../profiler/hbase/SaltyRowKeyBuilderTest.java  | 11 ------
 metron-analytics/metron-profiler/README.md      | 18 ++++++----
 .../integration/ProfilerIntegrationTest.java    | 30 +++++++++++++----
 .../configuration/profiler/ProfileResult.java   |  4 +++
 .../profiler/ProfileResultExpressions.java      |  4 +++
 .../profiler/ProfilerConfigTest.java            | 35 +++++++++++++++-----
 11 files changed, 154 insertions(+), 63 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/metron/blob/661e23e2/metron-analytics/metron-profiler-common/pom.xml
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-profiler-common/pom.xml 
b/metron-analytics/metron-profiler-common/pom.xml
index 928515f..74253cc 100644
--- a/metron-analytics/metron-profiler-common/pom.xml
+++ b/metron-analytics/metron-profiler-common/pom.xml
@@ -55,6 +55,10 @@
                     <groupId>org.slf4j</groupId>
                     <artifactId>slf4j-log4j12</artifactId>
                 </exclusion>
+                <exclusion>
+                    <groupId>asm</groupId>
+                    <artifactId>asm</artifactId>
+                </exclusion>
             </exclusions>
         </dependency>
         <dependency>
@@ -109,30 +113,10 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.storm</groupId>
-            <artifactId>storm-core</artifactId>
-            <version>${global_storm_version}</version>
-            <scope>provided</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.apache.logging.log4j</groupId>
-                    <artifactId>log4j-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.logging.log4j</groupId>
-                    <artifactId>log4j-core</artifactId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>log4j-slf4j-impl</artifactId>
-                    <groupId>org.apache.logging.log4j</groupId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-all</artifactId>
             <version>${global_mockito_version}</version>
             <scope>test</scope>
         </dependency>
     </dependencies>
-</project>
\ No newline at end of file
+</project>

http://git-wip-us.apache.org/repos/asf/metron/blob/661e23e2/metron-analytics/metron-profiler-common/src/main/java/org/apache/metron/profiler/ProfileMeasurement.java
----------------------------------------------------------------------
diff --git 
a/metron-analytics/metron-profiler-common/src/main/java/org/apache/metron/profiler/ProfileMeasurement.java
 
b/metron-analytics/metron-profiler-common/src/main/java/org/apache/metron/profiler/ProfileMeasurement.java
index 4737c3d..2212297 100644
--- 
a/metron-analytics/metron-profiler-common/src/main/java/org/apache/metron/profiler/ProfileMeasurement.java
+++ 
b/metron-analytics/metron-profiler-common/src/main/java/org/apache/metron/profiler/ProfileMeasurement.java
@@ -20,6 +20,8 @@
 
 package org.apache.metron.profiler;
 
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.metron.common.configuration.profiler.ProfileConfig;
 
 import java.io.Serializable;
@@ -174,4 +176,37 @@ public class ProfileMeasurement implements Serializable {
   public void setTriageValues(Map<String, Object> triageValues) {
     this.triageValues = triageValues;
   }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ProfileMeasurement that = (ProfileMeasurement) o;
+    return new EqualsBuilder()
+            .append(profileName, that.profileName)
+            .append(entity, that.entity)
+            .append(groups, that.groups)
+            .append(period, that.period)
+            .append(definition, that.definition)
+            .append(profileValue, that.profileValue)
+            .append(triageValues, that.triageValues)
+            .isEquals();
+  }
+
+  @Override
+  public int hashCode() {
+    return new HashCodeBuilder(17, 37)
+            .append(profileName)
+            .append(entity)
+            .append(groups)
+            .append(period)
+            .append(definition)
+            .append(profileValue)
+            .append(triageValues)
+            .toHashCode();
+  }
 }

http://git-wip-us.apache.org/repos/asf/metron/blob/661e23e2/metron-analytics/metron-profiler-common/src/main/java/org/apache/metron/profiler/ProfilePeriod.java
----------------------------------------------------------------------
diff --git 
a/metron-analytics/metron-profiler-common/src/main/java/org/apache/metron/profiler/ProfilePeriod.java
 
b/metron-analytics/metron-profiler-common/src/main/java/org/apache/metron/profiler/ProfilePeriod.java
index cbb8275..6c971a7 100644
--- 
a/metron-analytics/metron-profiler-common/src/main/java/org/apache/metron/profiler/ProfilePeriod.java
+++ 
b/metron-analytics/metron-profiler-common/src/main/java/org/apache/metron/profiler/ProfilePeriod.java
@@ -47,6 +47,9 @@ public class ProfilePeriod implements Serializable {
    */
   private long durationMillis;
 
+  public ProfilePeriod() {
+    // no-arg constructor required for kryo serialization in storm
+  }
 
   /**
    * @param epochMillis A timestamp contained somewhere within the profile 
period.

http://git-wip-us.apache.org/repos/asf/metron/blob/661e23e2/metron-analytics/metron-profiler-common/src/test/java/org/apache/metron/profiler/ProfileMeasurementTest.java
----------------------------------------------------------------------
diff --git 
a/metron-analytics/metron-profiler-common/src/test/java/org/apache/metron/profiler/ProfileMeasurementTest.java
 
b/metron-analytics/metron-profiler-common/src/test/java/org/apache/metron/profiler/ProfileMeasurementTest.java
index 3a8d650..b25e694 100644
--- 
a/metron-analytics/metron-profiler-common/src/test/java/org/apache/metron/profiler/ProfileMeasurementTest.java
+++ 
b/metron-analytics/metron-profiler-common/src/test/java/org/apache/metron/profiler/ProfileMeasurementTest.java
@@ -20,9 +20,13 @@
 
 package org.apache.metron.profiler;
 
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
 import org.adrianwalker.multilinestring.Multiline;
 import org.apache.metron.common.configuration.profiler.ProfileConfig;
 import org.apache.metron.common.utils.SerDeUtils;
+import org.junit.Before;
 import org.junit.Test;
 
 import java.io.ByteArrayInputStream;
@@ -33,6 +37,7 @@ import java.util.Collections;
 import java.util.concurrent.TimeUnit;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 public class ProfileMeasurementTest {
@@ -56,9 +61,9 @@ public class ProfileMeasurementTest {
   private ProfileConfig definition;
   private ProfileMeasurement measurement;
 
+  @Before
   public void setup() throws Exception {
     definition = ProfileConfig.fromJSON(profile);
-
     measurement = new ProfileMeasurement()
             .withProfileName("profile")
             .withEntity("entity")
@@ -74,10 +79,24 @@ public class ProfileMeasurementTest {
    */
   @Test
   public void testKryoSerialization() throws Exception {
+    assertNotNull(measurement);
+    Kryo kryo = new Kryo();
+
+    // serialize
+    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
+    Output output = new Output(byteStream);
+    kryo.writeObject(output, measurement);
+
+    // validate serialization
+    byte[] bits = output.toBytes();
+    assertNotNull(bits);
+
+    // deserialize
+    Input input = new Input(new ByteArrayInputStream(bits));
+    ProfileMeasurement actual = kryo.readObject(input, 
ProfileMeasurement.class);
 
-    // round-trip serialization
-    byte[] raw = SerDeUtils.toBytes(measurement);
-    Object actual = SerDeUtils.fromBytes(raw, Object.class);
+    // validate deserialization
+    assertNotNull(actual);
     assertEquals(measurement, actual);
   }
 
@@ -88,6 +107,7 @@ public class ProfileMeasurementTest {
    */
   @Test
   public void testJavaSerialization() throws Exception {
+    assertNotNull(measurement);
 
     // serialize using java
     ByteArrayOutputStream bytes = new ByteArrayOutputStream();

http://git-wip-us.apache.org/repos/asf/metron/blob/661e23e2/metron-analytics/metron-profiler-common/src/test/java/org/apache/metron/profiler/ProfilePeriodTest.java
----------------------------------------------------------------------
diff --git 
a/metron-analytics/metron-profiler-common/src/test/java/org/apache/metron/profiler/ProfilePeriodTest.java
 
b/metron-analytics/metron-profiler-common/src/test/java/org/apache/metron/profiler/ProfilePeriodTest.java
index f52bd09..17bb8fa 100644
--- 
a/metron-analytics/metron-profiler-common/src/test/java/org/apache/metron/profiler/ProfilePeriodTest.java
+++ 
b/metron-analytics/metron-profiler-common/src/test/java/org/apache/metron/profiler/ProfilePeriodTest.java
@@ -20,6 +20,9 @@
 
 package org.apache.metron.profiler;
 
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
 import org.apache.metron.common.utils.SerDeUtils;
 import org.junit.Test;
 
@@ -31,6 +34,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.stream.IntStream;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 /**
@@ -137,13 +141,24 @@ public class ProfilePeriodTest {
    */
   @Test
   public void testKryoSerialization() throws Exception {
-
     ProfilePeriod expected = new ProfilePeriod(AUG2016, 1, TimeUnit.HOURS);
+    Kryo kryo = new Kryo();
+
+    // serialize
+    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
+    Output output = new Output(byteStream);
+    kryo.writeObject(output, expected);
+
+    // validate serialization
+    byte[] bits = output.toBytes();
+    assertNotNull(bits);
 
-    // round-trip java serialization
-    byte[] raw = SerDeUtils.toBytes(expected);
-    Object actual = SerDeUtils.fromBytes(raw, Object.class);
+    // deserialize
+    Input input = new Input(new ByteArrayInputStream(bits));
+    ProfilePeriod actual = kryo.readObject(input, ProfilePeriod.class);
 
+    // validate deserialization
+    assertNotNull(actual);
     assertEquals(expected, actual);
   }
 

http://git-wip-us.apache.org/repos/asf/metron/blob/661e23e2/metron-analytics/metron-profiler-common/src/test/java/org/apache/metron/profiler/hbase/SaltyRowKeyBuilderTest.java
----------------------------------------------------------------------
diff --git 
a/metron-analytics/metron-profiler-common/src/test/java/org/apache/metron/profiler/hbase/SaltyRowKeyBuilderTest.java
 
b/metron-analytics/metron-profiler-common/src/test/java/org/apache/metron/profiler/hbase/SaltyRowKeyBuilderTest.java
index 57edea0..e92a447 100644
--- 
a/metron-analytics/metron-profiler-common/src/test/java/org/apache/metron/profiler/hbase/SaltyRowKeyBuilderTest.java
+++ 
b/metron-analytics/metron-profiler-common/src/test/java/org/apache/metron/profiler/hbase/SaltyRowKeyBuilderTest.java
@@ -20,11 +20,8 @@
 
 package org.apache.metron.profiler.hbase;
 
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.storm.tuple.Tuple;
 import org.apache.metron.profiler.ProfileMeasurement;
 import org.apache.metron.profiler.ProfilePeriod;
-import org.apache.metron.profiler.hbase.SaltyRowKeyBuilder;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -39,9 +36,6 @@ import java.util.concurrent.TimeUnit;
 
 import static org.hamcrest.core.IsEqual.equalTo;
 import static org.junit.Assert.assertThat;
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
 
 /**
  * Tests the SaltyRowKeyBuilder.
@@ -54,7 +48,6 @@ public class SaltyRowKeyBuilderTest {
 
   private SaltyRowKeyBuilder rowKeyBuilder;
   private ProfileMeasurement measurement;
-  private Tuple tuple;
 
   /**
    * Thu, Aug 25 2016 13:27:10 GMT
@@ -70,10 +63,6 @@ public class SaltyRowKeyBuilderTest {
             .withEntity("entity")
             .withPeriod(AUG2016, periodDuration, periodUnits);
 
-    // the tuple will contain the original message
-    tuple = mock(Tuple.class);
-    when(tuple.getValueByField(eq("measurement"))).thenReturn(measurement);
-
     rowKeyBuilder = new SaltyRowKeyBuilder(saltDivisor, periodDuration, 
periodUnits);
   }
 

http://git-wip-us.apache.org/repos/asf/metron/blob/661e23e2/metron-analytics/metron-profiler/README.md
----------------------------------------------------------------------
diff --git a/metron-analytics/metron-profiler/README.md 
b/metron-analytics/metron-profiler/README.md
index 1a17e10..345f38a 100644
--- a/metron-analytics/metron-profiler/README.md
+++ b/metron-analytics/metron-profiler/README.md
@@ -221,9 +221,10 @@ This section will describe the steps required to get your 
first "Hello, World!""
 
 Continuing the previous running example, at this point, you have seen how your 
profile behaves against real, live telemetry in a controlled execution 
environment.  The next step is to deploy your profile to the live, actively 
running Profiler topology.
 
-1.  Start the Stellar Shell with the `-z ZK:2181` command line argument.  This 
is required when deploying a new profile to the active Profiler topology.  
Replace `ZK:2181` with a URL that is appropriate to your environment.
+1.  Start the Stellar Shell with the `-z` command line argument so that a 
connection to Zookeeper is established.  This is required when  deploying a new 
profile definition as shown in the steps below.
        ```
-       [root@node1 ~]# $METRON_HOME/bin/stellar -z ZK:2181
+  [root@node1 ~]# source /etc/default/metron
+       [root@node1 ~]# $METRON_HOME/bin/stellar -z $ZOOKEEPER
        Stellar, Go!
        [Stellar]>>>
        [Stellar]>>> %functions CONFIG CONFIG_GET, CONFIG_PUT
@@ -280,16 +281,17 @@ Continuing the previous running example, at this point, 
you have seen how your p
     }
     ```
 
-1. Upload the profile definition to Zookeeper.  Change `node1:2181` to refer 
the actual Zookeeper host in your environment.
+1. Upload the profile definition to Zookeeper.
 
     ```
+    $ source /etc/default/metron
     $ cd $METRON_HOME
-    $ bin/zk_load_configs.sh -m PUSH -i config/zookeeper/ -z node1:2181
+    $ bin/zk_load_configs.sh -m PUSH -i config/zookeeper/ -z $ZOOKEEPER
     ```
 
     You can validate this by reading back the Metron configuration from 
Zookeeper using the same script. The result should look-like the following.
     ```
-    $ bin/zk_load_configs.sh -m DUMP -z node1:2181
+    $ bin/zk_load_configs.sh -m DUMP -z $ZOOKEEPER
     ...
     PROFILER Config: profiler
     {
@@ -317,7 +319,8 @@ Continuing the previous running example, at this point, you 
have seen how your p
 1. Use the [Profiler Client](../metron-profiler-client) to read the profile 
data.  The following `PROFILE_GET` command will read the data written by the 
`hello-world` profile. This assumes that `10.0.0.1` is one of the values for 
`ip_src_addr` contained within the telemetry consumed by the Profiler.
 
     ```
-    $ bin/stellar -z node1:2181
+    $ source /etc/default/metron
+    $ bin/stellar -z $ZOOKEEPER
     [Stellar]>>> PROFILE_GET( "hello-world", "10.0.0.1", PROFILE_FIXED(30, 
"MINUTES"))
     [451, 448]
     ```
@@ -827,7 +830,8 @@ It is assumed that the PROFILE_GET client is configured as 
described [here](../m
 
 Retrieve the last 30 minutes of profile measurements for a specific host.
 ```
-$ bin/stellar -z node1:2181
+$ source /etc/default/metron
+$ bin/stellar -z $ZOOKEEPER
 
 [Stellar]>>> stats := PROFILE_GET( "example4", "10.0.0.1", PROFILE_FIXED(30, 
"MINUTES"))
 [Stellar]>>> stats

http://git-wip-us.apache.org/repos/asf/metron/blob/661e23e2/metron-analytics/metron-profiler/src/test/java/org/apache/metron/profiler/integration/ProfilerIntegrationTest.java
----------------------------------------------------------------------
diff --git 
a/metron-analytics/metron-profiler/src/test/java/org/apache/metron/profiler/integration/ProfilerIntegrationTest.java
 
b/metron-analytics/metron-profiler/src/test/java/org/apache/metron/profiler/integration/ProfilerIntegrationTest.java
index c02c469..268ce26 100644
--- 
a/metron-analytics/metron-profiler/src/test/java/org/apache/metron/profiler/integration/ProfilerIntegrationTest.java
+++ 
b/metron-analytics/metron-profiler/src/test/java/org/apache/metron/profiler/integration/ProfilerIntegrationTest.java
@@ -20,7 +20,12 @@
 
 package org.apache.metron.profiler.integration;
 
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import com.esotericsoftware.kryo.serializers.FieldSerializer;
 import org.adrianwalker.multilinestring.Multiline;
+import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.client.Put;
 import org.apache.hadoop.hbase.util.Bytes;
@@ -39,16 +44,27 @@ import org.apache.metron.profiler.hbase.ColumnBuilder;
 import org.apache.metron.profiler.hbase.RowKeyBuilder;
 import org.apache.metron.profiler.hbase.SaltyRowKeyBuilder;
 import org.apache.metron.profiler.hbase.ValueOnlyColumnBuilder;
+import org.apache.storm.Config;
+import org.apache.storm.serialization.KryoTupleDeserializer;
+import org.apache.storm.serialization.KryoTupleSerializer;
+import org.apache.storm.serialization.KryoValuesDeserializer;
+import org.apache.storm.serialization.KryoValuesSerializer;
+import org.apache.storm.task.TopologyContext;
+import org.apache.storm.tuple.Tuple;
+import org.apache.storm.tuple.TupleImpl;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.mockito.Mockito;
 
+import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.Properties;
 import java.util.concurrent.TimeUnit;
@@ -58,6 +74,7 @@ import static 
com.google.code.tempusfugit.temporal.Timeout.timeout;
 import static com.google.code.tempusfugit.temporal.WaitFor.waitOrTimeout;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 /**
@@ -313,16 +330,15 @@ public class ProfilerIntegrationTest extends 
BaseIntegrationTest {
       // storm settings
       setProperty("profiler.workers", "1");
       setProperty("profiler.executors", "0");
-      setProperty("storm.auto.credentials", "[]");
-      setProperty("topology.auto-credentials", "[]");
-      setProperty("topology.message.timeout.secs", "60");
-      setProperty("topology.max.spout.pending", "100000");
+      setProperty(Config.TOPOLOGY_AUTO_CREDENTIALS, "[]");
+      setProperty(Config.TOPOLOGY_MESSAGE_TIMEOUT_SECS, "60");
+      setProperty(Config.TOPOLOGY_MAX_SPOUT_PENDING, "100000");
 
       // ensure tuples are serialized during the test, otherwise serialization 
problems
       // will not be found until the topology is run on a cluster with 
multiple workers
-      setProperty("topology.testing.always.try.serialize", "true");
-      setProperty("topology.fall.back.on.java.serialization", "false");
-      setProperty("topology.kryo.register", kryoSerializers);
+      setProperty(Config.TOPOLOGY_TESTING_ALWAYS_TRY_SERIALIZE, "true");
+      setProperty(Config.TOPOLOGY_FALL_BACK_ON_JAVA_SERIALIZATION, "false");
+      setProperty(Config.TOPOLOGY_KRYO_REGISTER, kryoSerializers);
 
       // kafka settings
       setProperty("profiler.input.topic", inputTopic);

http://git-wip-us.apache.org/repos/asf/metron/blob/661e23e2/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/profiler/ProfileResult.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/profiler/ProfileResult.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/profiler/ProfileResult.java
index e2aa54d..b66efe8 100644
--- 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/profiler/ProfileResult.java
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/profiler/ProfileResult.java
@@ -42,6 +42,10 @@ public class ProfileResult implements Serializable {
   @JsonProperty("triage")
   private ProfileTriageExpressions triageExpressions;
 
+  public ProfileResult() {
+    // no-arg constructor required for kryo serialization in storm
+  }
+
   @JsonCreator
   public ProfileResult(
           @JsonProperty(value = "profile", required = true) 
ProfileResultExpressions profileExpressions,

http://git-wip-us.apache.org/repos/asf/metron/blob/661e23e2/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/profiler/ProfileResultExpressions.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/profiler/ProfileResultExpressions.java
 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/profiler/ProfileResultExpressions.java
index 2cada01..2af83b5 100644
--- 
a/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/profiler/ProfileResultExpressions.java
+++ 
b/metron-platform/metron-common/src/main/java/org/apache/metron/common/configuration/profiler/ProfileResultExpressions.java
@@ -30,6 +30,10 @@ public class ProfileResultExpressions implements 
Serializable {
 
   private String expression;
 
+  public ProfileResultExpressions() {
+    // no-arg constructor required for kryo serialization in storm
+  }
+
   @JsonCreator
   public ProfileResultExpressions(String expression) {
     this.expression = expression;

http://git-wip-us.apache.org/repos/asf/metron/blob/661e23e2/metron-platform/metron-common/src/test/java/org/apache/metron/common/configuration/profiler/ProfilerConfigTest.java
----------------------------------------------------------------------
diff --git 
a/metron-platform/metron-common/src/test/java/org/apache/metron/common/configuration/profiler/ProfilerConfigTest.java
 
b/metron-platform/metron-common/src/test/java/org/apache/metron/common/configuration/profiler/ProfilerConfigTest.java
index 4c70a8c..f3b7c58 100644
--- 
a/metron-platform/metron-common/src/test/java/org/apache/metron/common/configuration/profiler/ProfilerConfigTest.java
+++ 
b/metron-platform/metron-common/src/test/java/org/apache/metron/common/configuration/profiler/ProfilerConfigTest.java
@@ -19,18 +19,22 @@
  */
 package org.apache.metron.common.configuration.profiler;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import com.esotericsoftware.kryo.Kryo;
+import com.esotericsoftware.kryo.io.Input;
+import com.esotericsoftware.kryo.io.Output;
+import org.adrianwalker.multilinestring.Multiline;
+import org.junit.Test;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
-import org.adrianwalker.multilinestring.Multiline;
-import org.apache.metron.common.utils.SerDeUtils;
-import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Tests the {@link ProfilerConfig} class.
@@ -252,11 +256,24 @@ public class ProfilerConfigTest {
 
     // setup a profiler config to serialize
     ProfilerConfig expected = ProfilerConfig.fromJSON(profilesToSerialize);
+    assertNotNull(expected);
+    Kryo kryo = new Kryo();
+
+    // serialize
+    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
+    Output output = new Output(byteStream);
+    kryo.writeObject(output, expected);
+
+    // validate serialization
+    byte[] bits = output.toBytes();
+    assertNotNull(bits);
 
-    // round-trip java serialization
-    byte[] raw = SerDeUtils.toBytes(expected);
-    Object actual = SerDeUtils.fromBytes(raw, Object.class);
+    // deserialize
+    Input input = new Input(new ByteArrayInputStream(bits));
+    ProfilerConfig actual = kryo.readObject(input, ProfilerConfig.class);
 
+    // validate deserialization
+    assertNotNull(actual);
     assertEquals(expected, actual);
   }
 

Reply via email to