Perlでもトレーシングがしたい! 〜はてなブログの"見える化"への挑戦〜 / Tracing in Perl

120b74af626c2b23f954926ef68ac5d6?s=47 papix
July 03, 2019

Perlでもトレーシングがしたい! 〜はてなブログの"見える化"への挑戦〜 / Tracing in Perl

120b74af626c2b23f954926ef68ac5d6?s=128

papix

July 03, 2019
Tweet

Transcript

  1. Perlでもトレーシングがしたい! ~はてなブログの"見える化"への挑戦~ by id:papix (@__papix__) 株式会社はてな

  2. papix 株式会社はてな アプリケーションエンジニア (2017年2月~) シニアエンジニア (2019年2月~) ブログMediaチーム サービスリード兼スクラムマスター はてなブログのHTTPS化などを担当しました 一般社団法人

    Japan Perl Association 理事 アカウント類 はてな: id:papix Twitter: @__papix__ GitHub: papix / CPAN: PAPIX ブログ: https://papix.hatena(blog.(com|jp)|diary.jp)/ 趣味はPerlと, (交通機関を利用した)旅行 JGC修行は完遂済み, 今年はSFC修行をしています
  3. 「推測するな, 計測せよ」 ISUCONでよく聞く言葉 元はRob Pike氏(現Google, Goの開発者)の発言だそう: ルール1: プログラムがどこで時間を消費することになるか知ること はできない。ボトルネックは驚くべき箇所で起こるものである。し たがって、どこがボトルネックなのかをはっきりさせるまでは、推

    測を行ったり、スピードハックをしてはならない。 ルール2: 計測すべし。計測するまでは速度のための調整をしてはな らない。コードの一部が残りを圧倒しないのであれば、なおさらで ある。
  4. 見える化の重要性 近年, Webサービスはどんどん高性能化している それに伴って, Webサービスの構成も複雑化している コードベースの大規模化, マイクロサービス化... それらに立ち向かうには"推測"では不十分 計測した結果(= 見える化した結果)に基づいて対処しないとい

    けない
  5. はてなブログの開発における「見える化」 インフラの見える化 エラーの見える化 処理の見える化

  6. 「見える化」を実現する方法

  7. はてなの場合: インフラの見える化 Mackerel はてな製のインフラ可視化/管理SaaS はてなブログでももちろん活用しています

  8. None
  9. None
  10. はてなの場合: エラーの見える化 Sentry エラーをトラッキングしてくれるSaaS SDKを入れることで勝手にエラー情報をまとめてくれる

  11. None
  12. はてなの場合: 処理の見える化 AWS X‑Ray AWSが提供する"分散トレーシング" as a Service このトークでは, はてなブログにおけるAWS

    X‑Rayについての アレコレをご紹介します
  13. Perlでもトレーシングがしたい! ~はてなブログの"見える化"への挑戦~ by id:papix (@__papix__) 株式会社はてな

  14. トレーシング/トレースとは トレース Wikipedia曰く, プログラミングにおいて、命令の実行された形跡 をたどること。 = 処理の見える化(可視化) 可視化をすることで, バグ調査の助けにしたり, 最適化の道筋を

    立てたり出来る
  15. Perlにおけるトレーシング Devel::NYTProf NYTはNewYork Times NYT社内のエンジニア有志が作ったらしい... Devel::KYTProf KYTは京都 弊社サービスシステム開発本部部長, id:onishiのモジュール

  16. Devel::KYTProf use するだけでいろいろいい感じに表示してくれる 以下はFurl::HTTPのProfilerでFurlを使ったHTTPリクエストを トレースした様子

  17. ProfilerとLogger Profiler ... 実際にトレースする君 データベースの読み書き, HTTPリクエスト, Memcachedの読 み書きなどをトレースできる 他, Redis用のProfilerもCPANizeされている

    昨日, AWS::CLIWrapperのProfilerを書いた → Devel::KYTProf::Profiler::AWS::CLIWrapper Logger ... トレース結果を出力する君 指定しなければSTDERRに出す
  18. ところで... Devel::KYTProfを追えば, DBIを使ったデータベースアクセスなどを トレース出来る しかし, 実際のバックエンドサーバーは同時に大量のリクエストを 捌く もし, 本番環境でトレーシングしようとすると...? あるトレース結果がどのリクエストによるものかが判定出来な

    い 単発の操作のトレースはできるが, あるリクエストに起因して 起きた一連の操作のトレーシングはできない!
  19. そこで...

  20. AWS X‑Ray 本番環境や分散アプリケーションの分析とデバッグ

  21. 詳しくは... Perlでも分散トレーシングしたい!AWS::XRay による解析とその実 装 https://speakerdeck.com/fujiwara3/yapc‑tokyo‑2019 Web+DB PRESS Vol.111 Perl Hackers

    Hub 「AWS X‑Rayによる分散 トレーシング」
  22. AWS X‑Rayの構成 SDK -(UDP)-> daemon -> API 各プログラミング言語向けにSDKが提供されている SDKは, トレースした結果をUDPでdaemonに送る

    daemonはAWSが提供しているので, EC2インスタンスによし なに置いてあげるとよい daemonへはUDPで通信するので, 最悪daemonが死んでいても 安心 daemonはAWSが提供するAPIに向けてトレース結果を送る 開発者は, X‑Rayのコンソールでトレース結果を見れる
  23. AWS X‑Rayにおけるトレース AWS X‑Rayでは... 1リクエスト = 1トレース トレースは, 幾つかのセグメントを持つ 分散トレーシングのための仕様としては"OpenTracing"などが存在

    する ベンダー非依存のAPI仕様とライブラリを提供 OpenTracingでは... 1リクエスト = 1トレース トレースは幾つかのスパンを持つ
  24. X‑Rayの嬉しさ あるリクエストによって行われた全ての処理(それぞれが1つのセグ メントになる)を紐づけてトレース出来る 更に, (SDKを入れて対応していれば)あるリクエストによって他のサ ービスにリクエストが飛んだ時も, まとめてトレース出来る = 分散トレーシング!!!!

  25. ところでお値段は? トレースの記録 毎月10万トレースまで無料 100万件あたり5 USD トレースの取得/スキャン 取得/スキャンあわせて毎月100万回まで無料 取得は100万件あたり0.5 USD スキャンは100万件あたり0.5USD

    はてなブログの規模だと, サンプリングレートを指定してある程度 絞る必要がある
  26. 実際にやってみた Perlのための, X‑RayのSDKは... (AWSが公式に提供するものは)な い... さらに言えば, PerlはそもそもAWSのSDKが... ない... ので, 有志が作ったAWS::CLIWrapperというモジュールが

    CPANで公開されていて, 内部で aws コマンドを実行すること でAWSの操作をやっている...
  27. そこで... fujiwaraさんがなんとかしてくれました! AWS::XRay Perl製のAWS X‑Ray用ライブラリ Devel::KYTProf::Logger::XRay Devel::KYTProfでトレースした結果をXRayに送る Devel::KYTProfで計測した内容を, AWS X‑Rayを使ってトレースで

    きる!
  28. 実装方針 ひとまず一部のインスタンスにのみ, X‑Rayを導入する 若干とはいえパフォーマンス劣化は存在するため 現在, サンプリングレートは0.1%としてみている 環境変数 ENABLE_AWS_XRAY が真値を返す(真値を返すように設定 した)EC2インスタンスで動作するbackendサーバのみ有効化

  29. cpanfile requires 'AWS::XRay'; requires 'Devel::KYTProf'; requires 'Devel::KYTProf::Logger::XRay'; requires 'Devel::KYTProf::Profiler::Redis::Fast';

  30. app.psgi if ($ENV{'ENABLE_AWS_XRAY'}) { require AWS::XRay; require Devel::KYTProf; require Devel::KYTProf::Logger::XRay;

    Devel::KYTProf->apply_prof('Cache::Memcached::Fast'); Devel::KYTProf->apply_prof('DBI'); Devel::KYTProf->apply_prof('LWP::UserAgent'); Devel::KYTProf->apply_prof('Redis::Fast'); Devel::KYTProf->logger('Devel::KYTProf::Logger::XRay'); }
  31. Plack::Middlewareの読み込み enable 'Plack::Middleware::XRay', name => 'Hatena-Blog', sampling_rate => 0.1, #

    = 10% サンプリング ;
  32. None
  33. None
  34. None
  35. None
  36. None
  37. None
  38. sampler と response_filter

  39. Tips: 強制的にトレーシングする enable 'Plack::Middleware::XRay', name => 'Hatena-Blog', sampler => sub

    { my ($env) = @_; # Plack::Request を作ってクエリパラメータを見て, # `force_aws_xray` の値が # XRay を強制的に有効にするためのトークンと一致していれば, # 必ず1 を返す = XRay でトレーシングする my $req = Plack::Request->new($env); my $token = $req->parameters->{force_aws_xray}; return 1 if defined $token && $token eq 'SAMPLE_TOKEN'; # sampling rate でXRay でトレーシングするか判定 return rand() < 0.1; # = 10% サンプリング }, ;
  40. トレースを活かす 定期的に眺める チームで眺める → PWG 改善点を見つける Mackerelのグラフとはまた違う視点/粒度でサービスを見つめ ることができる

  41. まとめ はてなブログで取り組んでいる"見える化"についてご紹介しました 特に, AWS X‑Rayの導入や活用について詳しく説明しました 引き続き, これら"見える化"の成果を元に, より良く/より安定したブ ログ体験を皆様に提供できるよう, 頑張っていきます