From 547ab816ef57de02fa7734d05309180b618edc6e Mon Sep 17 00:00:00 2001 From: = Date: Mon, 22 Feb 2021 12:34:32 -0600 Subject: [PATCH] initial checkin --- hivemq-mqtt-client-1.0/bin/.gitignore | 2 + hivemq-mqtt-client-1.0/build.gradle | 30 +++++ .../client/internal/mqtt/MqttRxClient.class | Bin 0 -> 1231 bytes .../incoming/MqttIncomingPublishFlow.class | Bin 0 -> 5461 bytes .../outgoing/MqttIncomingAckFlowable.class | Bin 0 -> 2351 bytes .../publish/MqttPublishBuilder$Base.class | Bin 0 -> 1100 bytes .../publish/MqttPublishBuilder$Default.class | Bin 0 -> 828 bytes .../publish/MqttPublishBuilder$Send.class | Bin 0 -> 3903 bytes .../message/publish/MqttPublishBuilder.class | Bin 0 -> 2083 bytes .../hivemq/client/InboundWrapper.class | Bin 0 -> 2117 bytes .../hivemq/client/Mqtt5PublisherWrapper.class | Bin 0 -> 3771 bytes .../hivemq/client/OutboundWrapper.class | Bin 0 -> 3489 bytes .../hivemq/client/PublisherAdapter.class | Bin 0 -> 2270 bytes .../hivemq/client/SubscriberWrapper.class | Bin 0 -> 5184 bytes .../build/libs/hivemq-mqtt-client-1.0.jar | Bin 0 -> 17490 bytes .../compileJava/source-classes-mapping.txt | 21 ++++ .../build/tmp/jar/MANIFEST.MF | 7 ++ .../client/internal/mqtt/MqttRxClient.java | 21 ++++ .../incoming/MqttIncomingPublishFlow.java | 91 ++++++++++++++++ .../outgoing/MqttIncomingAckFlowable.java | 40 +++++++ .../message/publish/MqttPublishBuilder.java | 65 +++++++++++ .../hivemq/client/InboundWrapper.java | 40 +++++++ .../hivemq/client/Mqtt5PublisherWrapper.java | 98 +++++++++++++++++ .../hivemq/client/OutboundWrapper.java | 42 +++++++ .../hivemq/client/PublisherAdapter.java | 36 ++++++ .../hivemq/client/SubscriberWrapper.java | 75 +++++++++++++ hivemq-mqtt-client-1.1/bin/.gitignore | 2 + hivemq-mqtt-client-1.1/build.gradle | 30 +++++ .../client/internal/mqtt/MqttRxClient.class | Bin 0 -> 1231 bytes .../incoming/MqttIncomingPublishFlow.class | Bin 0 -> 5461 bytes .../publish/outgoing/MqttAckFlowable.class | Bin 0 -> 2327 bytes .../publish/MqttPublishBuilder$Base.class | Bin 0 -> 1100 bytes .../publish/MqttPublishBuilder$Default.class | Bin 0 -> 828 bytes .../publish/MqttPublishBuilder$Send.class | Bin 0 -> 3903 bytes .../message/publish/MqttPublishBuilder.class | Bin 0 -> 2083 bytes .../hivemq/client/InboundWrapper.class | Bin 0 -> 2117 bytes .../hivemq/client/OutboundWrapper.class | Bin 0 -> 3489 bytes .../hivemq/client/PublisherAdapter.class | Bin 0 -> 7975 bytes .../hivemq/client/SubscriberWrapper.class | Bin 0 -> 5184 bytes .../build/libs/hivemq-mqtt-client-1.1.jar | Bin 0 -> 17897 bytes .../compileJava/source-classes-mapping.txt | 19 ++++ .../build/tmp/jar/MANIFEST.MF | 7 ++ .../client/internal/mqtt/MqttRxClient.java | 21 ++++ .../incoming/MqttIncomingPublishFlow.java | 91 ++++++++++++++++ .../publish/outgoing/MqttAckFlowable.java | 40 +++++++ .../message/publish/MqttPublishBuilder.java | 65 +++++++++++ .../hivemq/client/InboundWrapper.java | 40 +++++++ .../hivemq/client/OutboundWrapper.java | 42 +++++++ .../hivemq/client/PublisherAdapter.java | 100 +++++++++++++++++ .../hivemq/client/SubscriberWrapper.java | 75 +++++++++++++ hivemq-mqtt-client-1.2/bin/.gitignore | 2 + hivemq-mqtt-client-1.2/build.gradle | 30 +++++ .../client/internal/mqtt/MqttRxClient.class | Bin 0 -> 1231 bytes .../incoming/MqttIncomingPublishFlow.class | Bin 0 -> 5501 bytes .../publish/outgoing/MqttAckFlowable.class | Bin 0 -> 2327 bytes .../publish/MqttPublishBuilder$Base.class | Bin 0 -> 1100 bytes .../publish/MqttPublishBuilder$Default.class | Bin 0 -> 828 bytes .../publish/MqttPublishBuilder$Send.class | Bin 0 -> 3903 bytes .../message/publish/MqttPublishBuilder.class | Bin 0 -> 2083 bytes .../hivemq/client/InboundWrapper.class | Bin 0 -> 2117 bytes .../hivemq/client/Mqtt5PublisherWrapper.class | Bin 0 -> 3865 bytes .../hivemq/client/OutboundWrapper.class | Bin 0 -> 3489 bytes .../hivemq/client/PublisherAdapter.class | Bin 0 -> 9388 bytes .../hivemq/client/SubscriberWrapper.class | Bin 0 -> 5184 bytes .../build/libs/hivemq-mqtt-client-1.2.jar | Bin 0 -> 19755 bytes .../compileJava/source-classes-mapping.txt | 21 ++++ .../build/tmp/jar/MANIFEST.MF | 7 ++ .../client/internal/mqtt/MqttRxClient.java | 21 ++++ .../incoming/MqttIncomingPublishFlow.java | 91 ++++++++++++++++ .../publish/outgoing/MqttAckFlowable.java | 40 +++++++ .../message/publish/MqttPublishBuilder.java | 65 +++++++++++ .../hivemq/client/InboundWrapper.java | 40 +++++++ .../hivemq/client/Mqtt5PublisherWrapper.java | 103 ++++++++++++++++++ .../hivemq/client/OutboundWrapper.java | 42 +++++++ .../hivemq/client/PublisherAdapter.java | 103 ++++++++++++++++++ .../hivemq/client/SubscriberWrapper.java | 75 +++++++++++++ settings.gradle | 3 + 77 files changed, 1743 insertions(+) create mode 100644 hivemq-mqtt-client-1.0/bin/.gitignore create mode 100644 hivemq-mqtt-client-1.0/build.gradle create mode 100644 hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/MqttRxClient.class create mode 100644 hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.class create mode 100644 hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttIncomingAckFlowable.class create mode 100644 hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Base.class create mode 100644 hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Default.class create mode 100644 hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Send.class create mode 100644 hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.class create mode 100644 hivemq-mqtt-client-1.0/build/classes/java/main/com/nr/instrumentation/hivemq/client/InboundWrapper.class create mode 100644 hivemq-mqtt-client-1.0/build/classes/java/main/com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.class create mode 100644 hivemq-mqtt-client-1.0/build/classes/java/main/com/nr/instrumentation/hivemq/client/OutboundWrapper.class create mode 100644 hivemq-mqtt-client-1.0/build/classes/java/main/com/nr/instrumentation/hivemq/client/PublisherAdapter.class create mode 100644 hivemq-mqtt-client-1.0/build/classes/java/main/com/nr/instrumentation/hivemq/client/SubscriberWrapper.class create mode 100644 hivemq-mqtt-client-1.0/build/libs/hivemq-mqtt-client-1.0.jar create mode 100644 hivemq-mqtt-client-1.0/build/tmp/compileJava/source-classes-mapping.txt create mode 100644 hivemq-mqtt-client-1.0/build/tmp/jar/MANIFEST.MF create mode 100644 hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/MqttRxClient.java create mode 100644 hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.java create mode 100644 hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttIncomingAckFlowable.java create mode 100644 hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.java create mode 100644 hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/InboundWrapper.java create mode 100644 hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.java create mode 100644 hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/OutboundWrapper.java create mode 100644 hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/PublisherAdapter.java create mode 100644 hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/SubscriberWrapper.java create mode 100644 hivemq-mqtt-client-1.1/bin/.gitignore create mode 100644 hivemq-mqtt-client-1.1/build.gradle create mode 100644 hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/MqttRxClient.class create mode 100644 hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.class create mode 100644 hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttAckFlowable.class create mode 100644 hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Base.class create mode 100644 hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Default.class create mode 100644 hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Send.class create mode 100644 hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.class create mode 100644 hivemq-mqtt-client-1.1/build/classes/java/main/com/nr/instrumentation/hivemq/client/InboundWrapper.class create mode 100644 hivemq-mqtt-client-1.1/build/classes/java/main/com/nr/instrumentation/hivemq/client/OutboundWrapper.class create mode 100644 hivemq-mqtt-client-1.1/build/classes/java/main/com/nr/instrumentation/hivemq/client/PublisherAdapter.class create mode 100644 hivemq-mqtt-client-1.1/build/classes/java/main/com/nr/instrumentation/hivemq/client/SubscriberWrapper.class create mode 100644 hivemq-mqtt-client-1.1/build/libs/hivemq-mqtt-client-1.1.jar create mode 100644 hivemq-mqtt-client-1.1/build/tmp/compileJava/source-classes-mapping.txt create mode 100644 hivemq-mqtt-client-1.1/build/tmp/jar/MANIFEST.MF create mode 100644 hivemq-mqtt-client-1.1/src/main/java/com/hivemq/client/internal/mqtt/MqttRxClient.java create mode 100644 hivemq-mqtt-client-1.1/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.java create mode 100644 hivemq-mqtt-client-1.1/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttAckFlowable.java create mode 100644 hivemq-mqtt-client-1.1/src/main/java/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.java create mode 100644 hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/InboundWrapper.java create mode 100644 hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/OutboundWrapper.java create mode 100644 hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/PublisherAdapter.java create mode 100644 hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/SubscriberWrapper.java create mode 100644 hivemq-mqtt-client-1.2/bin/.gitignore create mode 100644 hivemq-mqtt-client-1.2/build.gradle create mode 100644 hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/MqttRxClient.class create mode 100644 hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.class create mode 100644 hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttAckFlowable.class create mode 100644 hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Base.class create mode 100644 hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Default.class create mode 100644 hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Send.class create mode 100644 hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.class create mode 100644 hivemq-mqtt-client-1.2/build/classes/java/main/com/nr/instrumentation/hivemq/client/InboundWrapper.class create mode 100644 hivemq-mqtt-client-1.2/build/classes/java/main/com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.class create mode 100644 hivemq-mqtt-client-1.2/build/classes/java/main/com/nr/instrumentation/hivemq/client/OutboundWrapper.class create mode 100644 hivemq-mqtt-client-1.2/build/classes/java/main/com/nr/instrumentation/hivemq/client/PublisherAdapter.class create mode 100644 hivemq-mqtt-client-1.2/build/classes/java/main/com/nr/instrumentation/hivemq/client/SubscriberWrapper.class create mode 100644 hivemq-mqtt-client-1.2/build/libs/hivemq-mqtt-client-1.2.jar create mode 100644 hivemq-mqtt-client-1.2/build/tmp/compileJava/source-classes-mapping.txt create mode 100644 hivemq-mqtt-client-1.2/build/tmp/jar/MANIFEST.MF create mode 100644 hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/MqttRxClient.java create mode 100644 hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.java create mode 100644 hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttAckFlowable.java create mode 100644 hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.java create mode 100644 hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/InboundWrapper.java create mode 100644 hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.java create mode 100644 hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/OutboundWrapper.java create mode 100644 hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/PublisherAdapter.java create mode 100644 hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/SubscriberWrapper.java diff --git a/hivemq-mqtt-client-1.0/bin/.gitignore b/hivemq-mqtt-client-1.0/bin/.gitignore new file mode 100644 index 0000000..7eed456 --- /dev/null +++ b/hivemq-mqtt-client-1.0/bin/.gitignore @@ -0,0 +1,2 @@ +/main/ +/test/ diff --git a/hivemq-mqtt-client-1.0/build.gradle b/hivemq-mqtt-client-1.0/build.gradle new file mode 100644 index 0000000..4cb513f --- /dev/null +++ b/hivemq-mqtt-client-1.0/build.gradle @@ -0,0 +1,30 @@ + +// Build.gradle generated for instrumentation module hivemq-mqtt-client-1.0 + +apply plugin: 'java' + +dependencies { + implementation 'com.hivemq:hivemq-mqtt-client:1.0.0' + + // New Relic Java Agent dependencies + implementation 'com.newrelic.agent.java:newrelic-agent:6.0.0' + implementation 'com.newrelic.agent.java:newrelic-api:6.0.0' + implementation fileTree(include: ['*.jar'], dir: '../libs') +} + +jar { + manifest { + attributes 'Implementation-Title': 'com.newrelic.instrumentation.hivemq-mqtt-client-1.0' + attributes 'Implementation-Vendor': 'New Relic' + attributes 'Implementation-Vendor-Id': 'com.newrelic' + attributes 'Implementation-Version': 1.0 + } +} + +verifyInstrumentation { + // Verifier plugin documentation: + // https://github.com/newrelic/newrelic-gradle-verify-instrumentation + // Example: + // passes 'javax.servlet:servlet-api:[2.2,2.5]' + // exclude 'javax.servlet:servlet-api:2.4.public_draft' +} \ No newline at end of file diff --git a/hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/MqttRxClient.class b/hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/MqttRxClient.class new file mode 100644 index 0000000000000000000000000000000000000000..5b5042c68d866466d8082c1d0685d44938f8ae8d GIT binary patch literal 1231 zcmbtT&rcIU6#k|yU0I6=<%g)CC}@j@@gNsVNC*k1Dh3*i2M^O_Y=`X5mf6`B|0}$R z(ZqQ6k21cU7K2Dl410KQ=G*uCee>hzmu~=`W5vfc%zIeyk;A-?BJTOPk3|m;JUsNU z#86yUTGJXf28#tetGRzLOo%yrs51q5h8<)GRU($(dAQNjml1U<3k`F3yZLPiT_fp%S#zyy4 zOADJCn%K#Z)~=Rg$Xu=vbXO*6XkGbpyQ#J+lKU!Aw1iEqV=JtRH7$9;jYi9!k)aB> z=qOI3piMW72qg9H@5QMJ_fP z)}#?7a)n%A*;n7Ra zz8r{!@JU{$8z;?3kF1=6eRRJ|B#RCl!x)`QeFNOUINhjOOd#)^-;vG{R(|poxwogt ze?p=D86)3OJRvwwuAoer$t0c2F5FDtWe|>>>0g<`PLWkVRfbFxGDAoXv$#b%D`?K$ MZ##MCH+mQN1@Q`8V*mgE literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.class b/hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.class new file mode 100644 index 0000000000000000000000000000000000000000..db4de57b878c7a1df42acaa8eb854f4325ef7e7b GIT binary patch literal 5461 zcmc&&X;U1>8Gd?!9oQWtP$VoNN0+gL5NKm7_<~@g1q=$yAyyD6v7}*l%#JiWvznO& zDVL+%_kB6{X(w?mJGP`vs`AmP%J0b6{DD*|m8WNRVMk&(id5ypZud-gzsK|T`@G%r z_y7F)uK?bSN&*LwZ9yk4Br%VLB;JRM30%Va6ZimLkdK#}aV3GP&|0vFToQTcNxX<9 z1%(7!VI*-4*OM?&Ou&MjL9^cfa2LPp$HHg+w5t!Xn(w4ki6G`Vf!f4(q z)eybBiKByk>saIO5Bb-hD(bGwt-Km@>12Nu*nuHxZkaQdEX^xBjOjl%+m$=iwvMU) zk3Ai?tttJcComMGZaB-f3ZBf4xTCvelakg;zO4%KX{co61bWv2$d{7W$Tr**uAiz| zo3mx;JlUDjihep?)0VZAsWF}BJcn7$3A@U!?#wuLNq0O$XJQUUDUe$FQ(-mz7ecEk zFJ96d(v-kszMOUVG81e!CY@U@>N9e>PSSF@xOL9ca@R9jsmc}6oa<;goeP>Y_m-7w zV5tzye%ngh#ga*B0u9{~e8sj#9mjSA_IFRNd7mvf_KM^rpT7iyvv1u|3UKrrWpXcB zuKS#nC|C-_IRzgTXr?~R%IPLycFL>$#GGAra{8DdDe&P8QLFK09a){0#t1wb1yZ#x zEXeXeKO1Fa1x{`S&$MRD2mO)gsQ44!RPdIHJGiUj9&QWFNHfAZ!b`TOk~!!?sR(HRqZr0%rTOZBkc`54_o~pN2MZS6U9uV0n=D?H0Kt1WQ1&B zup07UCo^r8zj&IMuq@s2Q%(};<$A`c!VsCjQL4M5)G@=4N4Rm{5`pB@aAtJmN_Ki? zBE7*`^uBe}Fdm^{+t%`Qm=EI?Mp722IwZZw^YZ;R?g-G3)*ZSVk`;D0sJ;(XX>eTE z@~n1s-oEfZ*(ed>>DIIBaZMdjY@9BVb)MhuK8P@e#|*a@6wFU2=8yo9+%GxRHqy%^wA6W&8j4G`^qERtL}#NV@*@En_AoaMg^ z$7RZqSRM?p*b`u}k68Gj37g+Ru^_ApVQnX<9fY)#X2~!Gupg|NTUFjc*=brC=qgc{ zjMm{(_t3EweVsl8PtdI=8SJO9k4|>dy+d?R>g))_twMAdqZp&Is`gHHpT{^SNl#y6 zD>vSt)ciM`@dNdcVBGc#O!d8uy^QJsftR^8`?xD#MH^qLd@0coQ(-8ANIpj>hH2JW zYDhD7BLruZ(HWz`6EyUkZ{`ukVIOCVa!1SkJ-BM{AZMMc8k|Jz-{?{B-hUCxTK)`i zdLt%x60QtwoMO193D+#)JHJu5fXq&GU7)Uc>RO<#i_~>#BV7$NOD5;E?`e7u)SSX#fBK literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttIncomingAckFlowable.class b/hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttIncomingAckFlowable.class new file mode 100644 index 0000000000000000000000000000000000000000..e0bd0eb91fe70d1c817cc4b60fd79826b3d10c23 GIT binary patch literal 2351 zcmb_e+g1}-82)w$OiV_>Bc)PBP6h?WTCkR&HPF&plR$w5OYe4uZP+r|6X!tm8Ttf$ zf?oGZY1isyFZvXH5xe~NOp;P%I?L6DWM=Pw|A+5CZvOb|m)`&^;QKrZu=2QtPYbw> z&k96aEZ`14*N?jfzR1JCQXVBN8@OlSKEuGWR5GANrC5=!y9W@ zY`1Cc6Rr8&vK=W@U`Z7SPjSa;J`Vz`N{`j(VAWMmWur8+!;oEd_XNXWMJiDXn|0xB zYi$hYDz43)9qviJ?+~-WzVsP3Q*G^YwdV-WYK3)2`umm}1`SuLMg-!aBB-<}+Xp@L z1fj#*B{2*qc*^N8$Y;A&vjlN-D_rBB85b&=2dr?a8_*+d;@3hKXXu^%}i8^8>25rf+R^ z`Mjul@;y0^VJuC8fdvd#B8W<~J>f{(;w@=W(5PCs-28QU z@>bL+2EJryq($(5F|D&VvKgvCHpPzgCG~1qDL0M}wQ6#-J#GsfZSKERb{`EU#*p7~ zL(dj#Qcr+UT`DK^>ijc)$Qh=R^4J#qkXnCNze*-dJTOo;v4T|tUzzwCYX-hC@hu)w zoJ@R&MZBfiQKCxnjdWCGyhwMT=) zq$|u>_hduTEy!?z;_+@OOSlGoAL~yBB!biQK0~|5w9|djf8!O{&$Q^nAU*SR3|vGO z!x*B~Sj>d8I7d5T$9Y^JQN6l|OT;})YqLW+kB?|ILX-?XCLNbCO7hy=pS0_z_sVNz zj?l+&ge*gq)nuu3#KjF-@rF$Z-o3Si&UkVG3njkNjDPQS|&-iKH0mSRlzU!aYR) zv|Nk)UP6xaO+>Ni`l$IQ$;T-|VIuPe;|8YbYj(W8jv}2Dh+~F+H=f`oshlNJh9K#q J0V2->Zvi^mtpET3 literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Base.class b/hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Base.class new file mode 100644 index 0000000000000000000000000000000000000000..20172fac606e53383576629f82de2fc9534e09f2 GIT binary patch literal 1100 zcmb`G&2AGx49EYIgoG}EegG-uL*h`RQl!oW4m2U6TM1MtR28kld9ocfM!U1=>})EY zg{Ros+oT*z8Yx56=kJ7T;fsBgczMCF$jc3?ag^^&ZF316D%ATtb|&Or`l)nH zCh)L|9SW(lRS5lWwIj_o`f2WCy5z#W{nzI@{%xj4q5U&=ffE{V#$xOj=h9#Tr%voU zocH8t=E-ub%^hp;N<5sAnUdGH1)MffK{dh$g|Dk~Tj6R2Vv9TKzFi3iD9K-2JW7Tf zSYk~oJ+Fc4=RZ)7LX;3mtO*Tt@J?cLo>x(q46<}xVhNkrn&UQFg2necf@|`&WVVDo LG-O3ta088hY~uH@ literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Send.class b/hivemq-mqtt-client-1.0/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Send.class new file mode 100644 index 0000000000000000000000000000000000000000..126876948cf4159b85905910e673ddb7fd345ab0 GIT binary patch literal 3903 zcmb_fYg-dX6n-Z_)+Ae{)_c8HtX!0>_X?C20thw%lnB+f>LwY(+Rbj<3utfle)}`M zJgrLmJpIs*{ZW1T?rz{ou!~aokj%`^ocFwE&Y3f3{{H9pKLMP@4{7Yg>k2NWumgQ* zB+wu92GV!~gK4~px3*v?jbUU{7{O=;W4M&TI3_ZdhN2g=VBx7EmWFOFCIocU{S^6S}tdEZx+q_dHLlO4rpZQmgqz({SgtJU>oH{bAoQ%hKrxkoyI;)^vyRS=(~` zs&oVntZ9kBu4cLqYRi--H;dIkVY+{i)NZfEWZ>jR)b-a@q-KnYrF*_ZKa|$=;b!Oy z!@vzax}&ozvd+}4iZ)feD@z_tRu&z-Rtwy4J~YpA=vdct=o-t@!=P$*`;_k$ZQm-- zMRJ5ld3MbxP3qM!w8E$iby;pt9Gpcgda1BQ7kY(8sKjI#Y!!0;^Nm97gl=__(o>Ia7 zuW8cOca|zbf#x)-zmv4BRIpmpFUu{!PW~Li`$Gv zsV_)Jn+uwL6}xal;B0WN*Xwf?@8Z1x;C&T0aZAB%6*`IvN-D}Ax#T!AMgEF{J1QzL z6x>zu0Zau|6&7j=?x}F#DezS+;J$(fDn7(V3O-ix2|iWuP{n8XT)`JAzQk85zQ#8S zzE$xZjw|?H;L;|gqs>8z0;;7mIBi>fS2~Pi9x2ZVQs?k91EH)lkeSuoFlk8&buJg4wfD{TtcVJ1@$4uk2sCG-l}ypTI(sldIkIN* z6!RYF%w`*N*ou@E2J!P}6@r>Z(b1g;0((ZJ>lw_*ygmzb!bjuqj!fG}*y4vpMX$E-+Fj*j(#1m-x+j{Xg%iju`fhr3Xt*mCp}z$}uWTye6;6Kx!?` z&wgCs2wz$|S>Ssv@iRLu*vtRmWd$5XD~@3wd%L1Vco_#d z;&L3qVTvAUntNqs?kMLvI7(2Si5$m?8>st>Z7bWtA4pv9{uM2c(VAo1_6W&#t^L*` zDEaMMo*?xL(o4uBaAFB+0zFH3A%P`q6_|X2ZA)kuIJtxu6X@=Fgzdkfnxlmz^-(TK*Xf2qH~Yz;S%WO?Zy9vk zpgRWLWn`>~H$1chM&_DQ!dtev?+f3cIYx;h_k}_C5N!%oWz-Y6by;DwP^!3&wIlb1 zvu9OoDO6xd6$npp+j91Tz^d|q2k+{_x1OQ7rKhbqbvw@}75c*4@Z7ra0x5h(#S?

