From 2c57cb92d87756bdb35bed22b49af48fb8988eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?No=C3=A9mi=20V=C3=A1nyi?= Date: Fri, 4 Aug 2017 12:14:14 +0200 Subject: [PATCH] filebeat: add Kafka log module This module is based on https://www.elastic.co/blog/monitoring-kafka-with-elastic-stack-1-filebeat --- CHANGELOG.asciidoc | 1 + filebeat/docs/fields.asciidoc | 90 ++ .../images/filebeat-kafka-logs-overview.png | Bin 0 -> 69319 bytes filebeat/docs/modules/kafka.asciidoc | 37 + filebeat/docs/modules_list.asciidoc | 2 + filebeat/filebeat.reference.yml | 15 + filebeat/module/kafka/_meta/config.yml | 13 + filebeat/module/kafka/_meta/docs.asciidoc | 24 + filebeat/module/kafka/_meta/fields.yml | 9 + .../dashboard/Filebeat-Kafka-overview.json | 85 ++ filebeat/module/kafka/log/_meta/fields.yml | 41 + filebeat/module/kafka/log/config/log.yml | 10 + .../module/kafka/log/ingest/pipeline.json | 66 ++ filebeat/module/kafka/log/manifest.yml | 14 + filebeat/module/kafka/log/test/controller.log | 20 + .../log/test/controller.log-expected.json | 961 ++++++++++++++++++ filebeat/module/kafka/log/test/server.log | 20 + .../kafka/log/test/server.log-expected.json | 961 ++++++++++++++++++ .../module/kafka/log/test/state-change.log | 1 + .../log/test/state-change.log-expected.json | 49 + filebeat/modules.d/kafka.yml.disabled | 13 + 21 files changed, 2432 insertions(+) create mode 100644 filebeat/docs/images/filebeat-kafka-logs-overview.png create mode 100644 filebeat/docs/modules/kafka.asciidoc create mode 100644 filebeat/module/kafka/_meta/config.yml create mode 100644 filebeat/module/kafka/_meta/docs.asciidoc create mode 100644 filebeat/module/kafka/_meta/fields.yml create mode 100644 filebeat/module/kafka/_meta/kibana/default/dashboard/Filebeat-Kafka-overview.json create mode 100644 filebeat/module/kafka/log/_meta/fields.yml create mode 100644 filebeat/module/kafka/log/config/log.yml create mode 100644 filebeat/module/kafka/log/ingest/pipeline.json create mode 100644 filebeat/module/kafka/log/manifest.yml create mode 100644 filebeat/module/kafka/log/test/controller.log create mode 100644 filebeat/module/kafka/log/test/controller.log-expected.json create mode 100644 filebeat/module/kafka/log/test/server.log create mode 100644 filebeat/module/kafka/log/test/server.log-expected.json create mode 100644 filebeat/module/kafka/log/test/state-change.log create mode 100644 filebeat/module/kafka/log/test/state-change.log-expected.json create mode 100644 filebeat/modules.d/kafka.yml.disabled diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index a0333c8ef44..7185c89a6c0 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -74,6 +74,7 @@ https://github.com/elastic/beats/compare/v6.0.0-beta1...master[Check the HEAD di *Filebeat* - Add PostgreSQL module with slowlog support. {pull}4763[4763] +- Add Kafka log module. {pull}4885[4885] *Heartbeat* diff --git a/filebeat/docs/fields.asciidoc b/filebeat/docs/fields.asciidoc index 4e1cf9673fc..0b677ee0073 100644 --- a/filebeat/docs/fields.asciidoc +++ b/filebeat/docs/fields.asciidoc @@ -18,6 +18,7 @@ grouped in the following categories: * <> * <> * <> +* <> * <> * <> * <> @@ -749,6 +750,95 @@ type: text The logged message. +[[exported-fields-kafka]] +== Kafka fields + +Kafka module + + + +[float] +== kafka fields + + + + +[float] +== log fields + +Kafka log lines. + + + +[float] +=== `kafka.log.timestamp` + +The timestamp from the log line. + + +[float] +=== `kafka.log.level` + +example: WARN + +The log level. + + +[float] +=== `kafka.log.message` + +type: text + +The logged message. + + +[float] +=== `kafka.log.component` + +type: keyword + +Component the log is coming from. + + +[float] +=== `kafka.log.class` + +type: text + +Java class the log is coming from. + + +[float] +== trace fields + +Trace in the log line. + + + +[float] +=== `kafka.log.trace.class` + +type: keyword + +Java class the trace is coming from. + + +[float] +=== `kafka.log.trace.message` + +type: text + +Message part of the trace. + + +[float] +=== `kafka.log.trace.full` + +type: text + +The full trace in the log line. + + [[exported-fields-kubernetes-processor]] == Kubernetes fields diff --git a/filebeat/docs/images/filebeat-kafka-logs-overview.png b/filebeat/docs/images/filebeat-kafka-logs-overview.png new file mode 100644 index 0000000000000000000000000000000000000000..b04697a4b338c64a715fac0797132ef7f3af8254 GIT binary patch literal 69319 zcmbrmcRbbo|3B_(5khuZDIqh2Y@LwE-aE2|viC_=NC*j;W$&!)kWDt(lD+qK&i8Su z>;3uMexJ|p`_K2>uIm(WDM31uv-^D0~=i2NSy|FS{>dVO_&| zC~;5KWn^XCS(9{V0(+y#Gn$|`_zbSPxJA$>C1ytVNuaap7hQbo(@zRcYQ-c zqNt|~TnXlp#A`%?SR1blc=P9bEc2-M3z&6IHLihJ8qQkR)zq*e6`-S)n z;oq-bo&59XtN-PwJ$@x`%g_RJG?O2G1i&v8LpnSX+A@?JQ>fek9)y;M>+OnO(uw+0uuLO%ib4zjSvV zIo%OsRmNjlyInd*duQ?Fyr1%AnyW`{yGlwA7gMu`M1$O;n`b}2f0Wy(${g8%E!Axx z+t%hpElAD#SbRTE@2b*Bd!^%ko;1VS>iUpFbq~H87M8d@3o~<=Oe+2bpOg&$IqTiy zdn>zGSW}nA#`&M_cNlSpCfv=mJm|t{;G*p8d2q9<{pm^x(W*;ye% zx;G0$WeJHw{?UUtq>|&EZ8p7m=Kd_&BO};Y=HoD3W$ybngoL48V(78K!99~8OV8sv z@{%E#8}rg}&xW<__1V#1>T~148oe*wcl+ay$G<1mAMdVC|GbBktBmrRuk*=#@&t!I zZhvKWb#S#QUZ~N;B(13_yzbOWB1P6hLy|bKsQNUcPKn&q)PbW=;`4g6fqjCoVWFlz zjSvCBCBvd&U!o|P-66kV{3;fFl~MMta zf3Nzqx_a@JWNK>Q{C6?dTS}R#@_T!>l9#x7xH8j=x7ylPu?gN>Azq!EPT|j24=Gz8 z7mI$Ytftp#R5&6i*hE10?%9&V;IC!@g@hB&Q#T62(7I&$igq21R#M4$1-WV`p^p`5 zP5s}D559WS+T>MO%htND52z~*#rEn6mVVE_Uu}gBs6IZasy^fCv2aJDuP;As(#v*> zA=kiem+h(Ea$cVLm0ne>7v#$`tr2{DeCyTw3E|;ATeIy{dh+dKgr#ZKw6G$IR@bP= z4|!rblzcuq(Fu(7jE_$YrrmSxN==ie-F+7y(wSOZ+;EX;L_nbP{oQ+Cf6>U_eZDlE z+SB8+XiSm!sS!VrR?Nu7(R%f#81Y+9y`ZbNUl7^x-7LweI{E0FZdX25%b|Ps;CR!5 zq^ZyBmBI(nzTt)^He;1LTxaB%zJJIh3l@zL4N1xP$fSUBT^lQS^{PO$n!U3#Z@fmt z^W>mHTjv((ny|x{&{|{{?f3vm$hnuIDAby@9*)nZm66d_WAMk6lqD892J&@Lw>vqu zbo><26#%p~}6p9##3{-xVLA7Wdb77e>@r zpNQb;bXD|?&a3(Jl3^vC&&tSnTr}L5Ca1y@B_$=rsiGP@{@=&gsiamW)z1F;#g(4Z zmOv8R)X(=^VF^*Mu4q0oeGy71sg&&L78mpW*g-;H$8I;0dP<@q#+>(K)Kr3gX#xs$WTwPtQN2{arQN!^b7Z=~$wo5FpjLBym zXKw5OU&@Q;nxv$9l9PvQ%vxr)DELY$(oE-*?^E;XEHjGpkdP4aYmf&w8gW-Tu4w9N zt7}}u^|R|LG^lWKIdXNq@;*9+IaNk-@*(}y_V{RNZuYa>+1%_IJdHew0Dr;JQTw~p zLR3`$BpPUp>Kl?d=H5CREx$gpzcyC>DJQ46>H|vey}?08r9D&p{R>AFr6|YrGBy8v z99Wi;48)$tt7W65);v5sMa9J)F)7+xUIo0XP>`@`^c!?tyx zq=Y!Lf4FWUthBnGCCe94ZIzY#@gu!#y7Q{e`xsZ}HIEy=Uy(`SRt z?4+tzC1CFnqfh_yH3L+w+0bwfIy2bfYY}oFl=+jG2e)VJpw=n!4b8J%Q;nr+mbw?7 zwxM}??uUEN>*C!L1z~ZGxVQc6v999UWkx zgrnVV<|x=UY+pD$+FKaeH8q{1OPANt(oGb0i=1F$u;Q@QyE(M&@F2HzabSUENlWDd zNBr6dlkdT?%Q||u%=`2>b+VE_NkdWO)^1ihdbczyS?)a6fpgTmcX`?+K`9xTD(Oy3 z{fls?g~xU3Rlo1Fcii)aGvbYt(^ zwWD=8u5oF&TBv%SBiDJc!o>~NuwJ?Aw$}59K3iL^Ro4tA3Dc`o)b&vZ4@K#HTOVgI ztLZH+vkdot^KJi0N=jB+V4YtYbTkyX)_dji-bMQFdwWu6>Nzb&Zu<#xlRf$M0xXn)z z*a)keIjGHbYo@JJXLp{Li!W$lXn&zKLMHWdvTHjltBGBCYWWrVZ*BG0=O5NAC61mi z=~v_S39Iq`hp8)porPU3Q*|~fiVQ7GelHtF1NZ)53^1X4;jyu*FE=B_*X}A6NpFB z_t%j(^CwI7Qk5N_InrFEbrSg{e?K_n3OB>*U~U7F;dacUb@}-E6{ux~t&TM(#1;$@8V1mV4obp2sVK zcB;vW#g2B=LJkX?Gc!lqN5=$NwIcHIppK5uQEZANEg=E6OjGBP$?uOHRa zCPo~cJD?LrH3zNpJMHdxuv&(xa|l^2SIE$IXGbe%j@j>MhDaNm8gbhxewy1Qh_!Yv zQCrYcab%D8wn`+L9?w*%&+HqobQ~BR*yVhx7o1e4c7YFC$gF0uxl$k5MDLzYu0=jJ z7FPGuN_Qz27niNzy)i6w1$L+%O4xY~nraH`A0&JA9ATXI&%1u^@UW!z`r;;_saKw@pG{Q zBDs6xo2e;!8=>`K8?FWOFz@^ibiTIr_qqRq;oZG=R!LBnlGC4xDEtO^rOw>z*kDGq ztaco0*p4ePlU1Mfs1|fL`g4g`UuBguRav5-3TWta`_w%y)WpAV->O16GqQb_C2A>Z z2ugdoE=R;6OIIJi^$dDBu=b2+wa92?j{&?n(xCcq?HiZxbuk*@xy7}%U(dOu{-FCQ zlX|aIO*isYSyGiP`qrU!=zk8~97;#W_w+|_DB~TyburF- zRi#M56(--AISPkow#|k`0@S7MI?*4hJYFmPxp9|P#q!MTZo$vjqTAytq+%YKO8>}5 zp$&phf@RwegxB(!-XcZ!n&}>zF$ZO3lEqM7>9Lo49g<~b`CpfHr%@8MtI>nsd{tl5 z&-5$0eyaB34P=Zi2eGXGCEU2%mdrk_E*lG6!Ho=PUAlXhQ&ewZUab93j11~a+J^V- zd~FVdE#`Xe@Qy3iqTuE0+x&dopNk4j3*Y+^xl=8(7?xxPJ~vdlC{k9cZfs_iEB_%P z;-k*X%1WWZ1u7f0rUVw(kfZEqlYmW|vpwusa+D42#xMt6^HlHkA7;LpjXx~9CYcjS zjG*+rY(8$1)vRd$rWM)897X53)3ZN`MA!GSu(Fm}k1|HIBJSVcU!Sy^Z+la*nf zqcmQ|2n%cL)ukm%Yim6Pjv&Ql?)^#T+I)do87O_t?5xZ}~*g)!A8I^X_Y@ z%H>EjYOue-89t=7mFwiy-h3j`#=_!oWw^+;<}ghqU7nGVkunvouG?JBr9>>T8E=)! zVWW(sk`QHSV$t)xF|ccXcjf1HpSQstH7ZvjDKRsUOC1aAYi(Xq(o}D%tU`jYl32D> zs&Z6haY|6UN+Sb2>r9-4sTmzh6R1>H;>lm7{bthhCn3wcA`r%&S*8or`W%4^@~+ zVP2xzX9)-he8XP8d zBcs=^Uu)ZAI6ixfOsaCgsW5FmOr~!bd_-z$>OlVq`Uan!y*&*zH5)s-V-ZFFyFoQ> z$qdAEiwED)bSEaaDX)hw9Iw~X2|AcJzoEHEPfJTHDk@4%kX~BqwAh>K?d|Pz;gZ|I zhM}~y^iZB2;1PPQ{()BG&vJ2maG*dKS6 zeaChg=iKbYbmTpDN4gQg;5>*x1VIDwjVD+*O)Arkgj($jC%IkM3}Df4=n+87Q%}*-STC z<;ug$>v(#!i?-Pa1qo%UQ%zGd!%Hnkm8IHo`CVuzVPe<%K=x1+t43CK_M(=ntE<}$ zBu50h+Q4C&7RNSnFKNI4zwzKyL;33$H)l0P)tk=AsxqO{r(Z7=X5pd z+|F~NTq6+?kt_HY;(OcLf|`E~3=S?$#7w5i#cgbC_+S$PN|xWw2(r0xkv`FL52}bx zl?zu~C!?=0h%3WIX7FYyJX?n+ZEZ3bt!P90U^d!7K3-5#sUNoeaz)t2B<}G=dJ_|q z>)|b9V<%BV%IfM)Xp|?SC0D0R6m{@RgY0Co!Z90lZoJa@0cMe*)wHxS9j}R}D(^1z z__WXV*3~L9_sgZt84jwid!l@a{t2EpHvU+Sq~SJhv8_EFtaP@$apU9h{(7Q_yAzZ{ zT@DS#2q>lx+?-qe&61geT2B(0h88B26cT;SxMO0mcNf2CtDIh3VtLo_)0|g4|JAEk zv+dE7mCpI7UUT4;_wL;b3=DkI{N|>wrna`%W+Mel8pdH&?|79p+h zK{FlNQ@LxQ=i`Gn)DLmOr5P%nRx6xVulm$2j92b|dKls0oaETr-Yx{|aiqlR{F#4( z8+$+Oo*ZtAxbKZsI)^qIoyW#*{`T#5Ob0CT(~Sl~Z9k8r#dHz39rK`q#7@%(Qc`@9 zKNN7DJ2~msdYv}YA=$`-4XigNaUMN|LT}5KshY)`nvucG$r(yuQt7xXr4T92;8sLv zzu0~azq%;p!^=Beheg9HHsckNl9I3_B2qG-szYVsh?d0>a9;Z$liJH(7se)&%1uvy zk0nY_KtN4Z)!59e&$ZF$c>nSOlvf5f(A2LRye)`nix7d6oBfIvJK!PBhu67giEqdCb= zO!LKPm$4TUyM|(?S5{V*mSpHizjz)y>9v~2cjz%y5cXa|dFBd+SW;xgO>}i(N+75? zupH;N51~e|s^>huO}SeoRDfbr&fI~y8yFZ6rnMc+(W*V&)A8^)Ns$ch?dv;#=AN$Z z7&L)*>^i0H`)gmm+;vMoev8kkKF*iB2qkZ4_ryQa)X?zf@^ak!_bsz_Vka97#l^*q z!4#bORW8SSt599_{MN8vTZ2NWS8mrhIhk1F(Gk`%340Swctl$Lh_TY+aH~I4g`J&! zwAf;MZ`2kR{W~v}O2$IXlV71?O^uj`^>{^;D8A>)kHSPGN`Rk#--l2XMm%8fviIA! zZ{NSCqzyH*u@QaJ^qR-)J2NRRXcI%vKrBU_9@l1-jq=(5m`r(z#K24134I7gag;)Twbo&=7uuou>JA2k><$^& zj+Ta?WR&_NZ>hZF(93d+9~sQmVP$1C>x_l+LMV3f*vd-Cq>U8O;)h4^Jwb$ujxJwK z!^vr{Y|<;+%lDF`QeV1)L6ysM*tNW&5*;x-X0vTkPEJmo_=}eo1MKI&i+CJ_p{TE1 zS)88kO|t2)qAN)5IR*#@dNW;iwtj^}CVhFa&7~yUhC3UgNRUuE1HW`(s`%{G)W%fZ z*&`z_+Rz69r`N-o+1cgnkx~Zd6{F?n@?cr@#K7(43zh4lU{-oVt5!!!mcKmzHBxMG zfAU$ne8c10j~+c*AX1fMBgb6g?$Q8Ma^JAl2&S$?G33~n=Z<=O(m2nbKL^p1fkNpg5e+oJ-MaIR+8We;jB-q&6PCBe__bnyDw(3nh zf2MBZXG0uvcG?mN5<5ji>(1t8av}>;l+5~Axr&xnOl)k{l|AQ$?&LsPcMN%9Z+m$j zZ!q7W7K$H~L=wbco?iBwJ>Cc<($uKJPoI429%mQ`{+gQl`uKKGaPV?waMwKYWV1P4 zK0X$JOT8ane0==y)6zLTTjk6<0s^iuO8L+JSzTSdapT5f^CeO;vYR(=UU4b>D(io` zQ+c|Os$XV9b4s3U>TeJ2!?u{udgS2fXrjhbha*}HiYAOltUXZ2sl~-WeSmJ}a;TH- zE&u@*@-cUx8>y;B78Y`y4vdVrwME{7>E>i*g=y;Zc!@8mR8ms1Q|`$-K8kV-rC8Y7 z*w8F}8gul+TRF4e!*CT)1oUr%!*wET?0}Y*mQSA;{1ErB(c$6Ya?W$Le!iy|GvmdN z;o;roAx_vs(Cv&0-xJmUeD>7ZdbGsK%+Syq1>N7=E_k8p(pn9RpQrf z^Yd#klfq8iQQO}UdI6QIq~0PZ1(2GQ0uq1(2mx^2RS#iiH#Rqw9!$xkV(t~Hsd-SN zZRwQ3^>B0lQ>&r8-RO=KxF_|F5=)M<)5Lv{rKzmcp)=Tft53zpn0V$&>e|XT0)8w44wBWSga?rE$k}ym;|~ap|AVsoI>JM-0Tg zjnyI0*ny#F1e~H!DDBh=*TbWt)E+;cdUg56g4VC5 zkWpBmW{I9sN~+@GUom~MNC9qaeWIEUdBP>B1n)+|B=2Du!X*CzFyYj*y9o&i!Q||{ z9=%=&L_L6OeV5v=?bzt~@9}s91U4xTt_lbV!MX)liE0Pr=iK1+vh3&{UO?Fqj1tiG z)7YQ)JZEMnmWJ-;Z{&L2E&I#WyJLUC=D>2%vOBM)%NW6`T5A2J>5T9V%!{zX#h`JK zvyeTk(slZ&?I)3S-S;--x6wX_9dRL*U+6$I_-IQjD<@ejyamOfqDKqM`L%r9+$qc~ zTwI&ejlsaQyXFZgZ(qB9{iS@7+wKx5G)L7nzF}8*Oz$j)nC6#4X97bIBmwch6rABr z*?V&hXwla`DbhziOJj)5^z|=UKFBDU64&iH*pIbuH7?vqDgO5D+i00B5@3S5x_VSp z6x6pTw<(v(u5`xoX5SAW=aOhuo}i^1ZI+Q*F7i=WTF!xdk> zHLGr-S7c+RHWU=KwDga}b~w_)eK63K+s76yJ{z zLO&@l78o|1oSt^UMnt1dFH!M*DK8JX%A1w&jy0+c7WzJLUl7XE(ipk9x$oYke1Z>b zk?6ORmzIavW{qf7%~X}s{*~=H#EsdL=ATlyE%b_*gCd2a%LVX?)7)KL4h{~U-Tg2! zGLkAAec{4|z4b{n_(2XcNMJh9V3+06bo`_lMru5d$I3CB2^SZ)=6J0V*gVd;5ngpQ zwV3zs&E@X!^5$k`rQARRn8;Y)HYm3<*OVLAkoQ`TP2wY_)Sj z8ypZG$S<4K<=6+h^ybYQXvxsaLqkK?Cu@-rHO-WN%ghd$liY*lED?f$8&NWG#Zny6 z!5CzP@}%ZdVbmDp(Qr1Bl4=^r))1g3@Ttql%%t}PZi|9mim97+aP1dK7#HNySo!&f z>gv4TOvHcq043Po-d@OgEhnmDY)rSz7oaITakTyV3QsWyIVF#2M=Y<^`$u!>iC!`| zx0so4^YX6trsB~kFE3vr01&jH8ag`J?j0DHdq)ZwMU>0{sTm4b5TJ8G>Mo-~7vTh54%;9e zG`v~+?DPjQr~^28@@J~|4@nRQ!fEj(d)`a`AI8z6(ZB6d1=g%VrBet|@5cv(9MReQ zF&yLfkKMY$Mt}TxC6UtGt4u{j5f1 zk5x(N|IGqW7xmRBep&M>g_hUN;XyFGDDCH~jXB zvzCo^P^fp*rF$KJK>ks03CwV2XgD@DHY_6OzJ4`DdbZrD$}wSKNv>LYe*k`PP!JA1 zYzx>-mP2{*HrxaOB$qE2LI(n7hmclN8-N?bzI63dO}zo0q!N@LIxZs#Rn>mjNjUWK z^76obVS_uIDb!qjR8_ z(&7|mZ0{($Q`BwT9-UN(Hjf`)8>ur^q_Y~|*(pCgIB?;JrlO=Yw?0K%eE9GIhyD>` zUr$eAp79?jUhTF!z3Jk>;VljjwCqVUL8>z71iz-I&z

