Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Perlでもトレーシングがしたい! 〜はてなブログの"見える化"への挑戦〜 / Tracing...
Search
papix
July 03, 2019
Technology
1.4k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Perlでもトレーシングがしたい! 〜はてなブログの"見える化"への挑戦〜 / Tracing in Perl
papix
July 03, 2019
More Decks by papix
See All by papix
Houtou.pm #1
papix
0
1.9k
Perl歴約10年のエンジニアがフルスタックTypeScriptに出会ってみた
papix
1
760
YAPC::Kyotoの「全て」 / All of "YAPC::Kyoto"
papix
0
1.7k
イベントの中の人 / Inside the Events
papix
0
370
2022年に始めるPerlでWebサービス開発(趣味)
papix
0
640
ワーケーションに関する考察
papix
3
2.3k
(今更)Amplifyさっくり体験
papix
0
930
はてなにおけるGitHub Actions活用事例 / GitHub Actions in Hatena
papix
0
2.9k
ミススペルを発見するmisspellのご紹介 / Introduce misspell
papix
0
1.3k
Other Decks in Technology
See All in Technology
ブラウザ研修 2026
recruitengineers
PRO
3
500
モバイルアプリ開発概論2026
recruitengineers
PRO
1
320
GitHub CopilotのFinOps- AI CreditのObservabilityと価値を生むためのエージェント設計
yuriemori
0
110
Breaking the Seal: Static Deobfuscation of Compiled V8 JavaScript Bytecode Malware
hshrzd
0
480
ガバメントクラウドでのランサムウェア対策
techniczna
1
770
Goでデータパイプラインを作ろう
sansantech
PRO
0
250
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
4
24k
Master Dataグループ紹介資料
sansan33
PRO
1
4.8k
Pavlokで始める電撃駆動開発
sgrsn
0
170
PLaMo 3.0 Primeの事後学習
pfn
PRO
0
270
タクシーアプリ『GO』の実践的データ活用〜位置情報データの収集とStreamlitでの可視化〜
mot_techtalk
2
200
新しい SLO が良い感じにハマっている話
z63d
4
2.1k
Featured
See All Featured
The Pragmatic Product Professional
lauravandoore
37
7.4k
The Curious Case for Waylosing
cassininazir
1
450
Testing 201, or: Great Expectations
jmmastey
46
8.2k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
820
What's in a price? How to price your products and services
michaelherold
247
13k
Building Adaptive Systems
keathley
44
3.2k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
230
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
360
Paper Plane
katiecoart
PRO
2
52k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Believing is Seeing
oripsolob
1
180
Transcript
Perlでもトレーシングがしたい! ~はてなブログの"見える化"への挑戦~ by id:papix (@__papix__) 株式会社はてな
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修行をしています
「推測するな, 計測せよ」 ISUCONでよく聞く言葉 元はRob Pike氏(現Google, Goの開発者)の発言だそう: ルール1: プログラムがどこで時間を消費することになるか知ること はできない。ボトルネックは驚くべき箇所で起こるものである。し たがって、どこがボトルネックなのかをはっきりさせるまでは、推
測を行ったり、スピードハックをしてはならない。 ルール2: 計測すべし。計測するまでは速度のための調整をしてはな らない。コードの一部が残りを圧倒しないのであれば、なおさらで ある。
見える化の重要性 近年, Webサービスはどんどん高性能化している それに伴って, Webサービスの構成も複雑化している コードベースの大規模化, マイクロサービス化... それらに立ち向かうには"推測"では不十分 計測した結果(= 見える化した結果)に基づいて対処しないとい
けない
はてなブログの開発における「見える化」 インフラの見える化 エラーの見える化 処理の見える化
「見える化」を実現する方法
はてなの場合: インフラの見える化 Mackerel はてな製のインフラ可視化/管理SaaS はてなブログでももちろん活用しています
None
None
はてなの場合: エラーの見える化 Sentry エラーをトラッキングしてくれるSaaS SDKを入れることで勝手にエラー情報をまとめてくれる
None
はてなの場合: 処理の見える化 AWS X‑Ray AWSが提供する"分散トレーシング" as a Service このトークでは, はてなブログにおけるAWS
X‑Rayについての アレコレをご紹介します
Perlでもトレーシングがしたい! ~はてなブログの"見える化"への挑戦~ by id:papix (@__papix__) 株式会社はてな
トレーシング/トレースとは トレース Wikipedia曰く, プログラミングにおいて、命令の実行された形跡 をたどること。 = 処理の見える化(可視化) 可視化をすることで, バグ調査の助けにしたり, 最適化の道筋を
立てたり出来る
Perlにおけるトレーシング Devel::NYTProf NYTはNewYork Times NYT社内のエンジニア有志が作ったらしい... Devel::KYTProf KYTは京都 弊社サービスシステム開発本部部長, id:onishiのモジュール
Devel::KYTProf use するだけでいろいろいい感じに表示してくれる 以下はFurl::HTTPのProfilerでFurlを使ったHTTPリクエストを トレースした様子
ProfilerとLogger Profiler ... 実際にトレースする君 データベースの読み書き, HTTPリクエスト, Memcachedの読 み書きなどをトレースできる 他, Redis用のProfilerもCPANizeされている
昨日, AWS::CLIWrapperのProfilerを書いた → Devel::KYTProf::Profiler::AWS::CLIWrapper Logger ... トレース結果を出力する君 指定しなければSTDERRに出す
ところで... Devel::KYTProfを追えば, DBIを使ったデータベースアクセスなどを トレース出来る しかし, 実際のバックエンドサーバーは同時に大量のリクエストを 捌く もし, 本番環境でトレーシングしようとすると...? あるトレース結果がどのリクエストによるものかが判定出来な
い 単発の操作のトレースはできるが, あるリクエストに起因して 起きた一連の操作のトレーシングはできない!
そこで...
AWS X‑Ray 本番環境や分散アプリケーションの分析とデバッグ
詳しくは... Perlでも分散トレーシングしたい!AWS::XRay による解析とその実 装 https://speakerdeck.com/fujiwara3/yapc‑tokyo‑2019 Web+DB PRESS Vol.111 Perl Hackers
Hub 「AWS X‑Rayによる分散 トレーシング」
AWS X‑Rayの構成 SDK -(UDP)-> daemon -> API 各プログラミング言語向けにSDKが提供されている SDKは, トレースした結果をUDPでdaemonに送る
daemonはAWSが提供しているので, EC2インスタンスによし なに置いてあげるとよい daemonへはUDPで通信するので, 最悪daemonが死んでいても 安心 daemonはAWSが提供するAPIに向けてトレース結果を送る 開発者は, X‑Rayのコンソールでトレース結果を見れる
AWS X‑Rayにおけるトレース AWS X‑Rayでは... 1リクエスト = 1トレース トレースは, 幾つかのセグメントを持つ 分散トレーシングのための仕様としては"OpenTracing"などが存在
する ベンダー非依存のAPI仕様とライブラリを提供 OpenTracingでは... 1リクエスト = 1トレース トレースは幾つかのスパンを持つ
X‑Rayの嬉しさ あるリクエストによって行われた全ての処理(それぞれが1つのセグ メントになる)を紐づけてトレース出来る 更に, (SDKを入れて対応していれば)あるリクエストによって他のサ ービスにリクエストが飛んだ時も, まとめてトレース出来る = 分散トレーシング!!!!
ところでお値段は? トレースの記録 毎月10万トレースまで無料 100万件あたり5 USD トレースの取得/スキャン 取得/スキャンあわせて毎月100万回まで無料 取得は100万件あたり0.5 USD スキャンは100万件あたり0.5USD
はてなブログの規模だと, サンプリングレートを指定してある程度 絞る必要がある
実際にやってみた Perlのための, X‑RayのSDKは... (AWSが公式に提供するものは)な い... さらに言えば, PerlはそもそもAWSのSDKが... ない... ので, 有志が作ったAWS::CLIWrapperというモジュールが
CPANで公開されていて, 内部で aws コマンドを実行すること でAWSの操作をやっている...
そこで... fujiwaraさんがなんとかしてくれました! AWS::XRay Perl製のAWS X‑Ray用ライブラリ Devel::KYTProf::Logger::XRay Devel::KYTProfでトレースした結果をXRayに送る Devel::KYTProfで計測した内容を, AWS X‑Rayを使ってトレースで
きる!
実装方針 ひとまず一部のインスタンスにのみ, X‑Rayを導入する 若干とはいえパフォーマンス劣化は存在するため 現在, サンプリングレートは0.1%としてみている 環境変数 ENABLE_AWS_XRAY が真値を返す(真値を返すように設定 した)EC2インスタンスで動作するbackendサーバのみ有効化
cpanfile requires 'AWS::XRay'; requires 'Devel::KYTProf'; requires 'Devel::KYTProf::Logger::XRay'; requires 'Devel::KYTProf::Profiler::Redis::Fast';
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'); }
Plack::Middlewareの読み込み enable 'Plack::Middleware::XRay', name => 'Hatena-Blog', sampling_rate => 0.1, #
= 10% サンプリング ;
None
None
None
None
None
None
sampler と response_filter
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% サンプリング }, ;
トレースを活かす 定期的に眺める チームで眺める → PWG 改善点を見つける Mackerelのグラフとはまた違う視点/粒度でサービスを見つめ ることができる
まとめ はてなブログで取り組んでいる"見える化"についてご紹介しました 特に, AWS X‑Rayの導入や活用について詳しく説明しました 引き続き, これら"見える化"の成果を元に, より良く/より安定したブ ログ体験を皆様に提供できるよう, 頑張っていきます