dV_7yA!Mbc z5J&hvuL-LjmTl?pG}g8e#l=wCRpDWQ!_5@fgqUWn1NeolVtx@MOWAh7@_LVqcomEu zwS~oKwJk9}c1~+b#hT(iK(`|;Mk(a%La>I_nqL=+4?Cf@pq?^@q7-e3BDv*xYmcB%CKUT`cC6um0 zZcjH9DskWmTUIPymlhHk*Y-g0ec@TJw9A_`MCS~;Z_+$HU^M@qx7?&bI)fZN+4ST0 z+N3m{MS*CA)B0L68vK1v0PidqUXYQf!qaxbto~%if zZ$?Aend3=FlXy4!@UC>>!|B43J{{O@d`KHY~ z`^JmidQS_J*0A*+lt@BMi<7jER3o+eW&}m8kOgDOjZmdB!90A01 zfT9Vy2>3q}U&3g;&hVtf<41@m{z5#76-UIsL`5sk-~cY;-xW}I(G;+vXqv7zdah9x bz852A;7{Qj!@=msJ_&2WpGK5|AE5s4KV(rE literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.0/build/classes/java/main/com/nr/instrumentation/hivemq/client/InboundWrapper.class b/hivemq-mqtt-client-1.0/build/classes/java/main/com/nr/instrumentation/hivemq/client/InboundWrapper.class new file mode 100644 index 0000000000000000000000000000000000000000..0126863f4282ebb5a56b2fd87dc3d0717d8e0fb6 GIT binary patch literal 2117 zcmbtVTUQ%Z6#h;!$>cH+4J8<_t(6)=%UBUaK(JOQXcDRciuJPAAxvRvG7}~fl%LXH z;A?eh6(3xE=<>mzDg-EQEL94P5M)TSI0ALr{#O?2I))R zcAZBeT6MPFwzG4?lTAiW-pO6dU$NwlFc6R5+9#;v(4rIMe zLYMo6+MBHn|JFZnu1aXTr0# zZ`aKdH7fd+CB53-vdidmz1d~0I~guNa&Lb8>4`4T=|I(&wXe#u8Q|+!(y^@L8V|a) zSf_V^(ZX0*RqJcds@pYFHf>Yxs?H2crpySKs=95jW-Z&QNrrk$JfSLTUi-7%+u)D-_JMTNUdY z@?mT@)jS28GspJ9n-Hd7S+i5a`JL?a=qV596Bxy<{kE*LK*N6zu>-H%C+J`^d}I>7 z8$KQay==Nq%DFz>a55xhTwbbHuUuOaIR7tZ3g`GAlL32=U#P*MjB-7MGnB*Jts%k> zkSYEIQ4~KSQXHrFj;aW9lv!x%m~sF~0u2&ogqmD<4bLIZow88yf}iK{LI^Gl+9Y_k zRr~>wBSZzt<3B^ITs%UIeW&HMBg6&nU`DNUf%{0z#`3WvBzYXq$1mMO>JCPfCQXf= z*MCDYuit}l_uD@oh`Yqr0+vOjxE`j=k;w=yk=HbtEt1U&`IPY@s(6JHeKugf0-gFa zwJ&isP5Cmvao)Q?tFwqH*4@~)n8;TdQ;KiQdA!D`GFZhZZ$xPi7~Qkic~+n%i|9j) w=or&c)GbxQG~gU2fERKp~6(rh4~ej2&~M%0E~b%3jhEB literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.0/build/classes/java/main/com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.class b/hivemq-mqtt-client-1.0/build/classes/java/main/com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.class new file mode 100644 index 0000000000000000000000000000000000000000..39e23365e030ab43b8c524c6c7f5e234b63de77a GIT binary patch literal 3771 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 LdI#@D^O?T^ps8wN literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.0/build/classes/java/main/com/nr/instrumentation/hivemq/client/SubscriberWrapper.class b/hivemq-mqtt-client-1.0/build/classes/java/main/com/nr/instrumentation/hivemq/client/SubscriberWrapper.class new file mode 100644 index 0000000000000000000000000000000000000000..b86d2257b0965dbd90128d6908e99d19c3b2d6ae GIT binary patch literal 5184 zcmb_giGLf#8GR$kUQ4@i96K=%UZV3<~+ERL@E&T)f-_X9X1?{CZ@u<9 zfPMIP3fu8W65H^oY93R~hf*++(UC>21yaZ3$gAOnBrKd#>rd+_pr~U9Y#k0tI(l$M zhYL^5`YkA@a2Ds1IFAcDp1_B7d;}lWaS@kvJc*}td<-8~%_o$Qr*%A|UU%SGh4xAH z^eNSRTEk~j6#Q8YpVRPp4bKU*slG< z4hbaZth{adWtYoyD=Z)0J(YEe=>=jH&!n>jOWJ0woR+r0mH^F`=UiE^vT3tqrMa7s^J<<8*I3@XYueu9j$4#D z0dZ15^JKorMT(qK<~rNw!W9H)9=2@DKPWKLw*s}HD6mkM{^J6PQ71)STCuykHFLh1Jw0uf0+B%kJg4Cc0#C2R_8oEL$`;cdyGBf4#|^bADXR=AI}4hv z_eSmtm(shAJtNQ4LSub_E~|-4C3s}jDAdUf;#?pMs9RD=Wu@R^Igl%tH>^yE^}Gn?kG1*hsikWI=OOI&Z_0om##OY;for+q~Xf~8;_N3-zv)E zmS-_^M{L^(!;`?#+3A{DNfnw*?}D9;^NbWsOUE8}UB?yZ>YG~9cYeWj&Z(>jJiFn# zGXg2c9(9VP0`(J!_bFd&s7E=PIVH1x0MRncV<*h%avfTA#f_qd`8vF62dm>NHRqJw ztUPR~-0!RfxLeKKJ&L`7yKut5PTXl=0D}hhAg$pm2EK}~Y52NHTczKib}_&$E1;fDr(gdZDt5btJ+8~6!+YTyO@jLtOhbNs@< zFYzmeMTkh}8u&GSr{P5dm+_K@mkqpvS2bKUP{Hpt{K3E<@h1&$82B^(qT#Ow{)WFB zxTe(p2mYzyUj|0;J_BzmNpqMta2zKD9$e)OpisvI?hVfFn?4o=+LnSVbUGvT#+RJH zrihCoINJs8zhz1d>V&x|kdBZRm5>5kBX-QlbH~)x$U8kR{SkFH^4ja`k4pJq1tT?lTW#*~hI@x#&lajLRXus!bwr1>WLt5pz4}iy+{lm3}Z%4%jsjH;hfYnGhtZurFmi>%VwsRBG%&|PFqx;T8N)-OB z5R1YhF{hCR%cDbOtH2W8jC9&Ew4s}KS|EZ%_TOwkR&{I2ggWl69u3!t{-}VV)GZNG zYe#>ZD@%^+k9gzfS$W!KK^;QNPUl*BF0QEsfEN^eacR?tYr`umD|6G*UvM~bXSB+^ zjcN<2=C%km>zA=|lIKg7E78NR>Fwax3KEE^0*=pptZ`%L=O1f1KBrWH7L2j1W3O?| zUAUX`_wemMi1QaXGVm(IfOrKl)x=ek7#LKqyVUDdG*!^duSczdmKdwE#API(M@Ql% zBrhX1a0Pk=Mhq_!DuKOh_dsWR8{gWIL zo6pnnk5F|Ya zy@fdqQyQi<%(UVtM|JL<<=;amaf}@+a<<9^HldUYdX%ZIp|bO5B>UH!lm7$LI@8+# literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.0/build/libs/hivemq-mqtt-client-1.0.jar b/hivemq-mqtt-client-1.0/build/libs/hivemq-mqtt-client-1.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..c52915f154088e92c4515ac72ceec1df0b331eaa GIT binary patch literal 17490 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 literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.0/build/tmp/compileJava/source-classes-mapping.txt b/hivemq-mqtt-client-1.0/build/tmp/compileJava/source-classes-mapping.txt new file mode 100644 index 0000000..5fbe9ee --- /dev/null +++ b/hivemq-mqtt-client-1.0/build/tmp/compileJava/source-classes-mapping.txt @@ -0,0 +1,21 @@ +com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.java + com.nr.instrumentation.hivemq.client.Mqtt5PublisherWrapper +com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.java + com.hivemq.client.internal.mqtt.message.publish.MqttPublishBuilder + com.hivemq.client.internal.mqtt.message.publish.MqttPublishBuilder$Base + com.hivemq.client.internal.mqtt.message.publish.MqttPublishBuilder$Default + com.hivemq.client.internal.mqtt.message.publish.MqttPublishBuilder$Send +com/nr/instrumentation/hivemq/client/OutboundWrapper.java + com.nr.instrumentation.hivemq.client.OutboundWrapper +com/nr/instrumentation/hivemq/client/PublisherAdapter.java + com.nr.instrumentation.hivemq.client.PublisherAdapter +com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.java + com.hivemq.client.internal.mqtt.handler.publish.incoming.MqttIncomingPublishFlow +com/nr/instrumentation/hivemq/client/SubscriberWrapper.java + com.nr.instrumentation.hivemq.client.SubscriberWrapper +com/hivemq/client/internal/mqtt/MqttRxClient.java + com.hivemq.client.internal.mqtt.MqttRxClient +com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttIncomingAckFlowable.java + com.hivemq.client.internal.mqtt.handler.publish.outgoing.MqttIncomingAckFlowable +com/nr/instrumentation/hivemq/client/InboundWrapper.java + com.nr.instrumentation.hivemq.client.InboundWrapper diff --git a/hivemq-mqtt-client-1.0/build/tmp/jar/MANIFEST.MF b/hivemq-mqtt-client-1.0/build/tmp/jar/MANIFEST.MF new file mode 100644 index 0000000..464f199 --- /dev/null +++ b/hivemq-mqtt-client-1.0/build/tmp/jar/MANIFEST.MF @@ -0,0 +1,7 @@ +Manifest-Version: 1.0 +Implementation-Title: com.newrelic.instrumentation.hivemq-mqtt-client- + 1.0 +Implementation-Version: 1.0 +Implementation-Vendor-Id: com.newrelic +Implementation-Vendor: New Relic + diff --git a/hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/MqttRxClient.java b/hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/MqttRxClient.java new file mode 100644 index 0000000..45b78cf --- /dev/null +++ b/hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/MqttRxClient.java @@ -0,0 +1,21 @@ +package com.hivemq.client.internal.mqtt; + +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PublishResult; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.instrumentation.hivemq.client.PublisherAdapter; + +import io.reactivex.Flowable; + +@Weave +public abstract class MqttRxClient { + + @Trace + public Flowable publish(Flowable publishFlowable) { + + publishFlowable = publishFlowable.map(new PublisherAdapter()); + return Weaver.callOriginal(); + } +} diff --git a/hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.java b/hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.java new file mode 100644 index 0000000..a869f07 --- /dev/null +++ b/hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.java @@ -0,0 +1,91 @@ +package com.hivemq.client.internal.mqtt.handler.publish.incoming; + +import org.reactivestreams.Subscriber; + +import com.hivemq.client.internal.mqtt.MqttClientConfig; +import com.hivemq.client.internal.mqtt.handler.util.FlowWithEventLoop; +import com.hivemq.client.mqtt.datatypes.MqttTopic; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperties; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish; +import com.newrelic.api.agent.DestinationType; +import com.newrelic.api.agent.MessageConsumeParameters; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.NewField; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.instrumentation.hivemq.client.InboundWrapper; + +@Weave(type=MatchType.BaseClass) +public abstract class MqttIncomingPublishFlow extends FlowWithEventLoop { + + @NewField + private Token token = null; + + MqttIncomingPublishFlow(final Subscriber subscriber, final MqttClientConfig clientConfig,final MqttIncomingQosHandler incomingQosHandler) { + super(clientConfig); + } + + @Trace(async=true) + public void onNext(Mqtt5Publish result) { + if(token !=null) { + token.link(); + } + MqttTopic topic = result.getTopic(); + String topicName = topic.toString().replace('/', '_'); //Utils.getTopicName(topic); + Mqtt5UserProperties userProperties = result.getUserProperties(); + MessageConsumeParameters params = MessageConsumeParameters.library("HiveMQ").destinationType(DestinationType.NAMED_TOPIC).destinationName(topicName).inboundHeaders(new InboundWrapper(userProperties)).build(); + + NewRelic.getAgent().getTracedMethod().reportAsExternal(params); + Weaver.callOriginal(); + } + + public void onComplete() { + if(token != null) { + token.expire(); + token = null; + } + Weaver.callOriginal(); + } + + public void onError(Throwable t) { + NewRelic.noticeError(t); + if(token != null) { + token.expire(); + token = null; + } + Weaver.callOriginal(); + } + + @Trace + public void request(long n) { + if(token == null) { + Token t = NewRelic.getAgent().getTransaction().getToken(); + if(t != null && t.isActive()) { + token = t; + } else if(t != null) { + t.expire(); + t = null; + } + } + Weaver.callOriginal(); + } + + protected void onCancel() { + if(token != null) { + token.expire(); + token = null; + } + Weaver.callOriginal(); + } + + void runCancel() { + if(token != null) { + token.expire(); + token = null; + } + Weaver.callOriginal(); + } +} diff --git a/hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttIncomingAckFlowable.java b/hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttIncomingAckFlowable.java new file mode 100644 index 0000000..75ad42a --- /dev/null +++ b/hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttIncomingAckFlowable.java @@ -0,0 +1,40 @@ +package com.hivemq.client.internal.mqtt.handler.publish.outgoing; + +import org.reactivestreams.Subscriber; + +import com.hivemq.client.internal.mqtt.MqttClientConfig; +import com.hivemq.client.internal.mqtt.message.publish.MqttPublish; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PublishResult; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.instrumentation.hivemq.client.SubscriberWrapper; + +import io.reactivex.Flowable; + +@Weave +public class MqttIncomingAckFlowable { + + + public MqttIncomingAckFlowable(Flowable publishFlowable, MqttClientConfig clientConfig) { + + } + + @Trace(async=true) + protected void subscribeActual(Subscriber subscriber) { + Token t = NewRelic.getAgent().getTransaction().getToken(); + Token token = null; + if(t != null && t.isActive()) { + token = t; + } else if(t != null) { + t.expire(); + t = null; + } + SubscriberWrapper wrapper = new SubscriberWrapper(subscriber, token); + subscriber = wrapper; + Weaver.callOriginal(); + + } +} diff --git a/hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.java b/hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.java new file mode 100644 index 0000000..d2423ce --- /dev/null +++ b/hivemq-mqtt-client-1.0/src/main/java/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.java @@ -0,0 +1,65 @@ +package com.hivemq.client.internal.mqtt.message.publish; + +import java.util.function.Function; + +import com.hivemq.client.internal.mqtt.datatypes.MqttTopicImpl; +import com.hivemq.client.internal.mqtt.datatypes.MqttUserPropertiesImpl; +import com.newrelic.api.agent.DestinationType; +import com.newrelic.api.agent.MessageProduceParameters; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.instrumentation.hivemq.client.OutboundWrapper; + +@Weave +public class MqttPublishBuilder> { + + MqttTopicImpl topic = Weaver.callOriginal(); + + MqttUserPropertiesImpl userProperties = Weaver.callOriginal(); + + MqttPublishBuilder() {} + + MqttPublishBuilder(MqttPublish publish) { + + } + + MqttPublishBuilder(MqttPublishBuilder publishBuilder) { + + } + + @Weave + public static class Send

