今天的事件
發生在ELK的Log
API的參數沒有正常顯示
繞了半天
最後才發現答案就在眼前

後端的專案
因為沒有畫面可以呈現
所以大部分都會留下詳細的Log
包括Request和Response的資料
方便Debug

這次因為追查線上的Bug
Trace到一隻外部專案的API
奇怪的是那隻API
參數的log竟然是空陣列

回頭看一下專案程式碼
參數就是一個簡單的List<string>
把員工的Sn帶入做資料查詢
不知道為什麼Log卻顯示空陣列

找到負責這個專案的同事
查看他們系統的Log
在他們的ELK當中
參數的紀錄也是空的

我看ELK這麼久了
雖然有遇過跳脫字元不顯示的
但是整個參數不見
倒是頭一遭

馬上用postman打了一個request壓壓驚
結果參數竟然神奇
應該說是「正常」的顯示了
所以問題不在ELK

摸摸鼻子再把自家專案打開
查看這個服務的其他API log
參數都正常
唯獨這個用員工Sn查詢的方法有問題

但是實作也不複雜
就是把Request物件序列化為json
然後發送http請求
沒什麼特別的邏輯

但是當我再定睛一看
才發現一個驚為天人的Bug
就是list的初始值放在小括號
而不是放在大括號

用講的好像很抽象
看圖比較明顯
list-trap.png

第一個寫法只是初始化list的Capacity
第二個寫法才會把將值塞入list
今天的bug就是因為第一種

即使C#在編譯時期
就會檢查一大堆錯誤
但今天遇到的這個問題
是編譯不會警告
肉眼也很難馬上發現的Bug

其實之前就聽同事分享過這個Bug
整組人盯著投影幕
看了半天也沒看出來

我那時候聽到笑了好久
沒想到自己遇到時
也是卡了快一個小時才發現
紀錄一下

下回預告

一模一樣的參數設定
最後卻跑出不同的結果
複製是不是在騙我?

下一回
複製失敗bug事件