Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

そこで...

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

sampler と response_filter

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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