1 of 14

OpenCensusを使ってみて、

便利なところと、

困ってるところ

GCPUG Admin

Google Developers Expert

Mercari / Merpay Solution Team

@sinmetal

I use OpenCensus with

Language : Go

Backend : Stackdriver

https://gcpug.jp

2 of 14

どんなところでOpenCensus使ってる?

2

  • 趣味で作ってるマルチプレイヤーゲーム
    • Google Kubernetes Engine
    • Google Cloud Firestore
  • Google Cloud SpannerのPerformance Test
    • Google Kubernetes Engine
    • Google Cloud Spanner

https://gcpug.jp

3 of 14

NPC Architecture

3

Google Kubernetes Engine

Google Cloud Firestore

  • Map情報
  • プレイヤー情報
  • モンスター情報

land Pod

  • Go

AI Service

AI Pod

AI Pod

AI Pod

https://gcpug.jp

4 of 14

OpenCensus Trace

4

モンスターの位置の判断処理が100msごとに無限ループで回っているので、ループごとにspanを生成して計測している

実際のソースコード

  • ルートとなるhandleMonster

https://gcpug.jp

5 of 14

Stackdriver Trace

5

AI Podへのリクエストは多少時間かかるかな?と思っていたが、気にするほどではなかったことが分かる

https://gcpug.jp

6 of 14

Stackdriver Trace

6

Firestoreへのリクエストはspanを作ってないのになんで出てるのか?

https://gcpug.jp

7 of 14

OpenCensus Trace

7

  • GCPのClientLibraryを使うと通信の部分にOpenCensusがLibrary側で入れられているので、勝手に出てくる
  • GCPのサービスによっては明示的にSpanが入れられているものもある
    • Spannerの例

https://gcpug.jp

8 of 14

Google Cloud SpannerのPerformance Testに

使ってみたときの話

https://gcpug.jp

9 of 14

Google Cloud SpannerのPerformance Test

9

  • Spannerを使っているとなんかたまに遅い時がある?みたいな話があったので、GKE上でGoで書いたアプリケーションからSpannerにアクセスし続けて、調べていた
    • 実際のソースコード

https://gcpug.jp

10 of 14

レアケースを捕まえるのが難しい

10

  • サンプリングされるので、0.1%程度しか発生しないケースや、再現できないケースを捕まえるのが難しい
    • UUIDでのGET, INSERTなのに、たまにTransactionがAbortされる
    • 1hに1回遅くなる瞬間がある

https://gcpug.jp

11 of 14

レアケースを捕まえるのが難しい

11

  • AlwaysSampleで全部出力しようと試みる
    • trace.ApplyConfig(trace.Config{DefaultSampler: trace.AlwaysSample()})
    • buffer fullになって、地味にこぼしていく
  • 捕まえたいケースが発生した時にtrace.AlwaysSample()のspanを作ったら、出てこないかな?とかも考えたが、そもそも親のspanがstart()した時に、traceを作るかの判断が行われているので、遡ることはできなかった

https://gcpug.jp

12 of 14

Spanはどこの時間を計測しているかを考える (1)

12

  • 例えば span “/tweet/get” に非常に時間がかかっている時、何が考えられるだろうか?

https://gcpug.jp

13 of 14

Spanはどこの時間を計測しているかを考える (2)

13

  • 実際には、SpannerからのResponseをGoのstructに入れる部分に時間がかかっていた。
    • PodのCPU利用率が100%になっていた
  • 単純なDBへのアクセスの部分にSpanを入れていると思っていても、実際にはいろんな細かい処理が存在している

https://gcpug.jp

14 of 14

Thank you

https://gcpug.jp