From 46480d72f39e2a955835ae2db2f967796e2b1756 Mon Sep 17 00:00:00 2001 From: GDWR Date: Sat, 3 Feb 2024 15:57:57 +0000 Subject: [PATCH] Add grafana dashboard --- README.md | 31 +- assets/dashboard.webp | Bin 0 -> 35982 bytes example/docker-compose.yml | 18 + .../grafana/dashboards/jetson-exporter.json | 754 ++++++++++++++++++ .../provisioning/dashboards/automatic.yml | 7 + .../provisioning/datasources/automatic.yml | 10 + example/prometheus.yml | 8 + 7 files changed, 823 insertions(+), 5 deletions(-) create mode 100644 assets/dashboard.webp create mode 100644 example/docker-compose.yml create mode 100644 example/grafana/dashboards/jetson-exporter.json create mode 100644 example/grafana/provisioning/dashboards/automatic.yml create mode 100644 example/grafana/provisioning/datasources/automatic.yml create mode 100644 example/prometheus.yml diff --git a/README.md b/README.md index 3aaa3e7..41276fb 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,6 @@ Jetson Exporter [![GitHub release (latest by date)](https://img.shields.io/github/v/release/GDWR/jetson-exporter)](https://github.com/GDWR/jetson_exporter/releases) [![GitHub](https://img.shields.io/github/license/GDWR/jetson-exporter)](https://github.com/GDWR/jetson_exporter/blob/main/LICENSE) -> [!CAUTION] -> Project is currently under creation, not ready for use. - Prometheus exporter for the Nvidia Jetson family. Supported devices: @@ -29,9 +26,33 @@ sudo dpkg -i jetson-exporter_0.0.1_arm64.deb rm jetson-exporter_0.0.1_arm64.deb ``` +## Grafana (dashboards) + Prometheus Example + +Find a basic configuration of Prometheus + Grafana that can be used to monitor a Jetson device (on the same system). +This configuration is available in the [`example`](./example) directory. + +A Grafana dashboard is available in the [`example/grafana/dashboards`](./example/grafana/dashboards) directory. + +> [!NOTE] +> If you notice an issue with the grafana dashboard, please open an issue or submit a pull request. + +![Grafana Dashboard](./assets/dashboard.webp) + + +## Contributing + +Find a bug? Want to add a feature? Submit a pull request or open an issue. All contributions are welcome! +This repository has a configured [`.devcontainer`](https://code.visualstudio.com/docs/devcontainers/tutorial) for use with Visual Studio Code to make it easy to get involved. + +In the scripts directory, a useful `tegrastats` emulator script from the [jetson_stats](https://github.com/rbonghi/jetson_stats) has been added +as a good means of testing your changes (until formal unit tests are added). To utilize this script use the command +```shell +go run cmd/jetson_exporter.go --tegrastats.path $PWD/scripts/tegrastats +``` Resources --------- -* [Repository Structure](https://github.com/golang-standards/project-layout) * [`tegrastats` Utility](https://docs.nvidia.com/drive/drive-os-5.2.0.0L/drive-os/index.html#page/DRIVE_OS_Linux_SDK_Development_Guide/Utilities/util_tegrastats.html) -* [ridgerun's Evaluating Performance docs using `tegrastats`](https://developer.ridgerun.com/wiki/index.php/Xavier/JetPack_5.0.2/Performance_Tuning/Evaluating_Performance) \ No newline at end of file +* [jetson_stats](https://github.com/rbonghi/jetson_stats) +* [ridgerun's Evaluating Performance docs using `tegrastats`](https://developer.ridgerun.com/wiki/index.php/Xavier/JetPack_5.0.2/Performance_Tuning/Evaluating_Performance) +* [Repository Structure](https://github.com/golang-standards/project-layout) diff --git a/assets/dashboard.webp b/assets/dashboard.webp new file mode 100644 index 0000000000000000000000000000000000000000..fc4c9b3c84b845fa251f1e3beb2f76bf4708d16f GIT binary patch literal 35982 zcmaI7b9g1&*7hCSM#pwKw$ow9wr$(&*tTtTY}>YNXT81mKHquHdGY;M*IKh?%^Ef4 z829~KwGpe7UIv{_`fZh}0?NJ3YKe=dK8~JoT|fcoCUVyt z){}Lkakl1U%cvb{7tv;<=ZI5VOUTKp{;bHjqslatXcOo5iyi5br=$0+W%|_{d41lm zA&Z)31#%h2X7oXc78Np>$++~>`QfrF?L3(i1IbD$SI@rsJfaXx*kE|;am-T66*75b zRp+YCerY>YQj@A+&Lf?>psRY15hVe8DCF0ym-ikY{_^3Wv?OHLOm<4tC8Jg$K@{0a z4#Sz_FYMABpmV+(DaVqNqB4s6N!| z_=-ZzFwp2bJbLTh-$T3yT)fZDZ{Xyq$(qOBI3I&J`~v7wRN?}c(9S*)Zu^;Bbb?ZFc<8VS77&$KexFg2AQX3^`5)4ekatcf}|aMqt|kcIv( zRk<;916KHI?eC4qZ)#D2SVa5#jo4%D^E6+^9`Xw=2%B$wvpg zmEn${E1^wEvN#obmhBv>QrjZQ@!HT)Y<{2E%1vUy@wHbzE>#>$&JJ6@ce;=@0}+$V%+6; zdqXX-im6cyhSO``JC)(#N}&kfYMgZ5C8n$+Pcd^=L5*dHLN8o-39*qYXWxr@lZU=QArERz@r|r`tkZ4A1q(YKo9^?=kgj3p34_2Z6Vla{<~auY*k?ibGcdM}J3UJZlg_ zcZxbJT>P#Ri^&@#2a+u=(s(!e$3ZU!tInL9i}D)sG}2stG5ChAne48rDmJdeQ(~8d)R#UapJouNe&-epwg4D%HFF_;AFyOdKA7%0U1mB z=W|q(5$Q$rYqeqg1426-jGxo0_XM7v|%Jf4t5mX2lhVzf^m80T%cSfKX^*ER}bee0H{?_zKr6kffngb*mZw3+M!U;w|Pc@aykI@?_*cic~{zGUg;F$*Z z7&mBfaAsJ{8ZUs|(F89aKW-kn>{}D_(q`^WJRQSLv?rI5ovLfwzw45!gE91Y3Mdrn zQ?xSIndzTWL5pz3w5H65?ebL?3JNBFNju#{LOy=t4)o-_AiA{XkP1}P7!6gAnuIh0 zt1{~A5_{UniL25bE)Ud|9E^)eIKjWrl@B3R(VGnyMDw{tNQigdOqxsK%1w%L8xY5C zM)FXH3*q@^ga6a7{@Tx3Gv=#GO)x{12fy{BH1;u^Nyhx^6kPpe1)Il$11b(lt?M1| z1@T+q*l1qCm84gqvcE3DplEmBQT^ily==7qW2#e&M2F31)7zEsM6(hud4WnnM=mQ7 z?(Ark8cQpPfVE^xW{XLvXfYokz>p#Ufs)XdRO2htUj?QsPar_L8sa^(qBiFqaT)^sJ3362s1koQvf+S8fR4VT zkH;Eon+23f_$%DL>nGWqn5MblMKAQX*P(ub)>6F$x602iG`KCEGUfAWZf*Z)3@59` zAcd7ngPU64KE!{kqjS6-ufLj$7s5XpgU=EsRB(Qa;8Ru)(M}oaGMj$~xtE1&5%Q5R zm!`~gwY2p1?f|7bVTi~qQgDwNDyi_^0!N@^ORd0vNrQjyc0ppBneY=-L=Y_^=~`D!ikeEhUf`V4@Q5Fez77~XtrtiTj?2tkRQ#m_2{ zTm95X;@`mnb;R=K3YIw2(<~pG63^ z$i7;yv~p7lG^F3UM`5YDSr#@XV2M$}{>HyA3bd5Ue0F$L-RMe@?^>Gn|EVVpzKU79nU=-PXvix9`@IOi(?? z#T!bI>_8?A4w;y=H@|S5h-ZG9ML}a_et;s`U4%}{GA(uXb(bnL^XL=Kl?~4Ov*C4{ zV7@tZVx8)*oNj9gfR}lWqM^m+@<1j+g4bcd5p@h2QSQ_$w?j%))Bmiq$+pJ}sj+I& zN(C4H;Vvos3;33q@#7oJg=BPMMV0CR6bg8|Yv)uK9j@dU+dCm`$Aax+$uXHX#Kw@s zTEcaht08_ol$3%^Yj{hoO`(CJKDtx0^QO>KP>{;(V@Cq=3!4+sn{Z{dCL`$(=$Rav zX;adOljyDrAD4_;R%!kQsgZo&bw5g`)5*_V@)0${C9K5#5+SQ)MTzePz18VS{W3yv z>TT+qZ=MG!ms5(K7pR{e;Ev=ry+nwZ8zDN4mZBF6B+D>FKdr=!b$Akb^C)+z9mt%<97hSh}%|Og(gao+!_Er z!||J8v_3v?WQ2;XcE2(3>spDqzs2D{48h{L#M;VH^s2x=hot{)c*gbCF%>yE5R4+@ z)s*R{UfaJmNRk9Zau(Ym1eg&)X*#r4>be=~8r9mr)(;A6iXI!Ll)QsCyYPyOYt}o5 zYH^Z^I}IQa+vhzWaIQ;v)e~B6j5}!?0k6N z`bD`gw=~ea)9=%M3|3oC2fJ5)z5Ow!6hCaBK%e$#IVXl3RQMRQ3HMmMs z(f+zgaeNfxh$f~i^Kw^Jp@FHfQ-hU^R4C`v`~G(nW$M%`yo26~kfS}A4twb&HL_?5 zqc>~{d$`Y4gUIKsdGciG0PVgPyBiW~NfGxy8fELp{jKZo*-;-y-Sb(3_xl)bL9<9Y z8zM^<~H0E6vJk(Nh0XbFqNJq61sf zpHZ@nrD!XykQv~vcA(Z+DCPF_bt_RkST|JfP;v1Vv$M5f-&$FYkY}`$ZP(AHj?< z4bL%Jd?G3^+O$-xx4P>F`E9JZYHRe#KZ4s07hM3P1w!No{FEo|$0(0cR`)K$b;EaK zhXx>Wh=jl9_RytLEvo!D+{x@fO$l(gkd_5R-PNzJ&~J)y32M$^Y%*&Ar@P z6D%5G5%S0u#B?H}r9pxC!tMXIQrATD%GZA^Rc@dvZUH3&$@6CqN%1eyhQDmq>36d- zG`Z7#kKS8D0X?~&f7{n7fJejTg`E1Xu-2smko{q(_S0XU>#y{f#$E9QL_*5rzg)TOX!8nBo$DXl z^iYSg8-U!C3Py>Kuf6m9f`JA|{SdKqFR)eTbwkPf11I*shj$v4@`0LcIuGdgm71Zq z<(c+9^=bQ3JMHTZ1)1Cw7g-_83_i?1mwWtMilLJQ=yv5yqh&uEE%A^SBHi4CK#r{o z^9fgEI|b2h%-<_mC(uaHvT^$auo36efU3cll=#gh?^XE5B1?|{)kS_~Q~ec>e`%vB z*?;`K|KvoGht*XcdE73VmmBRk0`fvo!WP}RilC(q!9^mE9`qVX{x7c)_D$~6 zbbPN=KkU61W)*=PURGpNF}J6*-A9Hj@WKQpQ{;m`9`uif{VSTSh=22g^YlM?{BJNqES7JOyuTMH_d$;h zV@S@LG}Tai^Z&_66eK79(;}QYHh=x4;wFb<|479HK1;m6Aw${X|F_ovLJk8#e`j}G z`#;L~Uy|~_Q}YiXd7Py9bEoY1(A$6M&!hd3KV9^H$c2XZFQ~n>*{|;$K6```)Z=XC z2g*o5RlO@y; z2GKObf&U39{%s5mBeWAaP6)5&%?ypB(4y}D0fjUt+aUjw7S;fqRaOa`MFKbYtE*YFz}076I%HAOR4|o4*vJ* z|L>6NPs*|Y0et~TWRKMK{0of@#ecUV|AXU7u62_v>~lUiJ}512HbY8ZI}Y@nI%gZGYfTv*%T+ zuBAt#(cxm*6WY`87Rv5}o*KaalJ;7pE!J*Ev+43`lJOsOe8ZvIfd(& z0%fhr{qr;M=wk{j65dH=F~_WSa=~mAk^+gJSXS@7Bc#Y7Iu^;{4VQeS&a!rgtjxEg z)In1bbw~*R;mB7S~GUcoS(JAnqHo^de^*v9@~uj zLOtoucBJ4?Tx4NCayCL??va$u4O?jP`&R_geiLq3Jg^$Fx}$}_7`B#XD-qExJHs*z zNf&S2Je%5&pYc*UhtB;%*6t3tGfG8O-Gj{-zasosn#s6>{UX3w2H>cohL8@P)hdVA zz-s5Y_W~jcBs9!;9~TC)m#mu?lhRG;@YNS>=$h0wy@$os&seFbm7MO!t{q8NviWWM zLf51~RT-u1{C#QN_u|Zgg)9qQ9**bKCzOKW>dk3gq&6jNI<79pJIIGU=j~<%X*HYI zXAK^wz?ktgA4I!8ID%hF_S2UXeUFA<7m;RR&@Nz+-rMt?6w~Yk+T%&wC~ z4*GROchVJh8*Yc?n0yq(J3;j2lA@t|rzT`9IUz_#dK97QrvuwK&GU29;(^sNe68B~ zOf9?%+77x7I*cd&f%}w@-ph2#O~U{A1Esk&D4vEdez#g=uykI<@9QU7N0Ewq%sgVn zVeJ9zn~jaWt^5(SKpT$s#y)V4rHxdzVm(Yo{{eOH+T|N=7}R%JFOq|f#^OogiQM#J zm(U`C%A z#Q5ajqt&Sr@GY^kDioxVj|wo^ghAs^WEZfd48>oUg;qK*c;bsBZJ z?(1L4zF{c!x#v}38Y6=Y_@gOa{pk?eR)~$0-BjdOVvDwWZwX8#A{+F+0#1#d*VXR9 zBT<1|EB5{83G$ClhQw-)Oe!^0jy#45-EFGKD61m?j{&1POC|#@A2BJjr?EUgJvnXy z=DTwzxagWBo`@oO#S3&cvG`i&xTrsTbGj51v7aR3CnpovB1)zm=Be!rc%5tt8bM^( z2Wb2B{8HqDD14GNIB2V-`rKwq08g{!7f-eZQZAQCmocEOUGr)BV#2EOhklAWMWD6` zJ+Yg7B9}dZs7ghiErorvZ35-eNEkV@W}Z)?3rH&b(iKob+g`43Rh@epBDUli-@rGf zEg%ktUB{Rj;HyMi6&$X9G*XUrS#ltCPhm2RHizdo2%LA*oar7rIKwEIiHt#c< zHSQO7KqPOF>jbj$j0)JsyF61_iu$lEb#5dRi2jl@1gFsC&L??{hq*7{;2auSBfski z<6<9Od4?tZ!p1eu5?>4Hc|*z#IB&e&=~fkXB|>TPUYMW6O2!7+JgSh7>ZCx*t`vH@6}n2qaVho?3a-t zpNla~kzQA$3Ryl3kB&+O6?Z;mWDh5vxG0etlg||`-IP`9N|;<(gl!GM*)Uk<@>h9=UBPD);ctWaL%oz_U z_r@kG@pWL;xOYEaM~7KDvor(@-4=(|k>5r>i5hmpOE9@m#Xxfs$ttGGqf0u-;G2h0I$$#e`1 zDOppT@;buaS1g4UN(;;X?rwD{t+mRNNDRR~>s-+ybw+(#*E`#mGHb)7pBaN6Q$c6v zSL;}|OkIp&o{Si14YR=hF5fswBJm~t3y%VyGWU{i@Y_5Sc5xUrN$b(>`ydJGGjZ6| zmjAIVTw-q_5s5OA*Ufok{1pf`?A+%xMHp>vH~INnuB*RZoFQ+-V*tkH!& z&%c#C*L)DxmlkgUO_(dbsP7*Q28*}zSTa{#{o03BSGhtgqDxo(x%qKoEr$UhdQ)Oh z0Z+@;iu!p?W{b$r;Y!&BELTpc>QkjW8J1!YR=+XOz+R_zO%TJ0So>{)&HCgr&yZZ> zZP%hyp9L!9J9$^>Y^9w4Gxlk?f-ygw6$?9p&dFKW$rHm*1pl>5hEv@7D-9)HLK8yh zFt}God$9b+9yS9l zqduw{jX4SqxUS0e1vVpy{nG7v{5TpAO$RKTj4csv0vJ) zia5#k5LC`fyFehWNO=9uZ>ag$ zKvlCWOpiAj67uajcc9P?iaRVt%Or=zr)V15Nf*wY5cv8 zTb8vB)9hkwGt<h97$f_-@sRAk0721i0j*dtBsC%dh5%P4Fh zARut7@S&0qNHaSzQ2gQ3dJIG5o{o2ZmuZYfhD&)ag z(+#|lV-DmODp36CUCD%QDfvS`{u5JCpa4oMKusG|&nfzYy^N zkl~p{4#GF>wOxbG0M$)2YUH?2*J3YPM`VLC4k1H%kl;AF*Y{_d9y@ckh@x8DbiUo; z_AtWxuTp8-kwL#Knb#v5n-f0LOxx{N|3lJPJ_lXxF7t4}J+bx&#U~THaH9@=X15KH zXR>+d0ah`;iHNK!z%<>R^rU42JU_Usk=xGHvE|0yWB^M8udGp|o>HWo<;-A``3qO& zip==U=wx{i*?HL5d6%1<8$}%^p?OMBKt37>C&1A<;adbFEj=`2G54H} z2cHBN#$RzgazXp7_u0-<@Am%WqEQ-KQb|>q0b@JwOKL#51xd)*FVq5BS=Q*U3IrJF zJ~7^C4sF4DYJEVQ4SCgkbXTgrABHp^nUJ~YE8msP6&y^CNv!DKN(SvMgre#N$+>UF-K5yJBcmj_FPmZwc>A(xw=19IzQKSA5EpW zfA8wn*uut|{!J@KZ$}vKGs>9NQb3lMuGb6bIQ$T1B6jqiHPh592gm){RM7a%}s;IMupz85E)__;+BduW9F|z=uHSI(Z!`ZNBMHD{}NR67ke!w%i3jO3y zTIlc>?Mu(L#qCK2c*@knO}^AQ5!iuvOL7E)_SH#g^6Kq zY<8Yyq4WwiHWnf4a|y16+)F(X4;!-&9wQJ5}3>)WybM4!=8DZ&$k>1gZsPu70% z_>#m$XGx3np2f5?ygtJR(($T*cC4zn6wM6!3ZPLGYGz1UW3SBoukTWcD@GdY{d)sk zjD8LU1uNU;oS~F>f$Zg%wM>UlhhZ9dHi4Za8kk*H{$EoNRwl$I(eJ)-J`rIBRCN^! zVV0H*huUcuKudMAihhS|ZMtM-N{K)~!v3MH&cUS+PuT7IvWg&{jwtN%k!)!D9cNjx z@1`Fz^&%kM*P;%;a)H3IS9v!PP3~V+OOU&W7^mp7el&!?9iUQr}-Oe+0tow zmOL9%8^)eYs3dA@GUTQzq&&V0r%fvNWkM3_?Xa? zbAlKrB;&vJI{ft4nPc4D)Hqq8&I9(}#L(!slxWE)_EM0*<$WKVEbpOx3CDL=Q3XyW z0Q>lyygN(YYMwyo0W+>O{-GD@OQ>e&8^0)bgj8cTONcXx+@klQY8KBX(Ec%rN;MrI z*Q;BZaxGiOaR(qMJ$;+8qIR-HsiQs&Xo(XQt6MCJ;~43{9}So!9EG(9H6)Fk!dn}hwMwFQTC#2lGQ^7DK8s_#?v{~< zGzimj>T(S#z*x1T8=$J25bbaNHS|>uSVn?UPZ;>r8ldkV3j^_z^;BtTwf+qRVe38Q z&A$A6?lu~mxjB#+k1E}v%51BEG6Uuc`KxC4M}-^xhL31lz0)C(Bwx^LwQJKOxHy4_ zAxDA`5D=)>V%b!u#c4TnjDFHXauLj%ltT9_dSbToT_L|2M^$|@A(-w`(fEbopmHa* z)Gml;thRd~KSn9mfMIMsyVi#mSh?R;*GS+Bj$adU9C!O;Mt7}a8N>>E_uHTZk!|ev zr=i@KsVrKd`re_Ro2PX^L+@2yZ!SrV0X#o9=-)#9Y|qQxRj$1Y-Tmc_3ez%kSeu0x z=**{<7jroGsXh6_IrFUF=b>E`=&dt%FAbX@G^i`k6%TS9DztazQ0$gBWMSB|RBoeX zDG1r5?7WSmM6*}yP~nYP54rhBa4&YG8*pzx{b39#mV38!;bkCZN!k3m^%+$za(%_* z)WMk1MDasV>GWobFn$=zLF^Kq{dApR;U{W60EuT{0@M_%)odxiORsdYQHW_ApSp%8 z^@;Ad_ZWWD3qx1wr*Ncm227Jn?GVqM6E7VlZ2lD1JwIAD-Z(9p)jbaqImsp}?TODD z!(P=La`g|x;=vep@}?c20$Z6efKGiqaL6V>I4Fi7x2d6D3fP&>s2Fd`Z3c;E_9>E^ zNl4U=!q!Pp64FFlD{ln zdJp|ge>?t%d>*fTWD69qeDN~ERs*#?P>th)t^z02oGPkr2=MXcp??kqWLN$|uKZm% z+5`h^|9VyY7oj-Ws<*GZkNbY>3e?&3TPZtYuiiS((qi6-2I7Po(f7??2~tXHPm^qG zU5|5DAOddHgxck8nVuo%dRk~?J;CyMs33!z{5&nE7dxM}i*jXCOUf5oJ>_&XYx(fb z*!Um_t*2_GB?5akVk(t`EX;Cf{TUn%5EwH^_>#Zcu-y5wua2}VvD=S)WSINM4LTye zdeSB!Q@yH&j(!_3$f9N_?%5oId|8%E&Wbl34Te0gbBp_`fG|V#l z013ThTuB9d3wpT2cU%=g|6@HJuieCyuXpP3T!imtCED!MKI}Pm; zju|Hpp7%tjQQ^iAVSw~iD{&!6!BKs2GfxKjT|QMdfBt%07S^AA-H0k8yA~EBAaraS z^jHYAJEQdb;Va0~DjM~bcI?0 zMO-Q|a;o*zjh5obl|UMX&#vu4C6^pFg5hUDT9fYx96JYKT?j!qTq>uNmhj#eM(RjS zG94uJjrxpsGvPeNde#yy{(hfDEzdiWb<(G_Y((iuf|@VoYol$qQ=mc;rZy%%1|a}J zn5eh-E0c>|-^n#WYYlgjyw<|(ZYXm;do(2;>vM-=z5F#cAgpofsoM=JEF`TOQB#lX zKxx-Nh7}qLFs^>4vNUUa+X_*GBh8ZvTo{a2z=%?;ef(3GKQA#ft1PDGc!CK0OaZax zw60$9blIFCtnBux789WN^k`D|N}m-`r)T5@h%vd7Req>TBfrE1pU;ppG0kEk8x*V2 zQlf8ueOzJ@D2INrF|u_C$z^1VRoF8Uy~M@6?X8cGZW#-KEedzg8I%$qxW>!A?;fpQ$=iE!@Ma=1j)F){M|jB6Bw%wh zd_jHpn{a#fL3_5Prpn#CuYaBf1FG8fl^{nF5VtuSKPfjK*rQ+E>GA`FatTauhGH3f zQrw$bO{G^5OenB2)JBB0DXs|8AkG8C04cTHCvmxmm*Swky@}^}f`LMhwAY3uR8XcykbR${5tzx*Q*s-r|VCc2aDc|9MS!8e0o=c_Iz^Iq0n5 zlP8(+{Dslx}SGkrsn?hVsH zgFS_SQ)Yp#TrDZq_dGLKv?GLUUsvgTRzdDiiione*hH-7knT|>lT{0J zm8?S)M(*3VS2YZXNx7-&-EXVS${M?@-h)hG>EgRov|?X7?AvKD9?j!g^C)6lvq+J0 zDEPPyq5*dShLCQ(F z#y;TpDN#X5ln=~AoO6jfkJQ^6`5?(_xU^Mly&>NS6xwCDqUlRa#7S45Zu9Ob5=a3_iFPJhAZ&b-GjmLPUi6uQhp^RfM zJPjHxNLZ2SR_?&J9kZR7Pq2_$Lw(YarS*18+_$7$gl=>8x3bkURXhiExKL_ZD&Kd@ zWLmL=qZ0kIQ?_wRJ`h(8ZL+jBQ+IcGkCpZ;=9#_jJPG70l}+W^gDr|txgxj5*x^`% z$CnSsFJQl&RwL*)ky8xDS!ffht{nOL3d<~2v+LfxGO+h zOZ3l=OYX1z%**yA&(SvdZm2>MjG<8iUi?&YR6$F*J8r5sDa6JAiCuF-uce2i5TbFI z{R1x=3TqZT+We=rSOL0lX*J%_k~g_g$N^Fmb)nW|96?=bp;N;!hDVL|82 zS3?P^0aOT#Q+KMGXF-Z!FlKv8xnBsivCto@PQ75u@DZl2D#CxL@Cd9)z0}> z7_JPmxU#N%j>h9oFRvDMY!U3qT%X*z=4pV?!E7VVkl#8M3gLA+?G3)k;i?!Rx2LeP(9X**SHY3KEezZur6&j$`oK!L*C zYzNG4G#KM0gljb6n$ZQzc)Zj;4dAO=rU;i1Ij@PouxoHsCY#$VxKf2-m7UbA7bz4J zK&PWuJhjYVbh&nbEj!uQn)|-%Vty3{9##0=&)`KbpyYcg z`%$nHALaode7rboI8ZbN-eJw+!4RE;=yTp|xJRNxNLek!XOoCxq?<{nm%g@MFe?a| zx#YZqsTq!MPo0qyp={;b&?#UZYN}fgG1m#X`uu=LhUBb3JTB-~6xcyEr)0SU<{*>x zA=MiarY$nMoH9EDo7R%i2`4G4FCW0o%I-@?|N5=7 zqG6J z)4XoBgR52%#DX`R-KFq`w=ASlK!JNh!UjA}!Gj?Mhyjf6?~_KCfiC)#Ryy!$mCPp5 z_GdhAvW#a&=sbwmVmm>oW@OrM_h=;1SX}D+7WFEra?AdZH}=~k zE-=oF=?mWwVRp8akBc6!(YvOmq4QR9EddIM{A!{Y|h6A@RIX!=0X# zFfF0(5kLzmJjKFy&7~X!FA;WaWv%@vC2f^1I*^|!L1jVH-B$t!zYfcJ8=y@(O#ZUvhq+SRrGAW+H$-v0sl^3_(+UNLZHik )3ivWdq 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%0DT*iX_P|Bjt8v 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 E09@rm@c;k- literal 0 HcmV?d00001 diff --git a/example/docker-compose.yml b/example/docker-compose.yml new file mode 100644 index 0000000..ba38fd5 --- /dev/null +++ b/example/docker-compose.yml @@ -0,0 +1,18 @@ +# This configuration assumes that it is running on the same Jetson host. If you wish to have this on an external server +# Update `prometheus.yml` to have the correct target hostname. + +services: + prometheus: + image: prom/prometheus + network_mode: host + command: + - --config.file=/etc/prometheus.yml + volumes: + - ./prometheus.yml:/etc/prometheus.yml + + grafana: + image: grafana/grafana + network_mode: host + volumes: + - ./grafana/provisioning:/etc/grafana/provisioning + - ./grafana/dashboards:/var/lib/grafana/dashboards diff --git a/example/grafana/dashboards/jetson-exporter.json b/example/grafana/dashboards/jetson-exporter.json new file mode 100644 index 0000000..29545f1 --- /dev/null +++ b/example/grafana/dashboards/jetson-exporter.json @@ -0,0 +1,754 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "green", + "mode": "fixed" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "decmbytes", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 4, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_ram_usage_megabytes{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": true, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Usage", + "range": true, + "refId": "Ram Usage", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_ram_max_megabytes{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Max", + "range": true, + "refId": "Ram Max", + "useBackend": false + } + ], + "title": "Available RAM", + "transparent": true, + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "orange", + "value": 70 + }, + { + "color": "red", + "value": 85 + } + ] + }, + "unit": "percent", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 4, + "y": 0 + }, + "id": 5, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_emc_freq_percent{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "emc", + "range": true, + "refId": "Tboard", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_gr3d_freq_percent{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "gr3d", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Usage", + "transparent": true, + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 6, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "log": 2, + "type": "log" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "dashed" + } + }, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "decmbytes", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 11, + "x": 10, + "y": 0 + }, + "id": 4, + "options": { + "legend": { + "calcs": [ + "max", + "stdDev", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_swap_usage_megabytes{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Usage", + "range": true, + "refId": "Tboard", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_swap_cached_megabytes{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Cached", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Swap", + "transparent": true, + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 6, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "log": 2, + "type": "log" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "dashed" + } + }, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "celsius", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 21, + "x": 0, + "y": 5 + }, + "id": 3, + "options": { + "legend": { + "calcs": [ + "max", + "stdDev", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_cpu_temp_celsius{instance=\"$instance\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Cpu", + "range": true, + "refId": "Cpu", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_cv1_temp_celsius{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": true, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Cv1", + "range": true, + "refId": "Cv1", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_cv2_temp_celsius{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": true, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Cv2", + "range": true, + "refId": "Cv2", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_diode_temp_celsius{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Diode", + "range": true, + "refId": "Diode", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_gpu_temp_celsius{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": true, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Gpu", + "range": true, + "refId": "Gpu", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_soc0_temp_celsius{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Soc0", + "range": true, + "refId": "Soc0", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_soc1_temp_celsius{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Soc1", + "range": true, + "refId": "Soc1", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_soc2_temp_celsius{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Soc2", + "range": true, + "refId": "Soc2", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_tboard_temp_celsius{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Tboard", + "range": true, + "refId": "Tboard", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_tj_temp_celsius{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Tj", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Temperature", + "transparent": true, + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 6, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "log": 2, + "type": "log" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "dashed" + } + }, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "decmbytes", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 21, + "x": 0, + "y": 13 + }, + "id": 1, + "options": { + "legend": { + "calcs": [ + "max", + "stdDev", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_ram_usage_megabytes{instance=\"$instance\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Usage", + "range": true, + "refId": "Ram Usage", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "tegrastats_ram_max_megabytes{instance=\"$instance\"}", + "fullMetaSearch": false, + "hide": true, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "Max", + "range": true, + "refId": "Ram Max", + "useBackend": false + } + ], + "title": "RAM Usage", + "transparent": true, + "type": "timeseries" + } + ], + "refresh": "", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": "127.0.0.1:9102", + "value": "127.0.0.1:9102" + }, + "datasource": { + "type": "prometheus", + "uid": "prometheus" + }, + "definition": "label_values(instance)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "instance", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(instance)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + } + ] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Jetson Exporter", + "uid": "d3572e85-6cf6-4efc-b267-c3709d0f2f2a", + "version": 3, + "weekStart": "" +} \ No newline at end of file diff --git a/example/grafana/provisioning/dashboards/automatic.yml b/example/grafana/provisioning/dashboards/automatic.yml new file mode 100644 index 0000000..746d621 --- /dev/null +++ b/example/grafana/provisioning/dashboards/automatic.yml @@ -0,0 +1,7 @@ +apiVersion: 1 + +providers: +- name: 'automatic' + disableDeletion: true + options: + path: /var/lib/grafana/dashboards diff --git a/example/grafana/provisioning/datasources/automatic.yml b/example/grafana/provisioning/datasources/automatic.yml new file mode 100644 index 0000000..c483344 --- /dev/null +++ b/example/grafana/provisioning/datasources/automatic.yml @@ -0,0 +1,10 @@ +apiVersion: 1 + +datasources: +- name: Prometheus + uid: prometheus + type: prometheus + url: http://localhost:9090 + editable: false + jsonData: + httpMethod: GET diff --git a/example/prometheus.yml b/example/prometheus.yml new file mode 100644 index 0000000..77910f8 --- /dev/null +++ b/example/prometheus.yml @@ -0,0 +1,8 @@ +global: + scrape_interval: 5s + evaluation_interval: 15s + +scrape_configs: + - job_name: jetson_exporter + static_configs: + - targets: [ '127.0.0.1:9102' ]