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

OpenTelemetryのバックエンドを作ってparquetと戯れている話

mrasu
September 28, 2023

 OpenTelemetryのバックエンドを作ってparquetと戯れている話

mrasu

September 28, 2023
Tweet

Other Decks in Programming

Transcript

  1. OpenTelemetryのバックエンド
    を作ってparquetと戯れている話
    株式会社Vaxila Labs
    杉中宏亮

    View Slide

  2. ⾃⼰紹介
    ● 杉中 宏亮 (@m_rasu)
    ● 株式会社 Vaxila Labs
    ● 趣味では昔からGo、仕事では
    1年ぐらい

    View Slide

  3. SRE NEXTに
    落ちたので来ました

    View Slide

  4. SRE NEXTに落ちたので来ました
    SRE NEXTは明⽇。
    SRE NEXTではOpenTelemetry関連のOSSの話をしようと
    思ってましたが、
    Goの⼈たちの前なので僕が書いている実装の話をします。

    View Slide

  5. OpenTelemetryネィティブの監視SaaSで
    会社を作りました

    View Slide

  6. 話したいこと
    Parquetのためにしてる⼯夫
    -> Parquet 楽しい

    View Slide

  7. ⽬次
    1. Parquetとは
    2. OpenTelemetryとは
    3. Vaxilaとは
    4. Parquetと遊ぶ
    a. ファイルの内容を考える
    b. Athenaと遊ぶ

    View Slide

  8. ⽬次
    1. Parquetとは
    2. OpenTelemetryとは
    3. Vaxilaとは
    4. Parquetと遊ぶ
    a. ファイルの内容を考える
    b. Athenaと遊ぶ

    View Slide

  9. Parquetとは
    ● 列指向のファイルフォーマット
    ○ CSVやJSONは⾏指向
    ● ⼤規模なデータを保存するときによく使われる
    ● カラム単位でエンコーディング⽅法を変えられる
    ● Readに強い代わりに、Writeはダメ

    View Slide

  10. Parquetのエンコーディング⽅法
    代表例
    ● Run length Encoding
    ○ 「a,a,a,b,b,b,a,a」 -> 「a3b3a2」みたいな
    ● Delta Encoding
    ○ 差分を書くことで容量圧縮
    ○ 時間の列で⾼威⼒
    ○ 「7,5,3,1」 -> 「7,-2, 3 (最初が7で、-2を連続3回)」みたいな
    ● zstd,snappy,lz4 なども

    View Slide

  11. Goで使う
    Goなら
    ● xitongsys/parquet-go
    ● parquet-go/parquet-go
    Vaxilaでは「parquet-go/parquet-go」を使⽤

    View Slide

  12. ⽬次
    1. Parquetとは
    2. OpenTelemetryとは
    3. Vaxilaとは
    4. Parquetと遊ぶ
    a. ファイルの内容を考える
    b. Athenaと遊ぶ

    View Slide

  13. OpenTelemetry とは
    OpenTelemetry is a vendor-neutral open-source
    Observability framework
    - 公式 https://opentelemetry.io/docs/

    View Slide

  14. OpenTelemetry とは
    簡単に⾔うと、
    ● 分散トレーシング
    ● メトリクス
    ● ログ
    を作ったり、送信したりするのに必要なSDK、プロトコルな
    ど⼀式
    ベンダー⾮依存が特徴

    View Slide

  15. OpenTelemetryの流れ

    View Slide

  16. OpenTelemetry で分散トレーシング
    分散トレーシングという名前だが、分散環境じゃなくても便利
    下図の1本1本がSpan
    SpanにはHTTPのパスやSQLなど⾊々記録している

    View Slide

  17. OpenTelemetry は Protocol Buffers
    ● データを送信する時は基本的にProtocol Buffers
    ● json もできる
    ● Apache Arrow の実装もそのうちできそう

    View Slide

  18. Protocol Buffers例
    message TracesData {
    repeated ResourceSpans resource_spans;
    }
    message ResourceSpans {
    repeated ScopeSpans scope_spans;
    }
    message ScopeSpans {
    repeated Span spans;
    }
    message Span {
    bytes trace_id;
    bytes span_id;
    repeated KeyValue attributes;
    }
    例えば、トレーシングのProtocol Buffersはこんな感じ
    attributes の中に、
    URLや実⾏したSQLが⼊ってい

    View Slide

  19. OpenTelemetry は Protocol Buffers
    VaxilaではParquetのフォーマットで保存している

    View Slide

  20. ⽬次
    1. Parquetとは
    2. OpenTelemetryとは
    3. Vaxilaとは
    4. Parquetと遊ぶ
    a. ファイルの内容を考える
    b. Athenaと遊ぶ

    View Slide

  21. Vaxilaとは
    ● 問題を解決するための監視ツール
    ● OpenTelemetryを使ってエラーや速度低下の原因を探し
    て教える
    「SLOを良くするために」

    View Slide

  22. なんで作った?
    ● 原因を⾒つけるために⾊々な特徴を探してた
    「これ、⼈間がやる必要ある?」
    -> 機械がやれよ
    ● 「それ、前からエラー鳴ってたみたいですが、
    全員無視してますね‧‧‧」を無くしたい
    ● 安く

    View Slide

  23. SLOに問題が!
    原因特定の流れ

    View Slide

  24. エラーのトレースと、それ以外を⽐べて原因を推測する
    原因特定の流れ

    View Slide

  25. attributes の分布からエラー原因を探すことも
    原因特定の流れ

    View Slide

  26. アーキテクチャ
    S3にParquet

    View Slide

  27. ⽬次
    1. Parquetとは
    2. OpenTelemetryとは
    3. Vaxilaとは
    4. Parquetと遊ぶ
    a. ファイルの内容を考える
    b. Athenaと遊ぶ

    View Slide

  28. Parquetと遊んでいます
    ● S3にParquet
    ● Athenaで検索

    View Slide

  29. Parquet (OpenTelemetry) ファイルから原因を探す
    ● 例外が起きたか?
    ● 実⾏時間が⻑すぎないか?
    ● エラーではないSpanと⽐較すれば
    ○ 「user_idが99のときだけエラー起きてるな」
    ○ 「このインスタンスだけ遅いから捨てよう」
    というのがわかる

    View Slide

  30. ⽬次
    1. Parquetとは
    2. OpenTelemetryとは
    3. Vaxilaとは
    4. Parquetと遊ぶ
    a. ファイルの内容を考える
    b. Athenaと遊ぶ

    View Slide

  31. OpenTelemetryのフォーマットは使わない
    Athena (trino) は配列内に触れるとスキャン量がかなり増える
    -> GoではSpanをトップレベルに
    type TraceSpan struct {
    TraceID []byte `parquet:"trace_id"`
    SpanID []byte `parquet:"span_id"`
    Attributes []Attribute `parquet:"attributes,list"`
    Scope InstrumentationScope `parquet:"scope"`
    }
    message ScopeSpans {
    InstrumentationScope scope;
    repeated Span spans;
    }
    message Span {
    bytes trace_id;
    bytes span_id;
    repeated KeyValue attributes;
    }
    go
    pb

    View Slide

  32. エンコーディングを選ぶ
    今は無難なところを指定している
    ● stringの列はzstd
    ● 時間を表す列はdelta encoding
    type TraceSpan struct {
    SpanID []byte `parquet:"span_id"`
    Name string `parquet:"name,zstd"`
    StartTimeUnixNano uint64 `parquet:"start_time_unix_nano,delta"`
    EndTimeUnixNano uint64 `parquet:"end_time_unix_nano,delta"`
    }

    View Slide

  33. 頻出フィールドを冗⻑化する
    Spanの属性には “service.name”
    というキーがよく検索条件になる
    -> トップレベルにフィールドを作る
    他にも、
    「例外が起きたか」
    などを事前に計算
    type TraceSpan struct {
    TraceID []byte `parquet:"trace_id"`
    ServiceName string `parquet:"service_name,zstd,dict"`
    HasExceptionEvent bool `parquet:"has_exception_event"`
    }
    トレース検索の絞り込み

    View Slide

  34. ⽬次
    1. Parquetとは
    2. OpenTelemetryとは
    3. Vaxilaとは
    4. Parquetと遊ぶ
    a. ファイルの内容を考える
    b. Athenaと遊ぶ

    View Slide

  35. Athenaを使う = SQL を書く
    SQLは頑張る
    ● Athenaは途中の結果を再使⽤しない
    ○ 2回参照したら2回読み込まれる -> 遅い‧お⾦かかる
    ● つまり、UNIONと相性が悪い
    -> concat, case, filter などで1回しか読まなくてもい
    いように頑張る

    View Slide

  36. ファイル数を減らして⾼速化
    Athenaはファイルを参照するのは時間がかかる
    「⼩さいファイルが⼀杯」よりも、「巨⼤なファイルが
    少々」の⽅が速い
    (Parquetの効率も良くなる)

    View Slide

  37. ×「データが来るたびにファイルを作る」
    ○「数秒待って1ファイルにまとめる」
    キューで⼀括保存

    View Slide

  38. 別DBにある項⽬で絞り込み
    検索項⽬がRDB(Aurora)にあることがある
    「この問題が起きたTraceの中から検索したい」
    -> 100万Traceあったら100万個のORがついたSQLが必要ってこと
    ‧‧‧?
    -> TraceIdを全部⼊れたファイルを⼀時的にアップロードしてAthena
    上でTraceIdを取得できるようにする
    トレース検索の絞り込み

    View Slide

  39. と、⾊々している

    View Slide

  40. 結論
    Parquet 楽しい

    View Slide

  41. 以上
    X(@vaxila_labs)もよろしくお願いします。

    View Slide