From d61d1b90fbfdaa9576066db08e230875a9787af7 Mon Sep 17 00:00:00 2001 From: /rootzoll Date: Fri, 4 Oct 2024 23:11:36 +0200 Subject: [PATCH] #2624 Update: Telegraf Metrics for InfluxDB/Grafana (#4764) * #2624 added config dialogs * Refactor Telegraf installation script to check if the service is already installed --- CHANGES.md | 1 + home.admin/_provision_.sh | 9 + home.admin/assets/telegraf/README.md | 162 +- .../assets/telegraf/grafana_dashboard.png | Bin 0 -> 115206 bytes .../raspiblitz-grafana-dashboard.json | 7628 +++++++++-------- home.admin/config.scripts/bonus.labelbase.sh | 5 +- home.admin/config.scripts/bonus.telegraf.sh | 155 +- home.admin/config.scripts/bonus.template.sh | 4 +- home.admin/config.scripts/cl.backup.sh | 2 +- home.admin/config.scripts/lnd.backup.sh | 2 +- 10 files changed, 4328 insertions(+), 3640 deletions(-) create mode 100644 home.admin/assets/telegraf/grafana_dashboard.png diff --git a/CHANGES.md b/CHANGES.md index 4b8670beb..c486256be 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ - Update: LNDK 0.2.0 (Pay BOLT12 offers with LND) [details](https://github.com/lndk-org/lndk/releases/tag/v0.2.0) - Update: Helipad (Podcasting 2.0 Boostagram reader) v0.2.0 [details](https://github.com/Podcastindex-org/helipad/releases/tag/v0.2.0) - Update: Mempool 3.0.0 [details](https://github.com/mempool/mempool/releases/tag/v3.0.0) +- Update: Telegraf Metrics for InfluxDB/Grafana [details](https://github.com/raspiblitz/raspiblitz/tree/dev/home.admin/assets/telegraf/README.md) - Update: RTL v0.15.2 [details](https://github.com/Ride-The-Lightning/RTL/releases/tag/v0.15.2) - Update: Jam (JoinMarket Web UI) v0.3.0 [details](https://github.com/joinmarket-webui/jam/releases/tag/v0.3.0) - Update: CLBOSS 0.13.3 [details](https://github.com/ZmnSCPxj/clboss/releases/tag/v0.13.3) diff --git a/home.admin/_provision_.sh b/home.admin/_provision_.sh index 80ee1cf26..744c8b8c7 100755 --- a/home.admin/_provision_.sh +++ b/home.admin/_provision_.sh @@ -734,6 +734,15 @@ else echo "Provisioning Tailscale - keep default" >> ${logFile} fi +# Telegraf +if [ "${telegrafMonitoring}" = "on" ]; then + echo "Provisioning Telegraf - run config script" >> ${logFile} + /home/admin/_cache.sh set message "Setup Telegraf" + sudo -u admin /home/admin/config.scripts/bonus.telegraf.sh on >> ${logFile} 2>&1 +else + echo "Provisioning Telegraf - keep default" >> ${logFile} +fi + # custom install script from user customInstallAvailable=$(ls /mnt/hdd/app-data/custom-installs.sh 2>/dev/null | grep -c "custom-installs.sh") if [ ${customInstallAvailable} -gt 0 ]; then diff --git a/home.admin/assets/telegraf/README.md b/home.admin/assets/telegraf/README.md index 01b8035e9..5520d6568 100644 --- a/home.admin/assets/telegraf/README.md +++ b/home.admin/assets/telegraf/README.md @@ -1,34 +1,150 @@ -[telegraf](https://www.influxdata.com/time-series-platform/telegraf/) is a metric collection tool by influxData. -It is opensource and works fine with [influxDB](https://www.influxdata.com/products/influxdb-overview/) as the timeseries database and [Grafana](https://grafana.com/grafana/) as the graphics front end. +# Monitoring RaspiBlitz with Telegraf + +[telegraf](https://www.influxdata.com/time-series-platform/telegraf/) is a metric collection tool by influxData. It is opensource and can push performance data of RaspiBlitz to an external [influxDB](https://www.influxdata.com/products/influxdb-overview/) server which then can be used as a datasource for the [Grafana](https://grafana.com/grafana/)WebUI to monitor RaspiBlitz in a Dashboard like this: -You may take a look [here](https://github.com/gcgarner/IOTstack) for a nice dockerized installation of influxDB and Grafana on a raspberry pi. +![Grafana Dashboard Example](grafana_dashboard.png) -Make sure to have a telegraf section in your `/mnt/hdd/raspiblitz.conf` -you have to manually edit them into `/mnt/hdd/raspiblitz.conf` before calling +InfluxDB & Grafana should run on separate hardware - you might use an old RaspberryPi4 for that and take a look [here](https://github.com/gcgarner/IOTstack) for a nice dockerized installation of influxDB and Grafana. +### Prepare your InfluxDB for RaspiBlitz + +Before you can start Teelegraf on RaspiBlitz you need to prepare a InfluxDB database for RaspiBlitz and create a user with password. So on your InfluxDB/Grafana machine follow the steps: + +Start the InfluxDB shell: +``` +influx +``` + +If you havent yet create an `admin` user: +``` +CREATE USER "admin" WITH PASSWORD '[ADMIN-PASSWORD]' WITH ALL PRIVILEGES; +``` + +Create database & user: +``` +CREATE DATABASE raspiblitz; +SHOW DATABASES; +CREATE USER "raspiblitz" WITH PASSWORD '[RASPIBLITZ-PASSWORD]'; +GRANT ALL ON raspiblitz TO raspiblitz; +``` + +If you havent yet create a read-only user for Grafana: +``` +CREATE USER "grafana" WITH PASSWORD '[GRAFANA-PASSWORD]'; +GRANT READ ON raspiblitz TO grafana; +``` + +To check if all is ready: +``` +SHOW DATABASES; +SHOW USERS; +``` + +You should see a database called `raspiblitz` and at least three users `admin, raspiblitz & grafana`. + +You can now exit the InfluxDB with: +``` +exit +``` + +Make yure that the InfluxDB configuration file contains the the `[http]` section: +``` +auth-enabled = true +``` + +On our Grafana/InfluxDB machine the config could be edited with: +``` +sudo nano /etc/influxdb/influxdb.conf +```` +Save the file (Ctrl+O, Enter) and exit (Ctrl+X). + +You my need to restart the InfluxDB server: +``` +sudo systemctl restart influxdb +``` + +### Activate Telegraf on RaspiBlitz + +Back on your RaspiBlitz you can switch Telegraf service on with the following install script: ``` /home/admin/config.scripts/bonus.telegraf.sh on ``` -You have to provide a running influxDB / Grafana infrastructure elsewhere (reachable for the RaspiBlitz) +Enter the connection details the script asks you for. -# telegraf section for raspiblitz.conf -All telegraf switches and configuration variables. You may copy & paste them into your RaspiBlitz configuration at `/mnt/hdd/raspiblitz.conf`, after editing and providing the proper values which match your environment +### Check Incoming Data on Grafana/InfluxDB server + +If install on the RaspiBlitz went thru OK you can go back to your Grafana/InfluxDB server and see if it received some basic CPU data: +``` +influx -username admin -password '[ADMIN-PASSWORD]' +USE raspiblitz; +SHOW MEASUREMENTS; +``` + +If data is being written successfully, you should see measurements like cpu, mem, disk, etc. ``` -# all telegraf switches and configuration variables -# -# switch telegraf service and metrics capturing on/off -telegrafMonitoring=on -# -# the full url to your influxDB data ingestion point, with port -telegrafInfluxUrl='http://192.168.2.46:8086' -# -# the name of your influxDB database -telegrafInfluxDatabase='raspiblitz' -# -# credentials for this database -telegrafInfluxUsername='telegraf' -telegrafInfluxPassword='metricsmetricsmetricsmetrics' - +SELECT * FROM cpu LIMIT 5; ``` + +This should display the first five entries from the cpu measurement. If you see that data you can close the influxDB shell with: +``` +exit +``` + +### Add Grafana Datasource + +Now configure Grafana to use the InfluxDB Data Source. + +Log In to Grafana. Use your Grafana credentials. + +- Click on the Configuration (gear icon) in the left sidebar. +- Click on Data Sources. +- Click Add data source and select InfluxDB. + +Configure the InfluxDB Data Source: +``` +HTTP: + URL: http://localhost:8086 +Auth: + Leave default unless specific settings are needed. +InfluxDB Details: + Database: raspiblitz + User: grafana + Password: [GRAFANA-PASSWORD] +HTTP Method: POST (recommended) +``` + +Click the Save & Test button to verify the connection.Now + +We need the datasource UID for later - to get it: + +- Click on Data Sources. +- Click on the new created InfluxDB data source. + +Find the UID: + +In the URL of your browser, you should see something like this: +``` +http://:3000/datasources/edit/ +``` + +The part after `/edit/` is the UID for your data source. It will be a unique identifier like `cOZgpReMk` + +We will need your personal datasource UID in the next step. + +### Create Grafana Dashboard + +Open the json data for the Dashboard in a new browser tab - following this link: https://raw.githubusercontent.com/raspiblitz/raspiblitz/refs/heads/dev/home.admin/assets/telegraf/raspiblitz-grafana-dashboard.json + +Copy all JSON data (to paste it later). + +In your Grafana WebUI: Click on “+” → “Import”. + +Now paste the JSON data from above into the field + +_BUT BEFORE YOU SAVE_ + +replace ALL InfluxDB UIDs in that json with your personal one. + + diff --git a/home.admin/assets/telegraf/grafana_dashboard.png b/home.admin/assets/telegraf/grafana_dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..1505f6cd1d0a2201c37f3bbec5e941dc022a6665 GIT binary patch literal 115206 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̢x%qpBU4 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�HbAr#=C)4?@O#R zUjLt3dcKUen?MSylTLnsx!@Tm(z3z@jt`7Tg_D?n!sNiigob1BXz`3&c~{ zFL>z(_vh%yC%EsT(`lD|jpKKJ3gG1|8{WT5_|qpr!7&vuq99}Cc5R^#yjyD8X4vpB2DmD;^KNPhBH{sH7VJW{_sg=mm*wX!B5YQn! zJABCv{N<&I?8rCobPa-Qw|f|10PF}CuAl>M7zG?~4XOx74fOSy<|dp-<|=p0jX)}T zdSQVjw~Doqbmk%}^q%xHRNnri+7l8BtlqUpct5ueePy!t*R;Mux z;PaF+YCo1|f9wXpjr=uEYeWZ@gSpg6<=<~5$h8O{_7 zz-e|H`yL)$Z3gN8PjD|RNO{O7Z0Q!(@4IX7KmP`L-# zPLtTp`c%}iHTCy4&t;|L31}Z|7RYO#mZyJVQ}q6Gng6ChiM+}?=)ITCZsAfI;I)Iz zrp?!5>7dR+*#N2Jit*2(WR4sdC*b@7z87Nl`o!q0gS~*&q z7toZ7U^LP@Kpsp!U$6jCS0DR*T^@O<<4fJWqar8Zx&y@49X~|FzQ{yIMX}Xj3T2)j zEK>#OAg6uYd!0qleK%{&R@~8K4jwbB)G3mfekFG5q9Ynswk~?UMDt;@R zop!>ry|GEgH!Gt;jBRKRJ;CQUrQRJ{a%r4o_zPELH zd4$EnXYj7(_~>R$b2A1V$hB>SLg-cVM}gv=!@6|Et@zoI)T3&n(b3Tbrjyy1R}nZD z^}{x{L%`E-y_oxE-@_>Z3bj62dl@lU<0j(mYPpcw{qT?x`!3h`8uQ5=YgS&uMz19@ zT-N(6mi2^)ld0zZ6zusz&Uj_2QkvG>W>aM}H}~12;Yiu6)e_6vX6C|uh02mOqp>nB zBam`a8qFHX!NOlk7AA_z(#s7U(rf;A8%4j%~YB;8P-G=5je!o~0tP=DwV@;HQBOx84H zEuZ?tJ$4ly$T}FAcx`=dF~tZ??!HYkdtaMJ8~SDE-p(IJ2e5W;V>CzR*5w6^Q@hRmOlY?#vw>S{>=Jf-=UIvAtu;2@`ZPQ7<#oM0y)w$hEIK^*Ib zU+N%@6epnORjye=?DcDr_OZxYgxnk*_UuDZ4v$@X@Ot5xp1u+tPfJjrt?ZtqzS{ei zVa(|LCv~5SyjwwHPZwDTC`^83FXb}Ux4+YJb@N_oUAgaz*<&-^ZPC?wAnxMkJy-R7 zchEM8CPkblqUDaUx9?Os|hMmbNKl z&m7ims%eCg~HW9W12*CzSMTrN1=6rBufRPI~QlaME)r>&Dx*9V%w5-ihKn@I0zx zzR4d`eRJLv(KAvi;G(2d__tC3O|5I;-xOq})UuW{JDgoB?dPP9YkzJn80eg4WqAly z7F?avUUedLPb%-LqG8xro!GMz^Cp?7mb|ex9QFBKwWh(AR-e(ak|34q7xpB=V`#R5o6K5q3-GS0lP3|H5O(lXz8XC` zrh0PlD(eX-loo%s$QQpC{~lu6?F&-e6v1EZ)znzO9QjW+Wv$AtUnE>X_k;$3f^)m3 z{QCKw*oOY?-F{nWoi=rsYu{YwGzxNZ&&?1}zYH|RQYVsgkRRXm{e-d!JFyjHgj>S7 za6YL2*qpAOv8GdL=z!jvN+2Qet+cc){CJ;=1tJzpu_toK%au=syvW7pHa9+lH6!=0 z&rC@p$j2MXJqP)t9>%OE^Hx9l5ufQY0LypKi3uB-hkok2pmqCG%3EB@V+=y3iJ{t} zzXq0-M#$J?{_O0ZUrci|1$>4vK8+$@J7wnU#nn14omvboxBjZ>KV~JVwzp z4P5_jxv5`&c5`X~)FD?m?kR91-l0dZI9ijZf-QM$Q4mnyCh*H%O7AQ>=>!8=0sNQK z$PA5)k=MGgn69Di6ZGCmvc*KUWB7iOFEr;#K2+Q^sc zKCi|u3-mE|AjNE_il@Pya)_1tO!5EO%J=V$g5>nh2tmvKnJxe6n5iBbe@x;`+x4Og2nMqV@ITw?rjfq%AHP68)RX@&n*upPTYtN!0ayCVMWTDD^cVo7N9zQCdz;y_s@=i%^r!f zzo(}f`8f3F`5&f;P_P}Gus_N=ZT)`iO<2u;P-95*`=YewysuO6)x<)fe-$|k(F79F z8PO9YAjNhMF}6?BoQay?-%Z5(zx($f4h8!hBG-jH05DoTt z_FOGExkWSgXU|>(s|y9;HS6<^AiYsv3!Evv7yl#&s?KoHpfN<>s{&bDeuB{OS$ahpo>M=dqfLU)5CuJ)!l9 z6OlE6vihx|1;T{M!T&+*DeL~@JIL-N-UeZ|uyMH*#Byb&?<)1w&me+r2)$SG#k{W9 zNlS{jb^cwK!;HT-Y9|T~zVqEcKEWA|z8Xv#GVJHOz0&l1$B?4xLW2m|pD}UrQC8lq zIjn;0pbwIs{Ublr2_g)dg45{3CLUFjSI;zjyb}qkkv}bavN&4C5Fo_ugz7TUjdy6x zM%ABA&q+LIUgCSynmH;x^LO8^Z`ru!v9WIx!421NCS_>WTnKsX$!_L#V$M3kq1C>n zC$3Yc%*o%oK=QhkcS9~bw^rB66OLGQ<2%W^O{XLSjTdB@^s3Zs3~+5A?cKV1{VoMu zV583G65tM#AhZku`jZW$)?;NEeB&psz;@20;& zX97U82#rKqlws04C+bO@BJ>|Pe&ObIIN-sW$dh{ zJKeA*GWRr-&V@ALw;y+1o;{N;FVztTr5Bpf4{fvd4-VQGas%?4_7O(H)F|p4?zG_t z!k1mHO5rCkOKeTJuIp@;P?<*5OAt(Fb%&zj)3grfOf8*vD*)lIVKSM%3aoAWk|lD6V%QvV%2{>*YO2#D!ye+5wNn9jPiUvCjl*24k=_39CkF=$ zWMXXm(h)LMyCAC6e0t*DJl(LhR&7=F%hHgm87Mm4o>h8aqq zc;&64xeaPs<{6FI9!&yF0dO*VNfUW?M0m+eMmb4j$O}HyH#Nmx@7&pqGWhDgv+NAC zkT_D+vMZe4SCL+?PEQ5ltwummT@6Kd+g_Z+eZeYF{N~M@<_&k}QOlDO&nC`FodQF; z1p(v@>LH!fiM@$y`7S4T!fT?GNY4DP>js4d7ibfo6asBP<9&hh9;WkRrlOjHyw+8|lZQn)C?8h2w1a=JN%i(CB z-9r#*8AL_T`6R*SXVQa9NN760!T8d7j;rYb#gBMD4ttf$8R%Hlq|T&edAA(&ZPUV! zs(*P-Bza79T~B;@*>g@~T*li~&bvS3lk}CrYdE#`n?1)r*-EA-j-4m%-Kf`MU`LRW zz)I53onyr&O1Y7hJL=jVanVlnM(RFX0#Q{+uhw~E?QwP5%Ri1oS0<}P`P;L zt>J~kk?U=s-YcXj(M93Z`L_=VYtEWKw|!#`8BbAdd;HPc0Pi)`!siOi^pBr_f%DPGy?lQBSuq zK+Wy^GOrIAxCmV(nn0KxF12-CyqD_*pBPSWlvmZ}7vcPQQ{eozLy0tY()IQvY`Jrn zHpaI6NSJdWT~_eJ4e3F#Hxv&Ztd7NH5US^RWWu$#jN7BE{EEGI`h~*|h9&7IY*P4j z*mzRfyS71$Z&IssorMOQy;A@Rd-+~HV(Q7bQ* zR)*4@O3&Y2PZnxYi2?t=T?&;n{ zwfhXrT-;lyMng{TN#dNtP3?)T@z1sA86iT*9lEV~7C;o`P!S^2>|pa4$)KzZ2Xn8F zmH&js5A$U~Bwk6zZf=EDc2Ed41&Iw`nqTf`NCUutX6eg*EeX}`t5Pcq(8RDrE~^lw zv|LD@F;kky0kPq5PlHmrj7E9MwqtU1f@W(hq<)Y@k#t&C(cic(Dy-}q* z)pmr{qPTTN5~^rYU6alJpQ%Fk_3=2kcD+pk$l%eEpB>xtJorM*yHKiAD+x}HHB@0$ z`blc<=yG;YZ$hD{=sgBvnIx;6{FN#Wwph}0q;*ymusL{jMzO!UneHr;7%{QA9i+3YDJ~6L=-e3Eu29!`^ONKqtt&|u z7SZgphi^~qP;#)WB)!Woarj#USumz}8ZpchNJANO4av#ei{}Jm2?F*g->|Hg_QA7_=&BU>$BO%WEQn86haX-|nB84a_QpJ$RTEHIxHc-pA?kvyXF&HBE(J6O%0kgXw2;7NR5 z$;X7j0t~pd8A$&ly&lpJ%6bbm!;cX0lCt=JGxA>ZZF)6hUIS~(5^oW0V#fc!Zh?*m zuKPuUeJR1C!k*_Le3>av)X8mn3pQ@zs+QxpiNVUhQtC!l$AZ+u%OL8uS4=>#Cr~fGN#NvMLdj~ zPJ!a#6N(qOb_Lh|p>aB266AhhQT_{D(0Gu0d76zd zSUzFo;kx5q=lt7xA;Sk7!jCr*0R)|(sFPZq=m{%2$5EV*RC634q-#I0MVQk*#NauV z#15#c@bT9E%fb6TUQTsx&$*;r`Z;t_fP@Sv{(C3@*gGu1I)e{%*;AkGyMtwR>WE=t#QjP%-T6vX!?4Bj z;!r`_Ox6Uz9bMy>If8%8bz4IFC9T071_OM`5rQ_MHvy)$a8kl49n@byAiG65U0SA{ zaKr3w_Qfd@iTOKMJhIykp#|*QhsNHOfzlp;uM_eWOh!Ng)b+1kgBfRp&-nQs)@BM} zea%Ms@Oyc4*AO?_L!GrwkRAjh_)in{Ks=;(&@FBkJ{!Z7A(~fc{I46~2?SrfANf@e z6)-krYc4VHibO-dOCnu`BGD#)>^%60JO(HY9!eL)>Hrle;XnJrChC|O4d+Kwk>9jQ z`@h?>jG_9@MO57<7~^-Y0@>2b82CACSS(})9wG2L3z|w~agIg;pCg_H+5pg%pWE5s zJz;?ZPMUMR$_e$h@kGr3-7HdOFd%-;YwSzwmee+g=MJwf7aEcU*7lJ`P-lQ3F7V9A@Ia14ME@ zwv=xzz*BOd#yMs6(aAuyJBukGyPbtXwBYEzcfofVL4wJK6jV%rRWbDfMJJqA-J)vy z=ybK=>hMLD<6=DmD@xL(6{u_anRIK1tV=wao&@He=J#^w$88I931@H(usX z!=SuCemzTm_8qa+rv!fYQG@=>Nji9y`tjk4lj}xx>1_SxOwS~mED4B~9%1J{k>lU} zxwn$4(Tm^nO_kT(^8Y&m5K`mAELCKTCop8ouaVg@Hpnlt0}jn9BK$K*%j1L{hGPazDoCmwdC z&b++5Tk)0S9b>nLf!?JDti_?bwfp3%5_Q$HyyrPtI;ENsj0Y|6tO-UHTO<7QR~q~Y zN|_${UH8-uA`_(co4(O%5G-&%GUi%0lh#>LHor+n%zfoAvJs%{UkQ}mG6Cu1yd$TI zWwQ@#cd|OK6C3K$)YCLS2)+)~c}7O_c4bNbIUD{xCBXm4zoOYy71(z>Z>6bbmcUkj zN6I*F>Xbkhmiy_(8yHlw4D%0nNyt?*Rl**K-)IX6{*ta{Rl{ZbYCI>Kb*0~&mOxwK zY0bf|^wC5dccIu>T$+(TX9?AUW^ca^gP`}BXJOGsm*h2|!wE9fp{c2&qo0(2ii?Z4 zr3bFW>ln>_18`I7bdP2CEX4Lc)=4t6OK#_hTG$|Vx%$U}25&T6gk`f8x;9!0=bTTo z8b8b!)~R$V)?v}1H~NuWz@;BUMtg1H6G|FDqIBZOad{eL0 z2EZhJ8q(#-+Tb;-iQLJ{=`Xh5ST-!p>S&pkY;Uu~us;yl0+v%+j+>%)1)*Bv*qn=OT$|z z8YRaBgsg_o&2FoSBMrlPF8XRp>ohVhM5GstpCvZpoQOSy}V0 zbR|FyB}28?2?TF{&eeawGoIgbOfD>6sh7lF=Hi6piOW=-<=@FLp*-F82h@eBdrlHn z1h;P8-^AR!9~!C9`6dFw9IkE??(j8yurgkDZ|B(6P})v+=@Gqymg74qSM;XR2P+w= zRRvZqIR;7X&|;T?AOeXw)xP7KO4*usMqj=F1vDiPlL0#dH+ON-)Z<)SvQB=_MF=xD z+|T%-HD$3vu?6TC8gmtE+QL7SjMo-|imP77>(FidQp=^cdwcx3F4ZL~wjXcPO>g{q z#T+Ncii@EW{^|xZ0q&{{hKTDN>Z!&(*4wS-T^&?u(jN>n&JMp9;$YJbj&YBZxjt3&yI%P0pT;H{4hAm@J@3z)=9Y(W zqnG)&N})tcN?|U|yWLdL^=lUYaV#*Nf^Wah?~`By-wqK$HR|l7NxMNQu}aWn*pyIz zkLOx9vPn~kLc@!!J^2P%t7GNT>77wjA3kWu9)~@+jWid3F$fu%>__l(!)-t)&f)-t z)L|bp`B7L{#v-4{JAwdFTS-PH&@x;&?gK{!^|ckVX-_O8lio0y$`W<{f1Zu8f32&aSN$~{Kus=#{-P7_ zV3#)X%|j-yf7m{dzjzaHiHTPvowfxIceQasg{F$KL`!~nhTN4Hl)fa!FOqF%CLuFT z@@Ps05?IKtVxZ++g2ba}Kc<8u8Ji_h;zJhS#e^yec(aD#&QY@4{>PAxV*_K{Nyu>( zzI0Kgg=i>wB3Lv^sAoeTP4>Q^&Xe-%``ezzhzkTSFiB|?0PPgQx#sa(XsJ&nvLll6 zQ{5ZU407cC{O@nxyt!1U_(t^6Crr@eIvpVf9tQu6DZc7eiFSt092py3*x$f7@K6bi zt^zj7kD)T~r%a&MN`k#1!6Qw-+&qGbE}zRRXun@Ie{AJZO!n-ncCafc@Q$t7O}0{EJ;`by~fl+%$>uHtLr zlOG6yu|K~5@D5leQTTkrPcQjS-CoptP#fM6>G5r%jE4)xS07X3u`{3B0|( zm6I$S2$zN)sX4`b_=w!TAH3EjA71oF9YxdWoq0=`^`F1`$Bz}3@o9zPFenuK*9Adr zXQ8rd3d4jsRPr_dvq>0_z*vc73ANn#@3uNhL8Sj4<-}$$}&p}gZsh;rs_v%IV zm0TKC#mV?X@OkmZKLc?7ZE^*)s3h9|zP*m{f9w`M174PkclZ{e7Ol!K{4oEYgNuV9 z1qSGK!H~rNSvbh9rQS&@V9UnH{hy;NL{5wTb@h7diwE6*4a7gbR*0Gp=Et6ozyI1@ zsKU?vqN84p?K{uyZ{neZlHww84`6xvvVd(-$MQhw{Xb7Y7@QaXcwxl#wn9HqNf}2` zmRi2Ob_f5Y?PW`bCmRpx#(&0qHo<4~%%?n(J_vFC;9#IGq!J%ZegB!J|C9QYpq{{R zxw&7!-OZw`XZh{(wYw0S4`0@8D*}@`*i)@!)NsBIrJ?p zEd^HNM1<^LYwtaFsj~uk`vkiaN3N)kUBY%CaaB1vR&Kw_S-sDH(vD@PSnS_XBUxZE ztVGDZZ`+GLA2seZ=~)e=$=p?|*Y_fb?XUN=NfJ7FcF;yKTD+ms;l@Z&YvMh6)Ogl$f$qI<1Gu#&Wg3U(k){ zS%_zuX$%Yvj2)29RI{YwsfcS&Jj;d?t&w^yP8N6^5gS9Ec1ZeXe1`!MB_UiB&^ z&O=!;`oIkB)GY}T$>}EX5TePrge4l)NL*3hJ- zaXgMv0Q#RGfU|)xCeX6$h6lvvUD}|qM|UV6JyJY9>aoW!jWIPHPIt@#!aNo0xP%%C zPx;P@EQazXR5axXvhR%pwf6BGNT~T>b_A8QS3&M*gHw3H+>2GW&FKb9>Gt~~%9`e+ zA9-nm`48V{yGc57yRAlP+u1t0Ze@1^0gS7h$AFL1Dsks?ud2HA*ssT~#zW*sy22i> z_+ZUKrUvwyJCRTD|6Bsip1uX$MlvFApADN*)5i!HM4Z%8>?w;~vy)EJt-hi(!0ttO z)M&ozEiNlA+Z&bcd6a1go87Zx(71<;ZPi`)^OpYYCVsVs75*EaKy^slKmI&7!k?FQ zegpjZ*oX*aWd^Rv*vH?kHo9uU`Z5Ojx8nRDq{JxNa^pAcT*xbnr=X>Fw6soEhU9Mc~*-}1nq zsRjhYNn{Vz-O8;rmm0l^7MI<>5*tpUQ$ zw>s3~JP)4Z)X+XFQ@}~*;R}<|KvyqU)&>3rCYrk0ffu^EtEm}XAt;6rqR(x96}o%o z<6*q&P4Y#Mj*h$RVdoPwtUFK_ia~pu{d>Iifb#te-?_W@EZ1_Piq3HqNNiFT2pKM$ zt07NocvwTg^H6J!<|;q6`CwMWgmGL42n{qJqffTx&(N&ai<}(o<%ivnjpx)b?uawc zvgLuq^L$n~y3vtlJChEpyX?7Y_>}+DR>!Qxam6ic>^OMT@K^EytNxGJ-IJ6rECDIH zXSt>)(LK2A>DuV!1y1~xCpOw~_2Ic8M1FE_!nv$3Z9rUXw#$tZdl<5CPFgyU^ncBzfg|V$AGx2QH)|SRANB}|g#=w{lPO^fXMPp-? z&cXFDl5c?sU!CsayX%BeL~lt*&80O;&MQVFf$h%55&4^rDh&cS+#U@BaVcy~pe8JOH|W8QFJ%Vq5Mu zE7Oy<7{cK;2ouP+4}6L)OdmDqJcY3>ZT(JRecAO;queffyKD)c`?j;hJT%_mJnC|B z2?8(V8LD*TDJ8G-T1c!_Rl_b$mP*FQ@N#m^2_i1)JX|R=eJJ&^ktYdj@=^UpI2qW><%sf(j46PoS$iynwc|j_}^xx2osD0G>+*iQdVPS z(14xcy4BHEHMQmaM3F={VZi*rGN|3#-`Zx-_PKZp0zJ6f0 z9#Eo>v04UYFA7fsTpEoXf4+me@TIIxmI}4`8E^PsOrHd2OUQO6EB>r)B$l=2-S{(p zBm~7g-k+IlTI(!NL050Tbqn3%)l7$B_OCoftzG}<+|M71EV?!6V=%23+7E<*@`K7_ z!+1XU@vcu}Q{ouvDiuLLGe|pW)GF%lbOvor{$I{H>9S{Ht>1$SN+g7hW>{F)tp3!* zK0uUU74`I(j9}H35)RcBD#MDi)S2bZUcJ62OmX(-D*JaAn~r%Db#5H)7Av@ zwhs)vD_(@5!hat1|Jr%KMSNQ21Vb+KjCmk2~Cl>;yVc22a73yO(N3JAI=9Sjkz9n80t_zjabSYIj4&4oQYaHXyp}{ux zlrrdh%GU%$rRvAf9NnhPk@b4Kmz`EiPNM^B}3}#;MiK%FqD`B$a^W7d{7$>wGw8tCF9iwY0Ng5WNy!3-C0y6# zB^tn^Wx#p-yf7Qsg`7F@l}>;|PrmKroi?QzJGJFOYs%o$BU?N@NuU9j%cubh3un@T za#)$@dG5CMdhYE+Fze)mq259_>`WNv3^X6ef(24MA2cu+Z9Cc92~8IBZ_PJoGCbbT zhi%d*EBCIb>grVPhP1Kdf?`D04l`G5B6gW?DoESXY0V7qGWh`8lAI$OD)luYa&#d} zHg?xezVj$eC1Z>7{v$=>ju_^Yr`4+=LnhzYf@j^aYxfea!VN_EME4t@)Hb)(!k%oAQB!gtQ=QE9 zSA$7M^^6+f!zsxOz1sZhv(akzNWP=7uD&C|+>Ly^F9Pmw9eFzs8dFxR^s8ZsoH=7& zYY^RB^C)Xq%b`5o^{Oq>t)DK=?wz)?&9@FF-DiwOif&qRR=3s-{$Q{u)BEX>{R|!o z!oiTe2x*%C6Vk+Ol=lsN&?KRvqUbu)F*w`x{dG^ihzYmja(I?zu{Nmqwa|+2Jl?zw z=&;N)v`T$l$7Ryx&uBSzy|?$j%(C72OeT{+`}18j?Oba^^U=ncyw{OuVSULO`CI?n z5kO(&iB;vA+)~ehW;Fki^1+D8*MW*@DNr4nCKJ!Y&B3hGJ)kJ!$H(BhH4g!j6K!MV zdTqdF)}C1(*rB#JaLQ$T_D~)dce;T|o`lyaly{@7=}kNXn@o+Fj-vQTqfA|xKhkTE-6JhnBJd>GO}byNT@?^JF*U??4%t z7YdQ9t|a2_Zo5B_e7mnvY86=awtuGF^J@GyT2G;tmtAI6)x90R6!Ams5Guhl+C&dN zS$efB!_G;)D0>S--{ufzmW9F@AhH8pi4?RojVbfurV2YP9OP~$Gx5&V2Wwl+_?H*< ziV2h{keCA^Iq$U&1V=s%%wMf&g=9vN)z^N4#^;9eTGfh2oE8kJ`7C+rHD%^Ryag&^ z_qPn3msOEAm$IW&%CwmI}?bVW@igkUhw z=U_hs2XWX7qJbdor-*p3sd>>5w;dvh;YB;v-M~Q^s#XX0_c7_X1?MJws@(V?>}RmQ z;r62XYDrm{2#`aRmjFR@CGXJMA8!U@)pg*MWn^BD0Wo{6xgOU;CiYB~9OJ>Z*lP)* zy|314S@=!#)H9v(i%dz(2R+GP^BpD(_r3SMLQN02SslZ)#y|=#LYgIm8L&|1XXB5< z`dY?9nxgR);Q7KCx%cuR;-rMMhnb}%X4tc04F1J0G_)qHCaM&@*twFydzEw6?W!Gj z=yS1HvJB~=P&UW|!C{MvXyf9lR!HC@(=o~o*|_Jy{UhOyG6&b3`0us0t=XqDB^BTE z6WA#OHv7hI<=*bTWQnlLKo;S^SIL?AbVr9|M$ICH7*5Oor?4-Nhk9-Qe@>^KN~z8% zZ9 zI{lp2&p$rn<@LFjx$ok|>j&X(Zkl>HXpAQA=!@EEhoFINy$ zOop18nx>7-Td=0qChjiXP1!HKFA!_F{yuBkZSBUxup?NHXK@~O7%O1ra+_Z_zgs(= zU6>ju1vMniQed&#qRq5g6wacBTgu_K@6pv!Xe7;LPfKJyTD+s!7UsjEyDe1FN*PIv zURS(qz1eK==+wy0JEO~}F~PWmH!jX{z^ZY2F25Bm==D*Oq@J%j;@K34RyOqOOyFi9 z$AC>M8uh>L>cb=VrnR3aZ<{7=2`79R)VXTwZ4?qBJjI%)=T~C(&pO>i`svA?VWW%x z5sthBp0=c3f!N4ghctiU9oK%`_2co}0v3Z;_q3i;PY01Ohdq)ObJ-@uG{#L`+6VKE z#*f48SNMusm+ws1erUnIy)aWUM#eOyPmT1FlQ%Dk5#KL~fl~_AZMeN{Bydt8SRTB6 zg8|c|)~D-Z>4oZEjc4`S+uMr~LuhUdK4XlT6?Oi!ioHaEd z+CF09ZBa?ix2nm;zcYo=#s}>ZKg=wT3S13HH+eU- ze?VVH!N#f=VHwLO)c5YNs97_wM8?$1s8m%ns!1Oi6GvT=&-U{XK47ZapC(lk_7ja;b7rZoX;ZD~J_tcRU*bcI;-O&;`Xa*82{e}pPuk&)u+<-v~M_WdyS zOo3|AORpPlWiJ4*D((1vHqqiPpCHm?{3VtApqRJmwKqfraXV5=*ae1AL0wen`eMo$ z#xpmI)r?rTLv z#XG7#XWo#U9ZE|aIUrX#WBA^)XMo^wWn2tgjEjas4=cJnui*cWiD!9`g1I(e@uWM|j}T5M z3p}znk&JU$IZT9C-rem%PZTfIEt_l47?6RQVR2A6qfT>nC{%3Ox~xA=4q8ByZK+XK z_6@;PKG?R8t!Q9dD>?nZ-gmaE=3~Q|sibVxn=EZC)&G*l@CQPt7ph@fONN0P)9Am| zyl|_Uwc{gBwF>M#uKJbZ3n#r`2Z}PdkEeKd1xq&eRiK(D}4U;92Os1(*ZP%>hnz zC<)mnI+68k{DU})PWMvIDEAVoLUh!M>Vv@l4Ok80Zq@Y1>5D0Ab5*JqQq1;t+g8m~ ze6+lC1t(+B2u?Fwpjrm1SZ{>smfV0JAHBRE>Ii$O(#Aj%7?ZH!R!Cs?=WWTskI_B^ ze+s)oWi|J&wvj%Qw;qLQNJG0G(r!QRu6ac+7sadAV_K;Vw$_)NZa{QYm@ z)#v+kD-QE}U2PJ!xJ0Ow3WTe`M{AnRNtJ^gb9W)fQk=X<*Pwg~GVsxp;-k&xHI;+z z9nt+B05R@MobL6?y~dx#io`JD|5x!fK6!S;Um&Bt@^<|lWM_qiqifXKiUAq|q(s#8 zQWbpoRV?hpDFu-wcCu`Vsw^c7%4lVgh&cOP=HoZ_)ujLn#45E(sIEyHTze3xPS>f9$uZ3++-D6^TnsG9DOycmys@ z&$FJ0kFTbiizFu56`ot`539|!xChiJJ%}*idRdyBtVq4ycloi35TD<-A|5rms6G+J z)aAKixZgOVj%y*F5`fv=FdW|N?OZC^z`%a1_!{oJyOVr-Wg$8?4>@eKLarF$i@G1U zGAba@Sr8o;(U@z|ha0X#cP1LtXLV^k$8FQ!S@8$59AjzNpXOEZd(AwK*;wUz5*7^! zTt_w;3GI}#5-E-qyLt>}G|<)fD{%9u#zHn~aX4Ownz3LL^W0xro^Eb;g^cmckj^jD zLBTH3-6S(Sb7G4mpp@b@52nQ=8Mkd|%`*!NL=VB_|JJ<1~R?94K6@4Xzp%6Anh^^zWXb7Ych z;x;R~Xce6L1~;5l<&K^ocPh!QNe|bn??W7`gE<9Wo!&S4!mhlQw04X`xa@dC31b;%Xg~-IjPF%Zd`1WUs-kZgAfwES zvXE|Ab3(K6wsCAP+Il25r^hnjjK6Mv&BfqHA(K=<9r^NXEFJ1Sd4kmOJShkVn+=!k zbGExR>1tQHp=*YBbc&iyK=|i}!hFU~Yt%>Z=%n1#t|2DaWmV3l9piz`9$t{|Ro6_3c~N0Nq;!YWNDX;Meg6(vVSN0l>b_?xfp0Ox}+6Rlk6}z#$n^g;RT*9W)Qx7 zSg4HL#8_Pg1&9;)_wwSn+PGzq&zvxXe&cJam8Y{_C`C8vK%sCIBrphYQs3YVxTT;l zoR4Q;S%2}`=k7t7kZy*E2`L{__TW5d3b=R)YQ-stARp4{(`Ph84;Qu+OoTF(Q`Y6Y zV-hBc)EZyR%)Y4YSbM~aDweX}mafy>c8+pD!_mAYY^}R=BpknEHbBy@RL?NRd6IMP z_=s2Q2uuS$;Pcl_;;O;R0wOR9D*P@!0FTpfgA*dll@rt~yBF{6WRmiYAuOe-W%S(` zlOON17C}maIx!cdPxb30NVKPuwinx^-CL)veTmW!r6?udveThn?DN9ATFi}n3lU0H zQ8v9+eC%34_+DP6|KXb}r>gr=b`%U-z=gV4N7W*RfT?zy5b2MsOs}yR6*6TcK(&R*16$T zc%MVxp?>|C&|{MDwmaCW{cr$lfc1vw%qO5xKC{s4+TFvDW+I2@ml;D$8x6`t?(zN> zsr+H19KBzC7C&Ec9wzWQu=;-@1i4Ppv=LV*F8BG{k@YQvqp0fM2k&#aC zfUeu*r5O1x<63Pig{k|Y$qosVRb^$Kl0z4=E#SUPL888fTNWo4OILwb&><}qbZ@sk z45RGo>FsQDAtCW`5+iR4hexa}FUU&1v9xW?C8DOH!CBUWPt|Yjf&{|rwZyAc@3und z-KAw3!+xHNpSx&dNkO{GY>*{r~{<>iB8 zgq-kWQLw2DRFakukVm>bm5~_VDD-$QuNVt@=P^63G?@=QIxic=rN9bYVNFRw^CI<9 z${U!z$@l`cF&XWs8$SF|6bL+$nN;{#%h%(va32KR)4g$I`EmiG>m@5OE%1U)UHq#( zp3@?~a(|r*Ht7c4Su!iytYUwldz(G%h!)#jnBRXkE2X>+V(J>^U+)=8M~Xt}@3P7u zCH30k`vUuC6(Xppz=-ECD~Tu+r=s=pD7ckgM>&(4v*ji0$Uvq+gFjw?EGoArhGFt8hMW54 z)7g?x-MIO851)2VX9Ww?eooOQi&i$J^=+EyMc{eO*)V?a&y0dUVm53(>hGGGa<=tH zBcD9MhoKyj8mlUUJBvGepB&h-ODCU&Z)N(nLdA+@OR(#LL??d~up+7%}-|IGQC(*Ufy(OGzTfAtk(aNuEL)_ z?VyR@+7vVkLqVP9DOwXq))6+!!vV$rQRj#nHoxfmK!1F?mvhh9)6wEf&$$2-RH~et z`CQ~?3exvM|IoEvYQK<(MLTZ~YO(9{Z1uKJfN?RV`R!jO_#y-Vt!qd4LN=X+fBWIT zKV1Rt_$&AAw|3U=a%2-HDi$@Bwr*Pv`1%!oSNe&T@MkYouk8VAwyXBa;MTl~|NZu| zxbyj^WB;80?^AH!3@~C|imCkmQ^wr)8HfPOCSrT*)>CqziyegUntsma1%7|y4^MXh zhsE>s-Jf$I{`k+Jmxlozn@yPXKHbfwycz-}lb^@U*=YbnK#q-|3$@c7G1@ z1ej5t-Kkqo$;sDjs>%4E!1NDq{GpZq-&g$%N;KH`c6lRK$!9(9GQHI4@j2LfC~*0n zBJQ6rTb%1AdQZL3nj(p&C|ZhE@lA+Y4;&Q)rJEPa-tM!}J##X)O}><(vZ-!6QMNoHP!AZ1 z+9URa61&(LnrT6dxKZs_J15h_!XsCr$dtWa-9NnZ?~S6m!0|=cG*8zZrJln4+b_>JEWDw6j1%;xs!`#Kh9~`r+m@r-4w#6G9;&Aw52tgMa4M{j?H;_HHjO zwaxJeixP^|0kZyU+|uK=x#ontu8MTLd4SJVSWkkurHaoR6H5dQM^NK}AkCndXC`nT zP^WlEmRp@vz1D(1Ea6{wC?uQ-)D-I)vOywyqYz&Sy-WI9(e2ty*MVPdkOD4i>1qNE zj8x`{ew8vrCmgN(?af%-dPTELq4ruxiRSaOV^r6BQs>>y2nsd{N#fq2p=VV#>-TdgY*KdFl@=Ud)+|hXkwOiY) zu%HUSx*LTwb$5CxT^;sHFHwr$!0orAKYe3=e(c-fo>^RS>+QSW4;ow)BNjYz(5VB( z$7qJD70$U1PW3<{wee$NAbH+Gk=#<|8H4DAMuSR4+DS4@iY7A|ONs{Yu@O?{Su!Py z?9j!f&vxjDM?K{d#}z6O2ii<463$!tU0{UyOQN4&Pfj!r_n=Ou48C6)%i*&>6h1Ho zo$m^CX6Q4?&0M4;uMq~=gDYVH{*{#%7I=WP>G73Rgi0IFQV=*JIJ8Yv#iS3*c3c==PN4p1@jpCyhtbi^Pkf(pRcfI-0Mg)n^ATJ+*Wx zLkF^i{t+bpd)F@tJrl4-IhM`34QccqnxK^$0H%?!nN_ZijZLP%iqFgg1f5WeQEVlx zRrge*co!1HCMoVB>(M15OS3tr6@`U`=d0Ax=DTD&O&ibZ3B9HaPM%xR6?8$J1GNow z!_Nd(pWxRIPvhFsQol1gdBw4RUp-H>uz`vu6{wI5FRX#uW)0UmYhiJ~H}70OV9rhs zV9vimGLLg-dV$2AN#f81n%EryClZjBr6PhB;Vp76FGLB^v_dMpbP_($y{<%t182{$ zWf@&CXK-k^;qzs@QC>u^Jm7Be`WFAoi6kNLOduu&x%*}nI?I`kS0^W3PzHq#9ytu# z(&vygf!Sapmfpz>TP5> zesGkqy0pwyid?bBF>_zF_PA-(hw}*xK+H}8LiCGN*4ztFTO>hgqR~ONf9vBrNSDJ# zAIj|9c~x8c5Yr4(l3`w$`qrN zVCvHp1OeIa%(|Ll_J}~_+>4eZS#1!oxshjxa5H=8C}*LU8lWeaa#%=g)U;-?E*Hx; zK{v?OTe%h>OCO^aT8g@cb7#1&lzt8SR`GttvuvvERVXNfryj8466H77zEbS6V!Y%) zJ{@wN{%u8R^|j^n@Bh%x{(C>H9&9iuHcYVDxId!%dY9zbGuItfc9H2NC5-f#*QOQ< z2_Y{)R#h@>2UG?h49dD4#Lpwrs#*5Z=!JiomJ^5MM(N$1BZ8tJSHJ{i=Z@Kgj z?BWMd;qvSAjT~DdjnC%*u#<~Z@!4_;PCft-XYZ?br~g40`s=iPPy$fOXY=JR-zC+4 z=r;iS2Yv?#=mAI6&qVk?%)$W*Kv$1E#-hFpG5j^A&9_|AWOJECbc?s7c&N&;Q6VKu izkf>zw2MDzW9J@^cj}s-___WAezer})G(KB-Ty!Tj$kqX literal 0 HcmV?d00001 diff --git a/home.admin/assets/telegraf/raspiblitz-grafana-dashboard.json b/home.admin/assets/telegraf/raspiblitz-grafana-dashboard.json index 3c5ef54fe..7041984e0 100644 --- a/home.admin/assets/telegraf/raspiblitz-grafana-dashboard.json +++ b/home.admin/assets/telegraf/raspiblitz-grafana-dashboard.json @@ -3,17 +3,29 @@ "list": [ { "builtIn": 1, - "datasource": "-- Grafana --", + "datasource": { + "type": "datasource", + "uid": "grafana" + }, "enable": true, "hide": true, "iconColor": "rgba(0, 211, 255, 1)", "limit": 100, "name": "Annotations & Alerts", "showIn": 0, + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, "type": "dashboard" }, { - "datasource": "-- Grafana --", + "datasource": { + "type": "datasource", + "uid": "grafana" + }, "enable": true, "hide": true, "iconColor": "rgba(255, 96, 96, 1)", @@ -24,10 +36,21 @@ "tags": [ "reboot" ], + "target": { + "limit": 100, + "matchAny": true, + "tags": [ + "reboot" + ], + "type": "tags" + }, "type": "tags" }, { - "datasource": "-- Grafana --", + "datasource": { + "type": "datasource", + "uid": "grafana" + }, "enable": false, "hide": true, "iconColor": "#5794F2", @@ -42,15 +65,18 @@ ] }, "editable": true, - "gnetId": null, + "fiscalYearStartMonth": 0, "graphTooltip": 0, - "id": 12, - "iteration": 1601814213178, + "id": 2, "links": [], + "liveNow": false, "panels": [ { "collapsed": false, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "gridPos": { "h": 1, "w": 24, @@ -59,27 +85,38 @@ }, "id": 69, "panels": [], + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "refId": "A" + } + ], "title": "Quick Summary - Node", "type": "row" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "description": "", "fieldConfig": { "defaults": { - "custom": {}, "decimals": 1, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -124,12 +161,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "value" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [], "limit": "", "measurement": "system", @@ -164,29 +206,30 @@ } ], "timeFrom": "2m", - "timeShift": null, "title": "system", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "description": "", "fieldConfig": { "defaults": { - "custom": {}, "decimals": 1, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -231,12 +274,17 @@ "fields": "/^bitcoind$/", "values": false }, + "text": {}, "textMode": "value" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "$tag_service", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -284,29 +332,30 @@ } ], "timeFrom": "2m", - "timeShift": null, "title": "bitcoind - service", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "description": "", "fieldConfig": { "defaults": { - "custom": {}, "decimals": 1, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -351,12 +400,17 @@ "fields": "/^lnd$/", "values": false }, + "text": {}, "textMode": "value" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "$tag_service", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -404,29 +458,30 @@ } ], "timeFrom": "2m", - "timeShift": null, "title": "lnd - service", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "description": "", "fieldConfig": { "defaults": { - "custom": {}, "decimals": 1, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -471,12 +526,17 @@ "fields": "/^electrs$/", "values": false }, + "text": {}, "textMode": "value" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "$tag_service", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -524,28 +584,29 @@ } ], "timeFrom": "2m", - "timeShift": null, "title": "electrs - service", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "decimals": 2, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -589,12 +650,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "value" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "$col", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -645,29 +711,29 @@ ] } ], - "timeFrom": null, - "timeShift": null, "title": "Bitcoin - Recv", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "decimals": 2, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -711,12 +777,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "value" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "$col", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -767,29 +838,29 @@ ] } ], - "timeFrom": null, - "timeShift": null, "title": "Bitcoin - Sent", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "decimals": 2, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -825,12 +896,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "value" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -875,28 +951,28 @@ ] } ], - "timeFrom": null, - "timeShift": null, "title": "Blockchain Size", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -940,11 +1016,16 @@ "fields": "", "values": false }, + "text": {}, "textMode": "auto" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -987,28 +1068,28 @@ ] } ], - "timeFrom": null, - "timeShift": null, "title": "Bitcoin peers", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -1052,11 +1133,16 @@ "fields": "", "values": false }, + "text": {}, "textMode": "auto" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -1101,15 +1187,16 @@ ] } ], - "timeFrom": null, - "timeShift": null, "title": "LN peers", "transparent": true, "type": "stat" }, { "collapsed": false, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "gridPos": { "h": 1, "w": 24, @@ -1118,29 +1205,38 @@ }, "id": 97, "panels": [], + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "refId": "A" + } + ], "title": "Quick Summary - IP Addresses", "type": "row" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "description": "", "fieldConfig": { "defaults": { - "custom": { - "displayMode": "color-background" - }, "decimals": 1, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -1185,12 +1281,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "value" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "$tag_ipaddr", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -1200,7 +1301,7 @@ } ], "limit": "", - "measurement": "raspiblitz_ip_info", + "measurement": "ipinfo", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"value\") FROM \"bitcoin-uptime\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter LIMIT 1", @@ -1232,38 +1333,37 @@ "condition": "AND", "key": "origin", "operator": "=", - "value": "IPv6" + "value": "IPv4" } ], "tz": "" } ], "timeFrom": "2m", - "timeShift": null, - "title": "IPv6 (global)", + "title": "IPv4 (global)", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "description": "", "fieldConfig": { "defaults": { - "custom": { - "displayMode": "color-background" - }, "decimals": 1, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -1308,12 +1408,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "name" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "$tag_ipaddr", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -1323,7 +1428,7 @@ } ], "limit": "", - "measurement": "raspiblitz_ip_info", + "measurement": "ipinfo", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"value\") FROM \"bitcoin-uptime\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter LIMIT 1", @@ -1355,37 +1460,35 @@ "condition": "AND", "key": "origin", "operator": "=", - "value": "IPv6" + "value": "IPv4" } ], "tz": "" } ], "timeFrom": "2m", - "timeShift": null, - "title": "", "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "description": "", "fieldConfig": { "defaults": { - "custom": { - "displayMode": "color-background" - }, "decimals": 1, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -1430,12 +1533,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "value" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "$tag_ipaddr", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -1445,7 +1553,7 @@ } ], "limit": "", - "measurement": "raspiblitz_ip_info", + "measurement": "ipinfo", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"value\") FROM \"bitcoin-uptime\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter LIMIT 1", @@ -1484,31 +1592,30 @@ } ], "timeFrom": "2m", - "timeShift": null, "title": "bitcoind", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "description": "", "fieldConfig": { "defaults": { - "custom": { - "displayMode": "color-background" - }, "decimals": 1, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -1553,12 +1660,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "name" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "$tag_ipaddr", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -1568,7 +1680,7 @@ } ], "limit": "", - "measurement": "raspiblitz_ip_info", + "measurement": "ipinfo", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"value\") FROM \"bitcoin-uptime\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter LIMIT 1", @@ -1607,30 +1719,28 @@ } ], "timeFrom": "2m", - "timeShift": null, - "title": "", "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "description": "", "fieldConfig": { "defaults": { - "custom": { - "displayMode": "color-background" - }, "decimals": 1, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -1675,12 +1785,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "value" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "$tag_ipaddr", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -1690,7 +1805,7 @@ } ], "limit": "", - "measurement": "raspiblitz_ip_info", + "measurement": "ipinfo", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"uptime\") FROM \"raspiblitz_ip_info\" WHERE (\"host\" =~ /^$host$/ AND \"origin\" = 'publicIP') AND $timeFilter GROUP BY \"ipaddr\"", @@ -1729,31 +1844,30 @@ } ], "timeFrom": "2m", - "timeShift": null, - "title": "public IPv6", + "title": "public IPv4", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "description": "", "fieldConfig": { "defaults": { - "custom": { - "displayMode": "color-background" - }, "decimals": 1, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -1798,12 +1912,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "name" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "$tag_ipaddr", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -1813,7 +1932,7 @@ } ], "limit": "", - "measurement": "raspiblitz_ip_info", + "measurement": "ipinfo", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"value\") FROM \"bitcoin-uptime\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter LIMIT 1", @@ -1852,30 +1971,28 @@ } ], "timeFrom": "2m", - "timeShift": null, - "title": "", "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "description": "", "fieldConfig": { "defaults": { - "custom": { - "displayMode": "color-background" - }, "decimals": 1, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -1920,12 +2037,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "value" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "$tag_ipaddr", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -1935,7 +2057,7 @@ } ], "limit": "", - "measurement": "raspiblitz_ip_info", + "measurement": "ipinfo", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"value\") FROM \"bitcoin-uptime\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter LIMIT 1", @@ -1974,31 +2096,30 @@ } ], "timeFrom": "2m", - "timeShift": null, "title": "lnd", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "description": "", "fieldConfig": { "defaults": { - "custom": { - "displayMode": "color-background" - }, "decimals": 1, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -2043,12 +2164,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "name" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "$tag_ipaddr", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -2058,7 +2184,7 @@ } ], "limit": "", - "measurement": "raspiblitz_ip_info", + "measurement": "ipinfo", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"value\") FROM \"bitcoin-uptime\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter LIMIT 1", @@ -2097,13 +2223,14 @@ } ], "timeFrom": "2m", - "timeShift": null, - "title": "", "type": "stat" }, { "collapsed": false, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "gridPos": { "h": 1, "w": 24, @@ -2112,25 +2239,36 @@ }, "id": 74, "panels": [], + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "refId": "A" + } + ], "title": "Quick Summary - Blocks", "type": "row" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -2166,11 +2304,16 @@ "fields": "", "values": false }, + "text": {}, "textMode": "auto" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [], "limit": "1", "measurement": "web_bitcoin_info", @@ -2204,27 +2347,28 @@ } ], "timeFrom": "10m", - "timeShift": null, "title": "Bitcoin Blocks (Web)", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -2260,11 +2404,16 @@ "fields": "", "values": false }, + "text": {}, "textMode": "auto" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [], "limit": "1", "measurement": "bitcoin_blockchaininfo", @@ -2298,27 +2447,28 @@ } ], "timeFrom": "10m", - "timeShift": null, "title": "Bitcoin Blocks", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -2355,11 +2505,16 @@ "fields": "", "values": false }, + "text": {}, "textMode": "auto" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [], "limit": "1", "measurement": "ln_info", @@ -2393,27 +2548,28 @@ } ], "timeFrom": "10m", - "timeShift": null, "title": "LN BlockHeight", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ @@ -2450,11 +2606,16 @@ "fields": "", "values": false }, + "text": {}, "textMode": "auto" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [], "limit": "1", "measurement": "electrs_info", @@ -2468,7 +2629,7 @@ [ { "params": [ - "electrs_index_height" + "index_height" ], "type": "field" }, @@ -2488,24 +2649,24 @@ } ], "timeFrom": "10m", - "timeShift": null, "title": "electrs IndexHeight", "transparent": true, "type": "stat" }, { - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "description": "", "fieldConfig": { "defaults": { - "custom": {}, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "red", - "value": null + "color": "red" }, { "color": "orange", @@ -2545,12 +2706,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "auto" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "Block Beat", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -2598,24 +2764,24 @@ } ], "timeFrom": "24h", - "timeShift": null, "title": "Block Beat / 24h (Web)", "transparent": true, "type": "stat" }, { - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "description": "", "fieldConfig": { "defaults": { - "custom": {}, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "red", - "value": null + "color": "red" }, { "color": "orange", @@ -2655,12 +2821,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "auto" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "Block Beat", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -2708,14 +2879,16 @@ } ], "timeFrom": "24h", - "timeShift": null, "title": "Block Beat / 24h", "transparent": true, "type": "stat" }, { "collapsed": false, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "gridPos": { "h": 1, "w": 24, @@ -2724,31 +2897,41 @@ }, "id": 90, "panels": [], + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "refId": "A" + } + ], "title": "Quick Summary - MemPool", "type": "row" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ { - "color": "#299c46", - "value": null + "color": "#299c46" }, { "color": "rgba(237, 129, 40, 0.89)", @@ -2786,11 +2969,16 @@ "fields": "", "values": false }, + "text": {}, "textMode": "auto" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -2815,7 +3003,7 @@ [ { "params": [ - "electrs_mempool_count" + "mempool_txs_count" ], "type": "field" }, @@ -2834,35 +3022,34 @@ ] } ], - "timeFrom": null, - "timeShift": null, "title": "Pending Tx", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "decimals": 1, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ { - "color": "orange", - "value": null + "color": "orange" } ] }, @@ -2892,12 +3079,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "value" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "$tag_fee_rate", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -2928,7 +3120,7 @@ [ { "params": [ - "electrs_mempool_vsize" + "mempool_txs_vsize" ], "type": "field" }, @@ -2948,40 +3140,39 @@ "condition": "AND", "key": "fee_rate", "operator": "=", - "value": "≤ 1" + "value": "[ 0, 1)" } ] } ], - "timeFrom": null, - "timeShift": null, - "title": "1 sat/vbyte", + "title": "< 1 sat/vbyte", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "decimals": 1, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ { - "color": "orange", - "value": null + "color": "orange" } ] }, @@ -3011,12 +3202,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "value" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "$tag_fee_rate", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -3024,12 +3220,6 @@ ], "type": "time" }, - { - "params": [ - "fee_rate" - ], - "type": "tag" - }, { "params": [ "null" @@ -3047,7 +3237,7 @@ [ { "params": [ - "electrs_mempool_vsize" + "mempool_txs_vsize" ], "type": "field" }, @@ -3067,14 +3257,18 @@ "condition": "AND", "key": "fee_rate", "operator": "=", - "value": "≤ 2" + "value": "[ 2, 4)" + }, + { + "condition": "OR", + "key": "fee_rate", + "operator": "=", + "value": "[ 0, 1)" } ] } ], - "timeFrom": null, - "timeShift": null, - "title": "2 sat/vbyte", + "title": "< 2 sat/vbyte", "transparent": true, "type": "stat" }, @@ -3083,14 +3277,11 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" }, - "fill": 0, + "fill": 10, "fillGradient": 0, "gridPos": { "h": 4, @@ -3115,18 +3306,25 @@ "lines": true, "linewidth": 1, "nullPointMode": "null", + "options": { + "alertThreshold": true + }, "percentage": false, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "pointradius": 0.5, "points": false, "renderer": "flot", "seriesOverrides": [], "spaceLength": 10, - "stack": false, + "stack": true, "steppedLine": false, "targets": [ { "alias": "$tag_fee_rate", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -3159,7 +3357,7 @@ [ { "params": [ - "electrs_mempool_vsize" + "mempool_txs_vsize" ], "type": "field" }, @@ -3174,6 +3372,12 @@ "key": "host", "operator": "=~", "value": "/^$host$/" + }, + { + "condition": "AND", + "key": "mempool_txs_vsize", + "operator": ">", + "value": "0" } ] } @@ -3192,48 +3396,41 @@ "toDayOfWeek": 7 } ], - "timeShift": null, "title": "fees", "tooltip": { "shared": true, "sort": 0, - "value_type": "cumulative" + "value_type": "individual" }, "transparent": true, "type": "graph", "xaxis": { - "buckets": null, "mode": "time", - "name": null, "show": false, "values": [] }, "yaxes": [ { "format": "bytes", - "label": null, "logBase": 1, - "max": null, - "min": null, "show": false }, { "format": "short", - "label": null, "logBase": 1, - "max": null, - "min": null, "show": false } ], "yaxis": { - "align": false, - "alignLevel": null + "align": false } }, { "collapsed": false, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "gridPos": { "h": 1, "w": 24, @@ -3242,31 +3439,41 @@ }, "id": 57, "panels": [], + "targets": [ + { + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "refId": "A" + } + ], "title": "api.blockchain.info", "type": "row" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ { - "color": "dark-purple", - "value": null + "color": "dark-purple" } ] }, @@ -3296,11 +3503,16 @@ "fields": "", "values": false }, + "text": {}, "textMode": "auto" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [], "limit": "1", "measurement": "web_bitcoin_info", @@ -3334,24 +3546,24 @@ } ], "timeFrom": "10m", - "timeShift": null, "title": "Bitcoin Blocks (Web)", "transparent": true, "type": "stat" }, { - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "description": "", "fieldConfig": { "defaults": { - "custom": {}, "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "red", - "value": null + "color": "red" }, { "color": "orange", @@ -3391,12 +3603,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "auto" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "Block Beat", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -3444,33 +3661,33 @@ } ], "timeFrom": "24h", - "timeShift": null, "title": "Block Beat / 24h (Web)", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ { - "color": "#299c46", - "value": null + "color": "#299c46" } ] }, @@ -3500,12 +3717,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "auto" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "Blocks mined", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -3549,35 +3771,34 @@ ] } ], - "timeFrom": null, - "timeShift": null, "title": "Blocks Mined / 24h", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "decimals": 3, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ { - "color": "#299c46", - "value": null + "color": "#299c46" } ] }, @@ -3607,12 +3828,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "auto" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "Fees per 24h", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -3662,34 +3888,33 @@ ] } ], - "timeFrom": null, - "timeShift": null, "title": "Fees / 24h", "transparent": true, "type": "stat" }, { - "cacheTimeout": null, - "datasource": null, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "fieldConfig": { "defaults": { - "custom": {}, "mappings": [ { - "id": 0, - "op": "=", - "text": "N/A", - "type": 1, - "value": "null" + "options": { + "match": "null", + "result": { + "text": "N/A" + } + }, + "type": "special" } ], - "nullValueMode": "connected", "thresholds": { "mode": "absolute", "steps": [ { - "color": "#299c46", - "value": null + "color": "#299c46" } ] }, @@ -3719,12 +3944,17 @@ "fields": "", "values": false }, + "text": {}, "textMode": "auto" }, - "pluginVersion": "7.1.5", + "pluginVersion": "9.1.5", "targets": [ { "alias": "Marketprice USD", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "groupBy": [ { "params": [ @@ -3768,15 +3998,16 @@ ] } ], - "timeFrom": null, - "timeShift": null, "title": "Marketprice USD", "transparent": true, "type": "stat" }, { - "collapsed": true, - "datasource": null, + "collapsed": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "gridPos": { "h": 1, "w": 24, @@ -3784,3220 +4015,3411 @@ "y": 35 }, "id": 25, - "panels": [ + "panels": [], + "targets": [ { - "cacheTimeout": null, - "columns": [], - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" }, - "fontSize": "100%", - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 35 - }, - "id": 22, - "interval": "10s", - "links": [], - "pageSize": null, - "pluginVersion": "6.3.6", - "scroll": true, - "showHeader": true, - "sort": { - "col": null, - "desc": false - }, - "styles": [ - { - "alias": "Last seen", - "align": "auto", - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "pattern": "Time", - "type": "date" - }, - { - "alias": "Uptime", - "align": "auto", - "colorMode": "row", - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "decimals": 2, - "pattern": "Value", - "thresholds": [ - "36000", - "360000" - ], - "type": "number", - "unit": "dtdurations" - }, - { - "alias": "service", - "align": "auto", - "colorMode": null, - "colors": [ - "rgba(245, 54, 54, 0.9)", - "rgba(237, 129, 40, 0.89)", - "rgba(50, 172, 45, 0.97)" - ], - "dateFormat": "YYYY-MM-DD HH:mm:ss", - "decimals": 2, - "mappingType": 1, - "pattern": "Metric", - "thresholds": [], - "type": "string", - "unit": "short" - } - ], - "targets": [ - { - "alias": "system", - "groupBy": [], - "hide": false, - "limit": "1", - "measurement": "system", - "orderByTime": "ASC", - "policy": "default", - "query": "SELECT last(\"uptime\") FROM \"autogen\".\"system\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter LIMIT 1", - "rawQuery": false, - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "uptime" - ], - "type": "field" - }, - { - "params": [], - "type": "last" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - }, - { - "alias": "$tag_service", - "groupBy": [ - { - "params": [ - "service" - ], - "type": "tag" - } - ], - "limit": "1", - "measurement": "service_uptime", - "orderByTime": "ASC", - "policy": "default", - "query": "SELECT last(\"uptime\") FROM \"autogen\".\"service-uptime\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY \"service\" LIMIT 1", - "rawQuery": false, - "refId": "C", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "uptime" - ], - "type": "field" - }, - { - "params": [], - "type": "last" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "timeFrom": null, - "timeShift": null, - "title": "Uptime system / services", - "transform": "timeseries_to_rows", - "transparent": true, - "type": "table-old" - }, - { - "cacheTimeout": null, - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": { - "align": "left", - "displayMode": "auto" - }, - "decimals": 2, - "mappings": [], - "noValue": "No Data", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "decbytes" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Time" - }, - "properties": [ - { - "id": "displayName", - "value": "Last seen" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 35 - }, - "hideTimeOverride": true, - "id": 6, - "interval": "1m", - "links": [], - "options": { - "frameIndex": 1, - "showHeader": true, - "sortBy": [ - { - "desc": false, - "displayName": "Value" - } - ] - }, - "pluginVersion": "7.1.5", - "targets": [ - { - "alias": "$col", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - } - ], - "limit": "1", - "measurement": "bitcoin_nettotals", - "orderByTime": "DESC", - "policy": "autogen", - "query": "SELECT last(\"totalbytesrecv\") AS \"Bytes recv\" FROM \"autogen\".\"bitcoin-nettotals\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY \"host\" LIMIT 1", - "rawQuery": false, - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "totalbytesrecv" - ], - "type": "field" - }, - { - "params": [], - "type": "last" - }, - { - "params": [ - "Bytes recv" - ], - "type": "alias" - } - ], - [ - { - "params": [ - "totalbytessent" - ], - "type": "field" - }, - { - "params": [], - "type": "last" - }, - { - "params": [ - "Bytes sent" - ], - "type": "alias" - } - ] - ], - "slimit": "", - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - }, - { - "alias": "$col", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - } - ], - "limit": "1", - "measurement": "bitcoin_blockchaininfo", - "orderByTime": "DESC", - "policy": "default", - "refId": "B", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "size_on_disk" - ], - "type": "field" - }, - { - "params": [], - "type": "last" - }, - { - "params": [ - "Size on disk" - ], - "type": "alias" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "timeFrom": "10m", - "timeShift": null, - "title": "Bitcoin - totals", - "transformations": [ - { - "id": "seriesToRows", - "options": {} - } - ], - "transparent": true, - "type": "table" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": {}, - "unit": "dateTimeAsIso" - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 45 - }, - "hiddenSeries": false, - "id": 104, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideEmpty": true, - "hideZero": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "sort": "current", - "sortDesc": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "/ = ::1/", - "legend": false - }, - { - "alias": "/^eth0_.+/", - "legend": false - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_origin = $tag_ipaddr", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "origin" - ], - "type": "tag" - }, - { - "params": [ - "ipaddr" - ], - "type": "tag" - } - ], - "measurement": "raspiblitz_ip_info", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "created" - ], - "type": "field" - }, - { - "params": [], - "type": "last" - }, - { - "params": [ - "*1000" - ], - "type": "math" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "IP Address History", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "dateTimeAsIso", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "cacheTimeout": null, - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": { - "align": "center", - "displayMode": "color-background" - }, - "decimals": 1, - "mappings": [], - "noValue": "No Value transmitted", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red", - "value": null - }, - { - "color": "orange", - "value": 3600 - }, - { - "color": "green", - "value": 72000 - } - ] - }, - "unit": "dtdurations" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Time" - }, - "properties": [ - { - "id": "displayName", - "value": "Last seen" - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 45 - }, - "id": 94, - "interval": "1m", - "links": [], - "options": { - "showHeader": true, - "sortBy": [ - { - "desc": false, - "displayName": "uptime" - } - ] - }, - "pluginVersion": "7.1.5", - "targets": [ - { - "alias": "$tag_origin = $tag_ipaddr", - "groupBy": [ - { - "params": [ - "ipaddr" - ], - "type": "tag" - }, - { - "params": [ - "origin" - ], - "type": "tag" - } - ], - "hide": false, - "limit": "", - "measurement": "raspiblitz_ip_info", - "orderByTime": "ASC", - "policy": "autogen", - "query": "SELECT last(\"uptime\") FROM \"autogen\".\"system\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter LIMIT 1", - "rawQuery": false, - "refId": "A", - "resultFormat": "table", - "select": [ - [ - { - "params": [ - "uptime" - ], - "type": "field" - }, - { - "params": [], - "type": "last" - }, - { - "params": [ - "uptime" - ], - "type": "alias" - } - ] - ], - "slimit": "", - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ], - "tz": "" - } - ], - "timeFrom": "10m", - "timeShift": null, - "title": "IP addresses from services and network devices", - "transparent": true, - "type": "table" - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 12, - "x": 0, - "y": 53 - }, - "hiddenSeries": false, - "id": 102, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": true, - "steppedLine": true, - "targets": [ - { - "alias": "$tag_origin", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "origin" - ], - "type": "tag" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "measurement": "raspiblitz_ip_info", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "changed" - ], - "type": "field" - }, - { - "params": [], - "type": "max" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "IP Address changes", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "format": "none", - "label": null, - "logBase": 1, - "max": "5", - "min": "-1", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 24, - "x": 0, - "y": 61 - }, - "hiddenSeries": false, - "id": 31, - "interval": "10s", - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "sort": "current", - "sortDesc": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "bootstrap.service", - "bars": true, - "lines": false - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_systemd_unit", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "systemd_unit" - ], - "type": "tag" - } - ], - "limit": "", - "measurement": "procstat", - "orderByTime": "ASC", - "policy": "default", - "query": "SELECT last(\"created_at\") / 1000000 FROM \"procstat\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY time($__interval), \"systemd_unit\"", - "rawQuery": false, - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "created_at" - ], - "type": "field" - }, - { - "params": [], - "type": "last" - }, - { - "params": [ - " / 1000000" - ], - "type": "math" - } - ] - ], - "slimit": "", - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [ - { - "colorMode": "gray", - "fill": true, - "fillColor": "rgba(234, 112, 112, 0.12)", - "fromDayOfWeek": 6, - "line": false, - "lineColor": "rgba(237, 46, 24, 0.60)", - "op": "time", - "toDayOfWeek": 7 - } - ], - "timeShift": null, - "title": "Services Start History", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "transparent": true, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "dateTimeFromNow", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": null, - "decimals": 0, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 11, - "w": 24, - "x": 0, - "y": 71 - }, - "hiddenSeries": false, - "id": 10, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": true, - "current": true, - "max": true, - "min": true, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": true, - "targets": [ - { - "alias": "Bitcoin peers", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "measurement": "bitcoin_connectioncount", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - }, - { - "alias": "LN peers", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "measurement": "ln_info", - "orderByTime": "ASC", - "policy": "default", - "refId": "B", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "num_peers" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [ - { - "colorMode": "gray", - "fill": true, - "fillColor": "rgba(234, 112, 112, 0.12)", - "fromDayOfWeek": 6, - "line": false, - "lineColor": "rgba(237, 46, 24, 0.60)", - "op": "time", - "toDayOfWeek": 7 - } - ], - "timeShift": null, - "title": "Peers / Connection Count", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "transparent": true, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "format": "short", - "label": "", - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } + "refId": "A" } ], "title": "Uptime & Connections", "type": "row" }, { - "collapsed": true, - "datasource": null, + "columns": [], + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "fontSize": "100%", + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 36 + }, + "id": 22, + "interval": "10s", + "links": [], + "pluginVersion": "6.3.6", + "scroll": true, + "showHeader": true, + "sort": { + "desc": false + }, + "styles": [ + { + "alias": "Last seen", + "align": "auto", + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "pattern": "Time", + "type": "date" + }, + { + "alias": "Uptime", + "align": "auto", + "colorMode": "row", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "decimals": 2, + "pattern": "Value", + "thresholds": [ + "36000", + "360000" + ], + "type": "number", + "unit": "dtdurations" + }, + { + "alias": "service", + "align": "auto", + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "mappingType": 1, + "pattern": "Metric", + "thresholds": [], + "type": "string", + "unit": "short" + } + ], + "targets": [ + { + "alias": "system", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [], + "hide": false, + "limit": "1", + "measurement": "system", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT last(\"uptime\") FROM \"autogen\".\"system\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter LIMIT 1", + "rawQuery": false, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "uptime" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + }, + { + "alias": "$tag_service", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "service" + ], + "type": "tag" + } + ], + "limit": "1", + "measurement": "service_uptime", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT last(\"uptime\") FROM \"autogen\".\"service-uptime\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY \"service\" LIMIT 1", + "rawQuery": false, + "refId": "C", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "uptime" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "title": "Uptime system / services", + "transform": "timeseries_to_rows", + "transparent": true, + "type": "table-old" + }, + { + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "fieldConfig": { + "defaults": { + "custom": { + "align": "left", + "displayMode": "auto", + "inspect": false + }, + "decimals": 2, + "mappings": [], + "noValue": "No Data", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + } + ] + }, + "unit": "decbytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "displayName", + "value": "Last seen" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 36 + }, + "hideTimeOverride": true, + "id": 6, + "interval": "1m", + "links": [], + "options": { + "footer": { + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "frameIndex": 1, + "showHeader": true, + "sortBy": [ + { + "desc": false, + "displayName": "Value" + } + ] + }, + "pluginVersion": "9.1.5", + "targets": [ + { + "alias": "$col", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + } + ], + "limit": "1", + "measurement": "bitcoin_nettotals", + "orderByTime": "DESC", + "policy": "autogen", + "query": "SELECT last(\"totalbytesrecv\") AS \"Bytes recv\" FROM \"autogen\".\"bitcoin-nettotals\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY \"host\" LIMIT 1", + "rawQuery": false, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "totalbytesrecv" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "Bytes recv" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "totalbytessent" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "Bytes sent" + ], + "type": "alias" + } + ] + ], + "slimit": "", + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + }, + { + "alias": "$col", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + } + ], + "limit": "1", + "measurement": "bitcoin_blockchaininfo", + "orderByTime": "DESC", + "policy": "default", + "refId": "B", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "size_on_disk" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "Size on disk" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "timeFrom": "10m", + "title": "Bitcoin - totals", + "transformations": [ + { + "id": "seriesToRows", + "options": {} + } + ], + "transparent": true, + "type": "table" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "fieldConfig": { + "defaults": { + "unit": "dateTimeAsIso" + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 46 + }, + "hiddenSeries": false, + "id": 104, + "interval": "1m", + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": true, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "9.1.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/ = ::1/", + "legend": false + }, + { + "alias": "/^eth0_.+/", + "legend": false + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_origin = $tag_ipaddr", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "origin" + ], + "type": "tag" + }, + { + "params": [ + "ipaddr" + ], + "type": "tag" + } + ], + "measurement": "ipinfo", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "created" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "*1000" + ], + "type": "math" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [], + "timeRegions": [], + "title": "IP Address History", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "dateTimeAsIso", + "logBase": 1, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "fieldConfig": { + "defaults": { + "custom": { + "align": "center", + "displayMode": "color-background", + "inspect": false + }, + "decimals": 1, + "mappings": [], + "noValue": "No Value transmitted", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + }, + { + "color": "orange", + "value": 3600 + }, + { + "color": "green", + "value": 72000 + } + ] + }, + "unit": "dtdurations" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "displayName", + "value": "Last seen" + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 46 + }, + "id": 94, + "interval": "1m", + "links": [], + "options": { + "footer": { + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [ + { + "desc": false, + "displayName": "uptime" + } + ] + }, + "pluginVersion": "9.1.5", + "targets": [ + { + "alias": "$tag_origin = $tag_ipaddr", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "ipaddr" + ], + "type": "tag" + }, + { + "params": [ + "origin" + ], + "type": "tag" + } + ], + "hide": false, + "limit": "", + "measurement": "ipinfo", + "orderByTime": "ASC", + "policy": "autogen", + "query": "SELECT last(\"uptime\") FROM \"autogen\".\"system\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter LIMIT 1", + "rawQuery": false, + "refId": "A", + "resultFormat": "table", + "select": [ + [ + { + "params": [ + "uptime" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "uptime" + ], + "type": "alias" + } + ] + ], + "slimit": "", + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ], + "tz": "" + } + ], + "timeFrom": "10m", + "title": "IP addresses from services and network devices", + "transparent": true, + "type": "table" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 54 + }, + "hiddenSeries": false, + "id": 102, + "interval": "1m", + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "9.1.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": true, + "targets": [ + { + "alias": "$tag_origin", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "origin" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "ipinfo", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "changed" + ], + "type": "field" + }, + { + "params": [], + "type": "max" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [], + "timeRegions": [], + "title": "IP Address changes", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "none", + "logBase": 1, + "max": "5", + "min": "-1", + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 62 + }, + "hiddenSeries": false, + "id": 31, + "interval": "10s", + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "9.1.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "bootstrap.service", + "bars": true, + "lines": false + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_systemd_unit", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "systemd_unit" + ], + "type": "tag" + } + ], + "limit": "", + "measurement": "procstat", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT last(\"created_at\") / 1000000 FROM \"procstat\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY time($__interval), \"systemd_unit\"", + "rawQuery": false, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "created_at" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + " / 1000000" + ], + "type": "math" + } + ] + ], + "slimit": "", + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [], + "timeRegions": [ + { + "colorMode": "gray", + "fill": true, + "fillColor": "rgba(234, 112, 112, 0.12)", + "fromDayOfWeek": 6, + "line": false, + "lineColor": "rgba(237, 46, 24, 0.60)", + "op": "time", + "toDayOfWeek": 7 + } + ], + "title": "Services Start History", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": true, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "dateTimeFromNow", + "logBase": 1, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "decimals": 0, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 11, + "w": 24, + "x": 0, + "y": 72 + }, + "hiddenSeries": false, + "id": 10, + "interval": "1m", + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "9.1.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": true, + "targets": [ + { + "alias": "Bitcoin peers", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "bitcoin_connectioncount", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + }, + { + "alias": "LN peers", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "ln_info", + "orderByTime": "ASC", + "policy": "default", + "refId": "B", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "num_peers" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [], + "timeRegions": [ + { + "colorMode": "gray", + "fill": true, + "fillColor": "rgba(234, 112, 112, 0.12)", + "fromDayOfWeek": 6, + "line": false, + "lineColor": "rgba(237, 46, 24, 0.60)", + "op": "time", + "toDayOfWeek": 7 + } + ], + "title": "Peers / Connection Count", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": true, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "label": "", + "logBase": 1, + "min": "0", + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 36 + "y": 83 }, "id": 27, - "panels": [ + "panels": [], + "targets": [ { - "aliasColors": { - "Block Beat": "purple", - "Block Beat (24h)": "dark-purple", - "Heartbeat": "dark-purple" + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" }, - "bars": true, - "dashLength": 10, - "dashes": false, - "datasource": null, - "decimals": 0, - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 0, - "gridPos": { - "h": 7, - "w": 24, - "x": 0, - "y": 83 - }, - "hiddenSeries": false, - "hideTimeOverride": false, - "id": 62, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": true, - "min": false, - "rightSide": false, - "show": true, - "total": true, - "values": true - }, - "lines": false, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "Block Beat", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "limit": "", - "measurement": "bitcoin_blockchaininfo", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "blocks" - ], - "type": "field" - }, - { - "params": [], - "type": "last" - }, - { - "params": [], - "type": "difference" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [ - { - "colorMode": "custom", - "fill": false, - "fillColor": "rgba(51, 162, 229, 0.2)", - "line": true, - "lineColor": "rgba(31, 96, 196, 0.6)", - "op": "gt", - "value": 6, - "yaxis": "left" - } - ], - "timeFrom": "24h", - "timeRegions": [], - "timeShift": null, - "title": "Block Beat", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "transparent": true, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": false, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": false - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": null, - "decimals": 0, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 24, - "x": 0, - "y": 90 - }, - "hiddenSeries": false, - "id": 12, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "hideZero": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "Bitcoin - Verification Progress", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "Bitcoin - Blocks", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "hide": false, - "measurement": "bitcoin_blockchaininfo", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "blocks" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - }, - { - "alias": "Bitcoin - Headers", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "hide": false, - "measurement": "bitcoin_blockchaininfo", - "orderByTime": "ASC", - "policy": "default", - "refId": "B", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "headers" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - }, - { - "alias": "Bitcoin - Verification Progress", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "measurement": "bitcoin_blockchaininfo", - "orderByTime": "ASC", - "policy": "default", - "refId": "E", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "verificationprogress" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - }, - { - "alias": "LN - Bockheight", - "groupBy": [ - { - "params": [ - "$interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "measurement": "ln_info", - "orderByTime": "ASC", - "policy": "default", - "refId": "C", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "block_height" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - }, - { - "alias": "electrs - Indexheight", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "hide": false, - "measurement": "electrs_info", - "orderByTime": "ASC", - "policy": "default", - "refId": "D", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "electrs_index_height" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [ - { - "colorMode": "gray", - "fill": true, - "fillColor": "rgba(234, 112, 112, 0.12)", - "fromDayOfWeek": 6, - "line": false, - "lineColor": "rgba(237, 46, 24, 0.60)", - "op": "time", - "toDayOfWeek": 7 - } - ], - "timeShift": null, - "title": "Blockchain Info", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "transparent": true, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": 0, - "format": "none", - "label": "", - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "Pending Tx": "orange" - }, - "bars": false, - "cacheTimeout": null, - "dashLength": 10, - "dashes": false, - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 1, - "fillGradient": 7, - "gridPos": { - "h": 9, - "w": 24, - "x": 0, - "y": 100 - }, - "hiddenSeries": false, - "id": 41, - "interval": "1m", - "legend": { - "alignAsTable": true, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": true, - "targets": [ - { - "alias": "Pending Tx", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "hide": false, - "limit": "", - "measurement": "electrs_info", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "electrs_mempool_count" - ], - "type": "field" - }, - { - "params": [], - "type": "last" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [ - { - "colorMode": "gray", - "fill": true, - "fillColor": "rgba(234, 112, 112, 0.12)", - "fromDayOfWeek": 6, - "line": false, - "lineColor": "rgba(237, 46, 24, 0.60)", - "op": "time", - "toDayOfWeek": 7 - } - ], - "timeShift": null, - "title": "Pending Tx", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "transparent": true, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "none", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 10, - "w": 24, - "x": 0, - "y": 109 - }, - "hiddenSeries": false, - "id": 93, - "interval": "1m", - "legend": { - "alignAsTable": false, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 0.5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_fee_rate", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "fee_rate" - ], - "type": "tag" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "hide": false, - "measurement": "electrs_info", - "orderByTime": "ASC", - "policy": "autogen", - "query": "SELECT \"electrs_mempool_vsize\" / __series.field FROM \"autogen\".\"prometheus\" WHERE $timeFilter GROUP BY \"fee_rate\"", - "rawQuery": false, - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "electrs_mempool_vsize" - ], - "type": "field" - }, - { - "params": [], - "type": "last" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [ - { - "colorMode": "gray", - "fill": true, - "fillColor": "rgba(234, 112, 112, 0.12)", - "fromDayOfWeek": 6, - "line": false, - "lineColor": "rgba(237, 46, 24, 0.60)", - "op": "time", - "toDayOfWeek": 7 - } - ], - "timeShift": null, - "title": "fees via mempool size", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "transparent": true, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } + "refId": "A" } ], "title": "Blockchain Info & MemPool", "type": "row" }, { - "collapsed": true, - "datasource": null, + "aliasColors": { + "Block Beat": "purple", + "Block Beat (24h)": "dark-purple", + "Heartbeat": "dark-purple" + }, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "decimals": 0, + "description": "", + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 24, + "x": 0, + "y": 84 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 62, + "interval": "1m", + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": true, + "values": true + }, + "lines": false, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "9.1.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "Block Beat", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "limit": "", + "measurement": "bitcoin_blockchaininfo", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "blocks" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [], + "type": "difference" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [ + { + "colorMode": "custom", + "fill": false, + "fillColor": "rgba(51, 162, 229, 0.2)", + "line": true, + "lineColor": "rgba(31, 96, 196, 0.6)", + "op": "gt", + "value": 6, + "yaxis": "left" + } + ], + "timeFrom": "24h", + "timeRegions": [], + "title": "Block Beat", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": true, + "type": "graph", + "xaxis": { + "mode": "time", + "show": false, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "short", + "logBase": 1, + "min": "0", + "show": false + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "decimals": 0, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 91 + }, + "hiddenSeries": false, + "id": 12, + "interval": "1m", + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "9.1.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "Bitcoin - Verification Progress", + "yaxis": 2 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "Bitcoin - Blocks", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "measurement": "bitcoin_blockchaininfo", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "blocks" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + }, + { + "alias": "Bitcoin - Headers", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "measurement": "bitcoin_blockchaininfo", + "orderByTime": "ASC", + "policy": "default", + "refId": "B", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "headers" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + }, + { + "alias": "Bitcoin - Verification Progress", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "bitcoin_blockchaininfo", + "orderByTime": "ASC", + "policy": "default", + "refId": "E", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "verificationprogress" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + }, + { + "alias": "LN - Bockheight", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "ln_info", + "orderByTime": "ASC", + "policy": "default", + "refId": "C", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "block_height" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + }, + { + "alias": "electrs - Indexheight", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "measurement": "electrs_info", + "orderByTime": "ASC", + "policy": "default", + "refId": "D", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "electrs_index_height" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [], + "timeRegions": [ + { + "colorMode": "gray", + "fill": true, + "fillColor": "rgba(234, 112, 112, 0.12)", + "fromDayOfWeek": 6, + "line": false, + "lineColor": "rgba(237, 46, 24, 0.60)", + "op": "time", + "toDayOfWeek": 7 + } + ], + "title": "Blockchain Info", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": true, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 0, + "format": "none", + "label": "", + "logBase": 1, + "show": true + }, + { + "format": "none", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": { + "Pending Tx": "orange" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "fill": 1, + "fillGradient": 7, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 101 + }, + "hiddenSeries": false, + "id": 41, + "interval": "1m", + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "9.1.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": true, + "targets": [ + { + "alias": "Pending Tx", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "limit": "", + "measurement": "electrs_info", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "mempool_txs_count" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [], + "timeRegions": [ + { + "colorMode": "gray", + "fill": true, + "fillColor": "rgba(234, 112, 112, 0.12)", + "fromDayOfWeek": 6, + "line": false, + "lineColor": "rgba(237, 46, 24, 0.60)", + "op": "time", + "toDayOfWeek": 7 + } + ], + "title": "Pending Tx", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": true, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "fill": 10, + "fillGradient": 0, + "gridPos": { + "h": 10, + "w": 24, + "x": 0, + "y": 110 + }, + "hiddenSeries": false, + "id": 93, + "interval": "1m", + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "9.1.5", + "pointradius": 0.5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "$$hashKey": "object:211" + } + ], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_fee_rate", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "fee_rate" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "measurement": "electrs_info", + "orderByTime": "ASC", + "policy": "autogen", + "query": "SELECT last(\"mempool_txs_vsize\") FROM \"autogen\".\"electrs_info\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY time($__interval), \"fee_rate\" fill(null)", + "rawQuery": false, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "mempool_txs_vsize" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + }, + { + "condition": "AND", + "key": "mempool_txs_vsize", + "operator": ">", + "value": "0" + } + ] + } + ], + "thresholds": [], + "timeRegions": [ + { + "colorMode": "gray", + "fill": true, + "fillColor": "rgba(234, 112, 112, 0.12)", + "fromDayOfWeek": 6, + "line": false, + "lineColor": "rgba(237, 46, 24, 0.60)", + "op": "time", + "toDayOfWeek": 7 + } + ], + "title": "fees via mempool size", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": true, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "logBase": 1, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "collapsed": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 37 + "y": 120 }, "id": 29, - "panels": [ + "panels": [], + "targets": [ { - "aliasColors": { - "CPU Frequency": "blue", - "CPU Temperature": "red" + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": null, - "decimals": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 8 - }, - "hiddenSeries": false, - "id": 18, - "interval": "10s", - "legend": { - "alignAsTable": false, - "avg": true, - "current": true, - "hideEmpty": false, - "max": true, - "min": true, - "rightSide": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "CPU Frequency", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": true, - "targets": [ - { - "alias": "CPU Temperature", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "hide": false, - "measurement": "cpu_temperature", - "orderByTime": "ASC", - "policy": "autogen", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - }, - { - "params": [ - 10 - ], - "type": "moving_average" - }, - { - "params": [ - " / 1000" - ], - "type": "math" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - }, - { - "alias": "CPU Frequency", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "hide": false, - "measurement": "cpu_frequency", - "orderByTime": "ASC", - "policy": "default", - "refId": "B", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "value" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - }, - { - "params": [ - "20" - ], - "type": "moving_average" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [ - { - "colorMode": "gray", - "fill": true, - "fillColor": "rgba(234, 112, 112, 0.12)", - "fromDayOfWeek": 6, - "line": false, - "lineColor": "rgba(237, 46, 24, 0.60)", - "op": "time", - "toDayOfWeek": 7 - } - ], - "timeShift": null, - "title": "CPU Temperature / Frequence", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "transparent": true, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "celsius", - "label": "CPU Temperature", - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "hertz", - "label": "CPU Frequency", - "logBase": 1, - "max": null, - "min": "0", - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "CPU system": "light-green", - "CPU user": "dark-green" - }, - "bars": false, - "cacheTimeout": null, - "dashLength": 10, - "dashes": false, - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 16 - }, - "hiddenSeries": false, - "id": 20, - "interval": "10s", - "legend": { - "alignAsTable": false, - "avg": true, - "current": true, - "max": true, - "min": true, - "rightSide": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "CPU user", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "measurement": "cpu", - "orderByTime": "ASC", - "policy": "default", - "query": "SELECT mean(\"usage_user\") AS \"user\", mean(\"usage_system\")AS \"system\" FROM \"autogen\".\"cpu\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY time(1m) fill(null)", - "rawQuery": false, - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "usage_user" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - }, - { - "params": [ - "10" - ], - "type": "moving_average" - } - ] - ], - "tags": [ - { - "key": "cpu", - "operator": "=", - "value": "cpu-total" - }, - { - "condition": "AND", - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - }, - { - "alias": "CPU system", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "host" - ], - "type": "tag" - }, - { - "params": [ - "cpu" - ], - "type": "tag" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "measurement": "cpu", - "orderByTime": "ASC", - "policy": "autogen", - "query": "SELECT mean(\"usage_user\") AS \"user\", mean(\"usage_system\")AS \"system\" FROM \"autogen\".\"cpu\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY time(1m) fill(null)", - "rawQuery": false, - "refId": "B", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "usage_system" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - }, - { - "params": [ - 10 - ], - "type": "moving_average" - } - ] - ], - "tags": [ - { - "key": "cpu", - "operator": "=", - "value": "cpu-total" - }, - { - "condition": "AND", - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [ - { - "colorMode": "gray", - "fill": true, - "fillColor": "rgba(234, 112, 112, 0.12)", - "fromDayOfWeek": 6, - "line": false, - "lineColor": "rgba(237, 46, 24, 0.60)", - "op": "time", - "toDayOfWeek": 7 - } - ], - "timeShift": null, - "title": "CPU user/system", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "transparent": true, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "short", - "label": "", - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": null, - "decimals": 1, - "description": "", - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 24 - }, - "hiddenSeries": false, - "id": 16, - "interval": "10s", - "legend": { - "alignAsTable": false, - "avg": true, - "current": true, - "max": true, - "min": true, - "rightSide": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "avail mem", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": true, - "targets": [ - { - "alias": "15min", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "hide": false, - "measurement": "system", - "orderByTime": "ASC", - "policy": "default", - "query": "SELECT mean(\"load1\") AS \"load 1min\", mean(\"load5\") AS \"load 5min\", mean(\"load15\") AS \"load 15min\" FROM \"system\" WHERE $timeFilter GROUP BY time(1m), \"host\"\n", - "rawQuery": false, - "refId": "B", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "load15" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ], - "tz": "" - }, - { - "alias": "$col", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "measurement": "mem", - "orderByTime": "ASC", - "policy": "default", - "refId": "C", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "available" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - }, - { - "params": [ - "avail mem" - ], - "type": "alias" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [ - { - "colorMode": "gray", - "fill": true, - "fillColor": "rgba(234, 112, 112, 0.12)", - "fromDayOfWeek": 6, - "line": false, - "lineColor": "rgba(237, 46, 24, 0.60)", - "op": "time", - "toDayOfWeek": 7 - } - ], - "timeShift": null, - "title": "SystemLoad / FreeMem", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "transparent": true, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "decimals": null, - "format": "bytes", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - } - ], - "yaxis": { - "align": true, - "alignLevel": null - } - }, - { - "aliasColors": { - "Mem avail %": "yellow", - "Mem used %": "dark-orange", - "Swap used %": "purple" - }, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 32 - }, - "hiddenSeries": false, - "id": 44, - "interval": "10s", - "legend": { - "avg": false, - "current": true, - "max": false, - "min": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [ - { - "alias": "/Mem.+/", - "yaxis": 2 - } - ], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "Swap used %", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "hide": false, - "measurement": "swap", - "orderByTime": "ASC", - "policy": "default", - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "used_percent" - ], - "type": "field" - }, - { - "params": [], - "type": "max" - }, - { - "params": [ - 10 - ], - "type": "moving_average" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - }, - { - "alias": "$col", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "hide": false, - "measurement": "mem", - "orderByTime": "ASC", - "policy": "default", - "refId": "B", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "used_percent" - ], - "type": "field" - }, - { - "params": [], - "type": "max" - }, - { - "params": [ - 10 - ], - "type": "moving_average" - }, - { - "params": [ - "Mem used %" - ], - "type": "alias" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - }, - { - "alias": "$col", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "hide": false, - "measurement": "mem", - "orderByTime": "ASC", - "policy": "default", - "refId": "C", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "available_percent" - ], - "type": "field" - }, - { - "params": [], - "type": "max" - }, - { - "params": [ - 10 - ], - "type": "moving_average" - }, - { - "params": [ - "Mem avail %" - ], - "type": "alias" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [ - { - "colorMode": "gray", - "fill": true, - "fillColor": "rgba(234, 112, 112, 0.12)", - "fromDayOfWeek": 6, - "line": false, - "lineColor": "rgba(237, 46, 24, 0.60)", - "op": "time", - "toDayOfWeek": 7 - } - ], - "timeShift": null, - "title": "Mem & Swap", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "transparent": true, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "percent", - "label": null, - "logBase": 1, - "max": "100", - "min": "0", - "show": true - }, - { - "format": "percent", - "label": null, - "logBase": 1, - "max": "100", - "min": "0", - "show": true - } - ], - "yaxis": { - "align": true, - "alignLevel": null - } - }, - { - "aliasColors": { - "mmcblk0p1": "dark-purple", - "mmcblk0p2": "light-purple", - "sda1": "super-light-purple" - }, - "bars": false, - "cacheTimeout": null, - "dashLength": 10, - "dashes": false, - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 40 - }, - "hiddenSeries": false, - "id": 23, - "interval": "10s", - "legend": { - "alignAsTable": false, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_device", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "device" - ], - "type": "tag" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "measurement": "disk", - "orderByTime": "ASC", - "policy": "autogen", - "query": "SELECT mean(\"usage_user\") AS \"user\", mean(\"usage_system\")AS \"system\" FROM \"autogen\".\"cpu\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY time(1m) fill(null)", - "rawQuery": false, - "refId": "A", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "used_percent" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - }, - { - "params": [ - 10 - ], - "type": "moving_average" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [ - { - "colorMode": "gray", - "fill": true, - "fillColor": "rgba(234, 112, 112, 0.12)", - "fromDayOfWeek": 6, - "line": false, - "lineColor": "rgba(237, 46, 24, 0.60)", - "op": "time", - "toDayOfWeek": 7 - } - ], - "timeShift": null, - "title": "Disk used %", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "transparent": true, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "percent", - "label": "", - "logBase": 1, - "max": "100", - "min": "0", - "show": true - }, - { - "decimals": 0, - "format": "bytes", - "label": "", - "logBase": 1, - "max": null, - "min": "0", - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": { - "mmcblk0p1": "dark-purple", - "mmcblk0p2": "light-purple", - "sda1": "super-light-purple" - }, - "bars": false, - "cacheTimeout": null, - "dashLength": 10, - "dashes": false, - "datasource": null, - "fieldConfig": { - "defaults": { - "custom": {} - }, - "overrides": [] - }, - "fill": 0, - "fillGradient": 0, - "gridPos": { - "h": 8, - "w": 24, - "x": 0, - "y": 48 - }, - "hiddenSeries": false, - "id": 42, - "interval": "10s", - "legend": { - "alignAsTable": false, - "avg": false, - "current": true, - "max": false, - "min": false, - "rightSide": false, - "show": true, - "total": false, - "values": true - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pluginVersion": "7.1.5", - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "alias": "$tag_device", - "groupBy": [ - { - "params": [ - "$__interval" - ], - "type": "time" - }, - { - "params": [ - "device" - ], - "type": "tag" - }, - { - "params": [ - "null" - ], - "type": "fill" - } - ], - "measurement": "disk", - "orderByTime": "ASC", - "policy": "autogen", - "query": "SELECT mean(\"usage_user\") AS \"user\", mean(\"usage_system\")AS \"system\" FROM \"autogen\".\"cpu\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY time(1m) fill(null)", - "rawQuery": false, - "refId": "B", - "resultFormat": "time_series", - "select": [ - [ - { - "params": [ - "free" - ], - "type": "field" - }, - { - "params": [], - "type": "mean" - }, - { - "params": [ - 10 - ], - "type": "moving_average" - } - ] - ], - "tags": [ - { - "key": "host", - "operator": "=~", - "value": "/^$host$/" - } - ] - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [ - { - "colorMode": "gray", - "fill": true, - "fillColor": "rgba(234, 112, 112, 0.12)", - "fromDayOfWeek": 6, - "line": false, - "lineColor": "rgba(237, 46, 24, 0.60)", - "op": "time", - "toDayOfWeek": 7 - } - ], - "timeShift": null, - "title": "Disk free space", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "transparent": true, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "decimals": null, - "format": "bytes", - "label": "", - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "decimals": 0, - "format": "bytes", - "label": "", - "logBase": 1, - "max": null, - "min": "0", - "show": false - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } + "refId": "A" } ], "title": "Computer Metrics", "type": "row" + }, + { + "aliasColors": { + "CPU Frequency": "blue", + "CPU Temperature": "red" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 121 + }, + "hiddenSeries": false, + "id": 18, + "interval": "10s", + "legend": { + "alignAsTable": false, + "avg": true, + "current": true, + "hideEmpty": false, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "9.1.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "CPU Frequency", + "yaxis": 2 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": true, + "targets": [ + { + "alias": "CPU Temperature", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "measurement": "cpu_temperature", + "orderByTime": "ASC", + "policy": "autogen", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + 10 + ], + "type": "moving_average" + }, + { + "params": [ + " / 1000" + ], + "type": "math" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + }, + { + "alias": "CPU Frequency", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "measurement": "cpu_frequency", + "orderByTime": "ASC", + "policy": "default", + "refId": "B", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "value" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "20" + ], + "type": "moving_average" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [], + "timeRegions": [ + { + "colorMode": "gray", + "fill": true, + "fillColor": "rgba(234, 112, 112, 0.12)", + "fromDayOfWeek": 6, + "line": false, + "lineColor": "rgba(237, 46, 24, 0.60)", + "op": "time", + "toDayOfWeek": 7 + } + ], + "title": "CPU Temperature / Frequence", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": true, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "celsius", + "label": "CPU Temperature", + "logBase": 1, + "min": "0", + "show": true + }, + { + "format": "hertz", + "label": "CPU Frequency", + "logBase": 1, + "min": "0", + "show": true + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": { + "CPU system": "light-green", + "CPU user": "dark-green" + }, + "bars": true, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "fieldConfig": { + "defaults": { + "unit": "percent" + }, + "overrides": [] + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 129 + }, + "hiddenSeries": false, + "id": 20, + "interval": "10s", + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "9.1.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "alias": "CPU user", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "host" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "cpu", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT mean(\"usage_user\") AS \"user\", mean(\"usage_system\")AS \"system\" FROM \"autogen\".\"cpu\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY time(1m) fill(null)", + "rawQuery": false, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "usage_user" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "10" + ], + "type": "moving_average" + } + ] + ], + "tags": [ + { + "key": "cpu", + "operator": "=", + "value": "cpu-total" + }, + { + "condition": "AND", + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + }, + { + "alias": "CPU system", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "host" + ], + "type": "tag" + }, + { + "params": [ + "cpu" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "cpu", + "orderByTime": "ASC", + "policy": "autogen", + "query": "SELECT mean(\"usage_user\") AS \"user\", mean(\"usage_system\")AS \"system\" FROM \"autogen\".\"cpu\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY time(1m) fill(null)", + "rawQuery": false, + "refId": "B", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "usage_system" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + 10 + ], + "type": "moving_average" + } + ] + ], + "tags": [ + { + "key": "cpu", + "operator": "=", + "value": "cpu-total" + }, + { + "condition": "AND", + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + }, + { + "alias": "CPU idle", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "host" + ], + "type": "tag" + }, + { + "params": [ + "cpu" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "measurement": "cpu", + "orderByTime": "ASC", + "policy": "autogen", + "query": "SELECT mean(\"usage_user\") AS \"user\", mean(\"usage_system\")AS \"system\" FROM \"autogen\".\"cpu\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY time(1m) fill(null)", + "rawQuery": false, + "refId": "C", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "usage_idle" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + 10 + ], + "type": "moving_average" + } + ] + ], + "tags": [ + { + "key": "cpu", + "operator": "=", + "value": "cpu-total" + }, + { + "condition": "AND", + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + }, + { + "alias": "CPU io wait", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "host" + ], + "type": "tag" + }, + { + "params": [ + "cpu" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "measurement": "cpu", + "orderByTime": "ASC", + "policy": "autogen", + "query": "SELECT mean(\"usage_user\") AS \"user\", mean(\"usage_system\")AS \"system\" FROM \"autogen\".\"cpu\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY time(1m) fill(null)", + "rawQuery": false, + "refId": "D", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "usage_iowait" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + 10 + ], + "type": "moving_average" + } + ] + ], + "tags": [ + { + "key": "cpu", + "operator": "=", + "value": "cpu-total" + }, + { + "condition": "AND", + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [], + "timeRegions": [ + { + "colorMode": "gray", + "fill": true, + "fillColor": "rgba(234, 112, 112, 0.12)", + "fromDayOfWeek": 6, + "line": false, + "lineColor": "rgba(237, 46, 24, 0.60)", + "op": "time", + "toDayOfWeek": 7 + } + ], + "title": "CPU user/system", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": true, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:155", + "format": "percent", + "label": "", + "logBase": 1, + "max": "100", + "min": "0", + "show": true + }, + { + "$$hashKey": "object:156", + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "decimals": 1, + "description": "", + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 137 + }, + "hiddenSeries": false, + "id": 16, + "interval": "10s", + "legend": { + "alignAsTable": false, + "avg": true, + "current": true, + "max": true, + "min": true, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "9.1.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "avail mem", + "yaxis": 2 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": true, + "targets": [ + { + "alias": "15min", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "measurement": "system", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT mean(\"load1\") AS \"load 1min\", mean(\"load5\") AS \"load 5min\", mean(\"load15\") AS \"load 15min\" FROM \"system\" WHERE $timeFilter GROUP BY time(1m), \"host\"\n", + "rawQuery": false, + "refId": "B", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "load15" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ], + "tz": "" + }, + { + "alias": "$col", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "mem", + "orderByTime": "ASC", + "policy": "default", + "refId": "C", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "available" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + "avail mem" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [], + "timeRegions": [ + { + "colorMode": "gray", + "fill": true, + "fillColor": "rgba(234, 112, 112, 0.12)", + "fromDayOfWeek": 6, + "line": false, + "lineColor": "rgba(237, 46, 24, 0.60)", + "op": "time", + "toDayOfWeek": 7 + } + ], + "title": "SystemLoad / FreeMem", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": true, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "min": "0", + "show": true + }, + { + "format": "bytes", + "logBase": 1, + "min": "0", + "show": true + } + ], + "yaxis": { + "align": true + } + }, + { + "aliasColors": { + "Mem avail %": "yellow", + "Mem used %": "dark-orange", + "Swap used %": "purple" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 145 + }, + "hiddenSeries": false, + "id": 44, + "interval": "10s", + "legend": { + "avg": false, + "current": true, + "max": false, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "9.1.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/Mem.+/", + "yaxis": 2 + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "Swap used %", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "measurement": "swap", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "used_percent" + ], + "type": "field" + }, + { + "params": [], + "type": "max" + }, + { + "params": [ + 10 + ], + "type": "moving_average" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + }, + { + "alias": "$col", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "measurement": "mem", + "orderByTime": "ASC", + "policy": "default", + "refId": "B", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "used_percent" + ], + "type": "field" + }, + { + "params": [], + "type": "max" + }, + { + "params": [ + 10 + ], + "type": "moving_average" + }, + { + "params": [ + "Mem used %" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + }, + { + "alias": "$col", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "hide": false, + "measurement": "mem", + "orderByTime": "ASC", + "policy": "default", + "refId": "C", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "available_percent" + ], + "type": "field" + }, + { + "params": [], + "type": "max" + }, + { + "params": [ + 10 + ], + "type": "moving_average" + }, + { + "params": [ + "Mem avail %" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [], + "timeRegions": [ + { + "colorMode": "gray", + "fill": true, + "fillColor": "rgba(234, 112, 112, 0.12)", + "fromDayOfWeek": 6, + "line": false, + "lineColor": "rgba(237, 46, 24, 0.60)", + "op": "time", + "toDayOfWeek": 7 + } + ], + "title": "Mem & Swap", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": true, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percent", + "logBase": 1, + "max": "100", + "min": "0", + "show": true + }, + { + "format": "percent", + "logBase": 1, + "max": "100", + "min": "0", + "show": true + } + ], + "yaxis": { + "align": true + } + }, + { + "aliasColors": { + "mmcblk0p1": "dark-purple", + "mmcblk0p2": "light-purple", + "sda1": "super-light-purple" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 153 + }, + "hiddenSeries": false, + "id": 23, + "interval": "10s", + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "9.1.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_device", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "device" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "disk", + "orderByTime": "ASC", + "policy": "autogen", + "query": "SELECT mean(\"usage_user\") AS \"user\", mean(\"usage_system\")AS \"system\" FROM \"autogen\".\"cpu\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY time(1m) fill(null)", + "rawQuery": false, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "used_percent" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + 10 + ], + "type": "moving_average" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [], + "timeRegions": [ + { + "colorMode": "gray", + "fill": true, + "fillColor": "rgba(234, 112, 112, 0.12)", + "fromDayOfWeek": 6, + "line": false, + "lineColor": "rgba(237, 46, 24, 0.60)", + "op": "time", + "toDayOfWeek": 7 + } + ], + "title": "Disk used %", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": true, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percent", + "label": "", + "logBase": 1, + "max": "100", + "min": "0", + "show": true + }, + { + "decimals": 0, + "format": "bytes", + "label": "", + "logBase": 1, + "min": "0", + "show": false + } + ], + "yaxis": { + "align": false + } + }, + { + "aliasColors": { + "mmcblk0p1": "dark-purple", + "mmcblk0p2": "light-purple", + "sda1": "super-light-purple" + }, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "fill": 0, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 161 + }, + "hiddenSeries": false, + "id": 42, + "interval": "10s", + "legend": { + "alignAsTable": false, + "avg": false, + "current": true, + "max": false, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "9.1.5", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_device", + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" + }, + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "device" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "disk", + "orderByTime": "ASC", + "policy": "autogen", + "query": "SELECT mean(\"usage_user\") AS \"user\", mean(\"usage_system\")AS \"system\" FROM \"autogen\".\"cpu\" WHERE (\"host\" =~ /^$host$/) AND $timeFilter GROUP BY time(1m) fill(null)", + "rawQuery": false, + "refId": "B", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "free" + ], + "type": "field" + }, + { + "params": [], + "type": "mean" + }, + { + "params": [ + 10 + ], + "type": "moving_average" + } + ] + ], + "tags": [ + { + "key": "host", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [], + "timeRegions": [ + { + "colorMode": "gray", + "fill": true, + "fillColor": "rgba(234, 112, 112, 0.12)", + "fromDayOfWeek": 6, + "line": false, + "lineColor": "rgba(237, 46, 24, 0.60)", + "op": "time", + "toDayOfWeek": 7 + } + ], + "title": "Disk free space", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "transparent": true, + "type": "graph", + "xaxis": { + "mode": "time", + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "label": "", + "logBase": 1, + "min": "0", + "show": true + }, + { + "decimals": 0, + "format": "bytes", + "label": "", + "logBase": 1, + "min": "0", + "show": false + } + ], + "yaxis": { + "align": false + } } ], "refresh": "1m", - "schemaVersion": 26, + "schemaVersion": 37, "style": "dark", "tags": [], "templating": { "list": [ { - "allValue": null, "current": { "selected": false, - "text": null, - "value": null + "text": "raspberrypi", + "value": "raspberrypi" + }, + "datasource": { + "type": "influxdb", + "uid": "9ocoKgOnz" }, - "datasource": "InfluxDB", "definition": "SHOW TAG VALUES FROM \"ln_info\" WITH KEY=host", "hide": 0, "includeAll": false, @@ -7011,7 +7433,6 @@ "skipUrlSync": false, "sort": 0, "tagValuesQuery": "", - "tags": [], "tagsQuery": "", "type": "query", "useTags": false @@ -7039,5 +7460,6 @@ "timezone": "", "title": "Bitcoin/LN/electrs - Node", "uid": "ImRpu1igk", - "version": 90 + "version": 12, + "weekStart": "" } \ No newline at end of file diff --git a/home.admin/config.scripts/bonus.labelbase.sh b/home.admin/config.scripts/bonus.labelbase.sh index 0e50b3c53..febff6c34 100644 --- a/home.admin/config.scripts/bonus.labelbase.sh +++ b/home.admin/config.scripts/bonus.labelbase.sh @@ -148,11 +148,8 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then echo "# Installing ${APPID} ..." - - - # create a dedicated user for the app - # BACKGROUND is here to seperate running apps by unix users + # BACKGROUND is here to separate running apps by unix users # and only give file write access to the rest of the system where needed. echo "# create user" # If the user is intended to be loeed in to add '--shell /bin/bash' diff --git a/home.admin/config.scripts/bonus.telegraf.sh b/home.admin/config.scripts/bonus.telegraf.sh index 350035fff..5ae883d9f 100644 --- a/home.admin/config.scripts/bonus.telegraf.sh +++ b/home.admin/config.scripts/bonus.telegraf.sh @@ -3,14 +3,16 @@ ############################################################################### # File: bonus.telegraf.sh -# Date: 2020-10-03 ############################################################################### # command info if [ $# -eq 0 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ]; then - echo "config script to switch the telegraf metric collection on or off" - echo "bonus.telegraf.sh [on|off|status]" - exit 1 + echo "# config script to switch the telegraf metric collection" + echo "# detailed setup info: github.com/raspiblitz/raspiblitz/tree/dev/home.admin/assets/telegraf" + echo "# bonus.telegraf.sh status ---> get status of telegraf service" + echo "# bonus.telegraf.sh on ---> install & config" + echo "# bonus.telegraf.sh off ---> uninstall & reset config" + exit 1 fi # at this point the config file exists and can be sourced @@ -50,14 +52,151 @@ if [ "$1" = "status" ]; then fi +# Function to check if input is empty +function check_empty() { + if [ -z "$1" ]; then + return 1 + else + return 0 + fi +} + +# Function to validate IP address or domain with optional http(s) and port +function validate_url() { + if [[ "$1" =~ ^(https?://)?([a-zA-Z0-9.-]+|\b\d{1,3}(\.\d{1,3}){3}\b):[0-9]+$ ]]; then + return 0 + else + return 1 + fi +} + ############################### # switch on if [ "$1" = "1" ] || [ "$1" = "on" ]; then + echo "*** INSTALL TELEGRAF ***" + + # check installed by looking for service + serviceInstalled=$(sudo systemctl status telegraf --no-page 2>/dev/null | grep -c "telegraf.service - The plugin-driven") + if [ ${serviceInstalled} -eq 1 ]; then + echo "# Telegraf service is installed." + echo "# If you want to reset config and reinstall, please switch off first." + exit 0 + fi + + # check if config data in raspiblitz.conf is available + configMissing=0 + if [ ${#telegrafInfluxUrl} -eq 0 ]; then + echo "# Missing telegrafInfluxUrl in raspiblitz.conf" + configMissing=1 + fi + if [ ${#telegrafInfluxDatabase} -eq 0 ]; then + echo "# Missing telegrafInfluxDatabase in raspiblitz.conf" + configMissing=1 + fi + if [ ${#telegrafInfluxUsername} -eq 0 ]; then + echo "# Missing telegrafInfluxUsername in raspiblitz.conf" + configMissing=1 + fi + if [ ${#telegrafInfluxPassword} -eq 0 ]; then + echo "# Missing telegrafInfluxPassword in raspiblitz.conf" + configMissing=1 + fi + + # enter config if missing (first init) + if [ ${configMissing} -eq 1 ]; then + + # Display the info box with whiptail + whiptail --title "Metrics Setup Information" --yesno "To run the Telegraf metrics service you need an external monitoring server running Grafana & InfluxDB. Please prepare InfluxDB database & user as described in github.com/raspiblitz/raspiblitz/tree/dev/home.admin/assets/telegraf Choose YES if all is ready to config RaspiBlitz Telegraf service." 11 75; + if [ $? -eq 1 ]; then + echo "# user cancel" + exit 0 + fi + + # Collect telegrafInfluxUrl + telegrafInfluxUrl="" + while true; do + telegrafInfluxUrl=$(whiptail --inputbox "Enter the IP address or domain followed by port of your metrics InfluxDB (e.g., http://192.168.1.1:8086):" 8 78 "${telegrafInfluxUrl}" --title "InfluxDB Connection" 3>&1 1>&2 2>&3) + exitstatus=$? + if [ $exitstatus -ne 0 ]; then + echo "Operation canceled by user." + exit 1 + fi + if ! check_empty "$telegrafInfluxUrl"; then + whiptail --msgbox "Input cannot be empty. Please enter a valid URL." 8 78 + continue + fi + if ! validate_url "$telegrafInfluxUrl"; then + whiptail --msgbox "Invalid format. Please enter a valid IP address or domain followed by a port, with optional http(s) prefix." 8 78 + continue + fi + # Perform a test using curl to check if the service is running + [[ $telegrafInfluxUrl =~ ^(http|https):// ]] || telegrafInfluxUrl="http://$telegrafInfluxUrl" + if curl --output /dev/null --silent --head --fail "${telegrafInfluxUrl}/ping"; then + echo "OK Service is running at $telegrafInfluxUrl." + break + else + whiptail --msgbox "Was not able to connect to ${telegrafInfluxUrl} - please make sure InfluxDB is running and reachable for RaspiBlitz." 8 78 + continue + fi + done + + # Collect telegrafInfluxDatabase + while true; do + telegrafInfluxDatabase=$(whiptail --inputbox "Enter the name of the database where to store the metrics:" 8 78 "raspiblitz" --title "InfluxDB Database" 3>&1 1>&2 2>&3) + exitstatus=$? + if [ $exitstatus -ne 0 ]; then + echo "Operation canceled by user." + exit 1 + fi + if ! check_empty "$telegrafInfluxDatabase"; then + whiptail --msgbox "Input cannot be empty. Please enter a valid database name." 8 78 + continue + fi + break + done + + # Collect telegrafInfluxUsername + while true; do + telegrafInfluxUsername=$(whiptail --inputbox "Enter the username that is allowed to write on that database:" 8 78 "raspiblitz" --title "InfluxDB Username" 3>&1 1>&2 2>&3) + exitstatus=$? + if [ $exitstatus -ne 0 ]; then + echo "Operation canceled by user." + exit 1 + fi + if ! check_empty "$telegrafInfluxUsername"; then + whiptail --msgbox "Input cannot be empty. Please enter a valid username." 8 78 + continue + fi + break + done + + # Collect telegrafInfluxPassword + while true; do + telegrafInfluxPassword=$(whiptail --passwordbox "Enter the password for that username:" 8 78 --title "InfluxDB Password" 3>&1 1>&2 2>&3) + exitstatus=$? + if [ $exitstatus -ne 0 ]; then + echo "Operation canceled by user." + exit 1 + fi + if ! check_empty "$telegrafInfluxPassword"; then + whiptail --msgbox "Input cannot be empty. Please enter a valid password." 8 78 + continue + fi + break + done + + # save the config data to raspiblitz.conf + /home/admin/config.scripts/blitz.conf.sh set telegrafInfluxUrl "${telegrafInfluxUrl}" + /home/admin/config.scripts/blitz.conf.sh set telegrafInfluxDatabase "${telegrafInfluxDatabase}" + /home/admin/config.scripts/blitz.conf.sh set telegrafInfluxUsername "${telegrafInfluxUsername}" + /home/admin/config.scripts/blitz.conf.sh set telegrafInfluxPassword "${telegrafInfluxPassword}" + fi + # source and target dir for copy operation telegraf_source_dir=${resources_dir} telegraf_target_dir=/etc/telegraf - # + # full path to telegraf config file for sed-replace operation telegraf_conf_file=${telegraf_target_dir}/telegraf.conf @@ -160,8 +299,12 @@ if [ "$1" = "0" ] || [ "$1" = "off" ]; then # let apt-get remove the package sudo apt-get remove -y telegraf - echo "*** telegraf remove: set 'telegrafMonitoring=off' in config file 'raspiblitz.conf'" + echo "*** telegraf switch off and remove config ***" /home/admin/config.scripts/blitz.conf.sh set telegrafMonitoring "off" + /home/admin/config.scripts/blitz.conf.sh delete telegrafInfluxUrl + /home/admin/config.scripts/blitz.conf.sh delete telegrafInfluxDatabase + /home/admin/config.scripts/blitz.conf.sh delete telegrafInfluxUsername + /home/admin/config.scripts/blitz.conf.sh delete telegrafInfluxPassword echo "*** remove telegraf done ***" diff --git a/home.admin/config.scripts/bonus.template.sh b/home.admin/config.scripts/bonus.template.sh index 3205a3b95..89a662abc 100755 --- a/home.admin/config.scripts/bonus.template.sh +++ b/home.admin/config.scripts/bonus.template.sh @@ -11,7 +11,7 @@ APPID="template" # one-word lower-case no-specials # clean human readable version - will be displayed in UI -# just numbers only seperated by dots (2 or 0.1 or 1.3.4 or 3.4.5.2) +# just numbers only separated by dots (2 or 0.1 or 1.3.4 or 3.4.5.2) VERSION="0.1" # the git repo to get the source code from for install @@ -158,7 +158,7 @@ if [ "$1" = "1" ] || [ "$1" = "on" ]; then /home/admin/config.scripts/bonus.nodejs.sh on # create a dedicated user for the app - # BACKGROUND is here to seperate running apps by unix users + # BACKGROUND is here to separate running apps by unix users # and only give file write access to the rest of the system where needed. echo "# create user" # If the user is intended to be loeed in to add '--shell /bin/bash' diff --git a/home.admin/config.scripts/cl.backup.sh b/home.admin/config.scripts/cl.backup.sh index 14b94f9c1..63e97b98f 100644 --- a/home.admin/config.scripts/cl.backup.sh +++ b/home.admin/config.scripts/cl.backup.sh @@ -466,7 +466,7 @@ if [ ${mode} = "seed-import-gui" ]; then sudo chown admin:admin /var/cache/raspiblitz/.seed.tmp # dialog to enter - dialog --backtitle "RaspiBlitz - Recover from Core Lightning seed" --inputbox "Please enter/paste the SEED WORD LIST:\n(just the words, seperated by spaces, in correct order as numbered)" 9 78 2>/var/cache/raspiblitz/.seed.tmp + dialog --backtitle "RaspiBlitz - Recover from Core Lightning seed" --inputbox "Please enter/paste the SEED WORD LIST:\n(just the words, separated by spaces, in correct order as numbered)" 9 78 2>/var/cache/raspiblitz/.seed.tmp wordstring=$(cat /var/cache/raspiblitz/.seed.tmp | sed 's/[^a-zA-Z0-9 ]//g') sudo shred -u /var/cache/raspiblitz/.seed.tmp 2>/dev/null echo "processing ..." diff --git a/home.admin/config.scripts/lnd.backup.sh b/home.admin/config.scripts/lnd.backup.sh index f0bbd0198..39114c2f2 100755 --- a/home.admin/config.scripts/lnd.backup.sh +++ b/home.admin/config.scripts/lnd.backup.sh @@ -617,7 +617,7 @@ if [ ${mode} = "seed-import-gui" ]; then sudo chown admin:admin /var/cache/raspiblitz/.seed.tmp # dialog to enter - dialog --backtitle "RaspiBlitz - Recover from LND seed" --inputbox "Please enter/paste the SEED WORD LIST:\n(just the words, seperated by spaces, in correct order as numbered)" 9 78 2>/var/cache/raspiblitz/.seed.tmp + dialog --backtitle "RaspiBlitz - Recover from LND seed" --inputbox "Please enter/paste the SEED WORD LIST:\n(just the words, separated by spaces, in correct order as numbered)" 9 78 2>/var/cache/raspiblitz/.seed.tmp wordstring=$(cat /var/cache/raspiblitz/.seed.tmp | sed 's/[^a-zA-Z0-9 ]//g') sudo shred -u /var/cache/raspiblitz/.seed.tmp 2>/dev/null echo "processing ..."