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

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

papix
July 03, 2019

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

papix

July 03, 2019
Tweet

More Decks by papix

Other Decks in Technology

Transcript

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

    View Slide

  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修行をしています

    View Slide

  3. 「推測するな, 計測せよ」
    ISUCONでよく聞く言葉
    元はRob Pike氏(現Google, Goの開発者)の発言だそう:
    ルール1: プログラムがどこで時間を消費することになるか知ること
    はできない。ボトルネックは驚くべき箇所で起こるものである。し
    たがって、どこがボトルネックなのかをはっきりさせるまでは、推
    測を行ったり、スピードハックをしてはならない。
    ルール2: 計測すべし。計測するまでは速度のための調整をしてはな
    らない。コードの一部が残りを圧倒しないのであれば、なおさらで
    ある。

    View Slide

  4. 見える化の重要性
    近年, Webサービスはどんどん高性能化している
    それに伴って, Webサービスの構成も複雑化している
    コードベースの大規模化, マイクロサービス化...
    それらに立ち向かうには"推測"では不十分
    計測した結果(= 見える化した結果)に基づいて対処しないとい
    けない

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  8. View Slide

  9. View Slide

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

    View Slide

  11. View Slide

  12. はてなの場合: 処理の見える化
    AWS X‑Ray
    AWSが提供する"分散トレーシング" as a Service
    このトークでは, はてなブログにおけるAWS X‑Rayについての
    アレコレをご紹介します

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  17. ProfilerとLogger
    Profiler ... 実際にトレースする君
    データベースの読み書き, HTTPリクエスト, Memcachedの読
    み書きなどをトレースできる
    他, Redis用のProfilerもCPANizeされている
    昨日, AWS::CLIWrapperのProfilerを書いた
    → Devel::KYTProf::Profiler::AWS::CLIWrapper
    Logger ... トレース結果を出力する君
    指定しなければSTDERRに出す

    View Slide

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

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

    View Slide

  19. そこで...

    View Slide

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

    View Slide

  21. 詳しくは...
    Perlでも分散トレーシングしたい!AWS::XRay による解析とその実

    https://speakerdeck.com/fujiwara3/yapc‑tokyo‑2019
    Web+DB PRESS Vol.111 Perl Hackers Hub 「AWS X‑Rayによる分散
    トレーシング」

    View Slide

  22. AWS X‑Rayの構成
    SDK -(UDP)-> daemon -> API
    各プログラミング言語向けにSDKが提供されている
    SDKは, トレースした結果をUDPでdaemonに送る
    daemonはAWSが提供しているので, EC2インスタンスによし
    なに置いてあげるとよい
    daemonへはUDPで通信するので, 最悪daemonが死んでいても
    安心
    daemonはAWSが提供するAPIに向けてトレース結果を送る
    開発者は, X‑Rayのコンソールでトレース結果を見れる

    View Slide

  23. AWS X‑Rayにおけるトレース
    AWS X‑Rayでは...
    1リクエスト = 1トレース
    トレースは, 幾つかのセグメントを持つ
    分散トレーシングのための仕様としては"OpenTracing"などが存在
    する
    ベンダー非依存のAPI仕様とライブラリを提供
    OpenTracingでは...
    1リクエスト = 1トレース
    トレースは幾つかのスパンを持つ

    View Slide

  24. X‑Rayの嬉しさ
    あるリクエストによって行われた全ての処理(それぞれが1つのセグ
    メントになる)を紐づけてトレース出来る
    更に, (SDKを入れて対応していれば)あるリクエストによって他のサ
    ービスにリクエストが飛んだ時も, まとめてトレース出来る
    = 分散トレーシング!!!!

    View Slide

  25. ところでお値段は?
    トレースの記録
    毎月10万トレースまで無料
    100万件あたり5 USD
    トレースの取得/スキャン
    取得/スキャンあわせて毎月100万回まで無料
    取得は100万件あたり0.5 USD
    スキャンは100万件あたり0.5USD
    はてなブログの規模だと, サンプリングレートを指定してある程度
    絞る必要がある

    View Slide

  26. 実際にやってみた
    Perlのための, X‑RayのSDKは... (AWSが公式に提供するものは)な
    い...
    さらに言えば, PerlはそもそもAWSのSDKが... ない...
    ので, 有志が作ったAWS::CLIWrapperというモジュールが
    CPANで公開されていて, 内部で aws
    コマンドを実行すること
    でAWSの操作をやっている...

    View Slide

  27. そこで...
    fujiwaraさんがなんとかしてくれました!
    AWS::XRay
    Perl製のAWS X‑Ray用ライブラリ
    Devel::KYTProf::Logger::XRay
    Devel::KYTProfでトレースした結果をXRayに送る
    Devel::KYTProfで計測した内容を, AWS X‑Rayを使ってトレースで
    きる!

    View Slide

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

    View Slide

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

    View Slide

  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');
    }

    View Slide

  31. Plack::Middlewareの読み込み
    enable 'Plack::Middleware::XRay',
    name => 'Hatena-Blog',
    sampling_rate => 0.1, # = 10%
    サンプリング
    ;

    View Slide

  32. View Slide

  33. View Slide

  34. View Slide

  35. View Slide

  36. View Slide

  37. View Slide

  38. sampler
    と response_filter

    View Slide

  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%
    サンプリング
    },
    ;

    View Slide

  40. トレースを活かす
    定期的に眺める
    チームで眺める → PWG
    改善点を見つける
    Mackerelのグラフとはまた違う視点/粒度でサービスを見つめ
    ることができる

    View Slide

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

    View Slide