From a59928c0abdb7620db8d04908583e699bf576613 Mon Sep 17 00:00:00 2001 From: Mike Birnstiehl Date: Mon, 6 Oct 2025 16:34:11 -0500 Subject: [PATCH 1/8] add Streams 9.2 updates --- solutions/images/logs-streams-patterns.png | Bin 69324 -> 23642 bytes .../streams/management/advanced.md | 4 +- .../streams/management/data-quality.md | 15 +++++++ .../streams/management/extract.md | 25 +++++++----- .../streams/management/extract/append.md | 16 ++++++++ .../streams/management/extract/date.md | 10 +++-- .../streams/management/extract/dissect.md | 18 ++++++--- .../streams/management/extract/grok.md | 32 +++++++++------ .../extract/manual-pipeline-configuration.md | 6 +++ .../streams/management/extract/rename.md | 16 ++++++++ .../streams/management/extract/set.md | 16 ++++++++ .../streams/management/retention.md | 35 ++++++++-------- .../streams/management/schema.md | 8 ++++ solutions/observability/streams/streams.md | 38 +++++++----------- solutions/toc.yml | 22 +++++----- 15 files changed, 180 insertions(+), 81 deletions(-) create mode 100644 solutions/observability/streams/management/data-quality.md create mode 100644 solutions/observability/streams/management/extract/append.md create mode 100644 solutions/observability/streams/management/extract/manual-pipeline-configuration.md create mode 100644 solutions/observability/streams/management/extract/rename.md create mode 100644 solutions/observability/streams/management/extract/set.md create mode 100644 solutions/observability/streams/management/schema.md diff --git a/solutions/images/logs-streams-patterns.png b/solutions/images/logs-streams-patterns.png index 0dfd280b50e3f63420273cf8bff22c8b93b955b8..aa1df445824f1b46157528402bdead16bdb28f86 100644 GIT binary patch literal 23642 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 literal 69324 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 w!9VyDB~=sWkDjIe3;pi7*D z!{=>37u*+QXh7yIiAPtE2$Fuvxb>BBkxD@KK21L9%4_Iwb(t6>n)K#6&M9PuN<-ky zjlnv{@ui@;${t5e7ET!sf^6{N+6JadHTM8&cmh6J5vxCx8&_W+Tawsq^n+PO>O@_T zA4bUUR@1VeKa&aE65~J%KMt!{5dUG0*L=cNRL7!G7{gr$WHQ$zo5@#I|=+*-B6y4`uk~y*;-x2GVze@q1W+ceadqpNeD;R@ufA6U{ zEPtdVo6s_jZZ%P>C2uVPL1#_WiyT=cKDR2#5TVa|eI5M}YA9Eyn}?(ph;Lr9vqK$| zN?;xo;PvDZhuWXIG&Y%gYx6Um@E`C@@67ZZpqqq);>btSx>nXes$P-HOghI!`MMA2 zNoRcjUBLv9yRPX@+CNm&9x-YL__r?j)a;yMX@Pec#o}Ko5Q+?2?2p49u`v73?-@xv(b-ci}UmoSI zFbCy=Sk`7v@(DvaX^%1aplR7_~_AK^>wqd`h4R~`%U-Jddo^m)#x*Fwr_B2&_Tv?b#DjeUc2;29AxlxtON5xqNJ|(r%JVNXdmWS7 z`1xb_1Lr{KbmZg)$AwEkK~QO7%(VU>jYFU3-9g?*!;yC19I-*}Sfv~N-W1A=%J_En zCWQWrR^kUGIr))Zufv!JqUE#dcmDLN=+}4qkT?dF&eI6H6KHYQ>te0>MjD`ax@$k$ z0iJ6>%f@_@}x=^ z7Yt#lcoIjNvO0Shsaxq=3AvdbxLouM7%8t_OC~=ady27wveHvvex`)@D|psM1vxO) zbM>A&@ljyLMwVRQn#ZDWZ_HWTTTQerY&~h|fyO84fn@l>Q$nefr}kgqK#zmmgC zQsg};nt3uQn!S*N8t|Fna50`Pwy|t}J{_#68ua)>!+Z8B*a>U^GJJTbA4Wnt1qwF; zB;@J?s3=q0yQrZs&+O|q(bv{fK3UbJ2Io#~cG(4Gs{AO1qC&lWku0-&SeLUOSv#ki z+LL!Co)b6~-PCmc40FaRYGy7a1xm&`?g=8T#OjYPTD9((cyU11>KwJHHz&6x7TdG> zlP~Z*HxMPKl2>T`*+sb8s~-2d8rQ3oSGfq(;DCkD^JA7t%J&`?d z1YerTes=$6DE=PDpLyOCYD+&sWjqDo~e&m2R2|&_&t1> ztd}e*Uef@SC5Tz9y#jS$_$EKPnS4rRKvE2O9wAfhxIKd+j5Ab~J6yeI|Ms}SdYbgy z_fd28o$2COhT5_W5b*piDY3<$t%BL>eyxqTc&5#4H41V&J>~Ozok^txS1~A#9)(&N zg!4dS^pul**v2ry$afvoKtu0!X{6%pOczQc(0*9a1WewvI;YP31mpdEul;!#aL#U^ zvc?lzAcnQ_%88B)Fmd)BcXP&u_2$kN1T(m;WSOXbi9A@1g>j=nG508U-$mqG^ip*K zT2X0R1Lfw9*hdLb=Jp~#@4>^pD#kLzL!prGdPmq3^+u;zj2=Vd7M!G9E`ikt8J!+` zdKRlX7w@${j2JL+KV*-!>R|BNe_5Owip@11Wv5&U`@|fk8jZK^nZ~E&&ZQBC zBu;e&wR)I#PQg3F3=hi=sY}vbUbk1WWjXKBY;YZxJTlva|8-yBMGSf}mnPG*TxQsZ z<6wN9-BZ3|gUkM|ZS?wB`rD{G>>EJvZI)o~ER2A!VbE)RQ*XY!hMjCRvz}yUyW@eP z`keKe97NLuWQD=O*GPXneQ+_gFTHR*@H!Bro9v96 z>|{~^32VA7@teNw<#Og_YHF3zofOnva92H=c`T{?KTf(sK(qdQ=iih+Jo^;N^1ab0T)^0N34<|}JD&8CuX$80 zDqE?M&_6rd=KZw3g1+wMB{!+}YWlRGX5O2nl!DoCi~Fa6hzn8Kl?Xu z)6hA2UN4ZX`K6GqoiWD3NHodB!)X94>@BB&;Aqe#yrS?HW@Vj5D%(68$xrINJVtn*G~K4Q~?5&@6h~+;)EXp$lHC zBqIntIV_@O+yX2*wFyOR+wSIgfGK7DFtU%;*M9kxpshCXn9 z+fK0*+awAzlBw6=bktF>kmb@vP0YJEHgYG}hBMC!FOpPoi;QpO8t4iu$%y{&bR}ZtTn9lM={*&GyeZ zp^0wb6pyvUKF4MiLJSxf5)KvAD5bvdqBJKRiKWmqppl!HPs|=AsxV$A*a_eU4rRv* zdeB0jEi1tFf22Bm_vOY3RrSr5M{-@uLBpVJ#DxmbfgVgO3KdG zX`jKVG7F-J(SA6!7p`Bsrcb??)*GE*&5}n~4+tJ`Ex61pR&6!juS*rX8J8X@w7t(? z>A5da%+uTuAwpwZv~9{s*r|wz;Y%8G>vkOSZar%FEKOBI zmvz!nz2n5?6w4i($2*YUZNyy&M6H&gGt<_?8IBZur2BFg-juhigwGvSXhNSWxD)e| zM7P>--r>3PED3<*$LqYjqW1;Z8@8Zq4MY=gN)0ZE{Z7{Wz>wXj1rpbPy<8GFNKD|l zuyociyDGOk9oqI>N#Z@MPe9WrVyAEQM!1eGd#{^`6Zc%GNskC%*&b}Hfe9*^3ud97 z?b53lD?Xjkjy20-n?_9BSp}Zq!s}LeB5&>y5v9V-dP-EvheH$F2%%W-HWLd~*Ng|) zSLR@NC+holOC0V_*LMe0lBQHuC#C$&q&0l_c3yyDAY@fQYO1RHJGotz#&sSWYwWe` z?f95eG#V&a37~O{vF;=$n9O^oRDVBxb1{Do3|g0*A*SEJMmz`O6sUJ8MmMCpQP*Sp(J{KDa|2WXu2==*v!Dba2D1k_Nq|Sb@lNs z8%GjNc`U3ILT0LbUBAF`HypqUsfJcj>2-u35(VeC)>m0C7x(@~g zXQoDs;mWzIqlvsRac8^M$MNus#hRD2Fa4Ds?-sYW`bk68zqgpMOCtmX zf8srVi4*tkv;r5T4Qhv^wCo`ruzn_$&_Bb1GRS$w+&8viYPR;Wq!#yDl`cVvoN`m* zyuZC3(@a_?XqLUd@HQ*cGUNR*Ni7skg?sF4D6RY|vDj>w{pv&wJXd@gHmbgkSrt(d z@0V^OeFoo#B=EJgA{yc16}8a)9jN)L$%K25X;QH6xTz_9tZi`W<>{z!m3@1ot7!VL zrQT0`*l0G05<3*+FD~j7qY#;wCQ9^th6vq@SRut~vTXrM3*e=2rdgE|0$8qVDJFug zdJXH|8(DUVgx0{g*J`G`VU>rqUcG%vWQz56nSVR<02=>Ed^9ecax+t=Q2PfwT_r0q zXq@;{3R4kr&H086Z~JEEF6*c)QZNlcRk}cYUA8f+Sf^G0tzuE`NBX^<#qlYvwlDNG zrkayq%_*Hr>LHT*;rVtq#08!&3~5Px`EcXh--nb*I~7qbS5B5pHX~Y!!->>O z>K-+YL#|+4uWZ{f_RKPBE(@9OcJ1ziwn>IkQSrGjc0arXLZ=5V<7&e^5A`F-8z^8k zUr$RT(T*4C6z!69IwAuT->9B5&PEsxFx~BvSXcFN&Q#<0L?P-q0n|l>GfY0c1R|6Qjk2K_m223*&)0D7wP@oJZ@(HTZE@GaF~@Rxz& zB1}6dQK~ZZ6tfBJ(L@jna(~g*ofKP@7BV$!-R~B_8PId=guJuptF~9a2)GEzs+ErU zxEAFG!9^TU2d*(5v^g0J6I2i?WCc+YszGkMIJ6wCpJ{*1!4}xxCOeH|3LuwUDas%8X1QhVaZYjW1ZG~wKLIIT^Xt5~ z_t)!$-=e=UW{~>50Tc11DeYz}I4B=WmLqt|SL0K(g|W~>Ht>9I(B}4Emhw<7u)Ta1 zAlO360(Ccdg^u+-UL3BbG6B#)fOL_@Xpw*5=@QG>KYejGzB3E9vOYoF??`6fTD#1{ z*5|$xgYG`!tnl+&zMkKuG);??GIcyLJo3v8wZnRI9N~__LZyuGsnK7oQx=!Anx0Y@I*a#K(z=H(B>_`pKws4U~2oete#G15pt-2CkR9delXvUX3az0i=FDVZRW5fNhgI={1t!&D zKR~%PiVeSy8sTbIi~c>J6$Vc+nmXt4xeJs+0Yb?WNXE7g_+55jZ!TwTQH1-@)?vCUKAa zzJiGQz~u#U78k;EOI*d?t!Htw!JP}A)P&pi@zu~2ept=Aj5>(1>=N0Rcn%tU|G~*1 z2{1A|7=gfbbDeYBoT#)oVP zW_n7rkf*Ldp5&W*Q+5$U{C69n>e}uMP{hjJFOHc89WEb;h{4&(GjBcFJ2yJLixVyV zn@89=&cd7u#zDq?(I;UwZg$Z__xwbc0YrgW39(7eQ37x_)a5Sjrymm%GVod&mk}c>cRtkoGJbw`@jCD~M@m>*BM4)X%%#er+fU@;XVyw9qf znfcTlB_2cdt3upR;;*e~+I-?~y$zz~_%hS(Q&j^QhYwDd4Gj=+j!h%^fJQ=AA4Xc{ zUL;f`dvBN$Gr7vbK(S_QSy8RbLI?sIkHW7NXF~fo+|HxN_&l-0Z~47O9W@5DmJL@fDhloyNL`i@IZjV}xt-o4gJ zZR-90#hrJgsEjX~GUTAXjhFH{kY|(Ud+`-Zv`kNV+ zz&WP0OKI3xZq!{AZ=%{+#GdK{=4f$G!Kq8(SKYpSnkYcz%E%X&+l2sW3hHk!rTH+u z0232*+A^=Y?JBF=lL1r%39DRxg~Sla{6{D*{Amt-YG04p+Av25Ur_lrc6|!96SQo| z!W@Einy0IhIZWG+XTtX}*U-ay`CUQus(AvKJb&62&}vn?2#HK|XU0sFkr}u+Rp6if z;QdiC^?$WFVk`6%v#T>M{zq<7VEtg_+~S zM!yny_4vF_nh#dF&=^ifRFm?%!b2Q3*R0;>Ya>PMuvc=9QIv6xcRLjLin_%F@p4X?mv~FHAP5X5KN>Qr51Ak;<^HnvaA`d(|pAP-^asx@ZqA+142K`1NJo#}L zCzku%c99k3bWewfmr+;8WVT-GsJ{ap{(=gt&=lw)&RSLE@>u1m$$^vp{q%~y2;Cda!}_;s+}R|?{Eyp^@Y zPJ@nD*)DO4IUW*h-$xBXUhOCY20Yu%;IC=B*}L=f%RCSZQa0&lzXCXgkpg00ekSY4 zU=TT7PW&edL&6GKg|qLFd`2#7+U4+?&a4WXZ@}kF_2}AnHhmu>k~v1RM5>Z)nLi%h zX9mYdt7gP%szU#Z)X}x~b;EsPM>`$k)a=lA$6MWoP4%UU(l~k|aGlogQyq3@-ve-K z4*A27&4+6+i>VCHnVBu&TT`b9zg+`)inGSqLz=6`Md^-Sf zesVi7fxBd_q;b|z1>=^1X^zJ#p3Ew1i0y_j55@dm{_DLVjE^W!=6v`!YH@&g{o8tz z4W370T~}Q%PTBD@d!Us>2_CXBm;H^0H?=YE!)eXVJ&ol=de@w)o{{LXPTd9+Pr$|9 zK0?u+K*i{^;~P67<)(N57jXeUdBT$8iq>iuL*k`yjw7NvnlF;Fsg+7uq<(1&P7<*) zzzZJl6@XZHU{vS$9e3u(;Rf(4sYf@McdID2uV$nkP78nh+>96|XapO<>Ez4o%~Qb#(w zqx#$2q~n?zt+60WVBjnj)t1~RMbYJ(*LW-7AVqm{{+?%84LdY#@@)&1=*lykh~AiN zll^Y}$r$t{O+?6MW^qwnAeWmejyM`0o4R^UEpCS5(s8qFRiPROk}lUxO_$mx{5|0u z6o%$S1@2~1n0}f1Nb6~p$JRA5zc2KlqeE3R=b3KRc-U%FlIYCxFf#-vWIenAaxyNY zR)ek_**4okuS2=Ry?}}7VcYfc#l&uegH^vw7q@MnT(C;E&Gs}~w)>mwSN7I^tdP^) zU=Q539Fnkw-#+2R@v4{Nn>}VUkcBTW0*Sy}!CtWGuANo9DPo*wvZ9J>>#U&RBfA4r z3Zz(jeiCl7Smy0lQ$kISyLnOCc;|*9l1a+JbD1!(i*k`R?G5yCTUnsA2%zrimJm|9 z7%E5Yf>u_yVIzF=dO;;@5Gl zb!7SwrktM>nl+D!TL-!k!Axg^&8skA`m4PY{dYDia&*}F>Rmetfr(_N zN&AWi%h_B#>(LM5O--*v@v23O1rLa-gqj83X0W&5E~2$)ob7PN_9F&czISiWcJfp0 z94Ug_R(3Lws)|~iP6RYC_E!j6?ae1cSKaNJ3{CQU2iFRKvm*yv_{8=2S1>qD51)|} zRveoBTEBaX6Gr>NntE~4L|VZ z@p1Hdz;vlAXx5bT+icHO86k&mdw*`|9caD9CbZT5ZI)A`Z2eiAFeCvH~l%aVKYEz(KH>hmE%r#yA|I!HJRDE z8Msbenpywli**4e7z1Sgz~>!Y)5#gPDkIB-j^FM?nAlBnHpJk6I#hxPP7)4_hYL8b7r&}G7|-gvz4quYO(2?;iN8o#in_1V)GwR z)qO}u1~(>4k~q|wXW36 zM_Z3vk6UGSDWM7qee|q`5zvlCwlQl&$-aNW_@Y~M%u<@tSnyv=N~`%|c8TdhCnAF` zQ5}RD^@nG37E{Z?6<-4MPv0jHt{v^<6;WF_y+QE4ODev%*xup4DKc@l8^9hSoFd9+ zlPu;DxHt6<#V|Y@9abZG(de(Ur{iFH)MK7W4Va%sF=~D+v)&Ly$zxh+i(n&YZsUie zKl(~MMXI2ee83ykKck5-&!ipREDz=#AcQn5EJ5SJK_E zSEjYyL%j#XFo@s+9Ybbxio%qiNwnY8%agILr2oyXB2j|;*n-etLee613j4Yasg=V* zjcz}bpV|CPqIHR%S&7+!`7XRov`hI_7nwHG;9*l?f&Qu5HKn(b>SN|`(mRd4k(jP# zHR1H}FSQnF=w1)U;pFJGm}|==NiaAk8q4z7!9m&ximh_o>|ms>8&Aq`J3-BN8`tZi z=UbM{QqIHm0j=c5x2{yWZqP>MTaJl5M=5xw9O&S&?s%~CEK-WL<6Sp;ZCIxd_OuQx z14dS+>RT4UfiNWaIt)YL@)U*$6Ufpg>I?HBu9R4i%XfG)6h#F_TAV~Q374=Q+rxLw zT^BEKcZ9Bw%EUcrsR14LE1gQKV2D(sow<3oL)h_$to3AxdNsTyq8eETLA7L8M6lCG zdd3%D4t8>GE{@ck3>5i};*i6(zkeT_djBd$H)j0#C@dEAyAcLEba#mWjzrFR_@-Hr z?x;u4{6>rYaN7#G%9qJXGW3`S4FbyT;lLuni7s{zdpEQVmjvdyK661?9XY#<1w@GS z5bh7nWf2xrL0JsD&&ByynM9YCfAVd}LIk(TbA_(&IeBb5<93R=ZRQae(cI zhn8l|EiztzPBVpe@W5eZ-~BRd5)62uv}=*0U*0ok`;zb4c1G~eg3|(Cva^n1AzX?- zmjo66tWNU;X2mE#yBzYaY9wd6T8s{HPyuXk{n+sX{mId@PXxa-xM``Av;ael8j8N2 z2afpZd6SZ?ch=RaT%uXoXbRWwwn46;a}zOaFI6RaTr4Wbr&Ng4p_p{;MmsA_(gq7G zEji07v+up%%mkeuBpcS4!#>EIXpH25%WrlIPRgcKu#8?xkxRU6p-P}G)bpb zfZ7EUkN#B}VFz_9$yD=A@-d%6X>PPeOA~)(L}!8sFyYu+Rs%9Ow(LyzYD^2C~RRVHN;fH6m z1D}Z^zNO#wG--*>LsvT<9kH z_9A|^uB}mg)_p7FP?QRz%eT@9er@sP*&&T$)(_D}(y{9yDZ$AO)N zPx5^+1;tCrfF*M~_^j}tqI*Zr?lLXu@OHx|SbN}MDXQRwgWzOL@vCD6fr(Or2N3sE zYhC$!zxpb(s{~N6x6N>0n7qxbq3+)iK&}}C5*y*fdL@F`A4n*>iFKJn4!n75aST?w zrJZUV@IW-_63sWHBBDOVR24B4-a;lk*zxUmJjTJJ%8WqgCDXYX(#1%E z+E%hh$;R^EK%!Tt{sfJYiim~cMi-q7m|Y^2f{*W#F254{3hQ-3$Gqg4b_A*$n$L`e zDXsxrxG87N)pksVkUh(~ld%7uIweVyWQ1A&Mk9IEkt{b-qhr0R0djhtP=umx4ft8x zY@>HuM`JH%sy{`$_#imF8^6zK1z-$gG3=>tvMD_w+m{p!BQkO1j6U5DVV zJ7(@=c2b(o%YjZ~dF>-{yEL$R_R|#bfa6nWSiHDu#d=#v9GicyRkEWED5vyocRcf@ z{Enpk(H}@&3gEOl)nY*{L_A-iTY5SPMWO?Lv&(;RTd4QIgty+7j_M%ly*eHcICBnw z0g~sXX!WcS@9$E>#Ga_v4U6g45EP@enyTk>D}u$bqzp8{|M*!yNfL-i5YVoB?o!U4 zJjjdhzDR6k1P!Ogj;d#V1XFgYkDwj;5z%*x@nBFi~0 zqxO626acm-&MPuI@9!M9UxUad3%L9TF8hU>{p92gf|+CJY!iE-|I^EV%-C@FMX3L2 z=AX7%$ie*EL4_*v-@5lNxsI014efuL`KN7Qq|g~Qx|kt{i_6bAXK<1bMQd*C1Wj=e zhWkPAd8&inujUX$NOr2p{Unxg_)GXmlNT6qYV^81{eDl$f#=`fOOWhX z1jbQ5B>6q(HhJn-DC1wh$6QdvPM-q500W}6qxkg#MGPmTqPl22LrR_h5&h4B_>=to zhE;{#KIO?g(saVQ)j!IB#)uV~z(%JGr%`QrRYHbwY`XgNQT{CQto73s!;mD#`6Y*v z0Qd2l{clR~zXF6dkU@^;D`*vrNgk&FJbxDL`Iz#|hxZu&MFGX^p|#DmXn*YauV%mx zhT_@1E9AcE%%{QkAqhNo$)ARdT)Ag35n|fpMk>_&Z`<>MZ;Dw~pK}T;aD5v^uK)+_$KR|9d2pCGe^>Op+_rCvnUKIiFh$}m@ zvVS%H&+?&&iFu-a_YMq8{(-$JDi4XRE7BKxK@2>}pI55Q&!F`6?{12T9MSCKu zcV;yI&OrWqB?<{YQQS$Hc&UD;HviM3C6@kFa%Hv#4RZG-(qclzsp z5&`f?LeX3={*)gDK@zNjpr*a_SN{N4|Lg>Cr+^{gksPlK>-|Y8>C^Rrn52x4;8MlE zw(;K&;57vviNO2}-5;b3x_6M~Ch@Vc05Z<4Q@IQk6gDAi%5Y}^%OZ~%H f@c*01d?21#2b$iGy|Q}-{wFCWCt50O5b*y1dGNb( diff --git a/solutions/observability/streams/management/advanced.md b/solutions/observability/streams/management/advanced.md index 4baed472b4..0482121143 100644 --- a/solutions/observability/streams/management/advanced.md +++ b/solutions/observability/streams/management/advanced.md @@ -6,6 +6,4 @@ navigation_title: Configure advanced settings --- # Configure advanced settings for streams [streams-advanced-settings] -The **Advanced** tab on the **Manage stream** page shows the underlying configuration details of your stream. While Streams simplifies many configurations, it doesn't support modifying all pipelines and templates. From the **Advanced** tab, you can manually interact with the index or component templates or modify other ingest pipelines that used by the stream. - -This UI is intended for advanced users. \ No newline at end of file +The **Advanced** tab shows the underlying {{es}} configuration details of your stream. While Streams simplifies many configurations, it doesn't support modifying all pipelines and templates. From the **Advanced** tab, you can manually interact with the index or component templates or modify other ingest pipelines that used by the stream. \ No newline at end of file diff --git a/solutions/observability/streams/management/data-quality.md b/solutions/observability/streams/management/data-quality.md new file mode 100644 index 0000000000..c761dc9b3c --- /dev/null +++ b/solutions/observability/streams/management/data-quality.md @@ -0,0 +1,15 @@ +--- +applies_to: + serverless: preview + stack: preview 9.1, ga 9.2 +--- + +# Manage data quality [streams-data-retention] + +Use the **Data quality** tab to find failed and degraded documents in your stream. The **Data quality** tab is made up of the following components: + +- **Degraded documents**: Documents with the `ignored` property usually because of malformed fields or exceeding the limit of total fields when `ignore_above:false`. This component shows the total number of degraded documents, the percentage, and status (**Good**, **Degraded**, **Poor**). +- **Failed documents**: Documents that were rejected during ingestion. +- **Issues**: {applies_to}`stack: preview 9.2`Find issues with specific fields, how often they've occurred, and when they've occurred. + +For more information on data quality, refer to the [data set quality](../../data-set-quality-monitoring.md) documentation. \ No newline at end of file diff --git a/solutions/observability/streams/management/extract.md b/solutions/observability/streams/management/extract.md index d1b4dcfdbe..e046577ab7 100644 --- a/solutions/observability/streams/management/extract.md +++ b/solutions/observability/streams/management/extract.md @@ -15,6 +15,16 @@ The UI also shows indexing problems, such as mapping conflicts, so you can addre Applied changes aren't retroactive and only affect *future ingested data*. ::: +## Supported processors +Streams supports the following processors: + +- [Date](./extract/date.md): convert date strings into timestamps with options for timezone, locale, and output format settings. +- [Dissect](./extract/dissect.md): extract fields from structured log messages using defined delimiters instead of patterns, making it faster than Grok and ideal for consistently formatted logs. +- [Grok](./extract/grok.md): extract fields from unstructured log messages using predefined or custom patterns, supports multiple match attempts in sequence, and can automatically generate patterns with an LLM connector. +- [Set](./extract/set.md): assign a specific value to a field, creating the field if it doesn’t exist or overwriting its value if it does. +- [Rename](./extract/rename.md): change the name of a field, moving its value to a new field name and removing the original. +- [Append](./extract/append.md): add a value to an existing array field, or create the field as an array if it doesn’t exist. + ## Add a processor [streams-add-processors] Streams uses {{es}} ingest pipelines to process your data. Ingest pipelines are made up of processors that transform your data. @@ -22,14 +32,7 @@ Streams uses {{es}} ingest pipelines to process your data. Ingest pipelines are To add a processor: 1. Select **Add processor** to open a list of supported processors. -1. Select a processor from the list: - - [Date](./extract/date.md) - - [Dissect](./extract/dissect.md) - - [Grok](./extract/grok.md) - - GeoIP - - Rename - - Set - - URL Decode +1. Select a processor from the list. 1. Select **Add Processor** to save the processor. :::{note} @@ -39,7 +42,10 @@ Editing processors with JSON is planned for a future release, and additional pro ### Add conditions to processors [streams-add-processor-conditions] You can provide a condition for each processor under **Optional fields**. Conditions are boolean expressions that are evaluated for each document. Provide a field, a value, and a comparator. -Processors support these comparators: + +:::{dropdown} Supported comparators +Streams processors support the following comparators: + - equals - not equals - less than @@ -51,6 +57,7 @@ Processors support these comparators: - ends with - exists - not exists +::: ### Preview changes [streams-preview-changes] diff --git a/solutions/observability/streams/management/extract/append.md b/solutions/observability/streams/management/extract/append.md new file mode 100644 index 0000000000..bd8c899559 --- /dev/null +++ b/solutions/observability/streams/management/extract/append.md @@ -0,0 +1,16 @@ +--- +applies_to: + serverless: ga + stack: preview 9.1, ga 9.2 +--- +# Append processor [streams-append-processor] +% Need use cases + +Use the append processor to add a value to an existing array field, or create the field as an array if it doesn’t exist. + +To use an append processor: + +1. Set **Source Field** to the field you want append values to. +1. Set **Target field** to the values you want to append to the **Source Field**. + +This functionality uses the {{es}} rename pipeline processor. Refer to the [rename processor](elasticsearch://reference/enrich-processor/rename-processor.md) {{es}} documentation for more information. \ No newline at end of file diff --git a/solutions/observability/streams/management/extract/date.md b/solutions/observability/streams/management/extract/date.md index 2d79d22fa3..f5ba7a173e 100644 --- a/solutions/observability/streams/management/extract/date.md +++ b/solutions/observability/streams/management/extract/date.md @@ -8,9 +8,14 @@ applies_to: The date processor parses date strings and uses them as the timestamp of the document. +To parse a date string using the date processor: + +1. Set the **Source Field** to the field containing the timestamp. +1. Set the **Format** field to one of the accepted date formats (ISO8602, UNIX, UNIX_MS, or TAI64N) or use a Java time pattern. Refer to the [example formats](#streams-date-examples) for more information. + This functionality uses the {{es}} date pipeline processor. Refer to the [date processor](elasticsearch://reference/enrich-processor/date-processor.md) {{es}} documentation for more information. -## Examples +## Example formats [streams-date-examples] The following list provides some common examples of date formats and how to parse them. @@ -34,9 +39,8 @@ Sunday, October 15, 2023 => EEEE, MMMM dd, yyyy 2023-10-15 14:30:00 => yyyy-MM-dd HH:mm:ss ``` - ## Optional fields [streams-date-optional-fields] -The following fields are optional for the date processor: +You can set the following optional fields for the date processor in the **Advanced settings**: | Field | Description| | ------- | --------------- | diff --git a/solutions/observability/streams/management/extract/dissect.md b/solutions/observability/streams/management/extract/dissect.md index 72a08ad0a2..c9f3527b00 100644 --- a/solutions/observability/streams/management/extract/dissect.md +++ b/solutions/observability/streams/management/extract/dissect.md @@ -5,20 +5,26 @@ applies_to: --- # Dissect processor [streams-dissect-processor] -The dissect processor parses structured log messages and extracts fields from them. Unlike Grok, it does not use a set of predefined patterns to match the log messages. Instead, it uses a set of delimiters to split the log message into fields. -Dissect is much faster than Grok and is ideal for log messages that follow a consistent, structured format. +The dissect processor parses structured log messages and extracts fields from them. It uses a set of delimiters to split the log message into fields instead of predefined patterns to match the log messages. + +Dissect is much faster than Grok, and is recommend for log messages that follow a consistent, structured format. + +To parse a log message with a dissect processor: +1. Set the **Source Field** to the field you want to dissect +1. Set the delimiters you want to use in the **Pattern** field. Refer to the [example pattern](#streams-dissect-example) for more information on setting delimiters. This functionality uses the {{es}} dissect pipeline processor. Refer to the [dissect processor](elasticsearch://reference/enrich-processor/dissect-processor.md) {{es}} documentation for more information. -To parse a log message, simply name the field and list the delimiters you want to use. The dissect processor will then split the log message into fields based on the delimiters provided. +## Example dissect pattern [streams-dissect-example] -Example: +The following example shows the dissect pattern for an unstructured log message. -Log Message +**Log message:** ``` 2025-04-04T09:04:45+00:00 ERROR 160.200.87.105 127.79.135.127 21582 ``` -Dissect Pattern + +**Dissect Pattern:** ``` %{timestamp} %{log.level} %{source.ip} %{destination.ip} %{destination.port} ``` \ No newline at end of file diff --git a/solutions/observability/streams/management/extract/grok.md b/solutions/observability/streams/management/extract/grok.md index 27fd6d30ca..35669dc793 100644 --- a/solutions/observability/streams/management/extract/grok.md +++ b/solutions/observability/streams/management/extract/grok.md @@ -5,18 +5,26 @@ applies_to: --- # Grok processor [streams-grok-processor] -The Grok processor parses unstructured log messages and extracts fields from them. It uses a set of predefined patterns to match the log messages and extract the fields. The Grok processor is very powerful and can parse a wide variety of log formats. +The grok processor parses unstructured log messages using a set of predefined patterns to match the log messages and extract the fields. The Grok processor is very powerful and can parse a wide variety of log formats. -You can provide multiple patterns to the Grok processor. The Grok processor will try to match the log message against each pattern in the order they are provided. If a pattern matches, the fields will be extracted and the remaining patterns will not be used. -If a pattern does not match, the Grok processor will try the next pattern. If no patterns match, the Grok processor will fail and you can troubleshoot the issue. Refer to [generate patterns](#streams-grok-patterns) for more information. +You can provide multiple patterns to the grok processor. The Grok processor will try to match the log message against each pattern in the order they are provided. If a pattern matches, the fields will be extracted and the remaining patterns will not be used. -Start with the most common patterns first and then add more specific patterns later. This reduces the number of runs the Grok processor has to do and improves the performance of the pipeline. +If a pattern doesn't match, the grok processor will try the next pattern. If no patterns match, the Grok processor will fail and you can troubleshoot the issue. Instead of writing grok patterns, you can have streams generate patterns for you. Refer to [generate patterns](#streams-grok-patterns) for more information. + +:::{tip} +To improve pipeline performance, start with the most common patterns first, then add more specific patterns. This reduces the number times the grok processor has to run. +::: + +To parse a log message with a dissect processor: + +1. Set the **Source Field** to the field you want to search for grok matches. +1. Set the patterns you want to use in the **Grok patterns** field. Refer to the [example pattern](#streams-grok-example) for more information on patterns. This functionality uses the {{es}} Grok pipeline processor. Refer to the [Grok processor](elasticsearch://reference/enrich-processor/grok-processor.md) {{es}} documentation for more information. -The Grok processor uses a set of predefined patterns to match the log messages and extract the fields. -You can also define your own pattern definitions by expanding the `Optional fields` section. You can then define your own patterns and use them in the Grok processor. -The patterns are defined in the following format: +## Example grok pattern [streams-grok-example] + +Grok patterns are defined in the following format: ``` { @@ -33,15 +41,15 @@ The previous pattern can then be used in the processor. Requires an LLM Connector to be configured. Instead of writing the Grok patterns by hand, you can use the **Generate Patterns** button to generate the patterns for you. -% TODO Elastic LLM? - ![generated patterns](<../../../../images/logs-streams-patterns.png>) -Click the plus icon next to the pattern to accept it and add it to the list of patterns used by the Grok processor. +Select **Accept** to add a generated pattern to the list of patterns used by the grok processor. + +### How does **Generate patterns** work? [streams-grok-pattern-generation] +% need to check to make sure this is still accurate. -### How does the pattern generation work? [streams-grok-pattern-generation] Under the hood, the 100 samples on the right side are grouped into categories of similar messages. For each category, a Grok pattern is generated by sending a few samples to the LLM. Matching patterns are then shown in the UI. :::{note} -This can incur additional costs, depending on the LLM connector you are using. Typically a single iteration uses between 1000 and 5000 tokens, depending on the number of identified categories and the length of the messages. +This can incur additional costs, depending on the LLM connector you are using. Typically a single iteration uses between 1000 and 5000 tokens depending on the number of identified categories and the length of the messages. ::: \ No newline at end of file diff --git a/solutions/observability/streams/management/extract/manual-pipeline-configuration.md b/solutions/observability/streams/management/extract/manual-pipeline-configuration.md new file mode 100644 index 0000000000..3d55b2f63b --- /dev/null +++ b/solutions/observability/streams/management/extract/manual-pipeline-configuration.md @@ -0,0 +1,6 @@ +--- +applies_to: + serverless: ga + stack: preview 9.1, ga 9.2 +--- +# Manual pipeline configuration [streams-manual-pipeline-configuration] \ No newline at end of file diff --git a/solutions/observability/streams/management/extract/rename.md b/solutions/observability/streams/management/extract/rename.md new file mode 100644 index 0000000000..ea6e7dd033 --- /dev/null +++ b/solutions/observability/streams/management/extract/rename.md @@ -0,0 +1,16 @@ +--- +applies_to: + serverless: ga + stack: preview 9.1, ga 9.2 +--- +# Rename processor [streams-rename-processor] +% need use cases + +Use the rename processor to change the name of a field, moving its value to a new field name and removing the original. + +To use a rename processor: + +1. Set **Source Field** to the field you want to rename. +1. Set **Target field** to the new name you want to use for the **Source Field**. + +This functionality uses the {{es}} rename pipeline processor. Refer to the [rename processor](elasticsearch://reference/enrich-processor/rename-processor.md) {{es}} documentation for more information. \ No newline at end of file diff --git a/solutions/observability/streams/management/extract/set.md b/solutions/observability/streams/management/extract/set.md new file mode 100644 index 0000000000..c31a08ec38 --- /dev/null +++ b/solutions/observability/streams/management/extract/set.md @@ -0,0 +1,16 @@ +--- +applies_to: + serverless: ga + stack: preview 9.1, ga 9.2 +--- +# Set processor [streams-set-processor] +% need use cases + +Use the set processor to assign a specific value to a field, creating the field if it doesn’t exist or overwriting its value if it does. + +To use a set processor: + +1. Set **Source Field** to the field you want to insert, upsert, or update +1. Set **Value** to the value you want the source field to be set to. + +This functionality uses the {{es}} set pipeline processor. Refer to the [set processor](elasticsearch://reference/enrich-processor/set-processor.md) {{es}} documentation for more information. \ No newline at end of file diff --git a/solutions/observability/streams/management/retention.md b/solutions/observability/streams/management/retention.md index 52bfbcd1e3..1e932312ea 100644 --- a/solutions/observability/streams/management/retention.md +++ b/solutions/observability/streams/management/retention.md @@ -5,40 +5,43 @@ applies_to: stack: preview 9.1 --- -# Manage data retention for log streams [streams-data-retention] +# Manage data retention for streams [streams-data-retention] -Use the **Data retention** tab on the **Manage stream** page to set how long your stream retains data and to get insight into your stream's data ingestion and storage size. +Use the **Retention** tab to set how long your stream retains data and to get insight into your stream's data ingestion and storage size. -![Screenshot of the data retention UI](<../../../images/logs-streams-retention.png>) +The **Retention** tab contains the following components to help you determine how long you want your stream to retain data: -The **Data retention** page is made up of the following components that can help you determine how long you want your stream to retain data: +- **Retention**: The current retention policy, including the source of the policy. +- **Storage size**: The total size and number of documents in the stream. +- **Ingestion averages**: Estimated ingestion per day and month, calculated based on the total size of all data in the stream divided by the stream's age. +- **ILM policy data tiers**: {applies_to}`stack: preview 9.1, ga 9.2` The amount of data in each data tier (**Hot**, **Warm**, **Cold**). +- **Ingestion over time**: Estimated ingestion rate per time bucket. The bucket interval is dynamic and adjusts based on the selected time range. The ingestion rate is calculated using the average document size in the stream multiplied by the number of documents in each bucket. This is an estimate, and the actual ingestion rate may vary. -- **Retention period**: The minimum number of days after which the data is deleted -- **Source**: The origin of the data retention policy. -- **Last updated**: When data retention was last updated for the selected stream. -- **Ingestion**: Estimated ingestion per day and month, calculated based on the total size of all data in the stream divided by the stream's age. This is an estimate, and the actual ingestion may vary. -- **Total doc count**: The total number of documents in the stream. -- **Ingestion Rate**: Estimated ingestion rate per time bucket. The bucket interval is dynamic and adjusts based on the selected time range. The ingestion rate is calculated using the average document size in the stream multiplied by the number of documents in each bucket. This is an estimate, and the actual ingestion rate may vary. -- **Policy summary**: {applies_to}`stack: preview 9.1` The amount of data ingested per phase (hot, warm, cold). +For more information on data retention, refer to [Data stream lifecycle](../../../../manage-data/lifecycle/data-stream.md). ## Edit the data retention [streams-update-data-retention] -From any stream page, select **Edit data retention** to change how long your data stream retains data. +From the **Retention** tab, select **Edit data retention** to change how long your data stream retains data. + +### Inherit from index template +When enabled, your stream uses the retention configuration from its index template. ### Set a specific retention period The **Retention period** is the minimum number of days after which the data is deleted. To set data retention to a specific time period: -1. Select **Edit data retention** → **Set specific retention days**. -1. From here, set the period of time you want to retain data for this stream. +1. From the **Retention** tab, select **Edit data retention**. +1. Turn off **Inherit from index template** if enabled. +1. Select **Custom period**. +1. Set the period of time you want to retain data for this stream. To define a global default retention policy, refer to [project settings](../../../../deploy-manage/deploy/elastic-cloud/project-settings.md). ### Follow an ILM policy ```{applies_to} -stack: ga 9.1 +stack: preview 9.1, ga 9.2 ``` [ILM policies](../../../../manage-data/lifecycle/index-lifecycle-management.md) let you automate and standardize data retention across streams and other data streams. To have your streams follow an existing policy: -1. Select **Edit data retention** → **Use a lifecycle policy**. +1. From the **Retention** tab, select **Edit data retention**. 1. Select a pre-defined ILM policy from the list. You can also create a new ILM policy. Refer to [Configure a lifecycle policy](../../../../manage-data/lifecycle/index-lifecycle-management/configure-lifecycle-policy.md) for more information. \ No newline at end of file diff --git a/solutions/observability/streams/management/schema.md b/solutions/observability/streams/management/schema.md new file mode 100644 index 0000000000..33970f7457 --- /dev/null +++ b/solutions/observability/streams/management/schema.md @@ -0,0 +1,8 @@ +--- +navigation_title: Manage field mapping +applies_to: + serverless: preview + stack: preview 9.1, ga 9.2 +--- + +# Manage field mapping using the Schema tab [streams-data-retention] \ No newline at end of file diff --git a/solutions/observability/streams/streams.md b/solutions/observability/streams/streams.md index 417228488d..21c5e1bef5 100644 --- a/solutions/observability/streams/streams.md +++ b/solutions/observability/streams/streams.md @@ -1,20 +1,17 @@ --- applies_to: - serverless: preview - stack: preview 9.1 + serverless: ga + stack: preview 9.1, ga 9.2 --- -:::{warning} -Streams is currently in Technical Preview. This feature may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features. -::: - # Streams +% can we document when to use streams vs when to not use streams? + +Streams provides a single, centralized UI within {{kib}} that streamlines common tasks like extracting fields, setting data retention, and rerouting data, so you don't need to use multiple applications or manually configure underlying {{es}} components. -Streams provides a single, centralized UI within {{kib}} that streamlines common tasks, reducing the need to navigate multiple applications or manually configure underlying {{es}} components. Key workflows include: -- [Extract fields](../streams/management/extract.md) from your documents. -- [Change the data retention](../streams/management/retention.md) of a stream. +A Stream directly corresponds to an {{es}} data stream (for example, `logs-myapp-default`). Any updates you perform in Streams configures a specific [data stream](../../../manage-data/data-store/data-streams.md). -A Stream directly corresponds to an {{es}} data stream (for example, `logs-myapp-default`). Operations performed in the Streams UI configure that specific data stream. +% need to add a wired vs classic streams section ## Required permissions @@ -23,25 +20,20 @@ Streams requires the following Elastic Cloud Serverless roles: - Admin: ability to manage all Streams. - Editor/Viewer: limited access, unable to perform all actions. -## Access the Streams UI - -In {{obs-serverless}}, Streams is automatically available. - -In {{stack}} version 9.1 and later, you can enable Streams in the {{observability}} Advanced Settings. To do this: - -1. Go to **Management** > **Stack Management** > **Advanced Settings**, or search for "Advanced Settings" in the [global search field](../../../explore-analyze/find-and-organize/find-apps-and-objects.md). -1. Enable **Streams UI** under **Observability**. +## Access Streams -In {{serverless-short}} or after enabling Streams in {{stack}}, access the UI in one of the following ways: +Open Streams from one of the following places in {{kib}}: - Select **Streams** from the navigation menu or use the [global search field](../../../explore-analyze/find-and-organize/find-apps-and-objects.md). -- From **Discover**, expand a document's details flyout and select **Stream** or an action associated with the document's data stream. Streams will open filtered to only the selected stream. This only works for documents stored in a data stream. +- You can open the data stream for a specific document from **Discover**. To do this, expand a document's details flyout and select **Stream** or an action associated with the document's data stream. Streams will open filtered to the selected data stream. This only works for documents stored in a data stream. ## Manage individual streams [streams-management-tab] Interact with and configure your streams in the following ways: -- [Data retention](./management/retention.md): Manage how your stream retains data and get insight into data ingestion and storage size under the **Data retention** tab. -- [Processing](./management/extract.md): Parse and extract information from log messages into dedicated fields under the **Processing** tab. -- [Advanced](./management/advanced.md): Review and manually modify the inner workings of your stream under the **Advanced** tab. \ No newline at end of file +- [Retention](./management/retention.md): Manage how your stream retains data and get insight into data ingestion and storage size. +- [Processing](./management/extract.md): Parse and extract information from documents into dedicated fields. +- [Schema](./management/schema.md): Manage field mappings. +- [Data quality](./management/data-quality.md): Get information about failed and degraded documents in your stream. +- [Advanced](./management/advanced.md): Review and manually modify underlying {{es}} components of your stream. \ No newline at end of file diff --git a/solutions/toc.yml b/solutions/toc.yml index 7c3c9ad6af..de451ba549 100644 --- a/solutions/toc.yml +++ b/solutions/toc.yml @@ -455,15 +455,19 @@ toc: - file: observability/logs/logs-index-template-reference.md children: - file: observability/logs/logs-index-template-defaults.md - - file: observability/streams/streams.md - children: - - file: observability/streams/management/extract.md - children: - - file: observability/streams/management/extract/date.md - - file: observability/streams/management/extract/dissect.md - - file: observability/streams/management/extract/grok.md - - file: observability/streams/management/retention.md - - file: observability/streams/management/advanced.md + - file: observability/streams/streams.md + children: + - file: observability/streams/management/extract.md + children: + - file: observability/streams/management/extract/date.md + - file: observability/streams/management/extract/dissect.md + - file: observability/streams/management/extract/grok.md + - file: observability/streams/management/extract/set.md + - file: observability/streams/management/extract/rename.md + - file: observability/streams/management/extract/append.md + - file: observability/streams/management/extract/manual-pipeline-configuration.md + - file: observability/streams/management/retention.md + - file: observability/streams/management/advanced.md - file: observability/incident-management.md children: - file: observability/incident-management/alerting.md From 010e19b2aca4bba1db3ee1c9b4c827021b592050 Mon Sep 17 00:00:00 2001 From: Mike Birnstiehl Date: Mon, 6 Oct 2025 16:51:57 -0500 Subject: [PATCH 2/8] fix toc --- .../observability/streams/management/extract/grok.md | 12 +++++++++++- solutions/observability/streams/management/schema.md | 6 +++++- solutions/toc.yml | 2 ++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/solutions/observability/streams/management/extract/grok.md b/solutions/observability/streams/management/extract/grok.md index 35669dc793..29fa44a8e0 100644 --- a/solutions/observability/streams/management/extract/grok.md +++ b/solutions/observability/streams/management/extract/grok.md @@ -38,12 +38,22 @@ The previous pattern can then be used in the processor. ``` ## Generate patterns [streams-grok-patterns] +:::{note} Requires an LLM Connector to be configured. +::: + Instead of writing the Grok patterns by hand, you can use the **Generate Patterns** button to generate the patterns for you. +Generated patterns work best on semi-structured data. For very custom logs with a lot of text, creating manual patterns general creates more accurate results. + ![generated patterns](<../../../../images/logs-streams-patterns.png>) -Select **Accept** to add a generated pattern to the list of patterns used by the grok processor. +To add a generated grok pattern: + +1. Select **Create** → **Create processor**. +1. Select **Grok** from the **Processor** menu. +1. Select **Generate pattern**. +1. Select **Accept** to add a generated pattern to the list of patterns used by the grok processor. ### How does **Generate patterns** work? [streams-grok-pattern-generation] % need to check to make sure this is still accurate. diff --git a/solutions/observability/streams/management/schema.md b/solutions/observability/streams/management/schema.md index 33970f7457..4fd1ba80f1 100644 --- a/solutions/observability/streams/management/schema.md +++ b/solutions/observability/streams/management/schema.md @@ -5,4 +5,8 @@ applies_to: stack: preview 9.1, ga 9.2 --- -# Manage field mapping using the Schema tab [streams-data-retention] \ No newline at end of file +# Manage field mapping using the Schema tab [streams-schema] + +## Permissions to edit and add fields [streams-schema-permissions] + +## Field statuses [streams-schema-statuses] \ No newline at end of file diff --git a/solutions/toc.yml b/solutions/toc.yml index de451ba549..86ce1f32c8 100644 --- a/solutions/toc.yml +++ b/solutions/toc.yml @@ -467,6 +467,8 @@ toc: - file: observability/streams/management/extract/append.md - file: observability/streams/management/extract/manual-pipeline-configuration.md - file: observability/streams/management/retention.md + - file: observability/streams/management/schema.md + - file: observability/streams/management/data-quality.md - file: observability/streams/management/advanced.md - file: observability/incident-management.md children: From 4c073742a675f9033a1740415fc52f5a4096403a Mon Sep 17 00:00:00 2001 From: Mike Birnstiehl Date: Tue, 7 Oct 2025 12:19:39 -0500 Subject: [PATCH 3/8] update processing docs --- .../streams/management/extract.md | 69 +++++++++++-------- 1 file changed, 41 insertions(+), 28 deletions(-) diff --git a/solutions/observability/streams/management/extract.md b/solutions/observability/streams/management/extract.md index e046577ab7..dd96911dd0 100644 --- a/solutions/observability/streams/management/extract.md +++ b/solutions/observability/streams/management/extract.md @@ -5,17 +5,20 @@ applies_to: --- # Extract fields [streams-extract-fields] -Unstructured log messages must be parsed into meaningful fields before you can filter and analyze them effectively. Commonly extracted fields include `@timestamp` and the `log.level`, but you can also extract information like IP addresses, usernames, and ports. +Extracting meaningful fields from your log messages lets you filter and analyze them effectively. For example, you might want to use [Discover](../../../../explore-analyze/discover.md) to filter for log messages with a `WARNING` or `ERROR` log level that occurred during a certain time period to diagnose an issue. If you haven't extracted log level and timestamp fields from your messages, you won't get meaningful results. -Use the **Processing** tab on the **Manage stream** page to process your data. The UI simulates your changes and provides an immediate preview that's tested end-to-end. +From the **Processing** tab, you can add the [processors](#streams-extract-processors) you need to extract these structured fields. The UI then simulates your changes and provides an immediate [preview](#streams-preview-changes) that's tested end-to-end. -The UI also shows indexing problems, such as mapping conflicts, so you can address them before applying changes. +The UI also shows when you have indexing problems, such as [mapping conflicts](#streams-processing-mapping-conflicts), so you can address them before applying changes. + +After creating your processor, all future ingested data will be parsed into structured fields accordingly. :::{note} Applied changes aren't retroactive and only affect *future ingested data*. ::: -## Supported processors +## Supported processors [streams-extract-processors] + Streams supports the following processors: - [Date](./extract/date.md): convert date strings into timestamps with options for timezone, locale, and output format settings. @@ -27,13 +30,17 @@ Streams supports the following processors: ## Add a processor [streams-add-processors] -Streams uses {{es}} ingest pipelines to process your data. Ingest pipelines are made up of processors that transform your data. +Streams uses [{{es}} ingest pipelines](../../../../manage-data/ingest/transform-enrich/ingest-pipelines.md) made up of processors to transform your data, without requiring you to switch interfaces and manually update pipelines. + +To add a processor from the **Processing** tab: + +1. Select **Create** → **Create processor** to open a list of supported processors. +1. Select a processor from the **Processor** menu. +1. Configure the processor and select **Create** to save the processor. -To add a processor: +After adding all desired processors and conditions, make sure to **Save changes**. -1. Select **Add processor** to open a list of supported processors. -1. Select a processor from the list. -1. Select **Add Processor** to save the processor. +Refer to individual [supported processors](#streams-extract-processors) for more on configuring specific processors. :::{note} Editing processors with JSON is planned for a future release, and additional processors may be supported over time. @@ -41,7 +48,14 @@ Editing processors with JSON is planned for a future release, and additional pro ### Add conditions to processors [streams-add-processor-conditions] -You can provide a condition for each processor under **Optional fields**. Conditions are boolean expressions that are evaluated for each document. Provide a field, a value, and a comparator. +You can provide a condition for each processor under **Optional fields**. Conditions are boolean expressions that are evaluated for each document. + +To add a condition: +1. Select **Create** → **Create condition**. +1. Provide a **Field**, a **Value**, and a comparator. Expand the following dropdown for supported comparators. +1. Select **Create condition**. + +After adding all desired processors and conditions, make sure to **Save changes**. :::{dropdown} Supported comparators Streams processors support the following comparators: @@ -61,7 +75,7 @@ Streams processors support the following comparators: ### Preview changes [streams-preview-changes] -Under **Processors for field extraction**, when you set pipeline processors to modify your documents, **Data preview** shows you a preview of the results with additional filtering options depending on the outcome of the simulation. +After creating processors, the **Data preview** tab shows a preview of the results with additional filtering options depending on the outcome of the simulation. When you add or edit processors, the **Data preview** updates automatically. @@ -70,27 +84,26 @@ To avoid unexpected results, we recommend adding processors rather than removing ::: **Data preview** loads 100 documents from your existing data and runs your changes using them. -For any newly added processors, this simulation is reliable. You can save individual processors during the preview, and even reorder them. -Selecting **Save changes** applies your changes to the data stream. +For any newly created processors and conditions, the preview is reliable. You can create and reorder individual processors and conditions during the preview. -If you edit the stream again, note the following: -- Adding more processors to the end of the list will work as expected. -- Changing existing processors or re-ordering them may cause unexpected results. Because the pipeline may have already processed the documents used for sampling, the UI cannot accurately simulate changes to existing data. -- Adding a new processor and moving it before an existing processor may cause unexpected results. The UI only simulates the new processor, not the existing ones, so the simulation may not accurately reflect changes to existing data. +Select **Save changes** to apply your changes to the data stream. -![Screenshot of the Grok processor UI](<../../../images/logs-streams-grok.png>) +If you edit the stream after saving your changes, note the following: +- Adding more processors to the end of the list will work as expected. +- Editing or reordering existing processors may cause unexpected results. Because the pipeline may have already processed the documents used for sampling, **Data preview** cannot accurately simulate changes to existing data. +- Adding a new processor and moving it before an existing processor may cause unexpected results. **Data preview** only simulates the new processor, not the existing ones, so the simulation may not accurately reflect changes to existing data. ### Ignore failures [streams-ignore-failures] -Turn on **Ignore failure** to ignore the processor if it fails. This is useful if you want to continue processing the document even if the processor fails. +Each processor has the option to **Ignore failures**. When enabled, processing of the document continues when the processor fails. ### Ignore missing fields [streams-ignore-missing-fields] -Turn on **Ignore missing fields** to ignore the processor if the field is not present. This is useful if you want to continue processing the document even if the field is not present. +Dissect, grok, and rename processors include the **Ignore missing fields** option. When enabled, processing of the document continues when a source field is missing. ## Detect and handle failures [streams-detect-failures] -Documents fail processing for different reasons. Streams helps you to easily find and handle failures before deploying changes. +Documents fail processing for different reasons. Streams helps you to find and handle failures before deploying changes. In the following screenshot, the **Failed** percentage shows that not all messages matched the provided Grok pattern: @@ -104,11 +117,11 @@ Failures are displayed at the bottom of the process editor: ![Screenshot showing failure notifications](<../../../images/logs-streams-processor-failures.png>) -These failures may require action, but in some cases, they serve more as warnings. +These failures may require action, or serve as a warning. -### Mapping conflicts +### Mapping conflicts [streams-processing-mapping-conflicts] -As part of processing, Streams also checks for mapping conflicts by simulating the change end to end. If a mapping conflict is detected, Streams marks the processor as failed and displays a failure message like the following: +As part of processing, Streams also checks for mapping conflicts by simulating the change end-to-end. When Streams detects a mapping conflict, it marks the processor as failed and displays a failure message like the following: ![Screenshot showing mapping conflict notifications](<../../../images/logs-streams-mapping-conflicts.png>) @@ -120,12 +133,12 @@ Once saved, the processor provides a quick look at the processor's success rate ![Screenshot showing field stats](<../../../images/logs-streams-field-stats.png>) -## Advanced: How and where do these changes get applied to the underlying datastream? [streams-applied-changes] +## Advanced: How and where do these changes get applied to the underlying data stream? [streams-applied-changes] -When you save processors, Streams modifies the "best matching" ingest pipeline for the data stream. In short, Streams either chooses the best matching pipeline ending in `@custom` that is already part of your data stream, or it adds one for you. +When you save processors, Streams modifies the "best-matching" ingest pipeline for the data stream. In short, Streams either chooses the best-matching pipeline ending in `@custom` that is already part of your data stream, or it adds one for you. Streams identifies the appropriate @custom pipeline (for example, `logs-myintegration@custom` or `logs@custom`). -It checks the default_pipeline that is set on the datastream. +It checks the `default_pipeline` that is set on the data stream. You can view the default pipeline at **Manage stream** → **Advanced** under **Ingest pipeline**. In this default pipeline, we locate the last processor that calls a pipeline ending in `@custom`. For integrations, this would result in a pipeline name like `logs-myintegration@custom`. Without an integration, the only `@custom` pipeline available may be `logs@custom`. @@ -159,5 +172,5 @@ You can still add your own processors manually to the `@custom` pipeline if need - Streams does not support all processors. We are working on adding more processors in the future. - Streams does not support all processor options. We are working on adding more options in the future. - The data preview simulation may not accurately reflect the changes to the existing data when editing existing processors or re-ordering them. -- Dots in field names are not supported. You can use the dot expand processor in the `@custom` pipeline as a workaround. You need to manually add the dot expand processor. +- Field names containing dots are not supported. You can use the dot expand processor in the `@custom` pipeline as a workaround. You need to manually add the dot expand processor. - Providing any arbitrary JSON in the Streams UI is not supported. We are working on adding this in the future. From 5f385b09a1ef2088372d008979d58361e012f676 Mon Sep 17 00:00:00 2001 From: Mike Birnstiehl Date: Tue, 7 Oct 2025 12:22:21 -0500 Subject: [PATCH 4/8] update processing docs --- solutions/observability/streams/management/extract.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/solutions/observability/streams/management/extract.md b/solutions/observability/streams/management/extract.md index dd96911dd0..112a8a2b8d 100644 --- a/solutions/observability/streams/management/extract.md +++ b/solutions/observability/streams/management/extract.md @@ -9,7 +9,7 @@ Extracting meaningful fields from your log messages lets you filter and analyze From the **Processing** tab, you can add the [processors](#streams-extract-processors) you need to extract these structured fields. The UI then simulates your changes and provides an immediate [preview](#streams-preview-changes) that's tested end-to-end. -The UI also shows when you have indexing problems, such as [mapping conflicts](#streams-processing-mapping-conflicts), so you can address them before applying changes. +Streams also shows when you have indexing problems, such as [mapping conflicts](#streams-processing-mapping-conflicts), so you can address them before applying changes. After creating your processor, all future ingested data will be parsed into structured fields accordingly. @@ -135,6 +135,8 @@ Once saved, the processor provides a quick look at the processor's success rate ## Advanced: How and where do these changes get applied to the underlying data stream? [streams-applied-changes] +% make sure this is all still accurate. + When you save processors, Streams modifies the "best-matching" ingest pipeline for the data stream. In short, Streams either chooses the best-matching pipeline ending in `@custom` that is already part of your data stream, or it adds one for you. Streams identifies the appropriate @custom pipeline (for example, `logs-myintegration@custom` or `logs@custom`). @@ -169,6 +171,8 @@ You can still add your own processors manually to the `@custom` pipeline if need ## Known limitations [streams-known-limitations] +% update these limitations/verify limitations + - Streams does not support all processors. We are working on adding more processors in the future. - Streams does not support all processor options. We are working on adding more options in the future. - The data preview simulation may not accurately reflect the changes to the existing data when editing existing processors or re-ordering them. From fca203dd52f032f593584cfe00c16133ee94adbb Mon Sep 17 00:00:00 2001 From: Mike Birnstiehl Date: Tue, 7 Oct 2025 12:24:37 -0500 Subject: [PATCH 5/8] update known limitations --- solutions/observability/streams/management/extract.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/solutions/observability/streams/management/extract.md b/solutions/observability/streams/management/extract.md index 112a8a2b8d..3341c976c8 100644 --- a/solutions/observability/streams/management/extract.md +++ b/solutions/observability/streams/management/extract.md @@ -174,7 +174,6 @@ You can still add your own processors manually to the `@custom` pipeline if need % update these limitations/verify limitations - Streams does not support all processors. We are working on adding more processors in the future. -- Streams does not support all processor options. We are working on adding more options in the future. -- The data preview simulation may not accurately reflect the changes to the existing data when editing existing processors or re-ordering them. +- The data preview simulation may not accurately reflect the changes to the existing data when editing existing processors or re-ordering them. We will allow proper simulations using original documents in a future version. - Field names containing dots are not supported. You can use the dot expand processor in the `@custom` pipeline as a workaround. You need to manually add the dot expand processor. - Providing any arbitrary JSON in the Streams UI is not supported. We are working on adding this in the future. From 925ef8b5bcdae8011e8ea0524a5ece8d3f7b0ccf Mon Sep 17 00:00:00 2001 From: Mike Birnstiehl Date: Tue, 7 Oct 2025 12:25:13 -0500 Subject: [PATCH 6/8] fix limitations --- solutions/observability/streams/management/extract.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/solutions/observability/streams/management/extract.md b/solutions/observability/streams/management/extract.md index 3341c976c8..8400ac8573 100644 --- a/solutions/observability/streams/management/extract.md +++ b/solutions/observability/streams/management/extract.md @@ -171,9 +171,5 @@ You can still add your own processors manually to the `@custom` pipeline if need ## Known limitations [streams-known-limitations] -% update these limitations/verify limitations - - Streams does not support all processors. We are working on adding more processors in the future. -- The data preview simulation may not accurately reflect the changes to the existing data when editing existing processors or re-ordering them. We will allow proper simulations using original documents in a future version. -- Field names containing dots are not supported. You can use the dot expand processor in the `@custom` pipeline as a workaround. You need to manually add the dot expand processor. -- Providing any arbitrary JSON in the Streams UI is not supported. We are working on adding this in the future. +- The data preview simulation may not accurately reflect the changes to the existing data when editing existing processors or re-ordering them. We will allow proper simulations using original documents in a future version. \ No newline at end of file From 41968fe7eb85fc6e9f688c064e37de74a39772da Mon Sep 17 00:00:00 2001 From: Mike Birnstiehl Date: Tue, 7 Oct 2025 15:29:54 -0500 Subject: [PATCH 7/8] add significant events --- solutions/observability/streams/management/extract/date.md | 4 ++-- solutions/observability/streams/management/schema.md | 2 +- .../observability/streams/management/significant-events.md | 0 solutions/toc.yml | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 solutions/observability/streams/management/significant-events.md diff --git a/solutions/observability/streams/management/extract/date.md b/solutions/observability/streams/management/extract/date.md index f5ba7a173e..2e135592e2 100644 --- a/solutions/observability/streams/management/extract/date.md +++ b/solutions/observability/streams/management/extract/date.md @@ -6,9 +6,9 @@ applies_to: # Date processor [streams-date-processor] -The date processor parses date strings and uses them as the timestamp of the document. +The date processor parses dates from fields, and then uses the date or timestamp as the timestamp for the document. -To parse a date string using the date processor: +To extract a timestamp field using the date processor: 1. Set the **Source Field** to the field containing the timestamp. 1. Set the **Format** field to one of the accepted date formats (ISO8602, UNIX, UNIX_MS, or TAI64N) or use a Java time pattern. Refer to the [example formats](#streams-date-examples) for more information. diff --git a/solutions/observability/streams/management/schema.md b/solutions/observability/streams/management/schema.md index 4fd1ba80f1..3078efe47b 100644 --- a/solutions/observability/streams/management/schema.md +++ b/solutions/observability/streams/management/schema.md @@ -1,7 +1,7 @@ --- navigation_title: Manage field mapping applies_to: - serverless: preview + serverless: ga stack: preview 9.1, ga 9.2 --- diff --git a/solutions/observability/streams/management/significant-events.md b/solutions/observability/streams/management/significant-events.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/solutions/toc.yml b/solutions/toc.yml index 86ce1f32c8..0ccf42b97a 100644 --- a/solutions/toc.yml +++ b/solutions/toc.yml @@ -469,6 +469,7 @@ toc: - file: observability/streams/management/retention.md - file: observability/streams/management/schema.md - file: observability/streams/management/data-quality.md + - file: observability/streams/management/significant-events.md - file: observability/streams/management/advanced.md - file: observability/incident-management.md children: From 16a72aff2eddcddb71621e93f72699a6afabb9e0 Mon Sep 17 00:00:00 2001 From: Mike Birnstiehl Date: Tue, 7 Oct 2025 15:33:38 -0500 Subject: [PATCH 8/8] add title --- .../streams/management/significant-events.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/solutions/observability/streams/management/significant-events.md b/solutions/observability/streams/management/significant-events.md index e69de29bb2..cdda082d54 100644 --- a/solutions/observability/streams/management/significant-events.md +++ b/solutions/observability/streams/management/significant-events.md @@ -0,0 +1,16 @@ +--- +applies_to: + serverless: ga + stack: preview 9.1, ga 9.2 +--- + +# Add significant events + +Significant events surface noteworthy occurrences within a Stream’s data. These can include events like out-of-memory errors, startup and shutdown messages, and configuration changes. + +You can define significant events by either: + +- **Generate significant events with AI:** If you don't know what you're looking for, let AI suggest queries based on your data. Then, select the suggestions that make sense to you. +- **Create significant events from a query:** If you know what you're looking for, write your own query to add an event. + +% ## Query Examples - need to add some. \ No newline at end of file