【區塊鏈】關於ETH/BTC區塊的監控

這次我寫的是一個小型的shell, 連接釘釘的機器人, 使用過的應該會比較嫺熟的了,下面就簡述一下把mysql

主要的功能就是, 當發現本地數據庫區塊跟網絡上的區塊差距相差較大的時候就表明, 數據同步有問題, 這個時候, 發出一條告警出來,linux

對於比特網絡來講,我用的是https://blockchair.com/golang

注意到的哥們已經發現了, 在首頁的下方就是它的API, 我用的是比較愚蠢的方式去調用它, 直接用curl吧, 躁一把.web

也能夠點進去查詢它的相關調用, 這裏面所調用的幣種也是換湯不換藥, 好比如下的, 就是取到指定幣種的網絡信息, 先拿下來分析一下把sql

https://api.blockchair.com/bitcoin/stats
https://api.blockchair.com/bitcoin-cash/stats
https://api.blockchair.com/litecoin/stats
https://api.blockchair.com/bitcoin-sv/stats
https://api.blockchair.com/dogecoin/stats
https://api.blockchair.com/dash/stats
https://api.blockchair.com/groestlcoin/stats
https://api.blockchair.com/bitcoin/testnet/stats我

直接用curl了,取到信息了, 以下shell

可是有時候使用curl會給我彈出total這些渣渣字段, 很不喜歡, 因此, 發招用s參數吧, 以防萬一數據庫

curl -s https://api.blockchair.com/ethereum/stats

取到的數據很明顯了, 就是一個json格式的, 難道我還要去弄一個工具去格式化它? 非也json

在linux中, 想必你們都知道,jq命令就能顯示格式化json, 若是沒有的話安裝一下api

yum  install jq -y

 這樣就好辦不少了, 咱們能夠先把curl定義下來的東西重定向到一個文件中去啊, 而後用jq去分析那個文件不就好了嗎, 接下來數據就變成這樣了bash

[root@tx ~]# curl -s https://api.blockchair.com/ethereum/stats > block
[root@tx ~]# jq ".data.blocks" block 
9551780

你看, 直接取到網絡上最新塊的高度了, 可是, 爲何會這樣取呢, 其實用了jq以後格式是這樣的了, 用過的應該就很清楚

 看, 活生生就是一個json, 我用的是.data.blocks, 就是直接把高度過濾出來而已.

那麼接下來就是, 去取本地數據庫中的高度了, 我這邊用的是mysql, 直接就拿他開刀

[root@tx ~]# /data/tools/mysql -uroot -prkm2020 -S /tmp/mysql.sock -P 3306 -e "select cfg_val from db_config.tb_sysconfig where cfg_name='cache.usdt_erc20_sync_bcnum';"
mysql: [Warning] Using a password on the command line interface can be insecure.
+---------+
| cfg_val |
+---------+
| 9519439 |
+---------+
[root@tx ~]# 
[root@tx ~]#  

看, 這就是我本地的高度, 可是, 若是你想拿這個9519439跟上面網絡上取到的高度去對比, 那麼就不得不去掉mysql查詢格式出來的框框, 其實這裏可使用-N -s參數, 到底有什麼用呢, 自行百度

[root@tx ~]# /data/tools/mysql -uroot -prkm2020 -S /tmp/mysql.sock -P 3306 -N -s -e "select cfg_val from db_config.tb_sysconfig where cfg_name='cache.usdt_erc20_sync_bcnum';"
mysql: [Warning] Using a password on the command line interface can be insecure.
9519439
[root@tx ~]# 
[root@tx ~]#

看, 直接摳出來了, 上面還有一個提醒是吧, 其實不影響, 你直接把值取出來, 而後扔給一個變量去作對比, 是沒問題的

那麼直接就看shell吧

這是一個完整的shell !
解析器在寫的時候能夠自行添加.

currencyType="ethereum"
MYSQL_CONN="/data/tools/mysql -uroot -prkm2020 -S /tmp/mysql.sock -P 3306 -N -s"
N=0

function dingding(){
    hostname=`hostname`
    webhook="https://oapi.dingtalk.com/robot/send?access_token=4db55f9cd1f96921acd6187d4431641e68bc39923d84d24fe0dbd"

    currTime1=`echo $(date +"%Y-%m-%d.%T")`
    curl ''$webhook'' \
   -H 'Content-Type: application/json' \
   -d '{"msgtype": "text", 
        "text": {
             "content": "
服務器:'$hostname' 發生: '$currencyType'區塊數據同步異常!

[
提醒主機:'$hostname'
提醒信息: 區塊數據同步異常
監控幣種:'$currencyType'
進程同步區塊:'$local_height'
網絡最新區塊:'$netwo_height'
區塊差距:'$value'
提醒時間:'$currTime1'
]
"
        }
      }'
}

function check(){
    local_height=`$MYSQL_CONN -e "select cfg_val from db_config.tb_sysconfig where cfg_name='cache.usdt_erc20_sync_bcnum';"`
    curl -s https://api.blockchair.com/${currencyType}/stats > /tmp/netwo_height
    netwo_height=`jq ".data.blocks" /tmp/netwo_height`
    value=$[netwo_height - local_height]
    echo $(date +"%Y-%m-%d.%T"),$value
    if [ $value -ge 6 ];then
        dingding
        N=$[N+1]
        sleep 600;
    else
        N=0
    fi
}
function main(){
    while :
    do
        sleep 180;
        if [ $N == 0 ];then
            check
        else
            if [ $N -ge 2 ];then
                sleep 300;
                check
            else
                sleep 50;
                check
            fi
        fi
    done
}
main

首先, 我把幣種聲明變量扔在了文件的開頭位置, 下面就直接去識別, 就是這個

currencyType="ethereum"

須要監控其餘的能夠換成其餘的, 好比bitcoin等

而後我爲了偷懶, 把mysql的鏈接code, 塞進一個變量裏面去, 爲了下面方便調用它

dingding模塊應該沒什麼好說的了, 檢查模塊, 無非就是拿出數據庫中的高度, 跟網絡上重定向分析出來的高度作對比, 用最新的高度減去本地區塊, 得出差距, 我這邊設置是在6個節點, 若是大於等於6, 那發個信息出來吧, 

確定有人疑問, N是什麼鬼, N就是一個統計告警數, 爲了避免讓告警太頻繁

好比我下面的main的主體調用模塊, 3分鐘檢測一下,若是N等於0, 那就是說, 一切正常,  那麼若是說, 發現了一次告警, 那麼N+1, 發了一次信息, 等待10分鐘, 再檢測, 若是10分鐘後仍是沒有恢復, 還來告警, 那麼N再+1, 那就是跑了下面的大於或等於2的時候那個條件了, 再等待5分鐘而後再檢查, 若是說, 在此次死循環中, 告警事後恢復正常了, 而後N會被重置爲0, 一切仍是原來的模樣.

那麼釘釘出來是怎麼樣的呢, 這樣的

目的是什麼, 主要是爲了讓服務器本地環境與網絡上的區塊環境實現一致同步, 若是服務器的程序出現問題, 那麼就能第一時間知道, 而後着手處理, 對於爲何不用golang去寫, 由於golang不會寫, bash更簡單, 但最不完美的就是, 可能死循環形成的資源消耗遠比golang小工具的多?有待研究。就到這裏。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息