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
750
YAPC::Kyotoの「全て」 / All of "YAPC::Kyoto"
papix
0
1.7k
イベントの中の人 / Inside the Events
papix
0
360
2022年に始めるPerlでWebサービス開発(趣味)
papix
0
630
ワーケーションに関する考察
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
タスクの複雑さでモデルを選ぶ ── Thompson Samplingで動かす“トークン/コスト最適化
satohy0323
0
330
オブザーバビリティ、本当に活用できてる? 〜API連携×生成AIで成熟度を自動評価〜
dmmsre
1
3.1k
LLM/Agent評価:トップ営業の発言を「正解」にする 〜暗黙的正解による評価を営業資産に変える〜
takkuhiro
1
210
Empower GenAI with Agile - あなたのアジャイルが生成AIのバフになる仕組み
hageyahhoo
1
180
非定型なドキュメントを効率よくリファクタする 〜えぇ!?仕様書27本の移行が1日で終わったって!?〜
subroh0508
1
340
Claude Code 珍プレー好プレー
shinyasaita
0
330
シンガポールで登壇してきます
yama3133
0
120
最近評価が難しくなった
maroon8021
0
340
ゼロをイチにする仕事が終わったあと
smasato
0
340
世界、断片、モデル。そして理解
ardbeg1958
1
110
インフラと開発の垣根を超えていき!〜元AWSインフラエンジニアがAWS開発で奮闘している話〜
hatahata021
1
170
SRE本の知られざる名シーン / The Hidden Gems of Google SRE Book
nari_ex
1
380
Featured
See All Featured
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1k
How to make the Groovebox
asonas
2
2.3k
Why Our Code Smells
bkeepers
PRO
340
58k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
190
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.6k
The Spectacular Lies of Maps
axbom
PRO
1
850
How to Ace a Technical Interview
jacobian
281
24k
Everyday Curiosity
cassininazir
0
250
Skip the Path - Find Your Career Trail
mkilby
1
160
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の導入や活用について詳しく説明しました 引き続き, これら"見える化"の成果を元に, より良く/より安定したブ ログ体験を皆様に提供できるよう, 頑張っていきます