extends Base> { + + public Send(Function parentConsumer) { + + } + + @Trace(leaf=true) + public P send() { + OutboundWrapper wrapper = new OutboundWrapper(userProperties); + String topicName = topic.toString().replace('/', '_'); + MessageProduceParameters params = MessageProduceParameters.library("HiveMQ").destinationType(DestinationType.NAMED_TOPIC).destinationName(topicName).outboundHeaders(wrapper).build(); + NewRelic.getAgent().getTracedMethod().reportAsExternal(params); + userProperties = wrapper.getCurrent(); + return Weaver.callOriginal(); + } + } + + @Weave + private static class Base> extends MqttPublishBuilder { + + Base() {} + + @SuppressWarnings("unused") + Base(MqttPublish publish) { + super(publish); + } + } + + @Weave + public static class Default extends Base { + + } +} diff --git a/hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/InboundWrapper.java b/hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/InboundWrapper.java new file mode 100644 index 0000000..7cce04d --- /dev/null +++ b/hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/InboundWrapper.java @@ -0,0 +1,40 @@ +package com.nr.instrumentation.hivemq.client; + +import java.util.List; + +import com.hivemq.client.mqtt.datatypes.MqttUtf8String; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperties; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperty; +import com.newrelic.api.agent.HeaderType; +import com.newrelic.api.agent.InboundHeaders; + +public class InboundWrapper implements InboundHeaders { + + Mqtt5UserProperties userProperties = null; + + public InboundWrapper(Mqtt5UserProperties userProperties) { + this.userProperties = userProperties; + } + + @Override + public String getHeader(String name) { + List list = userProperties.asList(); + MqttUtf8String searchFor = MqttUtf8String.of(name); + for(Mqtt5UserProperty property : list) { + MqttUtf8String propertyName = property.getName(); + if(propertyName.equals(searchFor)) { + MqttUtf8String value = property.getValue(); + if(value != null) { + return value.toString(); + } + } + } + return null; + } + + @Override + public HeaderType getHeaderType() { + return HeaderType.MESSAGE; + } + +} diff --git a/hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.java b/hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.java new file mode 100644 index 0000000..5c627be --- /dev/null +++ b/hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.java @@ -0,0 +1,98 @@ +package com.nr.instrumentation.hivemq.client; + +import java.nio.ByteBuffer; +import java.util.Optional; +import java.util.OptionalLong; + +import com.hivemq.client.internal.mqtt.datatypes.MqttUserPropertiesImpl; +import com.hivemq.client.mqtt.datatypes.MqttQos; +import com.hivemq.client.mqtt.datatypes.MqttTopic; +import com.hivemq.client.mqtt.datatypes.MqttUtf8String; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperties; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PayloadFormatIndicator; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PublishBuilder.Complete; +import com.newrelic.api.agent.NewRelic; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5WillPublish; + +public class Mqtt5PublisherWrapper implements Mqtt5Publish { + + private Mqtt5Publish delegate = null; + + public Mqtt5PublisherWrapper(Mqtt5Publish p) { + delegate = p; + } + + @Override + public MqttTopic getTopic() { + return delegate.getTopic(); + } + + @Override + public Optional getPayload() { + return delegate.getPayload(); + } + + @Override + public byte[] getPayloadAsBytes() { + return delegate.getPayloadAsBytes(); + } + + @Override + public MqttQos getQos() { + return delegate.getQos(); + } + + @Override + public boolean isRetain() { + return delegate.isRetain(); + } + + @Override + public OptionalLong getMessageExpiryInterval() { + return delegate.getMessageExpiryInterval(); + } + + @Override + public Optional getPayloadFormatIndicator() { + return delegate.getPayloadFormatIndicator(); + } + + @Override + public Optional getContentType() { + return delegate.getContentType(); + } + + @Override + public Optional getResponseTopic() { + return delegate.getResponseTopic(); + } + + @Override + public Optional getCorrelationData() { + return delegate.getCorrelationData(); + } + + @Override + public Mqtt5UserProperties getUserProperties() { + Mqtt5UserProperties props = delegate.getUserProperties(); + if(props instanceof MqttUserPropertiesImpl) { + MqttUserPropertiesImpl propsImpl = (MqttUserPropertiesImpl)props; + OutboundWrapper wrapper = new OutboundWrapper(propsImpl); + NewRelic.getAgent().getTracedMethod().addOutboundRequestHeaders(wrapper); + return wrapper.getCurrent(); + } + return props; + } + + @Override + public Mqtt5WillPublish asWill() { + return delegate.asWill(); + } + + @Override + public Complete extend() { + return delegate.extend(); + } + +} diff --git a/hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/OutboundWrapper.java b/hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/OutboundWrapper.java new file mode 100644 index 0000000..994739c --- /dev/null +++ b/hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/OutboundWrapper.java @@ -0,0 +1,42 @@ +package com.nr.instrumentation.hivemq.client; + +import java.util.logging.Level; + +import com.hivemq.client.internal.mqtt.datatypes.MqttUserPropertiesImpl; +import com.hivemq.client.internal.mqtt.datatypes.MqttUserPropertyImpl; +import com.hivemq.client.internal.mqtt.datatypes.MqttUtf8StringImpl; +import com.hivemq.client.internal.util.collections.ImmutableList; +import com.hivemq.client.internal.util.collections.ImmutableList.Builder; +import com.newrelic.api.agent.HeaderType; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.OutboundHeaders; + +public class OutboundWrapper implements OutboundHeaders { + + MqttUserPropertiesImpl userProperties = null; + + public OutboundWrapper(MqttUserPropertiesImpl up) { + userProperties = up; + } + + @Override + public HeaderType getHeaderType() { + return HeaderType.MESSAGE; + } + + @Override + public void setHeader(String name, String value) { + MqttUtf8StringImpl nameStr = MqttUtf8StringImpl.of(name); + MqttUtf8StringImpl valueStr = MqttUtf8StringImpl.of(value); + MqttUserPropertyImpl property = new MqttUserPropertyImpl(nameStr, valueStr); + + Builder builder = ImmutableList.builder(); + ImmutableList list = builder.addAll(userProperties.asList()).add(property).build(); + userProperties = MqttUserPropertiesImpl.of(list); + NewRelic.getAgent().getLogger().log(Level.INFO,"Set outbound headers to: {0}",userProperties); + } + + public MqttUserPropertiesImpl getCurrent() { + return userProperties; + } +} diff --git a/hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/PublisherAdapter.java b/hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/PublisherAdapter.java new file mode 100644 index 0000000..a3210aa --- /dev/null +++ b/hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/PublisherAdapter.java @@ -0,0 +1,36 @@ +package com.nr.instrumentation.hivemq.client; + +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish; +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; + +import io.reactivex.functions.Function; + +public class PublisherAdapter implements Function { + + + private static boolean isTransformed = false; + + private Token token = null; + + public PublisherAdapter() { + token = NewRelic.getAgent().getTransaction().getToken(); + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace(async=true) + public Mqtt5Publish apply(Mqtt5Publish source) throws Exception { + if(token != null) { + token.linkAndExpire(); + token = null; + } + return new Mqtt5PublisherWrapper(source); + } + +} diff --git a/hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/SubscriberWrapper.java b/hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/SubscriberWrapper.java new file mode 100644 index 0000000..86acb42 --- /dev/null +++ b/hivemq-mqtt-client-1.0/src/main/java/com/nr/instrumentation/hivemq/client/SubscriberWrapper.java @@ -0,0 +1,75 @@ +package com.nr.instrumentation.hivemq.client; + +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; + +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PublishResult; +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.DestinationType; +import com.newrelic.api.agent.MessageProduceParameters; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Segment; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; + +public class SubscriberWrapper implements Subscriber { + + private Subscriber delegate = null; + private Token token = null; + private static boolean isTransformed = false; + private Segment segment = null; + + public SubscriberWrapper(Subscriber d, Token t) { + delegate = d; + token = t; + segment = NewRelic.getAgent().getTransaction().startSegment("HiveMQ-Publish"); + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + public void onSubscribe(Subscription s) { + delegate.onSubscribe(s); + } + + @Override + @Trace(async=true) + public void onNext(Mqtt5PublishResult t) { + if(token != null) { + token.link(); + } + Mqtt5Publish result = t.getPublish(); + String topicName = result.getTopic().toString(); + MessageProduceParameters params = MessageProduceParameters.library("HiveMQ").destinationType(DestinationType.NAMED_TOPIC).destinationName(topicName).outboundHeaders(null).build(); + if(segment != null) { + segment.reportAsExternal(params); + segment.end(); + segment = null; + } else { + NewRelic.getAgent().getTracedMethod().reportAsExternal(params); + } + delegate.onNext(t); + } + + @Override + public void onError(Throwable t) { + if(token != null) { + token.expire(); + token = null; + } + delegate.onError(t); + } + + @Override + public void onComplete() { + if(token != null) { + token.expire(); + token = null; + } + delegate.onComplete(); + } + +} diff --git a/hivemq-mqtt-client-1.1/bin/.gitignore b/hivemq-mqtt-client-1.1/bin/.gitignore new file mode 100644 index 0000000..7eed456 --- /dev/null +++ b/hivemq-mqtt-client-1.1/bin/.gitignore @@ -0,0 +1,2 @@ +/main/ +/test/ diff --git a/hivemq-mqtt-client-1.1/build.gradle b/hivemq-mqtt-client-1.1/build.gradle new file mode 100644 index 0000000..d341feb --- /dev/null +++ b/hivemq-mqtt-client-1.1/build.gradle @@ -0,0 +1,30 @@ + +// Build.gradle generated for instrumentation module hivemq-mqtt-client-1.1 + +apply plugin: 'java' + +dependencies { + implementation 'com.hivemq:hivemq-mqtt-client:1.1.0' + + // New Relic Java Agent dependencies + implementation 'com.newrelic.agent.java:newrelic-agent:6.0.0' + implementation 'com.newrelic.agent.java:newrelic-api:6.0.0' + implementation fileTree(include: ['*.jar'], dir: '../libs') +} + +jar { + manifest { + attributes 'Implementation-Title': 'com.newrelic.instrumentation.hivemq-mqtt-client-1.1' + attributes 'Implementation-Vendor': 'New Relic' + attributes 'Implementation-Vendor-Id': 'com.newrelic' + attributes 'Implementation-Version': 1.0 + } +} + +verifyInstrumentation { + // Verifier plugin documentation: + // https://github.com/newrelic/newrelic-gradle-verify-instrumentation + // Example: + // passes 'javax.servlet:servlet-api:[2.2,2.5]' + // exclude 'javax.servlet:servlet-api:2.4.public_draft' +} \ No newline at end of file diff --git a/hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/MqttRxClient.class b/hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/MqttRxClient.class new file mode 100644 index 0000000000000000000000000000000000000000..5b5042c68d866466d8082c1d0685d44938f8ae8d GIT binary patch literal 1231 zcmbtT&rcIU6#k|yU0I6=<%g)CC}@j@@gNsVNC*k1Dh3*i2M^O_Y=`X5mf6`B|0}$R z(ZqQ6k21cU7K2Dl410KQ=G*uCee>hzmu~=`W5vfc%zIeyk;A-?BJTOPk3|m;JUsNU z#86yUTGJXf28#tetGRzLOo%yrs51q5h8<)GRU($(dAQNjml1U<3k`F3yZLPiT_fp%S#zyy4 zOADJCn%K#Z)~=Rg$Xu=vbXO*6XkGbpyQ#J+lKU!Aw1iEqV=JtRH7$9;jYi9!k)aB> z=qOI3piMW72qg9H@5QMJ_fP z)}#?7a)n%A*;n7Ra zz8r{!@JU{$8z;?3kF1=6eRRJ|B#RCl!x)`QeFNOUINhjOOd#)^-;vG{R(|poxwogt ze?p=D86)3OJRvwwuAoer$t0c2F5FDtWe|>>>0g<`PLWkVRfbFxGDAoXv$#b%D`?K$ MZ##MCH+mQN1@Q`8V*mgE literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.class b/hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.class new file mode 100644 index 0000000000000000000000000000000000000000..db4de57b878c7a1df42acaa8eb854f4325ef7e7b GIT binary patch literal 5461 zcmc&&X;U1>8Gd?!9oQWtP$VoNN0+gL5NKm7_<~@g1q=$yAyyD6v7}*l%#JiWvznO& zDVL+%_kB6{X(w?mJGP`vs`AmP%J0b6{DD*|m8WNRVMk&(id5ypZud-gzsK|T`@G%r z_y7F)uK?bSN&*LwZ9yk4Br%VLB;JRM30%Va6ZimLkdK#}aV3GP&|0vFToQTcNxX<9 z1%(7!VI*-4*OM?&Ou&MjL9^cfa2LPp$HHg+w5t!Xn(w4ki6G`Vf!f4(q z)eybBiKByk>saIO5Bb-hD(bGwt-Km@>12Nu*nuHxZkaQdEX^xBjOjl%+m$=iwvMU) zk3Ai?tttJcComMGZaB-f3ZBf4xTCvelakg;zO4%KX{co61bWv2$d{7W$Tr**uAiz| zo3mx;JlUDjihep?)0VZAsWF}BJcn7$3A@U!?#wuLNq0O$XJQUUDUe$FQ(-mz7ecEk zFJ96d(v-kszMOUVG81e!CY@U@>N9e>PSSF@xOL9ca@R9jsmc}6oa<;goeP>Y_m-7w zV5tzye%ngh#ga*B0u9{~e8sj#9mjSA_IFRNd7mvf_KM^rpT7iyvv1u|3UKrrWpXcB zuKS#nC|C-_IRzgTXr?~R%IPLycFL>$#GGAra{8DdDe&P8QLFK09a){0#t1wb1yZ#x zEXeXeKO1Fa1x{`S&$MRD2mO)gsQ44!RPdIHJGiUj9&QWFNHfAZ!b`TOk~!!?sR(HRqZr0%rTOZBkc`54_o~pN2MZS6U9uV0n=D?H0Kt1WQ1&B zup07UCo^r8zj&IMuq@s2Q%(};<$A`c!VsCjQL4M5)G@=4N4Rm{5`pB@aAtJmN_Ki? zBE7*`^uBe}Fdm^{+t%`Qm=EI?Mp722IwZZw^YZ;R?g-G3)*ZSVk`;D0sJ;(XX>eTE z@~n1s-oEfZ*(ed>>DIIBaZMdjY@9BVb)MhuK8P@e#|*a@6wFU2=8yo9+%GxRHqy%^wA6W&8j4G`^qERtL}#NV@*@En_AoaMg^ z$7RZqSRM?p*b`u}k68Gj37g+Ru^_ApVQnX<9fY)#X2~!Gupg|NTUFjc*=brC=qgc{ zjMm{(_t3EweVsl8PtdI=8SJO9k4|>dy+d?R>g))_twMAdqZp&Is`gHHpT{^SNl#y6 zD>vSt)ciM`@dNdcVBGc#O!d8uy^QJsftR^8`?xD#MH^qLd@0coQ(-8ANIpj>hH2JW zYDhD7BLruZ(HWz`6EyUkZ{`ukVIOCVa!1SkJ-BM{AZMMc8k|Jz-{?{B-hUCxTK)`i zdLt%x60QtwoMO193D+#)JHJu5fXq&GU7)Uc>RO<#i_~>#BV7$NOD5;E?`e7u)SSX#fBK literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttAckFlowable.class b/hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttAckFlowable.class new file mode 100644 index 0000000000000000000000000000000000000000..4fb980f4bcfe00bf7cd9a5727ea497939f5d9dfe GIT binary patch literal 2327 zcmb_eZC4XV6n-WIHYTg!E2UCJ-V6$CYr$HAwt-50NrD0gj((dg(`96{8+T`k{)Ya7 z{(^q)C#5~7AN!%dqJPAm-q}r3v~1HJO|r8yckaFO+}FwPfByU{fCW6xqW~+9Pw`m+ zH}H9ZXp05h#20$FW#G#^3@qhQ!m@$e2JSEnEK5%+npBDv+izHV@<246Ted5Or!46y z5qR9S8qbxosx+*|8>_zeopeeS>05!|wj!Yy)|%_Lc-UEo#ReLgIc+eBV9`|-#5m?Qr?#gh_@+0N=(sN>LWqZGifx%2{ zNT4#@=&Ac3<`Mk%IUThO!zng1TzK2Cm(7lG+sBJ6_XN}sVaOfPHC6+Blo(#RQ(`!= zDIJfiC?L0f|G~odzPNPs2g9fy+JUT#vaKTSGE5XJe&BSoB~+9*jnLZc@C9+!X- zlD_v&_WuoTCy^v&yFEZH&m9xixO()kXdM^R#dc6PL>Rd$4(-WJ#qIqnZ^i{;;422F zmj^${(K>n~8H)O!7yuqkUtV~iWYo$L%bN2s#Sb}EvDK^pV44V*_7!x*C3Si*$U zI72I9$61^sQ9V143&cH4bF)kNh$tgO$>3wsaS@{=uaEnKR{iu|d5z2=`WOz8WvH^+ z>~A`1oq8Ygx%)@+P*J~r$k=^rJm zpV0Rb#&H?bgnEt)w=jVvOyV}CP{!5Ro`nQO*PfMFijj^5k{l!4L-gn5N^JKMa-?q} z_C?1=%|A)jP7w+dnKu|WFik(RZS_?YX{SIOGxS`0itD6umPi?bq_+l$JP-T@{NSTc literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Base.class b/hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Base.class new file mode 100644 index 0000000000000000000000000000000000000000..20172fac606e53383576629f82de2fc9534e09f2 GIT binary patch literal 1100 zcmb`G&2AGx49EYIgoG}EegG-uL*h`RQl!oW4m2U6TM1MtR28kld9ocfM!U1=>})EY zg{Ros+oT*z8Yx56=kJ7T;fsBgczMCF$jc3?ag^^&ZF316D%ATtb|&Or`l)nH zCh)L|9SW(lRS5lWwIj_o`f2WCy5z#W{nzI@{%xj4q5U&=ffE{V#$xOj=h9#Tr%voU zocH8t=E-ub%^hp;N<5sAnUdGH1)MffK{dh$g|Dk~Tj6R2Vv9TKzFi3iD9K-2JW7Tf zSYk~oJ+Fc4=RZ)7LX;3mtO*Tt@J?cLo>x(q46<}xVhNkrn&UQFg2necf@|`&WVVDo LG-O3ta088hY~uH@ literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Send.class b/hivemq-mqtt-client-1.1/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Send.class new file mode 100644 index 0000000000000000000000000000000000000000..126876948cf4159b85905910e673ddb7fd345ab0 GIT binary patch literal 3903 zcmb_fYg-dX6n-Z_)+Ae{)_c8HtX!0>_X?C20thw%lnB+f>LwY(+Rbj<3utfle)}`M zJgrLmJpIs*{ZW1T?rz{ou!~aokj%`^ocFwE&Y3f3{{H9pKLMP@4{7Yg>k2NWumgQ* zB+wu92GV!~gK4~px3*v?jbUU{7{O=;W4M&TI3_ZdhN2g=VBx7EmWFOFCIocU{S^6S}tdEZx+q_dHLlO4rpZQmgqz({SgtJU>oH{bAoQ%hKrxkoyI;)^vyRS=(~` zs&oVntZ9kBu4cLqYRi--H;dIkVY+{i)NZfEWZ>jR)b-a@q-KnYrF*_ZKa|$=;b!Oy z!@vzax}&ozvd+}4iZ)feD@z_tRu&z-Rtwy4J~YpA=vdct=o-t@!=P$*`;_k$ZQm-- zMRJ5ld3MbxP3qM!w8E$iby;pt9Gpcgda1BQ7kY(8sKjI#Y!!0;^Nm97gl=__(o>Ia7 zuW8cOca|zbf#x)-zmv4BRIpmpFUu{!PW~Li`$Gv zsV_)Jn+uwL6}xal;B0WN*Xwf?@8Z1x;C&T0aZAB%6*`IvN-D}Ax#T!AMgEF{J1QzL z6x>zu0Zau|6&7j=?x}F#DezS+;J$(fDn7(V3O-ix2|iWuP{n8XT)`JAzQk85zQ#8S zzE$xZjw|?H;L;|gqs>8z0;;7mIBi>fS2~Pi9x2ZVQs?k91EH)lkeSuoFlk8&buJg4wfD{TtcVJ1@$4uk2sCG-l}ypTI(sldIkIN* z6!RYF%w`*N*ou@E2J!P}6@r>Z(b1g;0((ZJ>lw_*ygmzb!bjuqj!fG}*y4vpMX$E-+Fj*j(#1m-x+j{Xg%iju`fhr3Xt*mCp}z$}uWTye6;6Kx!?` z&wgCs2wz$|S>Ssv@iRLu*vtRmWd$5XD~@3wd%L1Vco_#d z;&L3qVTvAUntNqs?kMLvI7(2Si5$m?8>st>Z7bWtA4pv9{uM2c(VAo1_6W&#t^L*` zDEaMMo*?xL(o4uBaAFB+0zFH3A%P`q6_|X2ZA)kuIJtxu6X@=Fgzdkfnxlmz^-(TK*Xf2qH~Yz;S%WO?Zy9vk zpgRWLWn`>~H$1chM&_DQ!dtev?+f3cIYx;h_k}_C5N!%oWz-Y6by;DwP^!3&wIlb1 zvu9OoDO6xd6$npp+j91Tz^d|q2k+{_x1OQ7rKhbqbvw@}75c*4@Z7ra0x5h(#S?

dV_7yA!Mbc z5J&hvuL-LjmTl?pG}g8e#l=wCRpDWQ!_5@fgqUWn1NeolVtx@MOWAh7@_LVqcomEu zwS~oKwJk9}c1~+b#hT(iK(`|;Mk(a%La>I_nqL=+4?Cf@pq?^@q7-e3BDv*xYmcB%CKUT`cC6um0 zZcjH9DskWmTUIPymlhHk*Y-g0ec@TJw9A_`MCS~;Z_+$HU^M@qx7?&bI)fZN+4ST0 z+N3m{MS*CA)B0L68vK1v0PidqUXYQf!qaxbto~%if zZ$?Aend3=FlXy4!@UC>>!|B43J{{O@d`KHY~ z`^JmidQS_J*0A*+lt@BMi<7jER3o+eW&}m8kOgDOjZmdB!90A01 zfT9Vy2>3q}U&3g;&hVtf<41@m{z5#76-UIsL`5sk-~cY;-xW}I(G;+vXqv7zdah9x bz852A;7{Qj!@=msJ_&2WpGK5|AE5s4KV(rE literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.1/build/classes/java/main/com/nr/instrumentation/hivemq/client/InboundWrapper.class b/hivemq-mqtt-client-1.1/build/classes/java/main/com/nr/instrumentation/hivemq/client/InboundWrapper.class new file mode 100644 index 0000000000000000000000000000000000000000..0126863f4282ebb5a56b2fd87dc3d0717d8e0fb6 GIT binary patch literal 2117 zcmbtVTUQ%Z6#h;!$>cH+4J8<_t(6)=%UBUaK(JOQXcDRciuJPAAxvRvG7}~fl%LXH z;A?eh6(3xE=<>mzDg-EQEL94P5M)TSI0ALr{#O?2I))R zcAZBeT6MPFwzG4?lTAiW-pO6dU$NwlFc6R5+9#;v(4rIMe zLYMo6+MBHn|JFZnu1aXTr0# zZ`aKdH7fd+CB53-vdidmz1d~0I~guNa&Lb8>4`4T=|I(&wXe#u8Q|+!(y^@L8V|a) zSf_V^(ZX0*RqJcds@pYFHf>Yxs?H2crpySKs=95jW-Z&QNrrk$JfSLTUi-7%+u)D-_JMTNUdY z@?mT@)jS28GspJ9n-Hd7S+i5a`JL?a=qV596Bxy<{kE*LK*N6zu>-H%C+J`^d}I>7 z8$KQay==Nq%DFz>a55xhTwbbHuUuOaIR7tZ3g`GAlL32=U#P*MjB-7MGnB*Jts%k> zkSYEIQ4~KSQXHrFj;aW9lv!x%m~sF~0u2&ogqmD<4bLIZow88yf}iK{LI^Gl+9Y_k zRr~>wBSZzt<3B^ITs%UIeW&HMBg6&nU`DNUf%{0z#`3WvBzYXq$1mMO>JCPfCQXf= z*MCDYuit}l_uD@oh`Yqr0+vOjxE`j=k;w=yk=HbtEt1U&`IPY@s(6JHeKugf0-gFa zwJ&isP5Cmvao)Q?tFwqH*4@~)n8;TdQ;KiQdA!D`GFZhZZ$xPi7~Qkic~+n%i|9j) w=or&c)GbxQG~gU2fERKp~6(rh4~ej2&~M%0E~b%3jhEB literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.1/build/classes/java/main/com/nr/instrumentation/hivemq/client/OutboundWrapper.class b/hivemq-mqtt-client-1.1/build/classes/java/main/com/nr/instrumentation/hivemq/client/OutboundWrapper.class new file mode 100644 index 0000000000000000000000000000000000000000..21c137f6851ef6190e82145d35402d2e3e1736c1 GIT binary patch literal 3489 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 QODbUZV3<~+ERL@E&T)f-_X9X1?{CZ@u<9 zfPMIP3fu8W65H^oY93R~hf*++(UC>21yaZ3$gAOnBrKd#>rd+_pr~U9Y#k0tI(l$M zhYL^5`YkA@a2Ds1IFAcDp1_B7d;}lWaS@kvJc*}td<-8~%_o$Qr*%A|UU%SGh4xAH z^eNSRTEk~j6#Q8YpVRPp4bKU*slG< z4hbaZth{adWtYoyD=Z)0J(YEe=>=jH&!n>jOWJ0woR+r0mH^F`=UiE^vT3tqrMa7s^J<<8*I3@XYueu9j$4#D z0dZ15^JKorMT(qK<~rNw!W9H)9=2@DKPWKLw*s}HD6mkM{^J6PQ71)STCuykHFLh1Jw0uf0+B%kJg4Cc0#C2R_8oEL$`;cdyGBf4#|^bADXR=AI}4hv z_eSmtm(shAJtNQ4LSub_E~|-4C3s}jDAdUf;#?pMs9RD=Wu@R^Igl%tH>^yE^}Gn?kG1*hsikWI=OOI&Z_0om##OY;for+q~Xf~8;_N3-zv)E zmS-_^M{L^(!;`?#+3A{DNfnw*?}D9;^NbWsOUE8}UB?yZ>YG~9cYeWj&Z(>jJiFn# zGXg2c9(9VP0`(J!_bFd&s7E=PIVH1x0MRncV<*h%avfTA#f_qd`8vF62dm>NHRqJw ztUPR~-0!RfxLeKKJ&L`7yKut5PTXl=0D}hhAg$pm2EK}~Y52NHTczKib}_&$E1;fDr(gdZDt5btJ+8~6!+YTyO@jLtOhbNs@< zFYzmeMTkh}8u&GSr{P5dm+_K@mkqpvS2bKUP{Hpt{K3E<@h1&$82B^(qT#Ow{)WFB zxTe(p2mYzyUj|0;J_BzmNpqMta2zKD9$e)OpisvI?hVfFn?4o=+LnSVbUGvT#+RJH zrihCoINJs8zhz1d>V&x|kdBZRm5>5kBX-QlbH~)x$U8kR{SkFH^4ja`k4pJq1tT?lTW#*~hI@x#&lajLRXus!bwr1>WLt5pz4}iy+{lm3}Z%4%jsjH;hfYnGhtZurFmi>%VwsRBG%&|PFqx;T8N)-OB z5R1YhF{hCR%cDbOtH2W8jC9&Ew4s}KS|EZ%_TOwkR&{I2ggWl69u3!t{-}VV)GZNG zYe#>ZD@%^+k9gzfS$W!KK^;QNPUl*BF0QEsfEN^eacR?tYr`umD|6G*UvM~bXSB+^ zjcN<2=C%km>zA=|lIKg7E78NR>Fwax3KEE^0*=pptZ`%L=O1f1KBrWH7L2j1W3O?| zUAUX`_wemMi1QaXGVm(IfOrKl)x=ek7#LKqyVUDdG*!^duSczdmKdwE#API(M@Ql% zBrhX1a0Pk=Mhq_!DuKOh_dsWR8{gWIL zo6pnnk5F|Ya zy@fdqQyQi<%(UVtM|JL<<=;amaf}@+a<<9^HldUYdX%ZIp|bO5B>UH!lm7$LI@8+# literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.1/build/libs/hivemq-mqtt-client-1.1.jar b/hivemq-mqtt-client-1.1/build/libs/hivemq-mqtt-client-1.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..c9adaf050b447cbfcaf0f28a0914501eec81ab58 GIT binary patch literal 17897 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 x`JLT>;lINEyEEoz>Ywe9->K(6{x_)qVU publish(Flowable publishFlowable) { + + publishFlowable = publishFlowable.map(new PublisherAdapter()); + return Weaver.callOriginal(); + } +} diff --git a/hivemq-mqtt-client-1.1/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.java b/hivemq-mqtt-client-1.1/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.java new file mode 100644 index 0000000..194c4a9 --- /dev/null +++ b/hivemq-mqtt-client-1.1/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.java @@ -0,0 +1,91 @@ +package com.hivemq.client.internal.mqtt.handler.publish.incoming; + +import org.reactivestreams.Subscriber; + +import com.hivemq.client.internal.mqtt.MqttClientConfig; +import com.hivemq.client.internal.mqtt.handler.util.FlowWithEventLoop; +import com.hivemq.client.mqtt.datatypes.MqttTopic; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperties; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish; +import com.newrelic.api.agent.DestinationType; +import com.newrelic.api.agent.MessageConsumeParameters; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.NewField; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.instrumentation.hivemq.client.InboundWrapper; + +@Weave(type=MatchType.BaseClass) +public abstract class MqttIncomingPublishFlow extends FlowWithEventLoop { + + @NewField + private Token token = null; + + MqttIncomingPublishFlow(final Subscriber subscriber, final MqttClientConfig clientConfig,final MqttIncomingQosHandler incomingQosHandler) { + super(clientConfig); + } + + @Trace(async=true) + public void onNext(Mqtt5Publish result) { + if(token !=null) { + token.link(); + } + MqttTopic topic = result.getTopic(); + String topicName = topic.toString().replace('/', '_'); + Mqtt5UserProperties userProperties = result.getUserProperties(); + MessageConsumeParameters params = MessageConsumeParameters.library("HiveMQ").destinationType(DestinationType.NAMED_TOPIC).destinationName(topicName).inboundHeaders(new InboundWrapper(userProperties)).build(); + + NewRelic.getAgent().getTracedMethod().reportAsExternal(params); + Weaver.callOriginal(); + } + + public void onComplete() { + if(token != null) { + token.expire(); + token = null; + } + Weaver.callOriginal(); + } + + public void onError(Throwable t) { + NewRelic.noticeError(t); + if(token != null) { + token.expire(); + token = null; + } + Weaver.callOriginal(); + } + + @Trace + public void request(long n) { + if(token == null) { + Token t = NewRelic.getAgent().getTransaction().getToken(); + if(t != null && t.isActive()) { + token = t; + } else if(t != null) { + t.expire(); + t = null; + } + } + Weaver.callOriginal(); + } + + protected void onCancel() { + if(token != null) { + token.expire(); + token = null; + } + Weaver.callOriginal(); + } + + void runCancel() { + if(token != null) { + token.expire(); + token = null; + } + Weaver.callOriginal(); + } +} diff --git a/hivemq-mqtt-client-1.1/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttAckFlowable.java b/hivemq-mqtt-client-1.1/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttAckFlowable.java new file mode 100644 index 0000000..49ad5a7 --- /dev/null +++ b/hivemq-mqtt-client-1.1/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttAckFlowable.java @@ -0,0 +1,40 @@ +package com.hivemq.client.internal.mqtt.handler.publish.outgoing; + +import org.reactivestreams.Subscriber; + +import com.hivemq.client.internal.mqtt.MqttClientConfig; +import com.hivemq.client.internal.mqtt.message.publish.MqttPublish; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PublishResult; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.instrumentation.hivemq.client.SubscriberWrapper; + +import io.reactivex.Flowable; + +@Weave +public class MqttAckFlowable { + + + public MqttAckFlowable(MqttClientConfig clientConfig, Flowable publishFlowable) { + + } + + @Trace(async=true) + protected void subscribeActual(Subscriber subscriber) { + Token t = NewRelic.getAgent().getTransaction().getToken(); + Token token = null; + if(t != null && t.isActive()) { + token = t; + } else if(t != null) { + t.expire(); + t = null; + } + SubscriberWrapper wrapper = new SubscriberWrapper(subscriber, token); + subscriber = wrapper; + Weaver.callOriginal(); + + } +} diff --git a/hivemq-mqtt-client-1.1/src/main/java/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.java b/hivemq-mqtt-client-1.1/src/main/java/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.java new file mode 100644 index 0000000..d2423ce --- /dev/null +++ b/hivemq-mqtt-client-1.1/src/main/java/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.java @@ -0,0 +1,65 @@ +package com.hivemq.client.internal.mqtt.message.publish; + +import java.util.function.Function; + +import com.hivemq.client.internal.mqtt.datatypes.MqttTopicImpl; +import com.hivemq.client.internal.mqtt.datatypes.MqttUserPropertiesImpl; +import com.newrelic.api.agent.DestinationType; +import com.newrelic.api.agent.MessageProduceParameters; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.instrumentation.hivemq.client.OutboundWrapper; + +@Weave +public class MqttPublishBuilder> { + + MqttTopicImpl topic = Weaver.callOriginal(); + + MqttUserPropertiesImpl userProperties = Weaver.callOriginal(); + + MqttPublishBuilder() {} + + MqttPublishBuilder(MqttPublish publish) { + + } + + MqttPublishBuilder(MqttPublishBuilder publishBuilder) { + + } + + @Weave + public static class Send

extends Base> { + + public Send(Function parentConsumer) { + + } + + @Trace(leaf=true) + public P send() { + OutboundWrapper wrapper = new OutboundWrapper(userProperties); + String topicName = topic.toString().replace('/', '_'); + MessageProduceParameters params = MessageProduceParameters.library("HiveMQ").destinationType(DestinationType.NAMED_TOPIC).destinationName(topicName).outboundHeaders(wrapper).build(); + NewRelic.getAgent().getTracedMethod().reportAsExternal(params); + userProperties = wrapper.getCurrent(); + return Weaver.callOriginal(); + } + } + + @Weave + private static class Base> extends MqttPublishBuilder { + + Base() {} + + @SuppressWarnings("unused") + Base(MqttPublish publish) { + super(publish); + } + } + + @Weave + public static class Default extends Base { + + } +} diff --git a/hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/InboundWrapper.java b/hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/InboundWrapper.java new file mode 100644 index 0000000..7cce04d --- /dev/null +++ b/hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/InboundWrapper.java @@ -0,0 +1,40 @@ +package com.nr.instrumentation.hivemq.client; + +import java.util.List; + +import com.hivemq.client.mqtt.datatypes.MqttUtf8String; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperties; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperty; +import com.newrelic.api.agent.HeaderType; +import com.newrelic.api.agent.InboundHeaders; + +public class InboundWrapper implements InboundHeaders { + + Mqtt5UserProperties userProperties = null; + + public InboundWrapper(Mqtt5UserProperties userProperties) { + this.userProperties = userProperties; + } + + @Override + public String getHeader(String name) { + List list = userProperties.asList(); + MqttUtf8String searchFor = MqttUtf8String.of(name); + for(Mqtt5UserProperty property : list) { + MqttUtf8String propertyName = property.getName(); + if(propertyName.equals(searchFor)) { + MqttUtf8String value = property.getValue(); + if(value != null) { + return value.toString(); + } + } + } + return null; + } + + @Override + public HeaderType getHeaderType() { + return HeaderType.MESSAGE; + } + +} diff --git a/hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/OutboundWrapper.java b/hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/OutboundWrapper.java new file mode 100644 index 0000000..994739c --- /dev/null +++ b/hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/OutboundWrapper.java @@ -0,0 +1,42 @@ +package com.nr.instrumentation.hivemq.client; + +import java.util.logging.Level; + +import com.hivemq.client.internal.mqtt.datatypes.MqttUserPropertiesImpl; +import com.hivemq.client.internal.mqtt.datatypes.MqttUserPropertyImpl; +import com.hivemq.client.internal.mqtt.datatypes.MqttUtf8StringImpl; +import com.hivemq.client.internal.util.collections.ImmutableList; +import com.hivemq.client.internal.util.collections.ImmutableList.Builder; +import com.newrelic.api.agent.HeaderType; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.OutboundHeaders; + +public class OutboundWrapper implements OutboundHeaders { + + MqttUserPropertiesImpl userProperties = null; + + public OutboundWrapper(MqttUserPropertiesImpl up) { + userProperties = up; + } + + @Override + public HeaderType getHeaderType() { + return HeaderType.MESSAGE; + } + + @Override + public void setHeader(String name, String value) { + MqttUtf8StringImpl nameStr = MqttUtf8StringImpl.of(name); + MqttUtf8StringImpl valueStr = MqttUtf8StringImpl.of(value); + MqttUserPropertyImpl property = new MqttUserPropertyImpl(nameStr, valueStr); + + Builder builder = ImmutableList.builder(); + ImmutableList list = builder.addAll(userProperties.asList()).add(property).build(); + userProperties = MqttUserPropertiesImpl.of(list); + NewRelic.getAgent().getLogger().log(Level.INFO,"Set outbound headers to: {0}",userProperties); + } + + public MqttUserPropertiesImpl getCurrent() { + return userProperties; + } +} diff --git a/hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/PublisherAdapter.java b/hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/PublisherAdapter.java new file mode 100644 index 0000000..d7bf4e5 --- /dev/null +++ b/hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/PublisherAdapter.java @@ -0,0 +1,100 @@ +package com.nr.instrumentation.hivemq.client; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; + +import com.hivemq.client.internal.mqtt.datatypes.MqttTopicImpl; +import com.hivemq.client.internal.mqtt.datatypes.MqttUserPropertiesImpl; +import com.hivemq.client.internal.mqtt.datatypes.MqttUserPropertyImpl; +import com.hivemq.client.internal.mqtt.datatypes.MqttUtf8StringImpl; +import com.hivemq.client.internal.mqtt.message.publish.MqttPublish; +import com.hivemq.client.internal.util.collections.ImmutableList; +import com.hivemq.client.mqtt.datatypes.MqttTopic; +import com.hivemq.client.mqtt.datatypes.MqttUtf8String; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperties; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperty; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PayloadFormatIndicator; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish; +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; + +import io.reactivex.functions.Function; + +public class PublisherAdapter implements Function { + + + private static boolean isTransformed = false; + + private Token token = null; + + public PublisherAdapter() { + token = NewRelic.getAgent().getTransaction().getToken(); + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace(async=true) + public Mqtt5Publish apply(Mqtt5Publish source) throws Exception { + if(token != null) { + token.linkAndExpire(); + token = null; + } + NewRelic.getAgent().getLogger().log(Level.FINE, "Entering PublisherAdapter"); + Mqtt5UserProperties userProperties = source.getUserProperties(); + NewRelic.getAgent().getLogger().log(Level.FINE, "PublisherAdapter, initial userProps: {0}",userProperties); + + MqttUserPropertiesImpl userPropertiesNew = convertProperties(userProperties); + NewRelic.getAgent().getLogger().log(Level.FINE, "PublisherAdapter, converted userProps: {0}",userPropertiesNew); + + OutboundWrapper wrapper = new OutboundWrapper(userPropertiesNew); + NewRelic.getAgent().getTracedMethod().addOutboundRequestHeaders(wrapper); + userPropertiesNew = wrapper.getCurrent(); + NewRelic.getAgent().getLogger().log(Level.FINE, "PublisherAdapter, populated userProps: {0}",userPropertiesNew); + + MqttTopic topic = source.getTopic(); + + MqttTopicImpl topicImpl = (MqttTopicImpl)topic; + ByteBuffer payload = source.getPayload().isPresent() ? source.getPayload().get() : null; + + long expiry = source.getMessageExpiryInterval().isPresent() ? source.getMessageExpiryInterval().getAsLong() : MqttPublish.NO_MESSAGE_EXPIRY; + + Mqtt5PayloadFormatIndicator format = source.getPayloadFormatIndicator().isPresent() ? source.getPayloadFormatIndicator().get() : null; + + MqttUtf8String ct = source.getContentType().isPresent() ? source.getContentType().get() : null; + + MqttTopicImpl response = source.getResponseTopic().isPresent() ? (MqttTopicImpl)source.getResponseTopic().get() : null; + + ByteBuffer correlationData = source.getCorrelationData().isPresent() ? source.getCorrelationData().get() : null; + MqttPublish pub = new MqttPublish(topicImpl, payload, source.getQos(), source.isRetain(), expiry, format, (MqttUtf8StringImpl) ct, response, correlationData, userPropertiesNew); + return pub; + } + + private MqttUserPropertiesImpl convertProperties(Mqtt5UserProperties props) { + MqttUserPropertiesImpl userProps = null; + + + + if(props instanceof MqttUserPropertiesImpl) { + userProps = (MqttUserPropertiesImpl)props; + } else { + List properties = props.asList(); + List list2 = new ArrayList(); + for(Mqtt5UserProperty prop : properties) { + + MqttUserPropertyImpl uProp = MqttUserPropertyImpl.of(prop.getName().toString(), prop.getValue().toString()); + list2.add(uProp); + } + ImmutableList list = ImmutableList.copyOf(list2); + userProps = MqttUserPropertiesImpl.of(list); + } + + return userProps; + } +} diff --git a/hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/SubscriberWrapper.java b/hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/SubscriberWrapper.java new file mode 100644 index 0000000..86acb42 --- /dev/null +++ b/hivemq-mqtt-client-1.1/src/main/java/com/nr/instrumentation/hivemq/client/SubscriberWrapper.java @@ -0,0 +1,75 @@ +package com.nr.instrumentation.hivemq.client; + +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; + +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PublishResult; +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.DestinationType; +import com.newrelic.api.agent.MessageProduceParameters; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Segment; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; + +public class SubscriberWrapper implements Subscriber { + + private Subscriber delegate = null; + private Token token = null; + private static boolean isTransformed = false; + private Segment segment = null; + + public SubscriberWrapper(Subscriber d, Token t) { + delegate = d; + token = t; + segment = NewRelic.getAgent().getTransaction().startSegment("HiveMQ-Publish"); + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + public void onSubscribe(Subscription s) { + delegate.onSubscribe(s); + } + + @Override + @Trace(async=true) + public void onNext(Mqtt5PublishResult t) { + if(token != null) { + token.link(); + } + Mqtt5Publish result = t.getPublish(); + String topicName = result.getTopic().toString(); + MessageProduceParameters params = MessageProduceParameters.library("HiveMQ").destinationType(DestinationType.NAMED_TOPIC).destinationName(topicName).outboundHeaders(null).build(); + if(segment != null) { + segment.reportAsExternal(params); + segment.end(); + segment = null; + } else { + NewRelic.getAgent().getTracedMethod().reportAsExternal(params); + } + delegate.onNext(t); + } + + @Override + public void onError(Throwable t) { + if(token != null) { + token.expire(); + token = null; + } + delegate.onError(t); + } + + @Override + public void onComplete() { + if(token != null) { + token.expire(); + token = null; + } + delegate.onComplete(); + } + +} diff --git a/hivemq-mqtt-client-1.2/bin/.gitignore b/hivemq-mqtt-client-1.2/bin/.gitignore new file mode 100644 index 0000000..7eed456 --- /dev/null +++ b/hivemq-mqtt-client-1.2/bin/.gitignore @@ -0,0 +1,2 @@ +/main/ +/test/ diff --git a/hivemq-mqtt-client-1.2/build.gradle b/hivemq-mqtt-client-1.2/build.gradle new file mode 100644 index 0000000..d124120 --- /dev/null +++ b/hivemq-mqtt-client-1.2/build.gradle @@ -0,0 +1,30 @@ + +// Build.gradle generated for instrumentation module hivemq-mqtt-client-1.2 + +apply plugin: 'java' + +dependencies { + implementation 'com.hivemq:hivemq-mqtt-client:1.2.0' + + // New Relic Java Agent dependencies + implementation 'com.newrelic.agent.java:newrelic-agent:6.0.0' + implementation 'com.newrelic.agent.java:newrelic-api:6.0.0' + implementation fileTree(include: ['*.jar'], dir: '../libs') +} + +jar { + manifest { + attributes 'Implementation-Title': 'com.newrelic.instrumentation.hivemq-mqtt-client-1.2' + attributes 'Implementation-Vendor': 'New Relic' + attributes 'Implementation-Vendor-Id': 'com.newrelic' + attributes 'Implementation-Version': 1.0 + } +} + +verifyInstrumentation { + // Verifier plugin documentation: + // https://github.com/newrelic/newrelic-gradle-verify-instrumentation + // Example: + // passes 'javax.servlet:servlet-api:[2.2,2.5]' + // exclude 'javax.servlet:servlet-api:2.4.public_draft' +} \ No newline at end of file diff --git a/hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/MqttRxClient.class b/hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/MqttRxClient.class new file mode 100644 index 0000000000000000000000000000000000000000..5b5042c68d866466d8082c1d0685d44938f8ae8d GIT binary patch literal 1231 zcmbtT&rcIU6#k|yU0I6=<%g)CC}@j@@gNsVNC*k1Dh3*i2M^O_Y=`X5mf6`B|0}$R z(ZqQ6k21cU7K2Dl410KQ=G*uCee>hzmu~=`W5vfc%zIeyk;A-?BJTOPk3|m;JUsNU z#86yUTGJXf28#tetGRzLOo%yrs51q5h8<)GRU($(dAQNjml1U<3k`F3yZLPiT_fp%S#zyy4 zOADJCn%K#Z)~=Rg$Xu=vbXO*6XkGbpyQ#J+lKU!Aw1iEqV=JtRH7$9;jYi9!k)aB> z=qOI3piMW72qg9H@5QMJ_fP z)}#?7a)n%A*;n7Ra zz8r{!@JU{$8z;?3kF1=6eRRJ|B#RCl!x)`QeFNOUINhjOOd#)^-;vG{R(|poxwogt ze?p=D86)3OJRvwwuAoer$t0c2F5FDtWe|>>>0g<`PLWkVRfbFxGDAoXv$#b%D`?K$ MZ##MCH+mQN1@Q`8V*mgE literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.class b/hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.class new file mode 100644 index 0000000000000000000000000000000000000000..0690fe47db2bd0e3be5a5a448dc918b1ff188764 GIT binary patch literal 5501 zcmc&&X;&N98GbGZ4M>BHT|+QVZQ>9cW3ZAqWP>`!7z{3w*$g#p>?kw+pm*-vY{QW;~ z{}sSfcqf4am}x*8W|Q~;E+sLC4<_&-yqLgcT#>gg)k8~Q9@z%upeJz^`6LQ36kJQ7 z5erF}C?;XSPN0PANjPwm@K8=*5lfQm4f*1xeDUEVK7x zpy;q^FA=t5AoTaFqp2S}@~<~l)LoZxz7h};fZht|eW$2Z z!<3P?G_UN?-~ZSwWOpcS9aaA?0Ux)mjDCaAp9&H?oP%3MPo_@X(cQ91PV1%SRvGz4 zs$^sZy4OL-=aSP{ix?HIpUBfTsip5cd6ChIey(2A7PXYAG1;d)hdEDzU1e8y#vQw) zJD#C4Yx|=FNGZLku$bP9q21&cFKG^on7|W0pLMEfI*2!Bq+2fPx zmt?`}lSG2fX3ZzQcn3c_gcE+S<1&(b(p4PlJ%lHa?IKqyTo>1^r6<@7C7lQOou&$y^GGYf_9h+XUnKHZ*YJAs5=g1aj2 zVOho7xFs+y)d`k+VR~T9(1Y@>cqT_vNB4!DJ-u22# zSZNtKq1GCnf*;*%3C}&Kq+bexOx>uiGkEj5=NAcq6P-a^g%R{Qg|od{RGL;Z z>B9UqJ)~)?BUR+@@#2daEv?)E~l(;X9-#l)sE{oN`^d~ zBzYb;vU+9W+Z7;Tx$<;vb8I`ZArMtMGCUli9dW2qRU4@P;a~%=RX-in8}5LA$d9%2 zOUD5@u%bqeWLyvOF3$B3SB1ZJJi>Q}d9}o~j%%{3`z}P6cndYJ^R^a`@_!dskVPF@ zkszZE-aQqN<1rlJ9XH}AI>}mI9YYt{$*be&_V*^ygA<4$#iwe8>L?!P)f0SDgC}`) zk~{-t{z=L>pBK8`M9sTsl*=+|1!j*gBPNjUzJt1^RMV9^h-dgn5qLhfxBea)-auj* z$r|)5L#@F(XuPyPb{D&rvAYJ#Xd+$RJ?vS=UVdV!TgH28INR-;UA6QG8YuS>f^!&q zXlE!5|*v~HSqWocQSR!Ia-1v;)EP(Ux9rX8&q$1`}Awshbup2PD*pd0<@<1a=o z`|v*Qt-}lCQ46uh_ezo*PxCi0hcjFTxs%aBip%69Q9Te~u{Xe?nOOKv3aj7ZJLLq` zPf`8H(L!L`2&_~$fc-#4-HPxQ@*cu)MOKNjq~8u5zlWBs$ZPW9fG^d0q(px;^rGCl8NAHBL? z;8g}`599MTn)p!VLy3mSgrNvLd74lRP^~kRFi78>WfTt4Ps3Drl!~7B)oiC9nn`hv zu`MILe?{SbydPr~g_EfHH@Xz0|3xgTnRJ@uF=Te)t~7Pb&|Mb@*9764+{j%Z*$zVE zB4y1`)+}XRqO7@%WYsc|WpYmV);1D`N&cpE#_&aagRc(L^sD?@`t^7NKa$SlRjwx2 MA91y~{yg6BUkPbO^Z)<= literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttAckFlowable.class b/hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttAckFlowable.class new file mode 100644 index 0000000000000000000000000000000000000000..4fb980f4bcfe00bf7cd9a5727ea497939f5d9dfe GIT binary patch literal 2327 zcmb_eZC4XV6n-WIHYTg!E2UCJ-V6$CYr$HAwt-50NrD0gj((dg(`96{8+T`k{)Ya7 z{(^q)C#5~7AN!%dqJPAm-q}r3v~1HJO|r8yckaFO+}FwPfByU{fCW6xqW~+9Pw`m+ zH}H9ZXp05h#20$FW#G#^3@qhQ!m@$e2JSEnEK5%+npBDv+izHV@<246Ted5Or!46y z5qR9S8qbxosx+*|8>_zeopeeS>05!|wj!Yy)|%_Lc-UEo#ReLgIc+eBV9`|-#5m?Qr?#gh_@+0N=(sN>LWqZGifx%2{ zNT4#@=&Ac3<`Mk%IUThO!zng1TzK2Cm(7lG+sBJ6_XN}sVaOfPHC6+Blo(#RQ(`!= zDIJfiC?L0f|G~odzPNPs2g9fy+JUT#vaKTSGE5XJe&BSoB~+9*jnLZc@C9+!X- zlD_v&_WuoTCy^v&yFEZH&m9xixO()kXdM^R#dc6PL>Rd$4(-WJ#qIqnZ^i{;;422F zmj^${(K>n~8H)O!7yuqkUtV~iWYo$L%bN2s#Sb}EvDK^pV44V*_7!x*C3Si*$U zI72I9$61^sQ9V143&cH4bF)kNh$tgO$>3wsaS@{=uaEnKR{iu|d5z2=`WOz8WvH^+ z>~A`1oq8Ygx%)@+P*J~r$k=^rJm zpV0Rb#&H?bgnEt)w=jVvOyV}CP{!5Ro`nQO*PfMFijj^5k{l!4L-gn5N^JKMa-?q} z_C?1=%|A)jP7w+dnKu|WFik(RZS_?YX{SIOGxS`0itD6umPi?bq_+l$JP-T@{NSTc literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Base.class b/hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Base.class new file mode 100644 index 0000000000000000000000000000000000000000..20172fac606e53383576629f82de2fc9534e09f2 GIT binary patch literal 1100 zcmb`G&2AGx49EYIgoG}EegG-uL*h`RQl!oW4m2U6TM1MtR28kld9ocfM!U1=>})EY zg{Ros+oT*z8Yx56=kJ7T;fsBgczMCF$jc3?ag^^&ZF316D%ATtb|&Or`l)nH zCh)L|9SW(lRS5lWwIj_o`f2WCy5z#W{nzI@{%xj4q5U&=ffE{V#$xOj=h9#Tr%voU zocH8t=E-ub%^hp;N<5sAnUdGH1)MffK{dh$g|Dk~Tj6R2Vv9TKzFi3iD9K-2JW7Tf zSYk~oJ+Fc4=RZ)7LX;3mtO*Tt@J?cLo>x(q46<}xVhNkrn&UQFg2necf@|`&WVVDo LG-O3ta088hY~uH@ literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Send.class b/hivemq-mqtt-client-1.2/build/classes/java/main/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder$Send.class new file mode 100644 index 0000000000000000000000000000000000000000..126876948cf4159b85905910e673ddb7fd345ab0 GIT binary patch literal 3903 zcmb_fYg-dX6n-Z_)+Ae{)_c8HtX!0>_X?C20thw%lnB+f>LwY(+Rbj<3utfle)}`M zJgrLmJpIs*{ZW1T?rz{ou!~aokj%`^ocFwE&Y3f3{{H9pKLMP@4{7Yg>k2NWumgQ* zB+wu92GV!~gK4~px3*v?jbUU{7{O=;W4M&TI3_ZdhN2g=VBx7EmWFOFCIocU{S^6S}tdEZx+q_dHLlO4rpZQmgqz({SgtJU>oH{bAoQ%hKrxkoyI;)^vyRS=(~` zs&oVntZ9kBu4cLqYRi--H;dIkVY+{i)NZfEWZ>jR)b-a@q-KnYrF*_ZKa|$=;b!Oy z!@vzax}&ozvd+}4iZ)feD@z_tRu&z-Rtwy4J~YpA=vdct=o-t@!=P$*`;_k$ZQm-- zMRJ5ld3MbxP3qM!w8E$iby;pt9Gpcgda1BQ7kY(8sKjI#Y!!0;^Nm97gl=__(o>Ia7 zuW8cOca|zbf#x)-zmv4BRIpmpFUu{!PW~Li`$Gv zsV_)Jn+uwL6}xal;B0WN*Xwf?@8Z1x;C&T0aZAB%6*`IvN-D}Ax#T!AMgEF{J1QzL z6x>zu0Zau|6&7j=?x}F#DezS+;J$(fDn7(V3O-ix2|iWuP{n8XT)`JAzQk85zQ#8S zzE$xZjw|?H;L;|gqs>8z0;;7mIBi>fS2~Pi9x2ZVQs?k91EH)lkeSuoFlk8&buJg4wfD{TtcVJ1@$4uk2sCG-l}ypTI(sldIkIN* z6!RYF%w`*N*ou@E2J!P}6@r>Z(b1g;0((ZJ>lw_*ygmzb!bjuqj!fG}*y4vpMX$E-+Fj*j(#1m-x+j{Xg%iju`fhr3Xt*mCp}z$}uWTye6;6Kx!?` z&wgCs2wz$|S>Ssv@iRLu*vtRmWd$5XD~@3wd%L1Vco_#d z;&L3qVTvAUntNqs?kMLvI7(2Si5$m?8>st>Z7bWtA4pv9{uM2c(VAo1_6W&#t^L*` zDEaMMo*?xL(o4uBaAFB+0zFH3A%P`q6_|X2ZA)kuIJtxu6X@=Fgzdkfnxlmz^-(TK*Xf2qH~Yz;S%WO?Zy9vk zpgRWLWn`>~H$1chM&_DQ!dtev?+f3cIYx;h_k}_C5N!%oWz-Y6by;DwP^!3&wIlb1 zvu9OoDO6xd6$npp+j91Tz^d|q2k+{_x1OQ7rKhbqbvw@}75c*4@Z7ra0x5h(#S?

dV_7yA!Mbc z5J&hvuL-LjmTl?pG}g8e#l=wCRpDWQ!_5@fgqUWn1NeolVtx@MOWAh7@_LVqcomEu zwS~oKwJk9}c1~+b#hT(iK(`|;Mk(a%La>I_nqL=+4?Cf@pq?^@q7-e3BDv*xYmcB%CKUT`cC6um0 zZcjH9DskWmTUIPymlhHk*Y-g0ec@TJw9A_`MCS~;Z_+$HU^M@qx7?&bI)fZN+4ST0 z+N3m{MS*CA)B0L68vK1v0PidqUXYQf!qaxbto~%if zZ$?Aend3=FlXy4!@UC>>!|B43J{{O@d`KHY~ z`^JmidQS_J*0A*+lt@BMi<7jER3o+eW&}m8kOgDOjZmdB!90A01 zfT9Vy2>3q}U&3g;&hVtf<41@m{z5#76-UIsL`5sk-~cY;-xW}I(G;+vXqv7zdah9x bz852A;7{Qj!@=msJ_&2WpGK5|AE5s4KV(rE literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.2/build/classes/java/main/com/nr/instrumentation/hivemq/client/InboundWrapper.class b/hivemq-mqtt-client-1.2/build/classes/java/main/com/nr/instrumentation/hivemq/client/InboundWrapper.class new file mode 100644 index 0000000000000000000000000000000000000000..0126863f4282ebb5a56b2fd87dc3d0717d8e0fb6 GIT binary patch literal 2117 zcmbtVTUQ%Z6#h;!$>cH+4J8<_t(6)=%UBUaK(JOQXcDRciuJPAAxvRvG7}~fl%LXH z;A?eh6(3xE=<>mzDg-EQEL94P5M)TSI0ALr{#O?2I))R zcAZBeT6MPFwzG4?lTAiW-pO6dU$NwlFc6R5+9#;v(4rIMe zLYMo6+MBHn|JFZnu1aXTr0# zZ`aKdH7fd+CB53-vdidmz1d~0I~guNa&Lb8>4`4T=|I(&wXe#u8Q|+!(y^@L8V|a) zSf_V^(ZX0*RqJcds@pYFHf>Yxs?H2crpySKs=95jW-Z&QNrrk$JfSLTUi-7%+u)D-_JMTNUdY z@?mT@)jS28GspJ9n-Hd7S+i5a`JL?a=qV596Bxy<{kE*LK*N6zu>-H%C+J`^d}I>7 z8$KQay==Nq%DFz>a55xhTwbbHuUuOaIR7tZ3g`GAlL32=U#P*MjB-7MGnB*Jts%k> zkSYEIQ4~KSQXHrFj;aW9lv!x%m~sF~0u2&ogqmD<4bLIZow88yf}iK{LI^Gl+9Y_k zRr~>wBSZzt<3B^ITs%UIeW&HMBg6&nU`DNUf%{0z#`3WvBzYXq$1mMO>JCPfCQXf= z*MCDYuit}l_uD@oh`Yqr0+vOjxE`j=k;w=yk=HbtEt1U&`IPY@s(6JHeKugf0-gFa zwJ&isP5Cmvao)Q?tFwqH*4@~)n8;TdQ;KiQdA!D`GFZhZZ$xPi7~Qkic~+n%i|9j) w=or&c)GbxQG~gU2fERKp~6(rh4~ej2&~M%0E~b%3jhEB literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.2/build/classes/java/main/com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.class b/hivemq-mqtt-client-1.2/build/classes/java/main/com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.class new file mode 100644 index 0000000000000000000000000000000000000000..5d519e7ee89a4d55bc5ffc957807fe2180817dba GIT binary patch literal 3865 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 rUZV3<~+ERL@E&T)f-_X9X1?{CZ@u<9 zfPMIP3fu8W65H^oY93R~hf*++(UC>21yaZ3$gAOnBrKd#>rd+_pr~U9Y#k0tI(l$M zhYL^5`YkA@a2Ds1IFAcDp1_B7d;}lWaS@kvJc*}td<-8~%_o$Qr*%A|UU%SGh4xAH z^eNSRTEk~j6#Q8YpVRPp4bKU*slG< z4hbaZth{adWtYoyD=Z)0J(YEe=>=jH&!n>jOWJ0woR+r0mH^F`=UiE^vT3tqrMa7s^J<<8*I3@XYueu9j$4#D z0dZ15^JKorMT(qK<~rNw!W9H)9=2@DKPWKLw*s}HD6mkM{^J6PQ71)STCuykHFLh1Jw0uf0+B%kJg4Cc0#C2R_8oEL$`;cdyGBf4#|^bADXR=AI}4hv z_eSmtm(shAJtNQ4LSub_E~|-4C3s}jDAdUf;#?pMs9RD=Wu@R^Igl%tH>^yE^}Gn?kG1*hsikWI=OOI&Z_0om##OY;for+q~Xf~8;_N3-zv)E zmS-_^M{L^(!;`?#+3A{DNfnw*?}D9;^NbWsOUE8}UB?yZ>YG~9cYeWj&Z(>jJiFn# zGXg2c9(9VP0`(J!_bFd&s7E=PIVH1x0MRncV<*h%avfTA#f_qd`8vF62dm>NHRqJw ztUPR~-0!RfxLeKKJ&L`7yKut5PTXl=0D}hhAg$pm2EK}~Y52NHTczKib}_&$E1;fDr(gdZDt5btJ+8~6!+YTyO@jLtOhbNs@< zFYzmeMTkh}8u&GSr{P5dm+_K@mkqpvS2bKUP{Hpt{K3E<@h1&$82B^(qT#Ow{)WFB zxTe(p2mYzyUj|0;J_BzmNpqMta2zKD9$e)OpisvI?hVfFn?4o=+LnSVbUGvT#+RJH zrihCoINJs8zhz1d>V&x|kdBZRm5>5kBX-QlbH~)x$U8kR{SkFH^4ja`k4pJq1tT?lTW#*~hI@x#&lajLRXus!bwr1>WLt5pz4}iy+{lm3}Z%4%jsjH;hfYnGhtZurFmi>%VwsRBG%&|PFqx;T8N)-OB z5R1YhF{hCR%cDbOtH2W8jC9&Ew4s}KS|EZ%_TOwkR&{I2ggWl69u3!t{-}VV)GZNG zYe#>ZD@%^+k9gzfS$W!KK^;QNPUl*BF0QEsfEN^eacR?tYr`umD|6G*UvM~bXSB+^ zjcN<2=C%km>zA=|lIKg7E78NR>Fwax3KEE^0*=pptZ`%L=O1f1KBrWH7L2j1W3O?| zUAUX`_wemMi1QaXGVm(IfOrKl)x=ek7#LKqyVUDdG*!^duSczdmKdwE#API(M@Ql% zBrhX1a0Pk=Mhq_!DuKOh_dsWR8{gWIL zo6pnnk5F|Ya zy@fdqQyQi<%(UVtM|JL<<=;amaf}@+a<<9^HldUYdX%ZIp|bO5B>UH!lm7$LI@8+# literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.2/build/libs/hivemq-mqtt-client-1.2.jar b/hivemq-mqtt-client-1.2/build/libs/hivemq-mqtt-client-1.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..ebb7a9127f89dea8beff867b6fd36af8ac79e0b9 GIT binary patch literal 19755 zcmb_^1$3P`lC_y*X2;CTOffSvGc&UtGc#k%%*@QpcFfEeW9-=Zot;kibY`cwcmL5l z@A>&0)xDCwQax3vBv}by5GViu2nYa5LuGk@w*vIz8--#+Z*|xD@yT6iwO%UDAGs?dqws@_0qwEUiy9$@YeNrAIH7T29Mp4cETw@dEb4%U#k-VVCYzVJbjqu#4Tg_cob`xrD^XjdvDBTMXFJAJMK>B8ti?Fw@$M z>beGY%V{r`mt134o3jY6TG?EHNR=qidtH0E^5fKVI84@?K>Bkt-&*#2e?Z>88`xO= zOIQB64)||%tnL4@8rmP#%&Z+8?VYTQtR3|n&1|gyQVi$ciIi}#s+Gx15lhLDPmK=XrS&Xou~@JYKF#WEsW{f7@UnT^e%q4y zB5=pv1}|wQf<;<)nQ^22>B0HSP~RsXz$?^FNqm3SIP~5`rj35VwDu9E!YgOYIaiT* z4B$F5BDx}_&4nU2FLlu!ZcXN^PG1W!9(eSV`b3vL2aVAis|C~)%BA(f27}9zgGwcv z<#dgM5>ty0gvR5WHIP0GAt$a$=k;DybB2n?tCcqpF(@W;=WH5HT%Ywt zcciT;ebh#%_aQaO5-vx%&6xA+tQI_{oEuHTi`0OCJ!)t4&M0NX8(2q}zfU?YEm{VC zzEClWr$HQ2@lExHZjx!DC$&xXdcUUHXZ;K`6;K;x!&=V3&hgwBr|o4jVsziKal$Yw z7f2bsJQ4W-=a|I@ZqZrpqZC`w-Q_C;ECE)jFnt~vMMI}d7Nn)5<58-&ME$vzx}~Bo zvv@|Y^uW2jRlSyZWqSivXK`5y#^7^*-7uyq{WU(1z9^EBBKo=@N?C->4j2#1HKaMv z+zW~64#}cq`EF9^JFh3?rgxskI}V=sbTdN{wKk;GTI=m)CzkumNTc?Kn99K#^z*Ci zfT!f(Nk~pR`U5Iiw|C`&(C%_3Pdbh~=(X7Vqo`p;;EX#P2&$fEJUlO>#Ah^Dnljb9 z0mTMq!_G=xyWlPBi_gfKlgO`M0Rr}yRx;*oeMq5R@WRU0qb#eT2m|LXoE|}d%Y&mO zdtIVEX2J_k&)2$WAQ4nhEgH&}&_E}@2WR%OzYZC8f8GV}V9S@w3bqS!3}{jkd<14F z0EZ{OCL}1Zi@O{S!xKppk_;CEkIm1+Z^a-cMN8Xe-}BwdUx$9p8iLMo(32`{S%C@PHYOsFx-0rF*`2YE=SxF5A=l$CU)VC zN9>VyJKTewCZ87)*dtEVY$|*q4*oR4I5|y%N^$}XyfmYok}aY6D=5|{%a7g|U|mct zwAV~RPYhjb=QOgXRA5Xe*49{5du8L~1FQ#J+6KxP<+>55awovXD)$^lf!XFW!RXAg zOtK7gJkO+GfzXb5sh;<<~IGeL_vEQ8GFp1$Vo{TIwSy^mWI>7Po|j{ zx=Jf6OE-AGzwWaF06%hs`=?m<0gl)2!e3C(m-S~L-iT9?*~x@Hi+kqw0~6y=To3ma zq4JF7B7HKsM%StL&zp`S&@4b2HI@sFLzFy6$QthUA&;t<6m;a> z(IX=W%L+^gixWNYmqo>xe7IlW3>brKM-5Z0tLHwSn%%(YJOEuYI?7p>d4zJA6?C6; zEZ*6|QEQkOiJOXN%59#)hzz3O&;gq~QYR3e8xRV!Nx65naz_tcVC8Uhu-VL$6X*77 z#hQLPI}MUr46sbRE*EXS#Yl61#$kAmC);Vy-INu`pq_q(giv7{y&XfpHquRtaI|G? z+2mh59uK*hD3k?)AdoZ3j#Z412cDS$3#Chyt@~n_1v^4l!&tRiR~JL2ohd;eW}0(FO!JnXDmRrZdqpz8^=SJEO+#$i8P0$8 zp==b|3`HhEpmkIZSiCg6kPv;Y=3OB=NWC&;N1yH2I}RHTDJZ^^wsh_$iJ|(L)_1s8 z51PHzjIr*OoER}BW>MxUU^y}y9{4d)gssX?bO;Q}IcqBwL=rX| z?OMHWyrz*}W%Jj@V$W!>gFUojYu4T6)~vS^^FmkL2}4{;Xoj_Sx{;Cy(94dkmCXT1 z<;NNeq3UNr%tuwWEZ<3uWcD;O(8RuA;ip!u>YC+8WM%k(_bdizFwBUdilf zw4jPvW(ch_v;4F<8n~TwjJ=`vscewF@P<;^OnfA_PvBSUK-(WNm6S8DVTKglxpo z>MTndQwxJpr6tml?sr4-X`2*Rb_PwCuGN?vHYUU$k#0G^;Fj+B$K1F^O`;OZq z7dK?eEcFyId*20cYQjq}_lfYDyM%#Fx)y7K$V2o(0P8-_KZdkk*rtz@4f5!_G(wg) zPYJt1Alwmi%=ve~R3|2SuJ6gKxn1uUsoM0FjOdy3hetn{RuX5>!9UeY@gAGbrW$-! zlHjn42pr5$otBpv#(-opm;ediZcBzhivYo#Hs-gmg7FvbEpW%MDkIjcN|$SJsm3AK zka)_bIc7MnoF{BpiW@wQtBku)=Z@2oNOLvnm=0H&xNS0>P2`ouKQ~SpfANj7v88z6 z+vG&aklA0@OVkjXHWBGxx^@*D7n?uNpAv z+!+fUPccsqu{9h=pv+4uGFGoRSdh2h(jcELAS-=i__W8!J}K-Tv|!>e)K}T!A&HLAoj~puEa3q$a1j;lnTTu>j%|`2ylo zLE?Rm`M?qf;8*d)aD$j7xdC(80Vr=#u}HJB5?EPmb*|r_uJHjxSY2pUzihp1{jBry z*<8-!!i!NLX@oz{8|lJ+vg14Z<(k7(%fpvjiD(`$T@*}k0ql*-A@HjnfQz1B zphr3$0#n?(ZEa6Um=@ZP&)3%gINkn$^IJ&XTmdp+I|@)yP^0vqLqadrxTGM5AUM~% zMADEeW^zO*TofmaP(0KpQz1Jw060TxpfVtISf7vv4hPB|a_N|H#h`T7%b&v*@gs$K9ycEKfU6uPCeuLQ7*vad}?smD-nt93cI|P2@@y^}~ z_AVb>2mA)X3%f=7SVHDqxOE7qxP!J+=R>aE^<{VIF%tc56~H@q^BLnA4(gRG;JaAQ zCzNkOJvxw}LF?9Lh3gn~t#=T<_wZjbmU-5R#?2sxS_KNdr)Tqo+42V>V-^e2rHi$$ zC?PlQg3Q>kAX^3`oDsR0YeJ;SEa@aW$Y<7bG|tsU63B(#)l{Rdm#76D6@}oKROult zHuIOq=&eL09vOR1(CZtUR@r^H+`xqrd52$1JcGb|*3qhjGP4t9U32TlA_9GBF~5Tt z(-q3Rv~z6=w=G*Ecn&?&v1u3nMYhR$^&5Fkb2z3s@_a(bD6v7x7)y--B<1*~3Oh-P zpY6D#tGI(Ex<6gPw)^=7Pj8M}>`7?^V|z80YIdvnIbKH0h)c$e+@>ud~#K%$AFOPLhb|ywKm%Zodu) zIhpZEvuKP=gnAvsPtB|G>!N%F7tw-kKFfCs?rjyUNBI^HZz+`$HB)iPWa(d_Zj?sP zs=6!yN+|(-nn=L1%x%n;%m{%%;&eO-tI?!huBzGeUce+E>$}19(evkhFQGd7PPT`$ zrwdobWe2>3o}O;~HsiZ!9$g@Rz(jx4A^yy!(UVxv<%57Z1c{VbtqU%|o+6srmh;G}-h$C5T4{Y)tTL4_dMQ$jYe1~`bFN;;N7VQ%S{6R-H8imR9d@_ESm0lw zUJJH1ph!1wrQ3MXN-bJRyq8oB;}yImg5# z*-)s=wxeA6#8J}{@iDUeS$p;3S*RMCt;VQgj7R**9_z#x*Azg0OD5(kK4W5csr*KcQ z1`c8EugquR8lezv;CQT*oJPjEt6WEP!I|0p`nJn+9?OyaM<~mZYFBf6@I4|8w!Zd7 zzl9iFF1rMd(mDZk7L#e+u#*t2ZqzG0j*;dxC&BCUCKW3iP?PK?4Uje~@ygnT++F$!qtr+g}kcvfPmRQd>W?x$y z+BTzrmD^U$=q~Zh0kzBhUD{zZqopFp; z>0wQc2-h*W(hm18(BiGpbD%@ncdI;n7g+80u$;>-Ou@j_s}jxYQ7IMaLyoPjoxG)4Du?7+OFp8!l?!?do&UfMCpDo(#*v7ZDVZ+kWs@7+em)xx+EF2`X zEIholuySZt(=_)8V?~bxFZ3wNMKGOAY$7UJU5DosjqxZObwT>r_{?KPpGam)FJ+Dz z>x7n;WzW)`qhjMyCbwFZ1)- zX~JQ0_Q*9Nt^lGh5Rz=LmzgPNZs;4kvf|PNypTGuQP=sJOb+beP{}u2+ey(vQ~jP7 z)ZP5A)I$XIbSh4Px}54Q)(+&fjOobr;fFqUO(tB*7J6=d|c6VXg0V(TE@XxZb1g4PZ|K!f%g(RAR23Yk6W z^U)@C#LX(G#tDX=5y^?OaUdRxCCoHKA0*z1;vRRy&`5k%7^Q=hppQ)UW_j+j*NkdV z9Xag`Tk3i*S03cg+>Cu{i;mKadx~KMJh=_Ut}oq9#7K85XlW zWLA2SV;qxnJ^&(mZ0MXyY5Gro8x0L z1$m>6-p6DDTOV$@t&I}Hjws>ZZYixn*`9*EKAdnj$1Zrhv$iJ`nABvE!)^zXwsq?%AoWQ)NDzCK^>+#3N0uN}{ziqhr!9_>SspWFQ%9>E{Q#iw!)h|Hr$BM2o=6LWZ%Dc?QHhrQbl`RZyz zA~cZ{&t|u855++eKLEO>R^I)bUryMpu;{W~r-^1~!GbdsuZ>HcT_*U#`)4nvuo}83 z{4GBI;Vs@7(1t)z61A8<5U&BbM;X24mD6bb6C)I6)1Y|vegt|-+CnRz=WW{{l zAD~48OfAy$>)KeyjxNSI7*7eMn9bsE*Kc1$H>Ymb2Z;uyR++p$v%CO5ZRWpRWP+j| zeFXIR);x9dG|B$3!T5a7Y10m=%ln$yi|xu3dhRO899?$MN3J?t7%R{T$Ph^?D?2tP zw#-&>G?gzWNFIr8J8LT^od;|(cePcvo(-6YJh|B)&qraHLTBwcd9szxc5ZjK^f_222~?ba*V6O4S$H6xXSP ze=uH|rg}<@cdK~MgoIL!_wcjY@f{Qq>A9Z)C`$C+SEJ$Q`-p=zdE>P7g1S`AnI!2L z^2~R=2OkQFyf!I@C0pXCS6&^BB`c%@;&*4Oko`9V6kAAar$j}zoT(>b54qLq9Wcr) zO@^gn70f>coLc&f*1i7@xkNeA{*jGX_pw%%AQlL%hX+GmwtIzVwZ>ln=tXPHP2Wtz zITKzKrrC|d?4|g8_*y(vQbDKW)E*uEp;T-HqJvk_?H zDV6O`20kfwndV|F0u;Sn<0P6-4OgE2x}om=WQ3X#_Y%gHpD!&0SJV5Ibj0C(?j+|- zwM-z+r25kG_S_bb^~Dx0^1M@y-7i4gOv?@CY~ps`OADq+WTHXbRcItLN4u$4TkOj6 z=T7ULCP$H}i(*n?xK_!@xQ)j0BtR~rp!!sc^?Ds{5;HPn_ZVWbHZ8Wo!8#4M#(>hJ zRWiD1Mvxk97z3ZMhu+Q2>6|#aD@&IeSbjyz)XZ?n->PxU#Gi8D_HC@>@F*(eerO++ zKHrl1?jnM>&jD;*qM2|q8RlX(>rOsYTVzBNAt!+Ag^_hUsvovL`&y`}QzF*1v%e>& zk=e5-MCwviJKC?sW~NVi!88+zgX9rQe}#giGq42Xx!%uuCFMJ)m&R~^m6ZkyOq=$I z+G(ZFdXN4X6?(bjLDCtGi~g7sin~2T0=vtHV~51sBO}!w@QFT!#5+nS<&oHXpdNyl zp_#-xaudV#b3aPE{+1F_)wUDxlBD9b2e1#_waB-TZVi&xh%WTUve2&WOOi^;y6?U| zn2*V!fbE<8tKxG+g_0TFV!nN4jyZ80WVV;1l|sISfqW)~G}unQ)Dr88Kyc;gvs@0n zb>uN_$>8$38X!Z>Tt1rA^yknFN3;P`+Dnzi@g?N$dDn|XO!6t-Dv3jy9J(g;!yFt? z7n)h(-M7GF&?F{V$1hspmsO%p4l)l>UyXuVymNCG}7B+ea{&WJs+lSzc}s^{1hBEy|ox!KKVVrcRrv z@^6?fzr~lkDxB9KsAg4H+#mo#MeQ_Rx(#EsHL-W!Ld{n3g=kjb`*?y&{^e=Qe}8Cz?Ay=k)NwK(Ov)qlVaP?lREpq zvbooux$|}LI{H#YDJdq)CgftIaiE--M@R&NRlkf>`p{~c6=xcxl^p6 zVPY$MCw*LTF3amiW}q%Gt7b5JG=uTgc&pFN}g<&Vb3I1~68C`AvnWUe!-Cqni4{Q)7f^{dw zIjI}uJ1$S)?wM-r693jb|1^SoIs5JM`K@Y-3x1*1U5a{xRY(84h$J{W@3^E}HH|2C zowLjIg^0NtLa^z63@#A!Iy++7yjk?3mQb5&zI#k*aPbq_VV~pzLIsCp-+kH%MxfNo zi9o({^Zi0MNt?$8|B#a7q|vJS#JVCWxmtYvu-CiCZmNKaG-Oqz!ybiM!OZ%|dOXQz zg~#j*-hj>8OT*%T%ls6fTV)#Z7r%ASN@>}bj}Y<=pCSzMajZPh)LGY zeVto$*hQb7eAI^s8W~>zU&LOfk6YTHAy~GF$EB_Bvpl98Hl{kBAG&LRk1?fqK>j}fu`Q6h6v3nv6B@YYHM+dS{4PHY; z6Ymit6LIO8x>#9r*N$U0y^malQD})%Q(CN-(q5MpZykImG6NH=5mZXK@NP(Mv^0-H zgV~z$hRMtQqfe#!oCt>c5R-tzAV#6WMBh6a`hYs)R7S@=CV$%I1%jrmVxdejE%v(n z6N%D-P`3{-oEDg=_CxVjszlSyR88WwN+OJr0w+|h(ld^cUup{$MQKWK?JZyqDc0PE z7Z^eb&e1Ci!MwO$*LGT!<>%81i&1>5yCPHa?rCuQ?i8)H))i5-m?^}2YMAmEo@fRb zr)A5s*e}Z&1X+~U3xveZ@G1Hp#X3&PH}1Cm023aXQ#9nBbvo5wNSnj|z11LsFzTFcuHRcMj;7(w#> z+HG(QiZBLovav1I zL^*^xlyb3Y!}47b$bN-D{GJ54J}?0rUrsSbS|TisP5E#;Um&V@E_4 zhz8B9c}P3rkfx#7^5;B>TnG+O%*Z4qipQOKVGf% zjuQwFsF;A$KQIdxks$#WxRlZe_F1f0^Hb$~qS-#=6G45!gC)i6yWQ}IW+E|d41wqV zAo9eln)VVU>mCxc8G_s!%;b#V&+AMeu6qu0k096T#d4bqceO!-7&+qrIRfylkd-u+ zcIL||j((X)+g8r-tNTa(tfBpn54gFFGd|v?;M;+Em<-#z2yV`V2;Py4l7`^&h0HT) z-htCBD~$+Jf{h5P!d!#}NVBkpwff+P8`+uL#2l?01Cy+-v@m)a;YA}xGW@t+$(n*0 zw-@+dI|Mr-DQ~wKJ`OdXn58~2f39PeIR(x-a9g4O;4F0Hu#Z`ZWc|KQbVeg(T9`hB zsp4)2Hgg?H%{$%G0UB2zmvuAvb%oT!g0Oz@id@c%m&_NAkpFw1v}DJAzi75L#3#31 zEqh-0yav6egI3=opFjI7Zx-zL^dIQo%-P?_v_brH)qj&#^UvT||E+|X_1ngcwVvg_ zWaRv_DBfR-TD@(?|D`fEM`KDrjE4ni3sMLOxVnzAWsj zM%$oS7E1HN=0^6!O(Hey!La`-n>2vC(%B1v<1YVX%ybGeZW%iN3ru5f+h$Lul6x!IHLTjEAB{M@@%t9EabT#7 zoAs|KW*`D-wSt!l1hybK*`^_(j8D2P?G(Y2-) zt1k98Mi3d%QlK!MB4sL`$Fx16=eym?x4byw)1MqF#{^WWCO^H0!DY{bo_Yi{Nx49+ z!G8qAzQcYYTduw?2+WOCDpz|P9po<8cw8Cu@)WqMxdwom053w@pRLQu&Wh8ky}%u1cM>dFI17Y8~5p4S`TvZhqi3GlWJJYjyh9giKLda2?acqc!Z zTHsd4^x*__i}v5!`2UN|F|&S43jObF&NHsZNby_1%L@enK>7b*bAAW@VROWOWBF}c z|A+nghwYhAHB)&%gwipvNH-@cion1h7GOjb32$nN(9Ty459A9($igS6Kf=vekc!H^ zo_B#0Q%gG9c^O)FDZXRrY$>*UxR>W3{VKw90Jry6lqWs{GJXWX{i4@eTBhCMvguW& ztu)2^`aHM^&<<`RYzsfFGNCE1ic%<3woG>DD#PwHY& zO2cw&0F8u$jGaN$TMmBun5y0r)qM?nLt zto&gd>P% znz=DVW$DX>)5Ufa7pf;7jHlZ)pf)Jq+aXU{+L!61wFYjiK258_)7jF6(&l~YPZ;=D zhAn<<>W&H9&`|8`h5f|41*l6hLCWUV^P|b~ZJt8+6$y&vsy)=KN+bS))l9C|UCCpd z^CYqu3VT>toLkR0O%@84fe#95n;NntjsYP4bIli2D34!+ea$9wQQNWu-DE?c!Fcdx zB|MVS<6zD1p~qf^^Hr`C?5CA+-cu-yNRvANMcde$j~5qeC@IR**y+n_Zr1p93qtdl?Z9tHEtBvBu7dGc?Jz!;`%a}ka&_u%g_Cp!(562^b&jIL(m&lGgxUtjF+Bm8;UwuARovB|6g`r!{8V zseUi2G*{pz&_U;?jP1tF(oud>PP+!>fg|a$0|fZC6wW(6Vd8zO9{c)VS|#mV=7Y3r@*&RhTAiSz`c~*WTE4)t zGQc&d`h0IKyN5q0U`8oz;@YTKD1HQ1CLwS-%eVR3q$)C5gSlKe>CiBjRN%UR?yPlu zN?oL@9ojLMQ;XG{alB}Ma5PxM(7H&45JK`K3_huq*~-SU*3~2BG{K>czCvE#&QZ9O zt3Hy?k*y37tTEV3&99=iUf5>ArFv|Aee0F42o{{5c(8&}OM51on;<9Cl(o4BRd?+y zr*!xY)_2>fPn)?9>6>Mb^DGc;(z~zbT5vrPjURAYam?}YNy4p6&U~%rPGT7(9{JdE zg2D=#Y4d2GsQ0BzLodF7ONjMZD=jUYlW|k@m5VG7jh$+ei!MZ4@kIn?D6QV~y*+5- z>t=aUQFdqv21+tH$c5HGi|EqgZ##B0PtJpj#>$_l2J%F-*!L&eD|n=Hzu`0~)H?32 zDjD{^n=c9*VtiN*5~LcD+n$*yNP?C1O0j`&DCmMUKhKu&p;v0i#sFUkL_s+bAH1jA zG+)Niv$$IF6Jd8r=m2e8u*|bMf52PmKP`3*tV(o^n9`Dc*bqQAVz zp6xM&kY~QY>B~~8&=GICWRZ8&O|FPP*{K%C5kVO$l@5w80xG=kaqxp7JM z8udh}E=1fnH9ou;5#6dQ{3OV=Z=tPN%yt;wwbI)j5OW-5a?$2V{>U6Qmc5eN)aE>6t2I z?y+ggfe$tay9~f;j@#r}(%<;wreTN}93R-Eg0q^sCequ8`N=({Q-_gid8D66SfJ3z8sBLon_8qb8b5lcHX5_mDvby#r#onR zXvpM1zLF3-JR)|E>z!wiVSGC%GxZiL zWB40ugC9!(c~^n|I-l{|Sqgme~Uc#uN# z2*Uf$fXZi4;uuMObfI6PR+6uA;0TEu_Qf^K>O)-HO{jgu^lxm}z04V0U&^sc9D}#j zxMd+(;oK<2VZW?R3<6{{qx2NP_sxIU9N|^-Ir_w4qw~Jjo{zNBSCi^SwXoz! zOq9&ZK(MpMmlR_!MQR=iG zsti#ond_9o)J@kgpP%L_OhK4pj)h>{}NMW|oFV_C)-84nIBh_$lkT5AcIsR(=9f+4Ud9zY^M! z$(s@11A(W(%c%eJ|n>W?!q=8g7d ztZRF{d04Umu({$AM#9?QGTSzTo&w3m!Lax89b7ES`QXsSwg5y4%*=#v#=>KQi7hqfyw1f!9U) zpp|MNH7VXaL5@A?lNwjrfSAzdlE(C`HI$>Z@>ehWg`Vx)uv_Uk>ra$k%W1*OcOJ{7 zyb$f5!ilRrB~64|M!)3qx{qAw2cOddxHMQ@+sS=a^da&gJNL9h?#v0mVefBxL=mF_A zDCReVuO^{77l@uHY%2z|?X_Nz*YW;f)^(A7kEmmot92m#&10_{?~I7?+%_;>`dxMK zRyJDtXPIeXPdF#n-i=REl^H*oqF9VK7m6@}!gww5I_kaII zX=Sk8YAoKAgX=ApBm19G4nZShJts@Y-y%8kQZiWd@LtmVjgV#vy($jn^WxOtp2yT= z@<<>+fu-iM?#@Z%7<+dl+BT2m-=eZ&+_%85^5E+vtho_2vRH4paCoD?J>FgdcC$LB z7wePuY6o})J|S?zdIg>&S0M$i&~*?5-iKhn49Amym0)b>brd$UJnMI**+Ef*W}HOM zHFz?x$3j*&nT*9%k2fO1%9G0=aUYZrN9Aagq%n2&ZD&*_4TpE+S2L~@o4P64w=AR$ z`1W-N&c0D)kGCT10U6Vv)0t$iv)Nsj!MDw6O*Vl;y=cBO#42iTZOE}#DDVEe3{N|~ zMBemEVp}()6q~{EvCHACE>My5%0tWi-qB+GzG^zV1p;2L^$69-=_cr{da)j1FL>b1 z9XH>$qg134dV41#PcA`MBf5AYm#U=}f!1L6U=R1ajvYlv|Dr@~G^@S_Eu?7(IQvuM zxcRPEsK!zGmnKkFBd350T{J0nITX*}1I9ml;r7`APvCC{jd z#X@CO7`}r+cc2l|Gz~uPKuuI1k8h$4P#hWzsN|irZMN8IOhZSCl+j2zk?527W)<(; zkeQh2)N!!)S@g+qxgZ%E^S<6E!YOl?gUQUyneyAE&8`=~EyT{~T>$MlJL;g9qewzO z9_EwiT_>3SYp{(q{~orWm@qwbLdb|6cOV0FnJuslalA;$_ed#{c;V@gYrP4*!vl6$ za~vCsb|M1xI?KIS)3yYu-rcCF#~!^5hn{U)kV7mYD&St3bC{S4(y`6_g#yTtHbQWo1ITtFVSRHQLaVa~_a{lzztD1#W2dx>#Lvx@-mXqN^+S+u`Nn4F3 zP^-JM#z|`0S6p@DTFHscYS%YOwuciiQpSDPF|_3b$=FaWGJP9R@rIx5EthB=O16&* zV@*xhMIYq$G4?~0)3+H)AK+g3iFn=;k5Hf_22uKQYQ(`U#V25{8UW@*!jO2;UOqb8k<=^TyGaWn zlc=(jRrq*Gy2&pS%ZJDhs-=z|c^>)Eidl#HjZpLwJ%OY_0*{Cn9ih1@mpDMp6Ymxp zk_P5(Pg8H+3#Q6ItH|DiTdhKVMYyO@Z)P8X%80etkN67Xq!`1%f` zSVW8*{N=7fN{Qo|d?*=|heGij*HgPgL?~}tv0_4X$1+yJK{%8LxT3jidsf=sdJDU~ z3}A!N7Osxt0!w%JlnkBBZ&+w(n9D(7D8m;qAPO98Be)>XvRhba$PW-wCfG(70nUkw z;R=vv{yNq-`Z_df2#jaIgoB6m3bd2y3Z--LI?~t1PI$-#vvSGI;nW`)RZ&2m+seZ$ zS)$Zng+!)!k^QzSP}Z>icz$6G;Q1cx`PzOUcRrfPB|3MR88o^y$YM2MjJ!^XM#aUn zR4@84fIFuZtHLQP>4e=}Hco}gJ?!|sXrcV~x0AeeW$?wsU*bkYFjsVA0nuqKC@f}9Y-TM!m``_-Lh}XN#{O)X z*_hJp#~Q647KnqwHpUQZeLbfQVx+K= zblN+Y4;XgFhbzTWgiv~$E>c~9xIMxEP!uU@7bG=nt@?g+MV+(431m`w=7?z$zS91I zbVN9=WfP%g?hYC=E1O=b)(m3?wa&;H!`*l@t0?3p;t>iFAw$a-f$srIJ46@M<2dht zJWXXfcY6&=J0iQx1LN6Ss86B&b{F%xFJ#t-6vh#u%=&hR%1b0G?{Y8;FRe1B&zuRY zf>=x=@7bb$QL5ZS?2<~22?PPN9`&RQqVLV1$4O3)mN{m2g+qg2(rESWf6#_h%&qrK z+>>jinO^rE--6Ijh{Vv$kHjgU-S}!6Aqvxj@8+K`!60Q%j`1K2N5(b5$@GljM#M z-_&^EBjE;3d=jqH*TWQ9cBw*nL5HOkg$P{*R=#FsO-{q7>a1cx-v*fkZ zp0_MEt|47i8ga@O564j;`tC&SUkJx4?IT2Qd?l#Q+ICQ|(QxuA8YV*vCQyar(gBG@ z#?PCD?9pa9tIBhplpxLn6+Zu3LVcw5rPNPOMvdZ{%bAj3c@G7g(93A*U=kHB|Fsg% zIM)gif6NDECyZ{7S?{aeKUOrqyPaid&cI`BTwazBY$Hrq#V>`n-sV z9Ul{}rf^5sAd1p7*G2#KdCM#io!5FJ7bAYC-yrdf#$DUcICR&eSvWOP`D-M&<(h<0lD|=8#d)%lR-OiwBcKFMr_R?bR>ja{{SUhG`E4S1@i4Olvb~S zBuYk{%RRvL46c9oN`B{)Ltd~$GQA72SPw|GyiHss$vx)29%qd{)IIVF#PXfNCn1~O zte|B7^PG!ISqVTOWZ-{)WyKGF1^@sa;GFNr-`_8=_*LxJ3oL$A{!#LM$=^PI7yGB{ zEPh4!QTyjz8E?MMZ{-K^^xO9zH%9?ipzZuFu?_dA$PXEo>_+Qz6J@)wro6=h@!rx;1%?~!R|I;DR zUx|Lr%>IK23;k~r{hK`PUzvVQ5Bq}&0Pk-y{kO?tzw-RR{W-OMnQ&BUHpB&_*a@=H=_UO zA`IpK2hEQz{@ZQoU)%6&!26FjkTL$xZTLa;=kWKh`2ReVf7b9a=KmT0XAJSLQ2(sq zH~$ONpE~#}`md4BKgL9WulKn?s)xX9)f2IC4j`jz&F57>E`cF}{U)g^R z_WZ%l{+2ZS7go~ht&g-nAJ$)V{EyJjuhhSKJ%3P_@%|^M|KS74N`Qj>K*oN18NMww KYxsZs_x}JigYC-z literal 0 HcmV?d00001 diff --git a/hivemq-mqtt-client-1.2/build/tmp/compileJava/source-classes-mapping.txt b/hivemq-mqtt-client-1.2/build/tmp/compileJava/source-classes-mapping.txt new file mode 100644 index 0000000..bc486fd --- /dev/null +++ b/hivemq-mqtt-client-1.2/build/tmp/compileJava/source-classes-mapping.txt @@ -0,0 +1,21 @@ +com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.java + com.nr.instrumentation.hivemq.client.Mqtt5PublisherWrapper +com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.java + com.hivemq.client.internal.mqtt.message.publish.MqttPublishBuilder + com.hivemq.client.internal.mqtt.message.publish.MqttPublishBuilder$Base + com.hivemq.client.internal.mqtt.message.publish.MqttPublishBuilder$Default + com.hivemq.client.internal.mqtt.message.publish.MqttPublishBuilder$Send +com/nr/instrumentation/hivemq/client/OutboundWrapper.java + com.nr.instrumentation.hivemq.client.OutboundWrapper +com/nr/instrumentation/hivemq/client/PublisherAdapter.java + com.nr.instrumentation.hivemq.client.PublisherAdapter +com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.java + com.hivemq.client.internal.mqtt.handler.publish.incoming.MqttIncomingPublishFlow +com/nr/instrumentation/hivemq/client/SubscriberWrapper.java + com.nr.instrumentation.hivemq.client.SubscriberWrapper +com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttAckFlowable.java + com.hivemq.client.internal.mqtt.handler.publish.outgoing.MqttAckFlowable +com/hivemq/client/internal/mqtt/MqttRxClient.java + com.hivemq.client.internal.mqtt.MqttRxClient +com/nr/instrumentation/hivemq/client/InboundWrapper.java + com.nr.instrumentation.hivemq.client.InboundWrapper diff --git a/hivemq-mqtt-client-1.2/build/tmp/jar/MANIFEST.MF b/hivemq-mqtt-client-1.2/build/tmp/jar/MANIFEST.MF new file mode 100644 index 0000000..87c9933 --- /dev/null +++ b/hivemq-mqtt-client-1.2/build/tmp/jar/MANIFEST.MF @@ -0,0 +1,7 @@ +Manifest-Version: 1.0 +Implementation-Title: com.newrelic.instrumentation.hivemq-mqtt-client- + 1.2 +Implementation-Version: 1.0 +Implementation-Vendor-Id: com.newrelic +Implementation-Vendor: New Relic + diff --git a/hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/MqttRxClient.java b/hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/MqttRxClient.java new file mode 100644 index 0000000..45b78cf --- /dev/null +++ b/hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/MqttRxClient.java @@ -0,0 +1,21 @@ +package com.hivemq.client.internal.mqtt; + +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PublishResult; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.instrumentation.hivemq.client.PublisherAdapter; + +import io.reactivex.Flowable; + +@Weave +public abstract class MqttRxClient { + + @Trace + public Flowable publish(Flowable publishFlowable) { + + publishFlowable = publishFlowable.map(new PublisherAdapter()); + return Weaver.callOriginal(); + } +} diff --git a/hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.java b/hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.java new file mode 100644 index 0000000..c5a5960 --- /dev/null +++ b/hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/incoming/MqttIncomingPublishFlow.java @@ -0,0 +1,91 @@ +package com.hivemq.client.internal.mqtt.handler.publish.incoming; + +import org.reactivestreams.Subscriber; + +import com.hivemq.client.internal.mqtt.MqttClientConfig; +import com.hivemq.client.internal.mqtt.handler.util.FlowWithEventLoop; +import com.hivemq.client.mqtt.datatypes.MqttTopic; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperties; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish; +import com.newrelic.api.agent.DestinationType; +import com.newrelic.api.agent.MessageConsumeParameters; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.MatchType; +import com.newrelic.api.agent.weaver.NewField; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.instrumentation.hivemq.client.InboundWrapper; + +@Weave(type=MatchType.BaseClass) +abstract class MqttIncomingPublishFlow extends FlowWithEventLoop { + + @NewField + private Token token = null; + + MqttIncomingPublishFlow(final Subscriber subscriber, final MqttClientConfig clientConfig,final MqttIncomingQosHandler incomingQosHandler, final boolean manualAcknowledgement) { + super(clientConfig); + } + + @Trace(async=true) + public void onNext(Mqtt5Publish result) { + if(token !=null) { + token.link(); + } + MqttTopic topic = result.getTopic(); + String topicName = topic.toString().replace('/', '_'); + Mqtt5UserProperties userProperties = result.getUserProperties(); + MessageConsumeParameters params = MessageConsumeParameters.library("HiveMQ").destinationType(DestinationType.NAMED_TOPIC).destinationName(topicName).inboundHeaders(new InboundWrapper(userProperties)).build(); + + NewRelic.getAgent().getTracedMethod().reportAsExternal(params); + Weaver.callOriginal(); + } + + public void onComplete() { + if(token != null) { + token.expire(); + token = null; + } + Weaver.callOriginal(); + } + + public void onError(Throwable t) { + NewRelic.noticeError(t); + if(token != null) { + token.expire(); + token = null; + } + Weaver.callOriginal(); + } + + @Trace + public void request(long n) { + if(token == null) { + Token t = NewRelic.getAgent().getTransaction().getToken(); + if(t != null && t.isActive()) { + token = t; + } else if(t != null) { + t.expire(); + t = null; + } + } + Weaver.callOriginal(); + } + + protected void onCancel() { + if(token != null) { + token.expire(); + token = null; + } + Weaver.callOriginal(); + } + + void runCancel() { + if(token != null) { + token.expire(); + token = null; + } + Weaver.callOriginal(); + } +} diff --git a/hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttAckFlowable.java b/hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttAckFlowable.java new file mode 100644 index 0000000..49ad5a7 --- /dev/null +++ b/hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/handler/publish/outgoing/MqttAckFlowable.java @@ -0,0 +1,40 @@ +package com.hivemq.client.internal.mqtt.handler.publish.outgoing; + +import org.reactivestreams.Subscriber; + +import com.hivemq.client.internal.mqtt.MqttClientConfig; +import com.hivemq.client.internal.mqtt.message.publish.MqttPublish; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PublishResult; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.instrumentation.hivemq.client.SubscriberWrapper; + +import io.reactivex.Flowable; + +@Weave +public class MqttAckFlowable { + + + public MqttAckFlowable(MqttClientConfig clientConfig, Flowable publishFlowable) { + + } + + @Trace(async=true) + protected void subscribeActual(Subscriber subscriber) { + Token t = NewRelic.getAgent().getTransaction().getToken(); + Token token = null; + if(t != null && t.isActive()) { + token = t; + } else if(t != null) { + t.expire(); + t = null; + } + SubscriberWrapper wrapper = new SubscriberWrapper(subscriber, token); + subscriber = wrapper; + Weaver.callOriginal(); + + } +} diff --git a/hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.java b/hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.java new file mode 100644 index 0000000..d2423ce --- /dev/null +++ b/hivemq-mqtt-client-1.2/src/main/java/com/hivemq/client/internal/mqtt/message/publish/MqttPublishBuilder.java @@ -0,0 +1,65 @@ +package com.hivemq.client.internal.mqtt.message.publish; + +import java.util.function.Function; + +import com.hivemq.client.internal.mqtt.datatypes.MqttTopicImpl; +import com.hivemq.client.internal.mqtt.datatypes.MqttUserPropertiesImpl; +import com.newrelic.api.agent.DestinationType; +import com.newrelic.api.agent.MessageProduceParameters; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Trace; +import com.newrelic.api.agent.weaver.Weave; +import com.newrelic.api.agent.weaver.Weaver; +import com.nr.instrumentation.hivemq.client.OutboundWrapper; + +@Weave +public class MqttPublishBuilder> { + + MqttTopicImpl topic = Weaver.callOriginal(); + + MqttUserPropertiesImpl userProperties = Weaver.callOriginal(); + + MqttPublishBuilder() {} + + MqttPublishBuilder(MqttPublish publish) { + + } + + MqttPublishBuilder(MqttPublishBuilder publishBuilder) { + + } + + @Weave + public static class Send

extends Base> { + + public Send(Function parentConsumer) { + + } + + @Trace(leaf=true) + public P send() { + OutboundWrapper wrapper = new OutboundWrapper(userProperties); + String topicName = topic.toString().replace('/', '_'); + MessageProduceParameters params = MessageProduceParameters.library("HiveMQ").destinationType(DestinationType.NAMED_TOPIC).destinationName(topicName).outboundHeaders(wrapper).build(); + NewRelic.getAgent().getTracedMethod().reportAsExternal(params); + userProperties = wrapper.getCurrent(); + return Weaver.callOriginal(); + } + } + + @Weave + private static class Base> extends MqttPublishBuilder { + + Base() {} + + @SuppressWarnings("unused") + Base(MqttPublish publish) { + super(publish); + } + } + + @Weave + public static class Default extends Base { + + } +} diff --git a/hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/InboundWrapper.java b/hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/InboundWrapper.java new file mode 100644 index 0000000..7cce04d --- /dev/null +++ b/hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/InboundWrapper.java @@ -0,0 +1,40 @@ +package com.nr.instrumentation.hivemq.client; + +import java.util.List; + +import com.hivemq.client.mqtt.datatypes.MqttUtf8String; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperties; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperty; +import com.newrelic.api.agent.HeaderType; +import com.newrelic.api.agent.InboundHeaders; + +public class InboundWrapper implements InboundHeaders { + + Mqtt5UserProperties userProperties = null; + + public InboundWrapper(Mqtt5UserProperties userProperties) { + this.userProperties = userProperties; + } + + @Override + public String getHeader(String name) { + List list = userProperties.asList(); + MqttUtf8String searchFor = MqttUtf8String.of(name); + for(Mqtt5UserProperty property : list) { + MqttUtf8String propertyName = property.getName(); + if(propertyName.equals(searchFor)) { + MqttUtf8String value = property.getValue(); + if(value != null) { + return value.toString(); + } + } + } + return null; + } + + @Override + public HeaderType getHeaderType() { + return HeaderType.MESSAGE; + } + +} diff --git a/hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.java b/hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.java new file mode 100644 index 0000000..b7b72d1 --- /dev/null +++ b/hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/Mqtt5PublisherWrapper.java @@ -0,0 +1,103 @@ +package com.nr.instrumentation.hivemq.client; + +import java.nio.ByteBuffer; +import java.util.Optional; +import java.util.OptionalLong; + +import com.hivemq.client.internal.mqtt.datatypes.MqttUserPropertiesImpl; +import com.hivemq.client.mqtt.datatypes.MqttQos; +import com.hivemq.client.mqtt.datatypes.MqttTopic; +import com.hivemq.client.mqtt.datatypes.MqttUtf8String; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperties; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PayloadFormatIndicator; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PublishBuilder.Complete; +import com.newrelic.api.agent.NewRelic; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5WillPublish; + +public class Mqtt5PublisherWrapper implements Mqtt5Publish { + + private Mqtt5Publish delegate = null; + + public Mqtt5PublisherWrapper(Mqtt5Publish p) { + delegate = p; + } + + @Override + public MqttTopic getTopic() { + return delegate.getTopic(); + } + + @Override + public Optional getPayload() { + return delegate.getPayload(); + } + + @Override + public byte[] getPayloadAsBytes() { + return delegate.getPayloadAsBytes(); + } + + @Override + public MqttQos getQos() { + return delegate.getQos(); + } + + @Override + public boolean isRetain() { + return delegate.isRetain(); + } + + @Override + public OptionalLong getMessageExpiryInterval() { + return delegate.getMessageExpiryInterval(); + } + + @Override + public Optional getPayloadFormatIndicator() { + return delegate.getPayloadFormatIndicator(); + } + + @Override + public Optional getContentType() { + return delegate.getContentType(); + } + + @Override + public Optional getResponseTopic() { + return delegate.getResponseTopic(); + } + + @Override + public Optional getCorrelationData() { + return delegate.getCorrelationData(); + } + + @Override + public Mqtt5UserProperties getUserProperties() { + Mqtt5UserProperties props = delegate.getUserProperties(); + if(props instanceof MqttUserPropertiesImpl) { + MqttUserPropertiesImpl propsImpl = (MqttUserPropertiesImpl)props; + OutboundWrapper wrapper = new OutboundWrapper(propsImpl); + NewRelic.getAgent().getTracedMethod().addOutboundRequestHeaders(wrapper); + return wrapper.getCurrent(); + } + return props; + } + + @Override + public void acknowledge() { + delegate.acknowledge(); + } + + @Override + public Mqtt5WillPublish asWill() { + return delegate.asWill(); + } + + @Override + public Complete extend() { + return delegate.extend(); + } + +} diff --git a/hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/OutboundWrapper.java b/hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/OutboundWrapper.java new file mode 100644 index 0000000..994739c --- /dev/null +++ b/hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/OutboundWrapper.java @@ -0,0 +1,42 @@ +package com.nr.instrumentation.hivemq.client; + +import java.util.logging.Level; + +import com.hivemq.client.internal.mqtt.datatypes.MqttUserPropertiesImpl; +import com.hivemq.client.internal.mqtt.datatypes.MqttUserPropertyImpl; +import com.hivemq.client.internal.mqtt.datatypes.MqttUtf8StringImpl; +import com.hivemq.client.internal.util.collections.ImmutableList; +import com.hivemq.client.internal.util.collections.ImmutableList.Builder; +import com.newrelic.api.agent.HeaderType; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.OutboundHeaders; + +public class OutboundWrapper implements OutboundHeaders { + + MqttUserPropertiesImpl userProperties = null; + + public OutboundWrapper(MqttUserPropertiesImpl up) { + userProperties = up; + } + + @Override + public HeaderType getHeaderType() { + return HeaderType.MESSAGE; + } + + @Override + public void setHeader(String name, String value) { + MqttUtf8StringImpl nameStr = MqttUtf8StringImpl.of(name); + MqttUtf8StringImpl valueStr = MqttUtf8StringImpl.of(value); + MqttUserPropertyImpl property = new MqttUserPropertyImpl(nameStr, valueStr); + + Builder builder = ImmutableList.builder(); + ImmutableList list = builder.addAll(userProperties.asList()).add(property).build(); + userProperties = MqttUserPropertiesImpl.of(list); + NewRelic.getAgent().getLogger().log(Level.INFO,"Set outbound headers to: {0}",userProperties); + } + + public MqttUserPropertiesImpl getCurrent() { + return userProperties; + } +} diff --git a/hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/PublisherAdapter.java b/hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/PublisherAdapter.java new file mode 100644 index 0000000..8a96e65 --- /dev/null +++ b/hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/PublisherAdapter.java @@ -0,0 +1,103 @@ +package com.nr.instrumentation.hivemq.client; + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.OptionalLong; + +import com.hivemq.client.internal.mqtt.datatypes.MqttUserPropertiesImpl; +import com.hivemq.client.internal.mqtt.datatypes.MqttUserPropertyImpl; +import com.hivemq.client.internal.util.collections.ImmutableList; +import com.hivemq.client.mqtt.datatypes.MqttTopic; +import com.hivemq.client.mqtt.datatypes.MqttUtf8String; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperties; +import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserProperty; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PayloadFormatIndicator; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish; +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; + +import io.reactivex.functions.Function; + +public class PublisherAdapter implements Function { + + + private static boolean isTransformed = false; + + private Token token = null; + + public PublisherAdapter() { + token = NewRelic.getAgent().getTransaction().getToken(); + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + @Trace(async=true) + public Mqtt5Publish apply(Mqtt5Publish source) throws Exception { + if(token != null) { + token.linkAndExpire(); + token = null; + } + + Optional contentOption = source.getContentType(); + MqttUtf8String ct = contentOption.isPresent() ? contentOption.get() : null; + Optional corrOption = source.getCorrelationData(); + ByteBuffer correlationData = corrOption.isPresent() ? corrOption.get() : null; + OptionalLong expiryOption = source.getMessageExpiryInterval(); + Long expiry = expiryOption.isPresent() ? expiryOption.getAsLong() : null; + Optional payloadOption = source.getPayload(); + ByteBuffer payload = payloadOption.isPresent() ? payloadOption.get() : null; + + Optional formatOption = source.getPayloadFormatIndicator(); + Mqtt5PayloadFormatIndicator payloadFormatIndicator = formatOption.isPresent() ? formatOption.get() : null; + + Optional responseOption = source.getResponseTopic(); + MqttTopic response = responseOption.isPresent() ? responseOption.get() : null; + + if(expiry != null) { + return Mqtt5Publish.builder().topic(source.getTopic()).contentType(ct).correlationData(correlationData).messageExpiryInterval(expiry) + .payload(payload).payloadFormatIndicator(payloadFormatIndicator).qos(source.getQos()).responseTopic(response).retain(source.isRetain()) + .userProperties(getUserProperties(source)).build(); + } else { + return Mqtt5Publish.builder().topic(source.getTopic()).contentType(ct).correlationData(correlationData).noMessageExpiry() + .payload(payload).payloadFormatIndicator(payloadFormatIndicator).qos(source.getQos()).responseTopic(response).retain(source.isRetain()) + .userProperties(getUserProperties(source)).build(); + } + } + + private Mqtt5UserProperties getUserProperties(Mqtt5Publish delegate) { + Mqtt5UserProperties props = delegate.getUserProperties(); + if(props == null) { + MqttUserPropertiesImpl propsImpl = MqttUserPropertiesImpl.NO_USER_PROPERTIES; + OutboundWrapper wrapper = new OutboundWrapper(propsImpl); + NewRelic.getAgent().getTracedMethod().addOutboundRequestHeaders(wrapper); + return wrapper.getCurrent(); + + } + if(props instanceof MqttUserPropertiesImpl) { + MqttUserPropertiesImpl propsImpl = (MqttUserPropertiesImpl)props; + OutboundWrapper wrapper = new OutboundWrapper(propsImpl); + NewRelic.getAgent().getTracedMethod().addOutboundRequestHeaders(wrapper); + return wrapper.getCurrent(); + } else { + List current = props.asList(); + List list = new ArrayList(); + for(Mqtt5UserProperty prop : current) { + MqttUserPropertyImpl newProp = MqttUserPropertyImpl.of(prop.getName().toString(), prop.getValue().toString()); + list.add(newProp); + } + ImmutableList iList = ImmutableList.copyOf(list); + MqttUserPropertiesImpl propsImpl = MqttUserPropertiesImpl.of(iList); + OutboundWrapper wrapper = new OutboundWrapper(propsImpl); + NewRelic.getAgent().getTracedMethod().addOutboundRequestHeaders(wrapper); + return wrapper.getCurrent(); + } + } + +} diff --git a/hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/SubscriberWrapper.java b/hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/SubscriberWrapper.java new file mode 100644 index 0000000..86acb42 --- /dev/null +++ b/hivemq-mqtt-client-1.2/src/main/java/com/nr/instrumentation/hivemq/client/SubscriberWrapper.java @@ -0,0 +1,75 @@ +package com.nr.instrumentation.hivemq.client; + +import org.reactivestreams.Subscriber; +import org.reactivestreams.Subscription; + +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5Publish; +import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PublishResult; +import com.newrelic.agent.bridge.AgentBridge; +import com.newrelic.api.agent.DestinationType; +import com.newrelic.api.agent.MessageProduceParameters; +import com.newrelic.api.agent.NewRelic; +import com.newrelic.api.agent.Segment; +import com.newrelic.api.agent.Token; +import com.newrelic.api.agent.Trace; + +public class SubscriberWrapper implements Subscriber { + + private Subscriber delegate = null; + private Token token = null; + private static boolean isTransformed = false; + private Segment segment = null; + + public SubscriberWrapper(Subscriber d, Token t) { + delegate = d; + token = t; + segment = NewRelic.getAgent().getTransaction().startSegment("HiveMQ-Publish"); + if(!isTransformed) { + isTransformed = true; + AgentBridge.instrumentation.retransformUninstrumentedClass(getClass()); + } + } + + @Override + public void onSubscribe(Subscription s) { + delegate.onSubscribe(s); + } + + @Override + @Trace(async=true) + public void onNext(Mqtt5PublishResult t) { + if(token != null) { + token.link(); + } + Mqtt5Publish result = t.getPublish(); + String topicName = result.getTopic().toString(); + MessageProduceParameters params = MessageProduceParameters.library("HiveMQ").destinationType(DestinationType.NAMED_TOPIC).destinationName(topicName).outboundHeaders(null).build(); + if(segment != null) { + segment.reportAsExternal(params); + segment.end(); + segment = null; + } else { + NewRelic.getAgent().getTracedMethod().reportAsExternal(params); + } + delegate.onNext(t); + } + + @Override + public void onError(Throwable t) { + if(token != null) { + token.expire(); + token = null; + } + delegate.onError(t); + } + + @Override + public void onComplete() { + if(token != null) { + token.expire(); + token = null; + } + delegate.onComplete(); + } + +} diff --git a/settings.gradle b/settings.gradle index 6014da5..69970a2 100644 --- a/settings.gradle +++ b/settings.gradle @@ -8,3 +8,6 @@ git { } } rootProject.name = 'java-instrumentation-template' +include 'hivemq-mqtt-client-1.0' +include 'hivemq-mqtt-client-1.1' +include 'hivemq-mqtt-client-1.2'