关于ETH/BTC区块的监控
此次我写的是一个小型的shell, 链接钉钉的机器人, 使用过的应该会比较娴熟的了,下面就简述一下把
主要的功能就是, 当发现本地数据库区块跟网络上的区块差距相差较大的时候就代表, 数据同步有问题, 这个时候, 发出一条告警出来,
对于比特网络来说,我用的是https://blockchair.com/
注意到的哥们已经发现了, 在首页的下方就是它的API, 我用的是比较愚蠢的方式去调用它, 直接用curl吧, 躁一把.

也可以点进去查询它的相关调用, 这里面所调用的币种也是换汤不换药, 比如以下的, 就是取到指定币种的网络信息, 先拿下来分析一下把
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了,取到信息了, 如下

但是有时候使用curl会给我弹出total这些渣渣字段, 很不喜欢, 所以, 发招用s参数吧, 以防万一
curl -s https://api.blockchair.com/ethereum/stats
取到的数据很明显了, 就是一个json格式的, 难道我还要去弄一个工具去格式化它? 非也
在linux中, 想必大家都知道,jq命令就能显示格式化json, 如果没有的话安装一下
yum install jq -y
这样就好办很多了, 我们可以先把curl定义下来的东西重定向到一个文件中去啊, 然后用jq去分析那个文件不就行了吗, 接下来数据就变成这样了
[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小工具的多?
有待研究。
就到这里。
关于ETH/BTC区块的监控的更多相关文章
- [易学易懂系列|rustlang语言|零基础|快速入门|(27)|实战4:从零实现BTC区块链]
[易学易懂系列|rustlang语言|零基础|快速入门|(27)|实战4:从零实现BTC区块链] 项目实战 实战4:从零实现BTC区块链 我们今天来开发我们的BTC区块链系统. 简单来说,从数据结构的 ...
- 在ETH交易区块链里查看北大的那封信
本文仅限于科普编码知识使用,随便举的例子不代表本人立场. 欢迎在其他网站传播,但转载不得标注来源及作者. 1.随便打开一个ETH区块链浏览网站,比如:https://www.etherchain.or ...
- 区块链基础认识-BTC
1.什么是区块链 a.定义: 从本质上来说区块链就是一种通过将用户的某种特定信息(比如交易信息),通过很多台计算机记录保存并同步的过程,每个区块都记录了对应的交易信息,将这些交易信息串联起来就形成了所 ...
- [币严区块链]BitcoinCash - BCH钱包地址生成与扫块充值监控(JAVA版)
本文的方案无需自建节点,因为BCH当前区块数据大小已经达到200G以上,BTC区块数据也已超过300G,若每个币都自建节点,对云服务器的消耗会非常大. 认识BitcoinCash(BCH) Bitco ...
- 以太坊api访问,区块同步监测
以太坊geth api访问,区块同步监测 curl查询geth区块高度 supervisor管理以太坊geth进程 geth进程健康检查 # curl访问geth api #使用curl访问geth ...
- todo:区块链????????
2018年这个春节,人人都在讲btc.ico.区块链. 恶补了几天区块链的知识和文章,一总结就是:一头雾水,没有哪个vc.创业者.技术人员 讲明白区块链到底是什么,技术上如何实现,就是哪些研读过中本聪 ...
- [转]USDT与omniCore钱包
本文转自:http://www.cnblogs.com/red-evil/p/10039740.html USDTUSDT,又称为泰达币,是由Tether公司在 2015年推出的一种与美元锚定的加密货 ...
- USDT与omniCore钱包
USDTUSDT,又称为泰达币,是由Tether公司在 2015年推出的一种与美元锚定的加密货币,理论上,1USDT=1美元,这种价格的稳定性基于Tether公司声称对每一个发行的Tether在他们的 ...
- 美图DPOS以太坊教程(Docker版)
一.前言 最近,需要接触区块链项目的主链开发,在EOS.BTC.ethereum.超级账本这几种区块链技术当中,相互对比后,最终还是以go-ethereum为解决方案. 以ethereum为基准去找解 ...
随机推荐
- Java多线程的创建(二)
前言: 虽然java的API中说创建多线程的方式只有两种(There are two ways to create a new thread of execution),分别是继承Thread类创建和 ...
- 1.HelloWorld 仪式感
HelloWorld: 1.随便新建一个文件夹,存放代码. 2.新建一个java文件 文件后缀改为 .java Hello.java 系统可能没显示文件后缀名,我们需要手动打开 3.编写代码 publ ...
- 开发者必须要了解的架构技术趋势:Service Mesh
内容概要 Service Mesh 是干啥的?解决了什么问题? Service Mesh 的特性 Service Mesh 的主流实现有哪些? 1. Service Mesh 是什么? 简单来讲,Se ...
- 不要把 JWT 用作 session
现在很多人使用 JWT 用作 session 管理,这是个糟糕的做法,下面阐述原因,有不同意见的同学欢迎讨论. 首先说明一下,JWT 有两种: 无状态的 JWT,token 中包含 session 数 ...
- [UVA1494] Qin Shi Huang's National Road System
题目 戳这里 题解 从今天起我要改邪归正,好好刷题准备联赛! 这是一道经典的最小生成树题目. 枚举每一条边作为道士要修的路,求出包含这条边的最小生成树. 先求出原图的最小生成树. 如果要删的边在最小生 ...
- Wordpress4.9.6 任意文件删除漏洞复现分析
第一章 漏洞简介及危害分析 1.1漏洞介绍 WordPress可以说是当今最受欢迎的(我想说没有之一)基于PHP的开源CMS,其目前的全球用户高达数百万,并拥有超过4600万次的超高下载量.它是一个开 ...
- ValueError: The field admin.LogEntry.user was declared with a lazy reference to 'system.sysuser', bu
问题:已经在settings.py文件中注册过app仍旧提示没有安装,并且使用makegirations命令时会抛出如下异常. ValueError: The field admin.LogEntry ...
- http轮询,长轮询
轮询,长轮询 轮询 轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接. 优点:后端程序编写比较容易. 缺点:请求中有大半是无用,浪费带宽和服务器资源. 实例:适于小 ...
- java基础算法(一):最大子序列和问题的多种算法思路
问题: /** * 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和,并顺序打印子序列. * 示例: * 输入: [-2,1,-3,4,-1,2,1 ...
- Hibernate(六)
================================缓存============================定义:介于应用程序和永久性数据存储源之间,可以复制数据存储源中的数据. 工作 ...