Open sinmetal opened 5 years ago
GKEがどうやってログ送ってるかは https://speakerdeck.com/ytakky2014/gkedeha-stackdriver-loggingni-douyatuteroguwosong-tuteiruka が詳しい。
でも、この問題は gcloud logging write
でも発生するので、GKEやfluentdはあまり関係ないようだ。
GoのLogging Libraryだけですべてが解決するのかは分からないが、修正が入ってるようだ https://github.com/googleapis/google-cloud-go/issues/1150
文字列として送るのであれば丸められる問題は解決するだろうけど、すでに行われているであろう数値としての比較がぶっ壊れるから今は修正できないというのが結論っぽい https://github.com/googleapis/google-cloud-go/issues/1150#issuecomment-518453164
ワカル
僕はログから直で引っ張って比較とかをしたことないけれど、Stackdriver側でstringに変換するより、アプリケーション側でstringにして吐き出した方が無難かなぁという気持ち
Payload interface{}
に map じゃなくて struct を渡すのであれば、 int64 なフィールドの struct tag に string
をつけておけば良いのではないかという気がする。
https://godoc.org/encoding/json#Marshal
The "string" option signals that a field is stored as JSON inside a JSON-encoded string. It applies only to fields of string, floating point, integer, or boolean types.
WHAT
Stackdriver LoggingのJsonPayloadに大きな数値を出力すると、誤差が出る。 JavaScriptで誤差が出る時と同じ値になるので、どこかでNode.jsとかが処理をしている?
投げたPayloadはnumもtextも
36028797018963966
だが、取得するとnumは36028797018963968
になっている。どうまるめられるかのメモ
WHY
GKEで標準出力に1lineでJsonを出力すれば https://cloud.google.com/logging/docs/structured-logging として扱ってくれるが、大きな数値はまるめられちゃうので、stringに変換するなどの工夫が必要そう。