summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author梁超 <[email protected]>2024-10-31 02:33:28 +0000
committer梁超 <[email protected]>2024-10-31 02:33:28 +0000
commita9c1d40fdc5f929ce20f75110ff0e4c8e1d0ce45 (patch)
tree9f3bf31410fd577a63e4c9fd459ae2daaf7dd469
parent2954275dd3cf3be19e5faebebfdfbf00779bcb42 (diff)
parentff5aa245bb5b95aec7a8825fd517efc2336314f8 (diff)
Merge branch 'bugfix/eval-error' into 'master'
[GAL-684] fix some bugs and update field mapping values See merge request galaxy/tsg_olap/sip-rtp-correlation!35
-rw-r--r--pom.xml31
-rw-r--r--src/main/java/com/geedgenetworks/flink/easy/application/voip/VoipUDFFactory.java1
-rw-r--r--src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/DistinctConcat.java18
-rw-r--r--src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/HasIpAddress.java8
-rw-r--r--src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IpAddressScalarFunction.java25
-rw-r--r--src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IsExternalIpAddress.java10
-rw-r--r--src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IsInternalIpAddress.java10
-rw-r--r--src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IsIpAddress.java6
-rw-r--r--src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/SortAddress.java31
-rw-r--r--src/main/resources/jobs/job.yml50
-rw-r--r--src/site/markdown/download.md21
-rw-r--r--tools/maven/spotbugs-exclude.xml3
12 files changed, 139 insertions, 75 deletions
diff --git a/pom.xml b/pom.xml
index 75c3b5b..0c1d39b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,7 +7,7 @@
<groupId>com.geedgenetworks.application</groupId>
<artifactId>sip-rtp-correlation</artifactId>
- <version>2.0-rc8</version>
+ <version>2.0-rc9</version>
<name>Flink : SIP-RTP : Correlation</name>
@@ -19,7 +19,7 @@
<scala.version>2.12.10</scala.version>
<scala.binary.version>2.12</scala.binary.version>
<flink.version>1.13.6</flink.version>
- <easy.stream.version>1.3-rc1</easy.stream.version>
+ <easy.stream.version>1.3-rc2</easy.stream.version>
<slf4j.version>1.7.32</slf4j.version>
<log4j.version>2.17.1</log4j.version>
<junit.version>5.8.0</junit.version>
@@ -62,8 +62,8 @@
</dependency>
<dependency>
- <groupId>com.zdjizhi</groupId>
- <artifactId>galaxy</artifactId>
+ <groupId>cn.hutool</groupId>
+ <artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>xyz.downgoon</groupId>
@@ -239,23 +239,9 @@
<!-- Common -->
<dependency>
- <groupId>com.zdjizhi</groupId>
- <artifactId>galaxy</artifactId>
- <version>1.1.3</version>
- <exclusions>
- <exclusion>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- </exclusion>
- <exclusion>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- </exclusion>
- </exclusions>
+ <groupId>cn.hutool</groupId>
+ <artifactId>hutool-all</artifactId>
+ <version>5.8.32</version>
</dependency>
<!-- Easy Stream-->
@@ -588,7 +574,8 @@
<groupId>${project.groupId}</groupId>
<artifactId>easy-stream-common</artifactId>
<version>${project.version}</version>
- <remoteRepositories>${project.distributionManagement.repository.url}</remoteRepositories>
+ <remoteRepositories>${project.distributionManagement.repository.url}
+ </remoteRepositories>
</configuration>
</execution>
</executions>
diff --git a/src/main/java/com/geedgenetworks/flink/easy/application/voip/VoipUDFFactory.java b/src/main/java/com/geedgenetworks/flink/easy/application/voip/VoipUDFFactory.java
index d718a14..4e1622a 100644
--- a/src/main/java/com/geedgenetworks/flink/easy/application/voip/VoipUDFFactory.java
+++ b/src/main/java/com/geedgenetworks/flink/easy/application/voip/VoipUDFFactory.java
@@ -22,6 +22,7 @@ public class VoipUDFFactory implements UDFFactory {
put("STREAM_DIR", new StreamDir());
put("STREAM_DIR_SET", new StreamDirSet());
put("FIND_NOT_BLANK", new FindNotBlank());
+ put("DISTINCT_CONCAT", new DistinctConcat());
put("SORT_ADDRESS", new SortAddress());
put("SNOWFLAKE_ID", new SnowflakeID());
diff --git a/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/DistinctConcat.java b/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/DistinctConcat.java
new file mode 100644
index 0000000..2c3914a
--- /dev/null
+++ b/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/DistinctConcat.java
@@ -0,0 +1,18 @@
+package com.geedgenetworks.flink.easy.application.voip.udf;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.flink.table.annotation.DataTypeHint;
+import org.apache.flink.table.functions.ScalarFunction;
+
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class DistinctConcat extends ScalarFunction {
+
+ public @DataTypeHint("STRING") String eval(String s1, String s2) {
+ return Stream.of(s1, s2).filter(StringUtils::isNotBlank)
+ .map(StringUtils::trim)
+ .distinct()
+ .collect(Collectors.joining(","));
+ }
+}
diff --git a/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/HasIpAddress.java b/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/HasIpAddress.java
index 7dddbc7..93e013b 100644
--- a/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/HasIpAddress.java
+++ b/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/HasIpAddress.java
@@ -1,17 +1,17 @@
package com.geedgenetworks.flink.easy.application.voip.udf;
-import com.zdjizhi.utils.IPUtil;
import org.apache.flink.table.annotation.DataTypeHint;
-import org.apache.flink.table.functions.ScalarFunction;
-public class HasIpAddress extends ScalarFunction {
+public class HasIpAddress extends IpAddressScalarFunction {
public @DataTypeHint("BOOLEAN") Boolean eval(String... ipaddr) {
if (null == ipaddr) {
return false;
}
for (var ip : ipaddr) {
- return ip != null && IPUtil.isIPAddress(ip);
+ if (ip != null && isIpAddress(ip)) {
+ return true;
+ }
}
return false;
}
diff --git a/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IpAddressScalarFunction.java b/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IpAddressScalarFunction.java
new file mode 100644
index 0000000..2f0066f
--- /dev/null
+++ b/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IpAddressScalarFunction.java
@@ -0,0 +1,25 @@
+package com.geedgenetworks.flink.easy.application.voip.udf;
+
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.net.NetUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.flink.table.functions.ScalarFunction;
+
+public abstract class IpAddressScalarFunction extends ScalarFunction {
+
+ protected static boolean isIpAddress(String ipaddr) {
+ return isIpv4(ipaddr) || isIpv6(ipaddr);
+ }
+
+ protected static boolean isIpv4(String ipaddr) {
+ return Validator.isIpv4(StringUtils.trim(ipaddr));
+ }
+
+ protected static boolean isIpv6(String ipaddr) {
+ return Validator.isIpv6(StringUtils.trim(ipaddr));
+ }
+
+ protected static boolean isInternalIpAddress(String ipaddr) {
+ return NetUtil.isInnerIP(StringUtils.trim(ipaddr));
+ }
+}
diff --git a/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IsExternalIpAddress.java b/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IsExternalIpAddress.java
index a2970a6..8e3eeda 100644
--- a/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IsExternalIpAddress.java
+++ b/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IsExternalIpAddress.java
@@ -1,17 +1,13 @@
package com.geedgenetworks.flink.easy.application.voip.udf;
-import com.zdjizhi.utils.IPUtil;
import org.apache.flink.table.annotation.DataTypeHint;
-import org.apache.flink.table.functions.ScalarFunction;
-import static com.zdjizhi.utils.IPUtil.isIPAddress;
-
-public class IsExternalIpAddress extends ScalarFunction {
+public class IsExternalIpAddress extends IpAddressScalarFunction {
public @DataTypeHint("BOOLEAN") Boolean eval(String ipaddr) {
- if (ipaddr == null || !isIPAddress(ipaddr)) {
+ if (ipaddr == null || !isIpAddress(ipaddr)) {
return false;
}
- return !IPUtil.internalIp(ipaddr);
+ return !isInternalIpAddress(ipaddr);
}
}
diff --git a/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IsInternalIpAddress.java b/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IsInternalIpAddress.java
index 55839ba..f485c60 100644
--- a/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IsInternalIpAddress.java
+++ b/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IsInternalIpAddress.java
@@ -1,17 +1,13 @@
package com.geedgenetworks.flink.easy.application.voip.udf;
-import com.zdjizhi.utils.IPUtil;
import org.apache.flink.table.annotation.DataTypeHint;
-import org.apache.flink.table.functions.ScalarFunction;
-import static com.zdjizhi.utils.IPUtil.isIPAddress;
-
-public class IsInternalIpAddress extends ScalarFunction {
+public class IsInternalIpAddress extends IpAddressScalarFunction {
public @DataTypeHint("BOOLEAN") Boolean eval(String ipaddr) {
- if (!isIPAddress(ipaddr)) {
+ if (!isIpAddress(ipaddr)) {
return false;
}
- return IPUtil.internalIp(ipaddr);
+ return isInternalIpAddress(ipaddr);
}
}
diff --git a/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IsIpAddress.java b/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IsIpAddress.java
index cbef834..262f855 100644
--- a/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IsIpAddress.java
+++ b/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/IsIpAddress.java
@@ -1,15 +1,13 @@
package com.geedgenetworks.flink.easy.application.voip.udf;
-import com.zdjizhi.utils.IPUtil;
import org.apache.flink.table.annotation.DataTypeHint;
-import org.apache.flink.table.functions.ScalarFunction;
-public class IsIpAddress extends ScalarFunction {
+public class IsIpAddress extends IpAddressScalarFunction {
public @DataTypeHint("BOOLEAN") Boolean eval(String ipaddr) {
if (null == ipaddr) {
return false;
}
- return IPUtil.isIPAddress(ipaddr);
+ return isIpAddress(ipaddr);
}
}
diff --git a/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/SortAddress.java b/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/SortAddress.java
index 13ab4a6..49380be 100644
--- a/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/SortAddress.java
+++ b/src/main/java/com/geedgenetworks/flink/easy/application/voip/udf/SortAddress.java
@@ -1,13 +1,14 @@
package com.geedgenetworks.flink.easy.application.voip.udf;
-import com.google.common.collect.Lists;
-import com.zdjizhi.utils.IPUtil;
+import cn.hutool.core.net.NetUtil;
import org.apache.commons.lang3.StringUtils;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.table.annotation.DataTypeHint;
-import org.apache.flink.table.functions.ScalarFunction;
-public class SortAddress extends ScalarFunction {
+import java.util.ArrayList;
+import java.util.List;
+
+public class SortAddress extends IpAddressScalarFunction {
public @DataTypeHint("STRING")
String eval(
@@ -17,14 +18,14 @@ public class SortAddress extends ScalarFunction {
public static String of(
Tuple2<String, Integer> a1, Tuple2<String, Integer> a2) {
- var list = Lists.newArrayList(a1, a2);
- if (a1.f1 == null || a2.f1 == null || StringUtils.isAnyEmpty(a1.f0, a2.f0)) {
- return "";
+ var list = new ArrayList<>(List.of(a1, a2));
+ if (a1.f1 == null || a2.f1 == null || StringUtils.isAnyEmpty(a1.f0, a2.f0)
+ || !isIpAddress(a1.f0) || !isIpAddress(a2.f0)) {
+ return a1.f0 + ":" + a1.f1 + "," + a2.f0 + ":" + a2.f1;
}
list.sort((a, b) -> {
if (a.f1.equals(b.f1)) {
- return Long.compare(
- IPUtil.getIpDesimal(a.f0), IPUtil.getIpDesimal(b.f0));
+ return compareAddress(a.f0, b.f0);
} else {
return a.f1.compareTo(b.f1);
}
@@ -32,4 +33,16 @@ public class SortAddress extends ScalarFunction {
return String.format("%s:%s,%s:%s",
list.get(0).f0, list.get(0).f1, list.get(1).f0, list.get(1).f1);
}
+
+ private static int compareAddress(String ip1, String ip2) {
+ try {
+ var v1 = isIpv4(ip1) ? NetUtil.ipv4ToLong(ip1) :
+ NetUtil.ipv6ToBigInteger(ip1).longValue();
+ var v2 = isIpv4(ip2) ? NetUtil.ipv4ToLong(ip2) :
+ NetUtil.ipv6ToBigInteger(ip2).longValue();
+ return Long.compare(v1, v2);
+ } catch (Exception e) {
+ return 0;
+ }
+ }
} \ No newline at end of file
diff --git a/src/main/resources/jobs/job.yml b/src/main/resources/jobs/job.yml
index cd4bbdf..46fe2df 100644
--- a/src/main/resources/jobs/job.yml
+++ b/src/main/resources/jobs/job.yml
@@ -16,7 +16,7 @@ source:
group.id: sip-rtp-correlation
security.protocol: SASL_PLAINTEXT
sasl.mechanism: PLAIN
- sasl.jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="example" password="example";
+ sasl.jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="EXAMPLE-KAFKA-USERNAME" password="EXAMPLE-KAFKA-PASSWORD";
format: json
schema:
## General
@@ -301,7 +301,7 @@ sink:
bootstrap.servers: localhost:9092
security.protocol: SASL_PLAINTEXT
sasl.mechanism: PLAIN
- sasl.jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="example" password="example";
+ sasl.jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="EXAMPLE-KAFKA-USERNAME" password="EXAMPLE-KAFKA-PASSWORD";
format: json
# 关联成功的 VOIP
- name: only-voip-records
@@ -313,7 +313,7 @@ sink:
bootstrap.servers: localhost:9092
security.protocol: SASL_PLAINTEXT
sasl.mechanism: PLAIN
- sasl.jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="example" password="example";
+ sasl.jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="EXAMPLE-KAFKA-USERNAME" password="EXAMPLE-KAFKA-PASSWORD";
format: json
# 没有关联成功的 SIP 和 RTP
- name: fusion-fail-records
@@ -325,7 +325,7 @@ sink:
bootstrap.servers: localhost:9092
security.protocol: SASL_PLAINTEXT
sasl.mechanism: PLAIN
- sasl.jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="example" password="example";
+ sasl.jaas.config: org.apache.kafka.common.security.plain.PlainLoginModule required username="EXAMPLE-KAFKA-USERNAME" password="EXAMPLE-KAFKA-PASSWORD";
format: json
pipeline:
@@ -345,7 +345,7 @@ pipeline:
- name: error4-records
where: decoded_as == 'SIP' && STREAM_DIR(flags) == 3 && ( NOT( IS_IP_ADDRESS(sip_originator_sdp_connect_ip) ) || NOT( IS_IP_ADDRESS(sip_responder_sdp_connect_ip) ) )
- ### Notes: If internal IP address correlate is needed, please uncomment the following two items
+ ### Notes: If internal IP address correlate is needed, please comment the following two items
# # Invalid: SIP one-way stream and internal network address
# - name: internal-error1-records
# where: decoded_as == 'SIP' && NOT(HAS_EXTERNAL_IP_ADDRESS(sip_originator_sdp_connect_ip, sip_responder_sdp_connect_ip))
@@ -643,9 +643,17 @@ pipeline:
- if: STREAM_DIR(flags) != 3 && @v1.isNotNull && STREAM_DIR(@v1.$flags) != STREAM_DIR(flags)
then:
- |-
- OUTPUT ok FROM withColumns(recv_time to t_vsys_id),
+ OUTPUT ok FROM withColumns(recv_time to device_tag),
+ DISTINCT_CONCAT(@v1.$data_center, data_center) AS data_center,
+ DISTINCT_CONCAT(@v1.$device_group, device_group) AS device_group,
+ withColumns(sled_ip to t_vsys_id),
STREAM_DIR_SET(flags) AS flags,
- withColumns(flags_identify_info to sip_call_id),
+ withColumns(flags_identify_info to decoded_path),
+ @v1.$sent_pkts + sent_pkts AS sent_pkts,
+ @v1.$received_pkts + received_pkts AS received_pkts,
+ @v1.$sent_bytes + sent_bytes AS sent_bytes,
+ @v1.$received_bytes + received_bytes AS received_bytes ,
+ withColumns(tcp_c2s_ip_fragments to sip_call_id),
FIND_NOT_BLANK(@v1.$sip_originator_description, sip_originator_description) AS sip_originator_description,
FIND_NOT_BLANK(@v1.$sip_responder_description, sip_responder_description) AS sip_responder_description,
FIND_NOT_BLANK(@v1.$sip_user_agent, sip_user_agent) AS sip_user_agent,
@@ -674,7 +682,7 @@ pipeline:
then:
- |-
OUTPUT ok FROM withColumns(recv_time to rtp_originator_dir)
- - SCHEDULING USING EVENT TIME FOR NOW + 60 * 1000
+ - SCHEDULING USING PROCESS TIME FOR NOW + 60 * 1000
schedule:
- if: '@v1.isNotNull'
then:
@@ -1383,14 +1391,14 @@ pipeline:
@i.$out_link_id AS out_link_id,
@i.$in_link_id AS in_link_id,
@i.$device_tag AS device_tag,
- @i.$data_center AS data_center,
- @i.$device_group AS device_group,
+ DISTINCT_CONCAT(@i.$data_center, data_center) AS data_center,
+ DISTINCT_CONCAT(@i.$device_group, device_group) AS device_group,
@i.$sled_ip AS sled_ip,
@i.$address_type AS address_type,
@i.$direction AS direction,
@i.$vsys_id AS vsys_id,
@i.$t_vsys_id AS t_vsys_id,
- @i.$flags AS flags,
+ flags AS flags,
@i.$flags_identify_info AS flags_identify_info,
@i.$c2s_ttl AS c2s_ttl,
@@ -1418,10 +1426,10 @@ pipeline:
@i.$ip_protocol AS ip_protocol,
- @i.$sent_pkts AS sent_pkts,
- @i.$received_pkts AS received_pkts,
- @i.$sent_bytes AS sent_bytes,
- @i.$received_bytes AS received_bytes,
+ @i.$sent_pkts + sent_pkts AS sent_pkts,
+ @i.$received_pkts + received_pkts AS received_pkts,
+ @i.$sent_bytes + sent_bytes AS sent_bytes,
+ @i.$received_bytes + received_bytes AS received_bytes,
withColumns(sip_call_id to sip_bye_reason),
@@ -1462,8 +1470,8 @@ pipeline:
@i.$direction AS direction,
@i.$vsys_id AS vsys_id,
@i.$t_vsys_id AS t_vsys_id,
- @i.$flags AS flags,
- @i.$flags_identify_info AS flags_identify_info,
+ @sip.$flags AS flags,
+ @sip.$flags_identify_info AS flags_identify_info,
@i.$c2s_ttl AS c2s_ttl,
@i.$s2c_ttl AS s2c_ttl,
@@ -1490,10 +1498,10 @@ pipeline:
@i.$ip_protocol AS ip_protocol,
- @i.$sent_pkts AS sent_pkts,
- @i.$received_pkts AS received_pkts,
- @i.$sent_bytes AS sent_bytes,
- @i.$received_bytes AS received_bytes,
+ @i.$sent_pkts + sent_pkts AS sent_pkts,
+ @i.$received_pkts + received_pkts AS received_pkts,
+ @i.$sent_bytes + sent_bytes AS sent_bytes,
+ @i.$received_bytes + received_bytes AS received_bytes,
@sip.$sip_call_id AS sip_call_id,
@sip.$sip_originator_description AS sip_originator_description,
diff --git a/src/site/markdown/download.md b/src/site/markdown/download.md
index e200125..520dcc8 100644
--- a/src/site/markdown/download.md
+++ b/src/site/markdown/download.md
@@ -2,12 +2,31 @@
### ${project.version}
-- VoIP Record 增加字段: SIP `sip_bye_reason` 相关字段。
+- 修复 sip 双向关联模块的数据丢失问题。
+- [GAL-684](https://jira.geedge.net/browse/GAL-684) 调整融合后的字段映射,增加更加详细的监控指标。
| Easy Stream | UDF Jar | Job |
|-------------| ------------------------------------------------------------ | ------------------------------------------------------------ |
| ${easy.stream.version} | [JAR](${project.distributionManagement.repository.url}/com/geedgenetworks/application/sip-rtp-correlation/${project.version}/${project.artifactId}-${project.version}.jar) ( [MD5](${project.distributionManagement.repository.url}/com/geedgenetworks/application/sip-rtp-correlation/${project.version}/${project.artifactId}-${project.version}.jar.md5) [SHA1](${project.distributionManagement.repository.url}/com/geedgenetworks/application/sip-rtp-correlation/${project.version}/${project.artifactId}-${project.version}.jar.sha1) ) | [YML](${project.distributionManagement.repository.url}/com/geedgenetworks/application/sip-rtp-correlation/${project.version}/${project.artifactId}-${project.version}.tar.gz) ( [MD5](${project.distributionManagement.repository.url}/com/geedgenetworks/application/sip-rtp-correlation/${project.version}/${project.artifactId}-${project.version}.tar.gz.md5) [SHA1](${project.distributionManagement.repository.url}/com/geedgenetworks/application/sip-rtp-correlation/${project.version}/${project.artifactId}-${project.version}.tar.gz.sha1) ) |
+### 2.0-rc8
+
+- 修复 Extract Key 错误,由于 IpAddress 类型数据校验导致的空指针异常。
+
+| Easy Stream | UDF Jar | Job |
+|-------------| ------------------------------------------------------------ | ------------------------------------------------------------ |
+| 1.3-rc1 | [JAR](http://192.168.40.153:8081/content/repositories/platform-release/com/geedgenetworks/application/sip-rtp-correlation/2.0-rc8/sip-rtp-correlation-2.0-rc8.jar) ( [MD5](http://192.168.40.153:8081/content/repositories/platform-release/com/geedgenetworks/application/sip-rtp-correlation/2.0-rc8/sip-rtp-correlation-2.0-rc8.jar.md5) [SHA1](http://192.168.40.153:8081/content/repositories/platform-release/com/geedgenetworks/application/sip-rtp-correlation/2.0-rc8/sip-rtp-correlation-2.0-rc8.jar.sha1) ) | [YML](http://192.168.40.153:8081/content/repositories/platform-release/com/geedgenetworks/application/sip-rtp-correlation/2.0-rc8/sip-rtp-correlation-2.0-rc8.tar.gz) ( [MD5](http://192.168.40.153:8081/content/repositories/platform-release/com/geedgenetworks/application/sip-rtp-correlation/2.0-rc8/sip-rtp-correlation-2.0-rc8.tar.gz.md5) [SHA1](http://192.168.40.153:8081/content/repositories/platform-release/com/geedgenetworks/application/sip-rtp-correlation/2.0-rc8/sip-rtp-correlation-2.0-rc8.tar.gz.sha1) ) |
+
+
+### 2.0-rc7
+
+- VoIP Record 增加字段: SIP `sip_bye_reason` 相关字段。
+
+| Easy Stream | UDF Jar | Job |
+|-------------| ------------------------------------------------------------ | ------------------------------------------------------------ |
+| 1.3-rc1 | [JAR](http://192.168.40.153:8081/content/repositories/platform-release/com/geedgenetworks/application/sip-rtp-correlation/2.0-rc7/sip-rtp-correlation-2.0-rc7.jar) ( [MD5](http://192.168.40.153:8081/content/repositories/platform-release/com/geedgenetworks/application/sip-rtp-correlation/2.0-rc7/sip-rtp-correlation-2.0-rc7.jar.md5) [SHA1](http://192.168.40.153:8081/content/repositories/platform-release/com/geedgenetworks/application/sip-rtp-correlation/2.0-rc7/sip-rtp-correlation-2.0-rc7.jar.sha1) ) | [YML](http://192.168.40.153:8081/content/repositories/platform-release/com/geedgenetworks/application/sip-rtp-correlation/2.0-rc7/sip-rtp-correlation-2.0-rc7.tar.gz) ( [MD5](http://192.168.40.153:8081/content/repositories/platform-release/com/geedgenetworks/application/sip-rtp-correlation/2.0-rc7/sip-rtp-correlation-2.0-rc7.tar.gz.md5) [SHA1](http://192.168.40.153:8081/content/repositories/platform-release/com/geedgenetworks/application/sip-rtp-correlation/2.0-rc7/sip-rtp-correlation-2.0-rc7.tar.gz.sha1) ) |
+
+
### 2.0-rc6
- VoIP Record 增加字段: SIP, RTP `protocol` 相关字段。
diff --git a/tools/maven/spotbugs-exclude.xml b/tools/maven/spotbugs-exclude.xml
index 3647f17..995d482 100644
--- a/tools/maven/spotbugs-exclude.xml
+++ b/tools/maven/spotbugs-exclude.xml
@@ -7,6 +7,9 @@
<Bug pattern="EI_EXPOSE_REP2"/>
</Match>
<Match>
+ <Bug pattern="REC_CATCH_EXCEPTION"/>
+ </Match>
+ <Match>
<Bug pattern="SE_NO_SERIALVERSIONID"/>
</Match>
<Match>