开发「定位线上问题」小工具总结

1. 写在最前面

1.1 背景

同事给处理各种线上问题以及处理紧急要交付的需求版本的我,紧急插入了一个线上的问题:

问题说明:发现从 2023.12.25 号开始,XX 产品上传的计费文件,偶现有超过 12 小时才进入计费存储系统。当前 XX 产品的计费逻辑为「超过 12h」,即忽略计费统计,简而言之,XX 产品已经有接近一个月的计费问题了!

注:XX 产品是一个正在处于打磨期的产品,无计费上报的监控链路、无集中日志存储、无计费服务维护人员,即一个计费「三无」产品

1.2 思路

本着「办法总比困难多的思路」,就算再难解决,作为接锅的人,也得想办法解决。

分析问题三步走:

  • 单个的日志文件可以解析出全局唯一的 id
  • 全局唯一的 id,可以定位出生成该文件的机器 ip
  • 定位问题 --- 机器的 ip 中上传日志的服务可以分析,出文件的生成时间和文件的上传时间

修复问题小工具:

  • 批量扫描线上所有机器,然后拉起被丢弃的日志文件,恢复数据。

2. 如何快速解决问题

2.1 分析问题

  • 解析全局唯一的 id
markdown 复制代码
> 注:开发小心得,为了避免给自己埋坑,在开发需要复杂解析的文件时,建议提供一个解析小工具!
  • 分析 id 所属机器
  • 发现计费侧反馈的文件,从 2024.01.11 ~ 2024.01.12 一直断断续续的有上传,并且已经超过了 12h

结论:仔细分析了计费的逻辑,发现根因是之前设计的上传触发逻辑有两种,一个当前时间大于文件最后更新时间的 10m ,一个是文件的大小需要大于 1M。而这个产生这个问题的客户使用的方式比较独特,他使计费文件的断断续续的有更新,且总大小仍然小于 1M。

2.2 修复问题

虽然计费出现了小插曲,但是该收的钱还是得收!但是由于野生的计费系统,没有办法查日志,想要分析从 2023.12.15 到 2024.1.17 号那些文件超过 12 小时上报了,这个问题就变成急需解决的问题了?

2.2.1 思路

遇事不要慌,沉着冷静的分析下,是否有什么规律可以看。日志上传成功的格式:

yaml 复制代码
2024-01-12 06:21:19 info billing_u: xxx serives upload file xyz_0_streamSubscription_1_1704991273078

分析如上日志,发现两个有效性

  • 2024-01-12 06:21:19 字段是文件上传的时间,北京时间
  • 1704991273078 字段是文件产生的时间,UTC 时间的时间戳

咦,将两个字段转化到相同的时区,然后比较不就可以得出产生到上传的时间的差值了嘛?这很有道理

2.2.2 实现

在 shell 上我就是个渣渣,不过,我有 chatgpt,快速入门 shell 不是梦。「只要你的问题描述的够精确,chatgpt 可以帮你解决 80% 的问题」

  • 首先,将待分析的文件中关心的日志上传成功的记录转成 csv 格式

    matlab 复制代码
    cat billing.log  | grep success > data.csv
  • 其次,写一个可以逐行读取 csv 日志的分析脚本

    bash 复制代码
    #!/bin/bash
    
    while IFS= read -r log_line; do
        timestamp=$(echo "$log_line" | awk '{print $1, $2}')
        number=$(echo "$log_line" | grep -oE '[0-9]+$')
        generateTime=$(($number / 1000))
    
        # 将时间戳转换为Unix时间戳
        timestamp_unix=$(TZ=UTC date -d "$timestamp" +%s)
    
        # 计算时间差
        time_diff=$((timestamp_unix - generateTime))
    
        if [ $time_diff -gt 43200 ]; then
            # 输出结果
            # echo $generateTime
            # echo $timestamp_unix
            echo $log_line
            # echo "时间差: $time_diff 秒"
        fi
    done <data.csv

    注:新学的 shell 语法如下,

    TZ=UTC date -d "$timestamp" +%s 将 2024-01-12 06:21:19 转成北京时间转为 UTC 的时间戳

    while IFS= read -r log_line; do

    ·····

    done <data.csv

  • 最后,使用运维执行脚本的工具逐个机器执行如上脚本拉取有问题的文件名。

执行效果如下图所示:

3. 碎碎念

2023 年忙着救火,再加上工作年限日益增加,开始变得有些倦怠了,希望 2024 能找回自己,积极学习感兴趣的技术,保持空杯的心态。就这样啦,今天又是早下班失败的一天!

  • 买定离手,落子无悔,我在哪里,我的背后就是退路。
  • 能用金解决的事情,就别用人情,能用汗水解决的问题,就别用眼泪。
  • 人们总是把那条没有选择的路想象得开满鲜花。
相关推荐
IT_陈寒6 分钟前
SpringBoot实战:这5个高效开发技巧让我节省了50%编码时间!
前端·人工智能·后端
laomocoder9 分钟前
golang可观测-无侵入式agent技术原理
开发语言·后端·golang
come1123424 分钟前
深入Spring Boot的核心——配置管理(指南四)
java·spring boot·后端
come112341 小时前
深入分析JAR和WAR包的区别 (指南七)
android·spring boot·后端
每天进步一点_JL1 小时前
深入理解 volatile
后端
李慕婉学姐1 小时前
【开题答辩过程】以《基于SpringBoot+Vue的扶贫助农平台的设计与实现》为例,不会开题答辩的可以进来看看
vue.js·spring boot·后端
王嘉俊9251 小时前
Redis 入门:高效缓存与数据存储的利器
java·数据库·redis·后端·spring·缓存·springboot
aricvvang2 小时前
一行 Promise.all 争议:数据库查询并行真的没用?我和同事吵赢了!!!
javascript·后端·node.js
文心快码BaiduComate2 小时前
Comate分饰多角:全栈开发一个Python学习网站
前端·后端·python
道可到2 小时前
淘宝面试原题 Java 面试通关笔记 02|从编译到运行——Java 背后的计算模型(面试可复述版)
java·后端·面试