一、环境
1、语言:go
二、服务概况
三、现象
lark告警群中偶尔会出现coinex的btc和eth同时告警,但是他们的最后一次告警时间不相同,代码的告警逻辑是:每隔30s定时从数据库中查询redis中btc和eth的数据updateTime字段的时间,updateTime+30秒与当前时间比较如果大于则表示30秒内数据未更新,发送lark告警。告警信息如下:
🚨 数据监控告警 🚨
🖥️ 服务器IP: xxxxxx
📊 交易所: coinex
💰 币对: BTCUSDT
📡 数据源: websocket
⚠️ 告警类型: timeout
🔴 告警级别: warning
📝 告警消息: WebSocket数据源超时,已超过2m0s未更新
🔑 Redis Key: MD_COINEX_SPOT_VOLUME_BTCUSDT
⏰ 告警时间: 2025-09-30 07:52:55
🕐 最后更新: 2025-09-30 07:47:41
👥 告警群组: 热门币对监控
==================================================
请及时检查数据源状态!
🚨 数据监控告警 🚨
🖥️ 服务器IP: xxxx
📊 交易所: coinex
💰 币对: ETHUSDT
📡 数据源: websocket
⚠️ 告警类型: timeout
🔴 告警级别: warning
📝 告警消息: WebSocket数据源超时,已超过2m0s未更新
🔑 Redis Key: MD_COINEX_SPOT_VOLUME_ETHUSDT
⏰ 告警时间: 2025-09-30 07:52:55
🕐 最后更新: 2025-09-30 07:45:52
👥 告警群组: 热门币对监控
==================================================
请及时检查数据源状态!
四、排查问题
1、首先通过在线websocket网站连接coinex的ws地址,确认告警是否真的是coinex未推送数据导致lark告警的。但是由于该问题是偶尔出现,一直未能出现在线websocke和lark同时告警的情况,因此作罢。
2、怀疑是代码的问题:用ai帮我检查代码的逻辑,ai告诉我可能是redis的pipeline导致数据每次存储时不在同一个slot中,可能一批数据导致跨节点存储时部分数据失败导致的,我开始调整这块的代码,突然想到如果真是这样的话,为什么只有coinex的这两个币对有问题,币安、gateio、bybit都没有出现过这种问题,感觉问题不在这边,因此作罢。
3、排查日志,为什么最后才是排查日志呢。因为之前看到过在xt、bitmart交易所出现过btc、eth服务端隔30秒以上不推送数据的情况,因此一直觉得是交易所那边没有btc的交易导致的数据没有及时更新。
直到在测试环境看到每次lark告警都是websocke断开重连之后才解开真实的bug原因,下面是websocket重连之后,服务端推送的数据:
{"method": "deals.update", "params": ["BTCUSDT", [{"id": 5844394418, "time": 1759125875.607549, "type": "sell", "price": "111674", "amount": "0.00011228"}, {"id": 5844394417, "time": 1759125875.607475, "type": "sell", "price": "111675", "amount": "0.00011226"}, {"id": 5844394416, "time": 1759125875.607362, "type": "sell", "price": "111676", "amount": "0.00003306"}, {"id": 5844391212, "time": 1759125813.756979, "type": "sell", "price": "111700", "amount": "0.01348103"}, {"id": 5844391046, "time": 1759125811.868881, "type": "buy", "price": "111701", "amount": "0.02107873"}, {"id": 5844390630, "time": 1759125810.063611, "type": "buy", "price": "111701", "amount": "0.01263460"}, {"id": 5844390492, "time": 1759125809.638278, "type": "sell", "price": "111700", "amount": "0.00001294"}, {"id": 5844390491, "time": 1759125809.638175, "type": "sell", "price": "111700", "amount": "0.00036332"}, {"id": 5844390490, "time": 1759125809.6381171, "type": "sell", "price": "111705", "amount": "0.00025242"}, {"id": 5844390489, "time": 1759125809.638052, "type": "sell", "price": "111705", "amount": "0.00010416"}, {"id": 5844390488, "time": 1759125809.6379759, "type": "sell", "price": "111705", "amount": "0.00010416"}, {"id": 5844390487, "time": 1759125809.6378551, "type": "sell", "price": "111705", "amount": "0.00224491"}, {"id": 5844390187, "time": 1759125808.106873, "type": "sell", "price": "111705", "amount": "0.00005533"}, {"id": 5844390143, "time": 1759125807.7271011, "type": "sell", "price": "111705", "amount": "0.00014024"}, {"id": 5844389894, "time": 1759125806.05726, "type": "buy", "price": "111706", "amount": "0.00117328"}, {"id": 5844387862, "time": 1759125753.638063, "type": "buy", "price": "111715", "amount": "0.00603992"}, {"id": 5844387794, "time": 1759125752.538177, "type": "buy", "price": "111715", "amount": "0.00860314"}, {"id": 5844387591, "time": 1759125751.3388391, "type": "buy", "price": "111715", "amount": "0.01099020"}]], "id": null
}
第一条数据的时间是2025-09-29 14:04:35,最后一条数据的时间是2025-09-29 14:02:31,而我在建立连接之后循环获取数据,就会把最后一条数据也存到redis中,那么就会出现假如刚好时间最早的一条数据存到redis中,lark开始检查数据更新情况,就会发出告警。在线上重点排查ws重连和告警的日志。和我的猜想相吻合。
五、解决问题
ws每次建立连接之后只获取第一条数据。
六、总结
一定要仔细查看日志,不要盲目的对代码进行修改。