From b809f2c1fa6293148514751ed1e36f709974e40b Mon Sep 17 00:00:00 2001 From: aesperer Date: Mon, 13 Nov 2023 13:47:46 +0900 Subject: [PATCH 1/4] Improved readability of the put method. --- .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/6.8/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/6.8/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .gradle/6.8/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/checksums/md5-checksums.bin | Bin 0 -> 19497 bytes .gradle/checksums/sha1-checksums.bin | Bin 0 -> 21845 bytes .gradle/configuration-cache/gc.properties | 0 .gradle/vcs-1/gc.properties | 0 .idea/.gitignore | 10 ++++ .idea/aws.xml | 11 +++++ .idea/compiler.xml | 6 +++ .idea/gradle.xml | 16 ++++++ .idea/jarRepositories.xml | 20 ++++++++ .idea/jpa-buddy.xml | 6 +++ .idea/misc.xml | 11 +++++ .idea/vcs.xml | 6 +++ .../kakao/connector/kafka/KafkaSinkTask.java | 46 ++++++++---------- 20 files changed, 108 insertions(+), 26 deletions(-) create mode 100644 .gradle/6.8/executionHistory/executionHistory.lock create mode 100644 .gradle/6.8/fileChanges/last-build.bin create mode 100644 .gradle/6.8/fileHashes/fileHashes.lock create mode 100644 .gradle/6.8/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/checksums/checksums.lock create mode 100644 .gradle/checksums/md5-checksums.bin create mode 100644 .gradle/checksums/sha1-checksums.bin create mode 100644 .gradle/configuration-cache/gc.properties create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 .idea/.gitignore create mode 100644 .idea/aws.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/jpa-buddy.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml diff --git a/.gradle/6.8/executionHistory/executionHistory.lock b/.gradle/6.8/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..9160a66d6ad0bdfe6a0f0f1cd54362c4e366a41f GIT binary patch literal 17 TcmZSP_#wG0?rhXz1}FdkFOCE2 literal 0 HcmV?d00001 diff --git a/.gradle/6.8/fileChanges/last-build.bin b/.gradle/6.8/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/6.8/fileHashes/fileHashes.lock b/.gradle/6.8/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..b29a885802dbb6c740c71fe0738d8b3a5cdb9664 GIT binary patch literal 17 TcmZS1{qoag!KRUj`b)W@BZWh28l)PYj&@z|8lO>s>zW=k9qv z_x#q}M;zxjbAoQ%%gyKIDb7#;1yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhv9 zmjWyJiFlC7_=QaqPQ1!FE<(ni$hUdgs+Ofzw34qA`q=*mJ5A?3LsL}llz+&0leYZ8 z^F4X#lpkjNd$+er#(ujPPIyv14{rB# ze*27G=RD&*mTp;H(eA61hcoWbUs^u4I>kb-qhZ`_zA#zz&JZ{oRf`whffqh0Te(16hHwKKmim$0Te(16hHwKKmim$0Te(1 z6hHwKKmim$0Te(16hHwKKmim$0Te(16hHwKKmim$0Te)i|9gRX`~;Nz9w_WH>w0DK z>G$GV7Q`PO)4H|sZvr^gUg*ryky*NE`QzNl#;)G7I+Hr%-J@;Zs~`P*dfjBhLolZp zDP~_y=MBI69dqkau4ujk#ElQd@7TW~9Zq$|b7xuNgg zE?pe*Z{M+Y#XIG{I#VN)7{!~!M)1juFFsq1b2+D!W-PwU$2| z_;|FeJz*6YRn8J($b>gDrp#m4^)-9?^CaE1=i+DlQc+w@jUB}B2@@M#7W>4s=$ODi z8lx^Ik6PzY<0vttGsK4cfwCc6zp*3Vpm@H0XO0s!&Je@<6*FIJA79{Q9MmlJ7_y(K zG(I6l?jmByUa_tsQzDDTr{9i}#18m4TMzNiL0BcZ8N~1r-l>@~^MHNB`s-Dr^0Y7R rAF!sj94b-1YvManHI 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 + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..61a9130 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..ba1ec5c --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..fdc392f --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jpa-buddy.xml b/.idea/jpa-buddy.xml new file mode 100644 index 0000000..966d5f5 --- /dev/null +++ b/.idea/jpa-buddy.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..f2b6fd0 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/main/java/com/kakao/connector/kafka/KafkaSinkTask.java b/src/main/java/com/kakao/connector/kafka/KafkaSinkTask.java index b02f0ec..d4f30f7 100644 --- a/src/main/java/com/kakao/connector/kafka/KafkaSinkTask.java +++ b/src/main/java/com/kakao/connector/kafka/KafkaSinkTask.java @@ -85,38 +85,32 @@ public void start(Map props) { @Override public void put(Collection records) { - if (samplingEnabled) { - for (SinkRecord record : records) { - if (record.value() != null) { - try { - String value = record.value().toString(); - boolean samplingCondition = Math.random() < samplingPercentage; - if (samplingCondition - && isFilteringMatch(value) - ) { + for (SinkRecord record : records) { + if (record.value() != null) { + try { + String value = record.value().toString(); + if (!samplingEnabled && isFilteringMatch(value)) { + sendRecord(value); + } else if (samplingEnabled) { + if (shouldSendRecord(value)) { sendRecord(value); } - } catch (Exception e) { - log.error(e.getMessage() + " / " + connectorName, e); - } - } - } - } else { - for (SinkRecord record : records) { - if (record.value() != null) { - try { - String value = record.value().toString(); - if (isFilteringMatch(value)) { - sendRecord(value); - } - } catch (Exception e) { - log.error(e.getMessage() + " / " + connectorName, e); } + } catch (Exception e) { + logError(e); } } } } + private boolean shouldSendRecord(String value) { + return Math.random() < samplingPercentage && isFilteringMatch(value); + } + + private void logError(Exception e) { + log.error(e.getMessage() + " / " + connectorName, e); + } + private void sendRecord(String value) { ProducerRecord sendRecord = getSinkRecord(value); producer.send(sendRecord, new ProducerCallback()); @@ -143,7 +137,7 @@ private long parsingTimestamp(String value) { LocalDateTime dateTime = LocalDateTime.parse(timestampFieldValue, formatter); return Timestamp.valueOf(dateTime).getTime(); } catch (Exception e) { - log.error(e.getMessage() + " / " + connectorName, e); + logError(e); return System.currentTimeMillis(); } } @@ -157,7 +151,7 @@ private String parsingMessageKey(String value) { } return messageKey.toString(); } catch (Exception e) { - log.error(e.getMessage() + " / " + connectorName, e); + logError(e); return null; } } From 8306cf561b00aabe0349dde240d9f112b1aa3189 Mon Sep 17 00:00:00 2001 From: aesperer Date: Mon, 13 Nov 2023 13:50:09 +0900 Subject: [PATCH 2/4] There seems to be no reason to wrap with asList. Rephrasing as an array --- src/main/java/com/kakao/connector/kafka/KafkaSinkTask.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/kakao/connector/kafka/KafkaSinkTask.java b/src/main/java/com/kakao/connector/kafka/KafkaSinkTask.java index d4f30f7..610d060 100644 --- a/src/main/java/com/kakao/connector/kafka/KafkaSinkTask.java +++ b/src/main/java/com/kakao/connector/kafka/KafkaSinkTask.java @@ -145,7 +145,7 @@ private long parsingTimestamp(String value) { private String parsingMessageKey(String value) { try { StringBuilder messageKey = new StringBuilder(); - List fields = Arrays.asList(keyParsingField.split(",")); + String[] fields = keyParsingField.split(","); for (String field : fields) { messageKey.append(JsonPath.read(value, field).toString()); } From 6468b5fb3db04cb4e883004a5a74cca0585931dd Mon Sep 17 00:00:00 2001 From: aesperer Date: Mon, 13 Nov 2023 13:51:35 +0900 Subject: [PATCH 3/4] delete .idea directory --- .idea/.gitignore | 10 ---------- .idea/aws.xml | 11 ----------- .idea/compiler.xml | 6 ------ .idea/gradle.xml | 16 ---------------- .idea/jarRepositories.xml | 20 -------------------- .idea/jpa-buddy.xml | 6 ------ .idea/misc.xml | 11 ----------- .idea/vcs.xml | 6 ------ 8 files changed, 86 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/aws.xml delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/jarRepositories.xml delete mode 100644 .idea/jpa-buddy.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 0a8642f..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml -# Zeppelin ignored files -/ZeppelinRemoteNotebooks/ diff --git a/.idea/aws.xml b/.idea/aws.xml deleted file mode 100644 index b63b642..0000000 --- a/.idea/aws.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 61a9130..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index ba1ec5c..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml deleted file mode 100644 index fdc392f..0000000 --- a/.idea/jarRepositories.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/jpa-buddy.xml b/.idea/jpa-buddy.xml deleted file mode 100644 index 966d5f5..0000000 --- a/.idea/jpa-buddy.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index f2b6fd0..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 58db607af6f8667bbfa8438c5633f0988183be35 Mon Sep 17 00:00:00 2001 From: aesperer Date: Mon, 13 Nov 2023 13:52:33 +0900 Subject: [PATCH 4/4] delete gradle, idea directory --- .../6.8/executionHistory/executionHistory.lock | Bin 17 -> 0 bytes .gradle/6.8/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/6.8/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .gradle/6.8/gc.properties | 0 .../buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 0 bytes .gradle/buildOutputCleanup/cache.properties | 2 -- .gradle/checksums/checksums.lock | Bin 17 -> 0 bytes .gradle/checksums/md5-checksums.bin | Bin 19497 -> 0 bytes .gradle/checksums/sha1-checksums.bin | Bin 21845 -> 0 bytes .gradle/configuration-cache/gc.properties | 0 .gradle/vcs-1/gc.properties | 0 11 files changed, 2 deletions(-) delete mode 100644 .gradle/6.8/executionHistory/executionHistory.lock delete mode 100644 .gradle/6.8/fileChanges/last-build.bin delete mode 100644 .gradle/6.8/fileHashes/fileHashes.lock delete mode 100644 .gradle/6.8/gc.properties delete mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 .gradle/buildOutputCleanup/cache.properties delete mode 100644 .gradle/checksums/checksums.lock delete mode 100644 .gradle/checksums/md5-checksums.bin delete mode 100644 .gradle/checksums/sha1-checksums.bin delete mode 100644 .gradle/configuration-cache/gc.properties delete mode 100644 .gradle/vcs-1/gc.properties diff --git a/.gradle/6.8/executionHistory/executionHistory.lock b/.gradle/6.8/executionHistory/executionHistory.lock deleted file mode 100644 index 9160a66d6ad0bdfe6a0f0f1cd54362c4e366a41f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 TcmZSP_#wG0?rhXz1}FdkFOCE2 diff --git a/.gradle/6.8/fileChanges/last-build.bin b/.gradle/6.8/fileChanges/last-build.bin deleted file mode 100644 index f76dd238ade08917e6712764a16a22005a50573d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1 IcmZPo000310RR91 diff --git a/.gradle/6.8/fileHashes/fileHashes.lock b/.gradle/6.8/fileHashes/fileHashes.lock deleted file mode 100644 index b29a885802dbb6c740c71fe0738d8b3a5cdb9664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 TcmZS1{qoag!KRUj`b)W@BZWh28l)PYj&@z|8lO>s>zW=k9qv z_x#q}M;zxjbAoQ%%gyKIDb7#;1yBG5Pyhu`00mG01yBG5Pyhu`00mG01yBG5Pyhv9 zmjWyJiFlC7_=QaqPQ1!FE<(ni$hUdgs+Ofzw34qA`q=*mJ5A?3LsL}llz+&0leYZ8 z^F4X#lpkjNd$+er#(ujPPIyv14{rB# ze*27G=RD&*mTp;H(eA61hcoWbUs^u4I>kb-qhZ`_zA#zz&JZ{oRf`whffqh0Te(16hHwKKmim$0Te(16hHwKKmim$0Te(1 z6hHwKKmim$0Te(16hHwKKmim$0Te(16hHwKKmim$0Te)i|9gRX`~;Nz9w_WH>w0DK z>G$GV7Q`PO)4H|sZvr^gUg*ryky*NE`QzNl#;)G7I+Hr%-J@;Zs~`P*dfjBhLolZp zDP~_y=MBI69dqkau4ujk#ElQd@7TW~9Zq$|b7xuNgg zE?pe*Z{M+Y#XIG{I#VN)7{!~!M)1juFFsq1b2+D!W-PwU$2| z_;|FeJz*6YRn8J($b>gDrp#m4^)-9?^CaE1=i+DlQc+w@jUB}B2@@M#7W>4s=$ODi z8lx^Ik6PzY<0vttGsK4cfwCc6zp*3Vpm@H0XO0s!&Je@<6*FIJA79{Q9MmlJ7_y(K zG(I6l?jmByUa_tsQzDDTr{9i}#18m4TMzNiL0BcZ8N~1r-l>@~^MHNB`s-Dr^0Y7R rAF!sj94b-1YvManHI zDmgMsH$<6p+@hk-X1P@4MF7`>e-)_V;~1``yD@&NiUYrb~>& zM*F8p{qq%n!wKL7Z~{01oB&P$Cx8>c3E%{90yqJj08RiWfD^z8-~@02I02jhPT;?i zfHg4?VKA8KOL@pIlY(e8MN#65PPpD?<;t;?tKiQJ4fOwmsM^Yzvj*P{0&XRV_%SoX z#&i!$Z^-izk8c}qkqve*1Ki>c;wMGhj)m-y$p?JXBE(O(y{=?4{&)fku#Lp#2jDM)__W|6Pg?PGBU9USU)DiGa4v1eIDp-1DbCN6IRvQq%GF-TS ze9QGe05{){c>eor1HL6$xqxq6i+E8)v4i+r{zAYFgAl*Bz+F~p_|_}HErt&=F z_qqYT=@H`3*UtEL?zxUyz^(ca?|h}BKFF-y1owXn@vg^H1U(Bb_W*9Z0P!Ay=pX&l zBxC?LwLrXAs`X%1;?Miw{zDNTH0ZshoTJ+hxQQy_L*gaLI>AkbfSY+E{%K5p$SB2w z4fkJ+_{egx>J7iTrvPs0ggCF$!NtL~3|Yvl5Eoc9AQ6_AG61+?C*nWwUhLjGr6Uk< zGbZ9fhcx+D#VxAE=~;?kuJyV`HBgY%QYi}-Y_&qpg*X_9bz zd&Fm_b!~8-v2`=tzZl|kvLlMsSM^+hJQwkWVR9|r;b1?8dWb8gY9=pAi-GxUI*qu}_2()Yxh4AuWWQMqz^ccNFEf5}e^IpU)bQKl*bC~U5M~oK4 zHy6oG`z5td0dUiqUwLm<+nf{f8vr+7hq%MMY9Ajh|7O4~mmt1lq55Hq3)9ZP{bwNV zrM!E|Wxg@;nnpBZgvWPvyRN-brTY|c!)){i9~buYzC69jfSdgJmHYdiPoUeN@y2e&E#H)}#Xc(`(YR=#});0zzcLpw*46l^Y-0&e;aakQq<_~9`CTi_*504IPG zzzN_4Z~{01oB&P$Cx8>c3E%{90yqJj08RiWfD^z8-~@02I02jhP5>u>6Tk`J1aJa4 z0h|C%04IPGzzN_4Z~{01oWOrC0Tp6M%ZSf>@-wwdEKw?6pyl0(tEvlZd>qvuJj!R$ zX!O{!E8EP$*agU6cPszfIws*hveo0}w9iv(mVIE%IN zWELnv+gaab?VIOP`frPOlxj89h>Nz^Hk5r#J2t1=_LTmLKj#y_>!%-?WmE0|dZ_yP zyDef|4&=az_W!f4kDuB+e|O)Hu?qZoH~g$(2aZ@z0poIDfLbD3h&5Llg=_rUW9d-= zHU>Y-eXL8-PM+yZ{H~l#-oYMN{$W&0TkP=7`Y$!-irGh!R;mYhhjxo;L(3mnv&pv% zxN5!B^-dVcm0_NUTItzl8WsLHG|38Dhk+&dfok#hwCL+s+6To9i?qroG>4a4{1ykT zNMMQGrCORHK7C%cLznG3LTvV=q@MNix0Z%h6tD!zo^th2B~atd=MN^rVcWz8PFMFO z+`80C%sWmRzW__&F4ao#W7HZah&c#cOwSp0@az#(kPIcP2w^?x3&0Z6{cej){@%B( zr?1LRstz@MaKgwk1_J&vM8kd+b@c{|ndq z@1s)GyhA`5j_ZLX>P4;PwLL)TvGk&f)$u%ar90bIj1Q?EfL1WDrjT!Ba3%l0Sz}!? zdu!4?qwn;u&T-G36Vmne?R8k|D5xd1lv=Au)wbxUT6rYj;Bcc%Z|04S39o{nbsktE z;#5mVCy{y5YED7&{rrq+PCoa9pS)3o7EzOIk`pA)oT_7*6QEw?pLwyO{%%arg-fFX zz;ar{k!Ye5oL|WWei|9$>n=E$Mg!}%pbz;a&9sYS25MYS5%d$N>gzcf=gD$}BMLS47SM7#i6OMo?y zN3|}Vrq%3XD>AmR%Wen6oaH+nH#w8AB82sgz_{owx4+vW#^t;g)SAe;-=s8fw4Qa( z-YrjwspF&{;a^Ly1we^z;uum33PV00_A;N3y%2-Q-F_6gH=6&Z;-5PMyOC134HS)0YA9?T;W^17vLnak z;=-|HD}||6XsM0l5uy1F3oIX8vk#q@L-$=l99@nD-rsX(&81rD@4YUZk=`IS#kx?) zoiWAfmz!Nb0n1g7Q)~T}yHrbCL^ij%?M$@BJC~v!d-;72FE_v|fa?p6ML+X9)v|X} z%=8-$5_BL2w-}Wv%7@y<=&i?1f9^%70+US=!w= z0j)itR^tTMr~no7{FQsGWXr!8^W4ca=uxl`B4!d}SIw2%%tbN7G_DE4q>!eJ+=ljCyD=s9m zo?UgF11<7;K{PM&?KUn;M!ow?W6zSNHMFw9g3hGhwBmLW8X^{nZvyo_!}GO*mkIhJfz9My91D7zO^wM$N}Ygv3|xaQurie4gdvX(nJ zCx~X+NG!N&>0Y&ey!TGrBi@v>TGdbEpStFzIuTZcu)(k33cz!Re4Fh1EV5P!S&25G zmFKWZ>V8R-Z~&iNfacUR^|Q45M2|Q<90S%R;?BffE22~A%UjvV;4HzE)w9Q+>PNIo z60?@Hc93^gva>g+)~ZOyXDQ74`<`#o8L#HuzP`LLaR#)=?1&yR$@7eBT+Hx?$C!5V z;#$$yp2WY8HdeDy8iW?{j6*c~>`zpyiOfst{Q zKkd>!o>2jxZ9G8o^hfPfD{230-H?