X6TiX!ntzCoQU2S@ReQp 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 literal 0 HcmV?d00001 diff --git a/filebeat/docs/modules/kafka.asciidoc b/filebeat/docs/modules/kafka.asciidoc new file mode 100644 index 00000000000..36a13dc8ae5 --- /dev/null +++ b/filebeat/docs/modules/kafka.asciidoc @@ -0,0 +1,37 @@ +//// +This file is generated! See scripts/docs_collector.py +//// + +[[filebeat-module-kafka]] +== Kafka module + +This module collects and parses the logs created by https://kafka.apache.org/[Kafka]. + +[float] +=== Compatibility + +The Kafka module was tested with logs from versions 2.11. + +[float] +=== Dashboard + +This module comes with a sample dashboard to see Kafka logs and stacktraces. + +image::./images/filebeat-kafka-logs-overview.png[] + +[float] +=== Logs fileset settings + +[float] +==== var.paths + +An array of paths where to look for the log files. If left empty, Filebeat +will choose the paths depending on your operating systems. + + +[float] +=== Fields + +For a description of each field in the metricset, see the +<> section. + diff --git a/filebeat/docs/modules_list.asciidoc b/filebeat/docs/modules_list.asciidoc index 1dd62900250..52dca849789 100644 --- a/filebeat/docs/modules_list.asciidoc +++ b/filebeat/docs/modules_list.asciidoc @@ -6,6 +6,7 @@ This file is generated! See scripts/docs_collector.py * <> * <> * <> + * <> * <> * <> * <> @@ -19,6 +20,7 @@ include::modules-overview.asciidoc[] include::modules/apache2.asciidoc[] include::modules/auditd.asciidoc[] include::modules/icinga.asciidoc[] +include::modules/kafka.asciidoc[] include::modules/mysql.asciidoc[] include::modules/nginx.asciidoc[] include::modules/postgresql.asciidoc[] diff --git a/filebeat/filebeat.reference.yml b/filebeat/filebeat.reference.yml index dcd7d03653b..d4566d31ccb 100644 --- a/filebeat/filebeat.reference.yml +++ b/filebeat/filebeat.reference.yml @@ -114,6 +114,21 @@ filebeat.modules: # can be added under this section. #prospector: +#-------------------------------- Kafka Module ------------------------------- +- module: kafka + # All logs + log: + enabled: true + + # Set custom paths for Kafka. If left empty, + # Filebeat will look under /opt. + #var.kafka_home: + + # Set custom paths for the log files. If left empty, + # Filebeat will choose the paths depending on your OS. + #var.paths: + + #-------------------------------- MySQL Module ------------------------------- #- module: mysql # Error logs diff --git a/filebeat/module/kafka/_meta/config.yml b/filebeat/module/kafka/_meta/config.yml new file mode 100644 index 00000000000..fe568e8e562 --- /dev/null +++ b/filebeat/module/kafka/_meta/config.yml @@ -0,0 +1,13 @@ +- module: kafka + # All logs + log: + enabled: true + + # Set custom paths for Kafka. If left empty, + # Filebeat will look under /opt. + #var.kafka_home: + + # Set custom paths for the log files. If left empty, + # Filebeat will choose the paths depending on your OS. + #var.paths: + diff --git a/filebeat/module/kafka/_meta/docs.asciidoc b/filebeat/module/kafka/_meta/docs.asciidoc new file mode 100644 index 00000000000..fc2ea722bb5 --- /dev/null +++ b/filebeat/module/kafka/_meta/docs.asciidoc @@ -0,0 +1,24 @@ +== Kafka module + +This module collects and parses the logs created by https://kafka.apache.org/[Kafka]. + +[float] +=== Compatibility + +The Kafka module was tested with logs from versions 2.11. + +[float] +=== Dashboard + +This module comes with a sample dashboard to see Kafka logs and stacktraces. + +image::./images/filebeat-kafka-logs-overview.png[] + +[float] +=== Logs fileset settings + +[float] +==== var.paths + +An array of paths where to look for the log files. If left empty, Filebeat +will choose the paths depending on your operating systems. diff --git a/filebeat/module/kafka/_meta/fields.yml b/filebeat/module/kafka/_meta/fields.yml new file mode 100644 index 00000000000..5469c535e71 --- /dev/null +++ b/filebeat/module/kafka/_meta/fields.yml @@ -0,0 +1,9 @@ +- key: kafka + title: "Kafka" + description: > + Kafka module + fields: + - name: kafka + type: group + description: > + fields: diff --git a/filebeat/module/kafka/_meta/kibana/default/dashboard/Filebeat-Kafka-overview.json b/filebeat/module/kafka/_meta/kibana/default/dashboard/Filebeat-Kafka-overview.json new file mode 100644 index 00000000000..7b5d03e48ee --- /dev/null +++ b/filebeat/module/kafka/_meta/kibana/default/dashboard/Filebeat-Kafka-overview.json @@ -0,0 +1,85 @@ +{ + "objects": [ + { + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"filter\":[]}" + }, + "savedSearchId": "Kafka stacktraces", + "title": "Number of Kafka stracktraces by class", + "uiStateJSON": "{}", + "version": 1, + "visState": "{\"title\":\"Number of Kafka stracktraces by class\",\"type\":\"histogram\",\"params\":{\"type\":\"histogram\",\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100},\"title\":{\"text\":\"@timestamp per 30 minutes\"}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"histogram\",\"mode\":\"stacked\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"valueAxis\":\"ValueAxis-1\",\"drawLinesBetweenPoints\":true,\"showCircles\":true}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"@timestamp\",\"interval\":\"auto\",\"customInterval\":\"2h\",\"min_doc_count\":1,\"extended_bounds\":{}}},{\"id\":\"3\",\"enabled\":true,\"type\":\"terms\",\"schema\":\"group\",\"params\":{\"field\":\"kafka.log.trace.class\",\"size\":10,\"order\":\"desc\",\"orderBy\":\"1\"}}]}" + }, + "id": "Number of Kafka stracktraces by class", + "type": "visualization", + "version": 1 + }, + { + "attributes": { + "columns": [ + "kafka.log.class", + "kafka.log.trace.class", + "kafka.log.trace.full" + ], + "description": "", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"index\":\"filebeat-*\",\"highlightAll\":true,\"version\":true,\"query\":{\"query\":\"_exists_:kafka.log.trace.class\",\"language\":\"lucene\"},\"filter\":[]}" + }, + "sort": [ + "@timestamp", + "desc" + ], + "title": "Kafka stacktraces", + "version": 1 + }, + "id": "Kafka stacktraces", + "type": "search", + "version": 1 + }, + { + "attributes": { + "columns": [ + "kafka.log.level", + "kafka.log.component", + "kafka.log.message" + ], + "description": "", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"index\":\"filebeat-*\",\"highlightAll\":true,\"version\":true,\"query\":{\"query\":\"kafka.log.level:*\",\"language\":\"lucene\"},\"filter\":[]}" + }, + "sort": [ + "@timestamp", + "desc" + ], + "title": "All Kafka logs", + "version": 1 + }, + "id": "All Kafka logs", + "type": "search", + "version": 1 + }, + { + "attributes": { + "description": "", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"language\":\"lucene\",\"query\":\"\"},\"filter\":[],\"highlightAll\":true,\"version\":true}" + }, + "optionsJSON": "{\"darkTheme\":false}", + "panelsJSON": "[{\"col\":1,\"id\":\"Number of Kafka stracktraces by class\",\"panelIndex\":1,\"row\":1,\"size_x\":6,\"size_y\":3,\"type\":\"visualization\"},{\"col\":7,\"columns\":[\"kafka.log.class\",\"kafka.log.trace.class\",\"kafka.log.trace.full\"],\"id\":\"Kafka stacktraces\",\"panelIndex\":2,\"row\":1,\"size_x\":6,\"size_y\":3,\"sort\":[\"@timestamp\",\"desc\"],\"type\":\"search\"},{\"size_x\":12,\"size_y\":3,\"panelIndex\":3,\"type\":\"search\",\"id\":\"All Kafka logs\",\"col\":1,\"row\":4,\"columns\":[\"kafka.log.level\",\"kafka.log.component\",\"kafka.log.message\"],\"sort\":[\"@timestamp\",\"desc\"]}]", + "timeRestore": false, + "title": "Kafka logs overview", + "uiStateJSON": "{}", + "version": 1 + }, + "id": "Kafka logs overview", + "type": "dashboard", + "version": 1 + } + ], + "version": "6.0.0-beta1-SNAPSHOT" +} diff --git a/filebeat/module/kafka/log/_meta/fields.yml b/filebeat/module/kafka/log/_meta/fields.yml new file mode 100644 index 00000000000..e9d234cb625 --- /dev/null +++ b/filebeat/module/kafka/log/_meta/fields.yml @@ -0,0 +1,41 @@ +- name: log + type: group + description: > + Kafka log lines. + fields: + - name: timestamp + description: > + The timestamp from the log line. + - name: level + example: "WARN" + description: > + The log level. + - name: message + type: text + description: > + The logged message. + - name: component + type: keyword + description: > + Component the log is coming from. + - name: class + type: text + description: > + Java class the log is coming from. + - name: trace + type: group + description: > + Trace in the log line. + fields: + - name: class + type: keyword + description: > + Java class the trace is coming from. + - name: message + type: text + description: > + Message part of the trace. + - name: full + type: text + description: > + The full trace in the log line. diff --git a/filebeat/module/kafka/log/config/log.yml b/filebeat/module/kafka/log/config/log.yml new file mode 100644 index 00000000000..98c684ef52f --- /dev/null +++ b/filebeat/module/kafka/log/config/log.yml @@ -0,0 +1,10 @@ +type: log +paths: +{{ range $i, $path := .paths }} + - {{$path}} +{{ end }} +exclude_files: [".gz$"] +multiline: + pattern: '^\[' + negate: true + match: after diff --git a/filebeat/module/kafka/log/ingest/pipeline.json b/filebeat/module/kafka/log/ingest/pipeline.json new file mode 100644 index 00000000000..1c5149f5a51 --- /dev/null +++ b/filebeat/module/kafka/log/ingest/pipeline.json @@ -0,0 +1,66 @@ +{ + "description": "Pipeline for parsing Kafka log messages", + "processors": [ + { + "grok": { + "field": "message", + "trace_match": true, + "patterns": [ + "(?m)%{TIMESTAMP_ISO8601:kafka.log.timestamp}. %{LOGLEVEL:kafka.log.level} +%{JAVALOGMESSAGE:kafka.log.message} \\(%{JAVACLASS:kafka.log.class}\\)$[ \\n]*(?'kafka.log.trace.full'.*)" + ] + } + }, + { + "grok": { + "field": "kafka.log.message", + "patterns": [ + "\\[%{DATA:kafka.log.component}\\][,:. ] +%{JAVALOGMESSAGE:kafka.log.message}" + ], + "on_failure": [ + { + "set": { + "field": "kafka.log.component", + "value": "unknown" + } + } + ] + } + }, + { + "grok": { + "field": "kafka.log.trace.full", + "ignore_missing": true, + "patterns": [ + "%{JAVACLASS:kafka.log.trace.class}:\\s*%{JAVALOGMESSAGE:kafka.log.trace.message}" + ], + "on_failure": [ + { + "remove": { + "field": "kafka.log.trace" + } + } + ] + } + }, + { + "rename": { + "field": "@timestamp", + "target_field": "beat.read_time" + } + }, + { + "date": { + "field": "kafka.log.timestamp", + "target_field": "@timestamp", + "formats": ["yyyy-MM-dd HH:mm:ss,SSS"] + } + }, + {"remove": {"field": "kafka.log.timestamp" }} + ], + "on_failure" : [{ + "set" : { + "field" : "error.log", + "value" : "{{ _ingest.on_failure_message }}" + } + }] +} diff --git a/filebeat/module/kafka/log/manifest.yml b/filebeat/module/kafka/log/manifest.yml new file mode 100644 index 00000000000..fb7916d9536 --- /dev/null +++ b/filebeat/module/kafka/log/manifest.yml @@ -0,0 +1,14 @@ +module_version: 1.0 + +var: + - name: kafka_home + default: /opt/kafka* + - name: paths + default: + - "{{.kafka_home}}/logs/controller.log*" + - "{{.kafka_home}}/logs/server.log*" + - "{{.kafka_home}}/logs/state-change.log*" + - "{{.kafka_home}}/logs/kafka-*.log*" + +ingest_pipeline: ingest/pipeline.json +prospector: config/log.yml diff --git a/filebeat/module/kafka/log/test/controller.log b/filebeat/module/kafka/log/test/controller.log new file mode 100644 index 00000000000..39cd4b97043 --- /dev/null +++ b/filebeat/module/kafka/log/test/controller.log @@ -0,0 +1,20 @@ +[2017-08-04 10:48:21,048] INFO [controller-event-thread]: Starting (kafka.controller.ControllerEventManager$ControllerEventThread) +[2017-08-04 10:48:21,063] INFO [Controller 0]: 0 successfully elected as the controller (kafka.controller.KafkaController) +[2017-08-04 10:48:21,064] INFO [Controller 0]: Broker 0 starting become controller state transition (kafka.controller.KafkaController) +[2017-08-04 10:48:21,082] INFO [Controller 0]: Controller 0 incremented epoch to 1 (kafka.controller.KafkaController) +[2017-08-04 10:48:21,085] DEBUG [Controller 0]: Registering IsrChangeNotificationListener (kafka.controller.KafkaController) +[2017-08-04 10:48:21,154] INFO [Replica state machine on controller 0]: Started replica state machine with initial state -> Map() (kafka.controller.ReplicaStateMachine) +[2017-08-04 10:48:21,156] INFO [Partition state machine on Controller 0]: Started partition state machine with initial state -> Map() (kafka.controller.PartitionStateMachine) +[2017-08-04 10:48:21,157] INFO [Controller 0]: Broker 0 is ready to serve as the new controller with epoch 1 (kafka.controller.KafkaController) +[2017-08-04 10:48:21,165] INFO [Partition state machine on Controller 0]: Invoking state change to OnlinePartition for partitions (kafka.controller.PartitionStateMachine) +[2017-08-04 11:44:22,588] DEBUG [Controller 0]: Live brokers: (kafka.controller.KafkaController) +[2017-08-04 11:44:25,094] INFO [controller-event-thread]: Shutting down (kafka.controller.ControllerEventManager$ControllerEventThread) +[2017-08-04 11:44:25,095] INFO [controller-event-thread]: Stopped (kafka.controller.ControllerEventManager$ControllerEventThread) +[2017-08-04 11:44:25,097] INFO [controller-event-thread]: Shutdown completed (kafka.controller.ControllerEventManager$ControllerEventThread) +[2017-08-04 11:44:25,099] DEBUG [Controller 0]: Controller resigning, broker id 0 (kafka.controller.KafkaController) +[2017-08-04 11:44:25,100] DEBUG [Controller 0]: De-registering IsrChangeNotificationListener (kafka.controller.KafkaController) +[2017-08-04 11:44:25,105] INFO [Partition state machine on Controller 0]: Stopped partition state machine (kafka.controller.PartitionStateMachine) +[2017-08-04 11:44:25,111] INFO [Replica state machine on controller 0]: Stopped replica state machine (kafka.controller.ReplicaStateMachine) +[2017-08-04 11:44:25,112] INFO [Controller-0-to-broker-0-send-thread]: Shutting down (kafka.controller.RequestSendThread) +[2017-08-04 11:44:25,112] INFO [Controller-0-to-broker-0-send-thread]: Stopped (kafka.controller.RequestSendThread) +[2017-08-04 11:44:25,113] INFO [Controller-0-to-broker-0-send-thread]: Shutdown completed (kafka.controller.RequestSendThread) diff --git a/filebeat/module/kafka/log/test/controller.log-expected.json b/filebeat/module/kafka/log/test/controller.log-expected.json new file mode 100644 index 00000000000..b3453298e43 --- /dev/null +++ b/filebeat/module/kafka/log/test/controller.log-expected.json @@ -0,0 +1,961 @@ +[ + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "wItR0l0Bed9fOYVUjezS", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T11:44:25.113Z", + "offset": 2695, + "kafka": { + "log": { + "component": "Controller-0-to-broker-0-send-thread", + "level": "INFO", + "message": "Shutdown completed", + "class": "kafka.controller.RequestSendThread" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.376Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "fileset": { + "module": "kafka", + "name": "log" + }, + "message": "[2017-08-04 11:44:25,113] INFO [Controller-0-to-broker-0-send-thread]: Shutdown completed (kafka.controller.RequestSendThread)" + }, + "fields": { + "@timestamp": [ + "2017-08-04T11:44:25.113Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501847065113 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "notR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T11:44:25.112Z", + "offset": 2452, + "kafka": { + "log": { + "component": "Controller-0-to-broker-0-send-thread", + "level": "INFO", + "message": "Shutting down", + "class": "kafka.controller.RequestSendThread" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.374Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "message": "[2017-08-04 11:44:25,112] INFO [Controller-0-to-broker-0-send-thread]: Shutting down (kafka.controller.RequestSendThread)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T11:44:25.112Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501847065112 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "n4tR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T11:44:25.112Z", + "offset": 2568, + "kafka": { + "log": { + "component": "Controller-0-to-broker-0-send-thread", + "level": "INFO", + "message": "Stopped", + "class": "kafka.controller.RequestSendThread" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.376Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "message": "[2017-08-04 11:44:25,112] INFO [Controller-0-to-broker-0-send-thread]: Stopped (kafka.controller.RequestSendThread)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T11:44:25.112Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501847065112 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "nYtR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T11:44:25.111Z", + "offset": 2330, + "kafka": { + "log": { + "component": "Replica state machine on controller 0", + "level": "INFO", + "message": "Stopped replica state machine", + "class": "kafka.controller.ReplicaStateMachine" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.373Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "fileset": { + "module": "kafka", + "name": "log" + }, + "message": "[2017-08-04 11:44:25,111] INFO [Replica state machine on controller 0]: Stopped replica state machine (kafka.controller.ReplicaStateMachine)" + }, + "fields": { + "@timestamp": [ + "2017-08-04T11:44:25.111Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501847065111 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "nItR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T11:44:25.105Z", + "offset": 2189, + "kafka": { + "log": { + "component": "Partition state machine on Controller 0", + "level": "INFO", + "message": "Stopped partition state machine", + "class": "kafka.controller.PartitionStateMachine" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.372Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "fileset": { + "module": "kafka", + "name": "log" + }, + "message": "[2017-08-04 11:44:25,105] INFO [Partition state machine on Controller 0]: Stopped partition state machine (kafka.controller.PartitionStateMachine)" + }, + "fields": { + "@timestamp": [ + "2017-08-04T11:44:25.105Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501847065105 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "m4tR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T11:44:25.100Z", + "offset": 2042, + "kafka": { + "log": { + "component": "Controller 0", + "level": "DEBUG", + "message": "De-registering IsrChangeNotificationListener", + "class": "kafka.controller.KafkaController" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.372Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "message": "[2017-08-04 11:44:25,100] DEBUG [Controller 0]: De-registering IsrChangeNotificationListener (kafka.controller.KafkaController)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T11:44:25.100Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501847065100 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "motR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T11:44:25.099Z", + "offset": 1914, + "kafka": { + "log": { + "component": "Controller 0", + "level": "DEBUG", + "message": "Controller resigning, broker id 0", + "class": "kafka.controller.KafkaController" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.372Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "message": "[2017-08-04 11:44:25,099] DEBUG [Controller 0]: Controller resigning, broker id 0 (kafka.controller.KafkaController)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T11:44:25.099Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501847065099 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "mYtR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T11:44:25.097Z", + "offset": 1797, + "kafka": { + "log": { + "component": "controller-event-thread", + "level": "INFO", + "message": "Shutdown completed", + "class": "kafka.controller.ControllerEventManager$ControllerEventThread" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.370Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "fileset": { + "module": "kafka", + "name": "log" + }, + "message": "[2017-08-04 11:44:25,097] INFO [controller-event-thread]: Shutdown completed (kafka.controller.ControllerEventManager$ControllerEventThread)" + }, + "fields": { + "@timestamp": [ + "2017-08-04T11:44:25.097Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501847065097 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "mItR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T11:44:25.095Z", + "offset": 1656, + "kafka": { + "log": { + "component": "controller-event-thread", + "level": "INFO", + "message": "Stopped", + "class": "kafka.controller.ControllerEventManager$ControllerEventThread" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.369Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "message": "[2017-08-04 11:44:25,095] INFO [controller-event-thread]: Stopped (kafka.controller.ControllerEventManager$ControllerEventThread)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T11:44:25.095Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501847065095 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "l4tR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T11:44:25.094Z", + "offset": 1526, + "kafka": { + "log": { + "component": "controller-event-thread", + "level": "INFO", + "message": "Shutting down", + "class": "kafka.controller.ControllerEventManager$ControllerEventThread" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.367Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "message": "[2017-08-04 11:44:25,094] INFO [controller-event-thread]: Shutting down (kafka.controller.ControllerEventManager$ControllerEventThread)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T11:44:25.094Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501847065094 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "lotR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T11:44:22.588Z", + "offset": 1390, + "kafka": { + "log": { + "component": "Controller 0", + "level": "DEBUG", + "message": "Live brokers: ", + "class": "kafka.controller.KafkaController" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.365Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "message": "[2017-08-04 11:44:22,588] DEBUG [Controller 0]: Live brokers: (kafka.controller.KafkaController)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T11:44:22.588Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501847062588 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "lYtR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.165Z", + "offset": 1292, + "kafka": { + "log": { + "component": "Partition state machine on Controller 0", + "level": "INFO", + "message": "Invoking state change to OnlinePartition for partitions ", + "class": "kafka.controller.PartitionStateMachine" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.364Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "message": "[2017-08-04 10:48:21,165] INFO [Partition state machine on Controller 0]: Invoking state change to OnlinePartition for partitions (kafka.controller.PartitionStateMachine)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.165Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701165 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "lItR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.157Z", + "offset": 1120, + "kafka": { + "log": { + "component": "Controller 0", + "level": "INFO", + "message": "Broker 0 is ready to serve as the new controller with epoch 1", + "class": "kafka.controller.KafkaController" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.363Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "fileset": { + "module": "kafka", + "name": "log" + }, + "message": "[2017-08-04 10:48:21,157] INFO [Controller 0]: Broker 0 is ready to serve as the new controller with epoch 1 (kafka.controller.KafkaController)" + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.157Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701157 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "k4tR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.156Z", + "offset": 976, + "kafka": { + "log": { + "component": "Partition state machine on Controller 0", + "level": "INFO", + "message": "Started partition state machine with initial state -> Map()", + "class": "kafka.controller.PartitionStateMachine" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.362Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "message": "[2017-08-04 10:48:21,156] INFO [Partition state machine on Controller 0]: Started partition state machine with initial state -> Map() (kafka.controller.PartitionStateMachine)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.156Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701156 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "kotR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.154Z", + "offset": 801, + "kafka": { + "log": { + "component": "Replica state machine on controller 0", + "level": "INFO", + "message": "Started replica state machine with initial state -> Map()", + "class": "kafka.controller.ReplicaStateMachine" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.361Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "message": "[2017-08-04 10:48:21,154] INFO [Replica state machine on controller 0]: Started replica state machine with initial state -> Map() (kafka.controller.ReplicaStateMachine)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.154Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701154 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "kYtR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.085Z", + "offset": 632, + "kafka": { + "log": { + "component": "Controller 0", + "level": "DEBUG", + "message": "Registering IsrChangeNotificationListener", + "class": "kafka.controller.KafkaController" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.360Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "fileset": { + "module": "kafka", + "name": "log" + }, + "message": "[2017-08-04 10:48:21,085] DEBUG [Controller 0]: Registering IsrChangeNotificationListener (kafka.controller.KafkaController)" + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.085Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701085 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "kItR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.082Z", + "offset": 507, + "kafka": { + "log": { + "component": "Controller 0", + "level": "INFO", + "message": "Controller 0 incremented epoch to 1", + "class": "kafka.controller.KafkaController" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.358Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "message": "[2017-08-04 10:48:21,082] INFO [Controller 0]: Controller 0 incremented epoch to 1 (kafka.controller.KafkaController)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.082Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701082 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "j4tR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.064Z", + "offset": 389, + "kafka": { + "log": { + "component": "Controller 0", + "level": "INFO", + "message": "Broker 0 starting become controller state transition", + "class": "kafka.controller.KafkaController" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.358Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "message": "[2017-08-04 10:48:21,064] INFO [Controller 0]: Broker 0 starting become controller state transition (kafka.controller.KafkaController)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.064Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701064 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "jotR0l0Bed9fOYVUfexP", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.063Z", + "offset": 254, + "kafka": { + "log": { + "component": "Controller 0", + "level": "INFO", + "message": "0 successfully elected as the controller", + "class": "kafka.controller.KafkaController" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.358Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "fileset": { + "module": "kafka", + "name": "log" + }, + "message": "[2017-08-04 10:48:21,063] INFO [Controller 0]: 0 successfully elected as the controller (kafka.controller.KafkaController)" + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.063Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701063 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "jYtR0l0Bed9fOYVUfOzU", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.048Z", + "offset": 131, + "kafka": { + "log": { + "component": "controller-event-thread", + "level": "INFO", + "message": "Starting", + "class": "kafka.controller.ControllerEventManager$ControllerEventThread" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.358Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log", + "fileset": { + "module": "kafka", + "name": "log" + }, + "message": "[2017-08-04 10:48:21,048] INFO [controller-event-thread]: Starting (kafka.controller.ControllerEventManager$ControllerEventThread)" + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.048Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/controller.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701048 + ] + } +] diff --git a/filebeat/module/kafka/log/test/server.log b/filebeat/module/kafka/log/test/server.log new file mode 100644 index 00000000000..8ebf66523d9 --- /dev/null +++ b/filebeat/module/kafka/log/test/server.log @@ -0,0 +1,20 @@ +[2017-08-04 10:48:20,377] INFO starting (kafka.server.KafkaServer) +[2017-08-04 10:48:20,379] INFO Connecting to zookeeper on localhost:2181 (kafka.server.KafkaServer) +[2017-08-04 10:48:20,400] INFO Client environment:java.io.tmpdir=/tmp (org.apache.zookeeper.ZooKeeper) +[2017-08-04 10:48:20,400] INFO Client environment:java.compiler= (org.apache.zookeeper.ZooKeeper) +[2017-08-04 10:48:20,401] INFO Initiating client connection, connectString=localhost:2181 sessionTimeout=6000 watcher=org.I0Itec.zkclient.ZkClient@5ffead27 (org.apache.zookeeper.ZooKeeper) +[2017-08-04 10:48:20,413] INFO Waiting for keeper state SyncConnected (org.I0Itec.zkclient.ZkClient) +[2017-08-04 10:48:20,415] INFO Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticate using SASL (unknown error) (org.apache.zookeeper.ClientCnxn) +[2017-08-04 10:48:20,420] INFO Socket connection established to localhost/0:0:0:0:0:0:0:1:2181, initiating session (org.apache.zookeeper.ClientCnxn) +[2017-08-04 10:48:20,457] INFO Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2181, sessionid = 0x15dabf8d4140000, negotiated timeout = 6000 (org.apache.zookeeper.ClientCnxn) +[2017-08-04 10:48:20,458] INFO zookeeper state changed (SyncConnected) (org.I0Itec.zkclient.ZkClient) +[2017-08-04 10:48:20,748] WARN No meta.properties file under dir /tmp/kafka-logs/meta.properties (kafka.server.BrokerMetadataCheckpoint) +[2017-08-04 10:48:20,800] INFO [ThrottledRequestReaper-Fetch]: Starting (kafka.server.ClientQuotaManager$ThrottledRequestReaper) +[2017-08-04 10:48:20,866] INFO Log directory '/tmp/kafka-logs' not found, creating it. (kafka.log.LogManager) +[2017-08-04 10:48:20,873] INFO Loading logs. (kafka.log.LogManager) +[2017-08-04 10:48:21,062] INFO [ExpirationReaper-0-Heartbeat]: Starting (kafka.server.DelayedOperationPurgatory$ExpiredOperationReaper) +[2017-08-04 10:48:21,063] INFO Result of znode creation is: OK (kafka.utils.ZKCheckedEphemeral) +[2017-08-04 10:48:21,095] INFO [Group Metadata Manager on Broker 0]: Removed 0 expired offsets in 1 milliseconds. (kafka.coordinator.group.GroupMetadataManager) +[2017-08-04 10:48:21,127] INFO [ProducerId Manager 0]: Acquired new producerId block (brokerId:0,blockStartProducerId:0,blockEndProducerId:999) by writing to Zk with path version 1 (kafka.coordinator.transaction.ProducerIdManager) +[2017-08-04 10:48:21,162] INFO [Transaction Coordinator 0]: Starting up. (kafka.coordinator.transaction.TransactionCoordinator) +[2017-08-04 10:48:21,167] INFO [Transaction Marker Channel Manager 0]: Starting (kafka.coordinator.transaction.TransactionMarkerChannelManager) diff --git a/filebeat/module/kafka/log/test/server.log-expected.json b/filebeat/module/kafka/log/test/server.log-expected.json new file mode 100644 index 00000000000..713942361b5 --- /dev/null +++ b/filebeat/module/kafka/log/test/server.log-expected.json @@ -0,0 +1,961 @@ +[ + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "wYtR0l0Bed9fOYVUjuwB", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.167Z", + "offset": 2641, + "kafka": { + "log": { + "component": "Transaction Marker Channel Manager 0", + "level": "INFO", + "message": "Starting", + "class": "kafka.coordinator.transaction.TransactionMarkerChannelManager" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.385Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "fileset": { + "module": "kafka", + "name": "log" + }, + "message": "[2017-08-04 10:48:21,167] INFO [Transaction Marker Channel Manager 0]: Starting (kafka.coordinator.transaction.TransactionMarkerChannelManager)" + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.167Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701167 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "sotR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.162Z", + "offset": 2497, + "kafka": { + "log": { + "component": "Transaction Coordinator 0", + "level": "INFO", + "message": "Starting up.", + "class": "kafka.coordinator.transaction.TransactionCoordinator" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.384Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "fileset": { + "module": "kafka", + "name": "log" + }, + "message": "[2017-08-04 10:48:21,162] INFO [Transaction Coordinator 0]: Starting up. (kafka.coordinator.transaction.TransactionCoordinator)" + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.162Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701162 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "sYtR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.127Z", + "offset": 2369, + "kafka": { + "log": { + "component": "ProducerId Manager 0", + "level": "INFO", + "message": "Acquired new producerId block (brokerId:0,blockStartProducerId:0,blockEndProducerId:999) by writing to Zk with path version 1", + "class": "kafka.coordinator.transaction.ProducerIdManager" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.384Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "fileset": { + "module": "kafka", + "name": "log" + }, + "message": "[2017-08-04 10:48:21,127] INFO [ProducerId Manager 0]: Acquired new producerId block (brokerId:0,blockStartProducerId:0,blockEndProducerId:999) by writing to Zk with path version 1 (kafka.coordinator.transaction.ProducerIdManager)" + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.127Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701127 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "sItR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.095Z", + "offset": 2138, + "kafka": { + "log": { + "component": "Group Metadata Manager on Broker 0", + "level": "INFO", + "message": "Removed 0 expired offsets in 1 milliseconds.", + "class": "kafka.coordinator.group.GroupMetadataManager" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.384Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "message": "[2017-08-04 10:48:21,095] INFO [Group Metadata Manager on Broker 0]: Removed 0 expired offsets in 1 milliseconds. (kafka.coordinator.group.GroupMetadataManager)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.095Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701095 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "r4tR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.063Z", + "offset": 1977, + "kafka": { + "log": { + "component": "unknown", + "level": "INFO", + "message": "Result of znode creation is: OK", + "class": "kafka.utils.ZKCheckedEphemeral" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.384Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "message": "[2017-08-04 10:48:21,063] INFO Result of znode creation is: OK (kafka.utils.ZKCheckedEphemeral)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.063Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701063 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "rotR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.062Z", + "offset": 1881, + "kafka": { + "log": { + "component": "ExpirationReaper-0-Heartbeat", + "level": "INFO", + "message": "Starting", + "class": "kafka.server.DelayedOperationPurgatory$ExpiredOperationReaper" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.381Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "message": "[2017-08-04 10:48:21,062] INFO [ExpirationReaper-0-Heartbeat]: Starting (kafka.server.DelayedOperationPurgatory$ExpiredOperationReaper)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.062Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701062 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "rYtR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:20.873Z", + "offset": 1745, + "kafka": { + "log": { + "component": "unknown", + "level": "INFO", + "message": "Loading logs.", + "class": "kafka.log.LogManager" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.381Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "message": "[2017-08-04 10:48:20,873] INFO Loading logs. (kafka.log.LogManager)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:20.873Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843700873 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "rItR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:20.866Z", + "offset": 1677, + "kafka": { + "log": { + "component": "unknown", + "level": "INFO", + "message": "Log directory '/tmp/kafka-logs' not found, creating it.", + "class": "kafka.log.LogManager" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.381Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "fileset": { + "module": "kafka", + "name": "log" + }, + "message": "[2017-08-04 10:48:20,866] INFO Log directory '/tmp/kafka-logs' not found, creating it. (kafka.log.LogManager)" + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:20.866Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843700866 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "q4tR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:20.800Z", + "offset": 1567, + "kafka": { + "log": { + "component": "ThrottledRequestReaper-Fetch", + "level": "INFO", + "message": "Starting", + "class": "kafka.server.ClientQuotaManager$ThrottledRequestReaper" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.380Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "message": "[2017-08-04 10:48:20,800] INFO [ThrottledRequestReaper-Fetch]: Starting (kafka.server.ClientQuotaManager$ThrottledRequestReaper)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:20.800Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843700800 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "qotR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:20.748Z", + "offset": 1438, + "kafka": { + "log": { + "component": "unknown", + "level": "WARN", + "message": "No meta.properties file under dir /tmp/kafka-logs/meta.properties", + "class": "kafka.server.BrokerMetadataCheckpoint" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.380Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "message": "[2017-08-04 10:48:20,748] WARN No meta.properties file under dir /tmp/kafka-logs/meta.properties (kafka.server.BrokerMetadataCheckpoint)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:20.748Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843700748 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "qYtR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:20.458Z", + "offset": 1301, + "kafka": { + "log": { + "component": "unknown", + "level": "INFO", + "message": "zookeeper state changed (SyncConnected)", + "class": "org.I0Itec.zkclient.ZkClient" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.379Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "fileset": { + "module": "kafka", + "name": "log" + }, + "message": "[2017-08-04 10:48:20,458] INFO zookeeper state changed (SyncConnected) (org.I0Itec.zkclient.ZkClient)" + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:20.458Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843700458 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "qItR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:20.457Z", + "offset": 1199, + "kafka": { + "log": { + "component": "unknown", + "level": "INFO", + "message": "Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2181, sessionid = 0x15dabf8d4140000, negotiated timeout = 6000", + "class": "org.apache.zookeeper.ClientCnxn" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.379Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "message": "[2017-08-04 10:48:20,457] INFO Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2181, sessionid = 0x15dabf8d4140000, negotiated timeout = 6000 (org.apache.zookeeper.ClientCnxn)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:20.457Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843700457 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "p4tR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:20.420Z", + "offset": 1004, + "kafka": { + "log": { + "component": "unknown", + "level": "INFO", + "message": "Socket connection established to localhost/0:0:0:0:0:0:0:1:2181, initiating session", + "class": "org.apache.zookeeper.ClientCnxn" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.379Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "message": "[2017-08-04 10:48:20,420] INFO Socket connection established to localhost/0:0:0:0:0:0:0:1:2181, initiating session (org.apache.zookeeper.ClientCnxn)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:20.420Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843700420 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "potR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:20.415Z", + "offset": 855, + "kafka": { + "log": { + "component": "unknown", + "level": "INFO", + "message": "Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticate using SASL (unknown error)", + "class": "org.apache.zookeeper.ClientCnxn" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.379Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "message": "[2017-08-04 10:48:20,415] INFO Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticate using SASL (unknown error) (org.apache.zookeeper.ClientCnxn)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:20.415Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843700415 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "pYtR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:20.413Z", + "offset": 662, + "kafka": { + "log": { + "component": "unknown", + "level": "INFO", + "message": "Waiting for keeper state SyncConnected", + "class": "org.I0Itec.zkclient.ZkClient" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.378Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "message": "[2017-08-04 10:48:20,413] INFO Waiting for keeper state SyncConnected (org.I0Itec.zkclient.ZkClient)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:20.413Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843700413 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "pItR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:20.401Z", + "offset": 561, + "kafka": { + "log": { + "component": "unknown", + "level": "INFO", + "message": "Initiating client connection, connectString=localhost:2181 sessionTimeout=6000 watcher=org.I0Itec.zkclient.ZkClient@5ffead27", + "class": "org.apache.zookeeper.ZooKeeper" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.378Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "message": "[2017-08-04 10:48:20,401] INFO Initiating client connection, connectString=localhost:2181 sessionTimeout=6000 watcher=org.I0Itec.zkclient.ZkClient@5ffead27 (org.apache.zookeeper.ZooKeeper)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:20.401Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843700401 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "o4tR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:20.400Z", + "offset": 372, + "kafka": { + "log": { + "component": "unknown", + "level": "INFO", + "message": "Client environment:java.compiler=", + "class": "org.apache.zookeeper.ZooKeeper" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.359Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "message": "[2017-08-04 10:48:20,400] INFO Client environment:java.compiler= (org.apache.zookeeper.ZooKeeper)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:20.400Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843700400 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "ootR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:20.400Z", + "offset": 270, + "kafka": { + "log": { + "component": "unknown", + "level": "INFO", + "message": "Client environment:java.io.tmpdir=/tmp", + "class": "org.apache.zookeeper.ZooKeeper" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.359Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "message": "[2017-08-04 10:48:20,400] INFO Client environment:java.io.tmpdir=/tmp (org.apache.zookeeper.ZooKeeper)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:20.400Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843700400 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "oYtR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:20.379Z", + "offset": 167, + "kafka": { + "log": { + "component": "unknown", + "level": "INFO", + "message": "Connecting to zookeeper on localhost:2181", + "class": "kafka.server.KafkaServer" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.359Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "message": "[2017-08-04 10:48:20,379] INFO Connecting to zookeeper on localhost:2181 (kafka.server.KafkaServer)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:20.379Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843700379 + ] + }, + + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "oItR0l0Bed9fOYVUfeyz", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:20.377Z", + "offset": 67, + "kafka": { + "log": { + "component": "unknown", + "level": "INFO", + "message": "starting", + "class": "kafka.server.KafkaServer" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.359Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log", + "fileset": { + "module": "kafka", + "name": "log" + }, + "message": "[2017-08-04 10:48:20,377] INFO starting (kafka.server.KafkaServer)" + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:20.377Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/server.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843700377 + ] + } +] diff --git a/filebeat/module/kafka/log/test/state-change.log b/filebeat/module/kafka/log/test/state-change.log new file mode 100644 index 00000000000..675a51dff72 --- /dev/null +++ b/filebeat/module/kafka/log/test/state-change.log @@ -0,0 +1 @@ +[2017-08-04 10:48:21,428] TRACE Controller 0 epoch 1 received response {error_code=0} for a request sent to broker baldur:9092 (id: 0 rack: null) (state.change.logger) diff --git a/filebeat/module/kafka/log/test/state-change.log-expected.json b/filebeat/module/kafka/log/test/state-change.log-expected.json new file mode 100644 index 00000000000..9d02b4d8869 --- /dev/null +++ b/filebeat/module/kafka/log/test/state-change.log-expected.json @@ -0,0 +1,49 @@ +[ + { + "_index": "filebeat-7.0.0-alpha1-2017.08.11", + "_type": "doc", + "_id": "v4tR0l0Bed9fOYVUjey6", + "_version": 1, + "_score": null, + "_source": { + "@timestamp": "2017-08-04T10:48:21.428Z", + "offset": 168, + "kafka": { + "log": { + "component": "unknown", + "level": "TRACE", + "message": "Controller 0 epoch 1 received response {error_code=0} for a request sent to broker baldur:9092 (id: 0 rack: null)", + "class": "state.change.logger" + } + }, + "beat": { + "hostname": "baldur", + "read_time": "2017-08-11T17:22:21.359Z", + "name": "baldur", + "version": "7.0.0-alpha1" + }, + "prospector": { + "type": "log" + }, + "source": "/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/state-change.log", + "message": "[2017-08-04 10:48:21,428] TRACE Controller 0 epoch 1 received response {error_code=0} for a request sent to broker baldur:9092 (id: 0 rack: null) (state.change.logger)", + "fileset": { + "module": "kafka", + "name": "log" + } + }, + "fields": { + "@timestamp": [ + "2017-08-04T10:48:21.428Z" + ] + }, + "highlight": { + "source": [ + "@kibana-highlighted-field@/home/n/go/src/github.com/elastic/beats/filebeat/module/kafka/log/test/state-change.log@/kibana-highlighted-field@" + ] + }, + "sort": [ + 1501843701428 + ] + } +] diff --git a/filebeat/modules.d/kafka.yml.disabled b/filebeat/modules.d/kafka.yml.disabled new file mode 100644 index 00000000000..fe568e8e562 --- /dev/null +++ b/filebeat/modules.d/kafka.yml.disabled @@ -0,0 +1,13 @@ +- module: kafka + # All logs + log: + enabled: true + + # Set custom paths for Kafka. If left empty, + # Filebeat will look under /opt. + #var.kafka_home: + + # Set custom paths for the log files. If left empty, + # Filebeat will choose the paths depending on your OS. + #var.paths: +