Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go で Cloud Logging を 使いこなすための slog 活用法

nownabe
October 06, 2023

Go で Cloud Logging を 使いこなすための slog 活用法

Google Cloud (GCP) の Cloud Logging の実践的な活用方法と、それを Go 言語の log/slog で実装する方法。

@ Encraft #7 AppDev with Google Cloud
https://knowledgework.connpass.com/event/294440/

nownabe

October 06, 2023
Tweet

More Decks by nownabe

Other Decks in Technology

Transcript

  1. Go で Cloud Logging を 使いこなすための slog 活用法 2023-10-06 Encraft

    #7 AppDev with Google Cloud ナレッジワーク Shogo Watanabe (@nownabe)
  2. © Knowledge Work Inc. 自己紹介 2 Shogo Watanabe (@nownabe /

    Shawn) • Software Engineer • 株式会社ナレッジワークの Platform Group 所属 • 入社 3 ヶ月 • Google Cloud、Go、Ruby が好き • 趣味は犬と漫画とスプラトゥーン
  3. © Knowledge Work Inc. 3 Google Cloud をこれから使いたい or 使い始めたばかりな方へ

    • Cloud Logging を使いこなす方法 • Go の log/slog を使った実装方法 • ナレッジワークでの Cloud Logging 活用状況と課題 今日話すこと
  4. © Knowledge Work Inc. 5 Google Cloud のログ管理サービス 様々なログにまつわる機能 •

    各種サービスのログや監査ログを自動集約 • Cloud Run や GKE などのアプリログを自動集約 • ログの閲覧が可能 • クエリや時間によるフィルタリング • Cloud Storage や BigQuery へのエクスポート • ログアラート • Google Cloud 以外のログにも対応 Cloud Logging って何?
  5. © Knowledge Work Inc. 6 様々な Google Cloud サービスと連携可能 •

    Cloud Trace • Cloud Monitoring • Error Reporting • Log Analytics • Cloud Storage • BigQuery • など Cloud Logging の連携サービス
  6. © Knowledge Work Inc. 8 Cloud Logging に JSON 形式でログを出力すると自動で構造を認識してくれる

    構造化ログ textPayload にただの文字列とし て認識されている jsonPayload として構造が認識 されている 非構造化ログ 構造化ログ
  7. © Knowledge Work Inc. 9 特別な役割を持つフィールドを使いこなす = Cloud Logging を使いこなすための第一歩

    • severity • message • httpRequest • time / timestamp • insertId • labels • operation • sourceLocation • spanId • trace • traceSampled • stack_trace • exception 構造化ログの特別なフィールド
  8. © Knowledge Work Inc. 10 ログエントリのメッセージを設定 Log Explorer のログエントリに表示される message

    フィールド message フィールドの値が表示される message なし message あり JSON がすべて表示される
  9. © Knowledge Work Inc. 11 ログエントリの重大度を設定 視認性が向上し、フィルタリングが容易に severity フィールド (1/2)

    severity なし severity あり Default として認識されている Info として認識されている
  10. © Knowledge Work Inc. 12 Severity は全部で 9 種類 •

    DEFAULT • DEBUG • INFO • NOTICE • WARNING • ERROR • CRITICAL • ALERT • EMERGENCY 詳細: ドキュメント / proto / Go SDK severity フィールド (2/2)
  11. © Knowledge Work Inc. 14 ログエントリに任意の Key-Value を追加 "logging.googleapis.com/labels" キーに

    map[string]string なオブジェクトを与える labels フィールド labels として認識される Log Analytics と相性いいかも?
  12. © Knowledge Work Inc. 16 ログエントリが紐づく Trace や Span を設定

    "logging.googleapis.com/trace" キーと "logging.googleapis.com/spanId" キーを追加 Cloud Trace 連携 (1/2) Cloud Trace のアイコン が表示される
  13. © Knowledge Work Inc. 17 Cloud Trace で Trace や

    Span に紐づくログをワンクリックで表示可能 Cloud Trace 連携 (2/2)
  14. © Knowledge Work Inc. 18 "stack_trace" フィールドにスタックトレースを追加すると Error Reporting にエラーが連携される

    Java、Python、Node、Ruby、C#、PHP、Go に対応 Error Reporting 連携 (1/2) { "severity": "ERROR", "message": "Something went wrong!", "stack_trace": "Something went wrong!\n\ngoroutine 76 [running]:\nmain.(*server).Echo(0x43ef840715ccb?, {0x1049e6168, 0x140004b46f0}, 0x1400024b640)\n github.com/knowledge-work/experimental/nownabe/sand box/grpchello/main.go:45 +0x384\ngithub.com/knowledge-work/experimental/nown abe/sandbox/grpchello/proto._EchoService_Echo_Handl er.func1({0x1049e6168, 0x140004b46f0}, {0x10493e7e0?, 0x1400024b640})\n …" } 同じエラーによるログのフィルタリング ができるように
  15. © Knowledge Work Inc. 22 Cloud Logging 構造化ログの特別なフィールドとズレているものがある • time

    はよさそう • level → severity に変える必要がある • msg → message に変える必要がある • trace や sourceLocation も追加したい カスタマイズなしで slog を使うと
  16. © Knowledge Work Inc. 23 msg → message slog.HandlerOptions の

    ReplacerAttr で replacer を指定 キー名を置換する replacer を定義
  17. © Knowledge Work Inc. 24 level → severity キー名は ReplaceAttr

    で置換 slog.Log で明示的に Severity を指定 Cloud Logging 用の Severity を定義
  18. © Knowledge Work Inc. 26 trace & spanId 追加 slog.Handler

    interface を満たす 独自 Handler を定義 Handle メソッドで ctx から取ったデータを slog.Record に追加 Handler から Logger を作って デフォルト Logger に設定
  19. © Knowledge Work Inc. 27 • slog のバックエンド • 独自

    Handler を定義することで様々なカスタマイズが可能 ◦ context によるログレコード操作など slog.Handler interface
  20. © Knowledge Work Inc. 28 labels 追加 WithAttrs で Handler

    に key-value を追加 デフォルト Logger にセット
  21. © Knowledge Work Inc. 29 stack_trace 追加 スタックトレースが取れる error が必要

    フォーマットは panic と同じ ログ出力時に "stack_trace" の key-value を追加 現実的にはラッパーを実装した方が良い (その場合 sourceLocation も自前実装)
  22. © Knowledge Work Inc. 30 Cloud Logging への最適化で見える log/slog でのログ実装戦略

    Cloud Logging フィールド key-value のスコープ 実装方法 message ログレコード単体 (slog 標準機能の変更) ReplaceAttr severity ログレコード単体 (slog 標準機能の変更) ReplaceAttr sourceLocation ログレコード単体 (slog 標準機能の変更) ReplaceAttr stack_trace ログレコード単体 出力時に key-value 追加 labels Context 独自 Handler trace Context 独自 Handler spanId Context 独自 Handler labels プロセス デフォルト Logger にフィールド追加 追加したい key-value のスコープによって実装方法が変わる
  23. © Knowledge Work Inc. 31 • log/slog - Go Packages

    ◦ 公式ドキュメント • Structured Logging with slog - The Go Programming Language ◦ 公式ブログ • A Guide to Writing slog Handlers ◦ slog の Logger と Handler の概念や使い方のガイド • go.nownabe.dev/clog ◦ Cloud Logging に最適化した log/slog ベースのログライブラリ ◦ 多分ある程度は動くはず… 詳しくは
  24. © Knowledge Work Inc. 33 • JSON による構造化ログを活用 • リクエストに紐づくユーザーやテナントの

    ID を構造化ログのフィールドに出力 • トラブルシュートでは Log Analytics が大活躍 最近の改善 • Cloud Trace との連携を強化した ◦ 紐づいていないログがあった • Error Reporting と連携するようにした ◦ スタックトレース表示がすっきり見やすくなった ◦ Datadog の Error Tracking も精度がよくなった ナレッジワークの Cloud Logging 活用状況
  25. © Knowledge Work Inc. 34 • labels / sourceLocation /

    spanId フィールドの活用 ◦ ユーザーやテナント情報を labels に入れてわかりやすくしたい ◦ sourceLocation で呼び出し元をわかりやすくしたい ◦ trace だけでなく spanId を紐づけてより traceability を強化したい • severity 対応 ◦ ERROR と ALERT の Severity を使い分けて監視したい • slog 導入 ◦ 今は zerolog を使っている ◦ slog だと Cloud Logging に合わせた Severity が設定可能 ◦ labels / spanId など context-scoped なフィールドがよりシンプルに実装できる ◦ 構造化ログライブラリとして必要十分なので今後の標準になるのでは? ナレッジワークの Cloud Logging まわりの課題