Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ブラウザアプリの継続的パフォーマンスモニタリング (序) / Continuous ...
Search
moznion
September 03, 2026
Technology
120
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ブラウザアプリの継続的パフォーマンスモニタリング (序) / Continuous Browser Application Performance Monitoring; Act 1
ToKyoto.js #03
の資料です
moznion
September 03, 2026
More Decks by moznion
See All by moznion
reFACToring
moznion
1
1.3k
cccccc
moznion
1
2.6k
履歴テーブル、今回はこう作りました 〜 Delegated Types編 〜 / How We Built Our History Table This Time — With Delegated Types
moznion
16
16k
「データ無い! 腹立つ! 推論する!」から 「データ無い! 腹立つ! データを作る」へ チームでデータを作り、育てられるようにするまで / How can we create, use, and maintain data ourselves?
moznion
11
7.6k
避けられないI/O待ちに対処する: Rails アプリにおけるSSEとasync gemの活用 / Tackling Inevitable I/O Latency in Rails Apps with SSE and the async gem
moznion
4
9.5k
RubyKaigi Hack Space in Tokyo & 函館最速 "予習" 会 / RubyKaigi Hack Space in Tokyo & The Fastest Briefing of RubyKaigi 2026 in Hakodate
moznion
1
470
地に足の付いた現実的な技術選定から魔力のある体験を得る『AIレシート読み取り機能』のケーススタディ / From Grounded Tech Choices to Magical UX: A Case Study of AI Receipt Scanning
moznion
7
5.2k
Chrome Extension Techniques from Hell
moznion
1
330
Simple組み合わせ村から大都会Railsにやってきた俺は / Coming to Rails from the Simple
moznion
4
9k
Other Decks in Technology
See All in Technology
EventBridge に「合流」はない ― サーバーレスのワークフローを育てるということ / No Join in EventBridge
yusukeshimizu
2
350
「ピッケル本」日本語版は4.0(第6版)が出版されるべき / pickaxe4-nagoyark05
kakutani
2
250
すぐできる衛星通信対応 あとは山奥に行くだけ
tatetate55
0
140
アクセスキーこわい やめかたと漏らさない工夫
sassssan68
1
530
登壇の自信を奪う3匹のオバケ / 3 Ghosts That Rob You of Your Confidence in Public Speaking
pauli
9
1k
なぜ「決定性」が 決定的に重要なのか? Durable Execution 基盤の数理的理解 #serverlessjp / ServerlessDays Tokyo 2026
ytaka23
3
1k
人間はどの意思決定を手放せるのか
kawasima
15
7.6k
GoのInterface内部構造から学ぶ!最高パフォーマンスを出すコード設計
yappli_developers
1
210
技術的負債から考える、AI時代のエンジニアリング投資 — ビズリーチの技術的負債と向き合った経験から、変更し続けられるソフトウェアを考える/ technical-debt-con2026
visional_engineering_and_design
4
3.3k
ADKで始める業務改善 - AIエージェント開発時の考えと設計
harappa80
2
250
Deployment の 先にある AI Agent 基盤 - kagent vNext、Agent Substrate、Hermes から読み解く Agent Runtime の現在地 / k8s-matsuri-2-ai-agent-platform-amsy810
masayaaoyama
4
680
AIで社員の自主発信に広報目線を組み込む
_mossann_t
0
130
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
42
3.2k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
400
Documentation Writing (for coders)
carmenintech
77
5.5k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
260
Practical Orchestrator
shlominoach
192
12k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
500
HDC tutorial
michielstock
2
880
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
430
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
530
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Transcript
© Timeleap Inc. CONFIDENTIAL ブラウザアプリの 継続的パフォーマンス モニタリング (序) Thu, 3
Sep 2026 ToKyoto.js #03 https://timeleap.co.jp/ @moznion 1
@moznion タイムリープ株式会社 ソフトウェアエンジニア プロダクト責任者 — はてなインターン2013参加者 ということで今⽇は京都陣営
背景共有 WebRTCを使って遠隔接客を提供しているブラウザアプリを開発‧運⽤ © Timeleap Inc. 3
パフォーマンスモニタリング Google Meetとかにあるコレが欲しい © Timeleap Inc. 4
パフォーマンスモニタリング モチベーションは様々 「重い」「⾳が途切れる」「映像が固まった」などといったお客様の報告内容と 正確な事象発⽣時刻を対応させたい サーバーサイドやWebRTCコンポーネントのエラーとの突合をしたい 諸要因によるCPU逼迫、アプリのヒープ肥⼤、ネットワーク環境の劣化などを検出したい などなど…… © Timeleap Inc.
5
というわけで作って提供した © Timeleap Inc. 6
計測できる項⽬ • CPU負荷 (利⽤状況) • メモリ使⽤量 (JavaScriptヒープ) • ネットワーク利⽤状況 (WebRTC)
◦ 送受信帯域 ◦ RTT ◦ Jitter ◦ パケットロスレート © Timeleap Inc. 7
CPU負荷 • Compute Pressure API ◦ nominal, fair, serious, criticalの4値でCPU利⽤状況が取れる†
◦ (主として) プライバシー保護の観点から精緻な利⽤率は取れない†† ◦ 今回はこれを採⽤ • chrome.system.cpu API ◦ Chrome拡張のAPIを使ってCPU利⽤率を取得する ◦ Compute Pressure APIとは違い、精緻な利⽤率が取れる ◦ Google Meetの機能はこれを使って実現されている ▪ Chromeがデフォルトで権限を付与しているからできる †† †: 良いデモ => https://w3c.github.io/compute-pressure/demo/ ††: 例えばFingerprinting等 †††: https://x.com/lcasdev/status/1810696257137959018 © Timeleap Inc. 8
メモリ使⽤量 • performance.memory ◦ ウェブページのメモリフットプリントを測定 ▪ JavaScriptのヒープサイズを返却する ◦ ⾮標準かつ⾮推奨: Chromeなど特定のブラウザのみ対応
とにかく使っちゃ駄⽬そうなムードがすごい ◦ が、今回は採⽤ © Timeleap Inc. 9
メモリ使⽤量 • performance.measureUserAgentSpecificMemory() ◦ performance.memoryの後継 ◦ JSヒープだけではなくページ全体のメモリを測定できる ◦ HTTPSの利⽤とcross-origin isolation
(COOP + COEP) が必要 まだ若そうな機能 ◦ 実際にはこれを使った⽅が良かったと思う…… © Timeleap Inc. 10
WebRTCのネットワーク利⽤状況 • RTCInboundRtpStreamStats ◦ WebRTCのありとあらゆるStatsが取得できる ▪ 多すぎるので説明略 (ドキュメントを参照ください) ▪ これを取得して貯めておくと何かと便利
◦ これを取得するには RTCPeerConnection.getStats() や RTCRtpReceiver.getStats() を呼ぶのだが…… ▪ ハングするケースがある ▪ Promise.raceなどを使ってタイムアウトを設けるのが安全 • getStats()⾃体はキャンセルされないのでin-flight 対応は別途必要 (さもなくばスタックする) © Timeleap Inc. 11
アーキテクチャ Infra 取得 CPU Pressure State Collector Scheduler ClientMetricsSampleをファンアウト performance
memory usedJSHeapSize WebRTCStats 毎秒 Trigger Sink † Hydration Ring Buffer Chart UIへ †: WebRTCStatsは各コネクション毎にサンプル間の差分を返却 append-only IndexedDB JSON Dumpへ © Timeleap Inc. 12
アーキテクチャ上の特徴 • ⾊々と増やしやすい ◦ 取得したいメトリクスが増えたらinfraを増やせば良い ◦ 出⼒先が増えたらSinkを増やせば良い • IndexedDBに永続化†することによりハイドレーションができる ◦
リロード等をしたとしてもデータが残っているのでチャートに レンダリングができる†† ◦ 過去データのダンプ機能を提供できる †: 永続化といっても未来永劫残すわけではなく、⼀定期間に限定 ††: getAll + sliceすると⻑期保存時にエラいことになるので降順カーソルで maxSamples 件だけ辿る © Timeleap Inc. 13
Tips⾊々 • CPU PressureのPressureObserverはsampleIntervalごとに コンストラクタで渡したcallback経由でpressure stateを渡す ◦ callbackとcollectorは不必要なレンダリングを防ぐ⽬的で分離 ▪ callbackは値を
(Reactなのでrefに) stashしておくだけ ▪ collectorはそのrefをgetしてくる 👉 PressureObserverのsampleIntervalと、collectorに対する Schedulerのtrigger intervalは噛み合っている必要がある © Timeleap Inc. 14
Tips⾊々 • IndexedDBはオリジン単位でTab間共有がされる ◦ 共有端末でのオペレーションが前提とされているとコンタミする ◦ IndexedDBのキーにセッションIDを含めるようにし、 それと共にオペレーションをすることでコンタミを防ぐ† †: と書いてて気付いたが、セッションIDよりユーザーIDのほうが良いのでは?
(セッションが変わってしまうと過去ぶんがダンプできなくなってしまう) © Timeleap Inc. 15
まとめ • ブラウザのAPIは充実していて案外サクッと作れる ◦ メモリ周りだけが決定版にはなっていない印象 • とはいえ素朴に作ると結構問題があった ◦ 雑にやると計測のたびにReactがレンダリングされて死ぬ ◦
WebRTCのgetStats()は油断するとハングする ▪ ハングするとモニタリング全体を巻き込んで⽌まる • IndexedDBがとにかく便利 ◦ 共⽤されうる端末の時には注意が必要 © Timeleap Inc. 16
破に向けて • 現状すべてのメトリクス機構がローカルで完結している • メトリクスはリモートに送出して中央管理したい† ◦ 承前: Sinkを実装すれば良い ◦ あるいはIndexedDBのScheduled
Exporterを作れば良い • どちらかというとメトリクスを受けて保管する側に課題がある ◦ Monitoring SaaSに素朴に突っ込むと⾼いし…… ◦ Prometheus的概念を⾃前で運⽤するのは…… †† ◦ DWHに⼊れるという選択も無いわけではない • 破でお会いしましょう †: 利⽤規約等のレベルでの解決‧同意が為されているという前提 ††: 嫌いではないが…… © Timeleap Inc. 17
© Timeleap inc. All Rights Reserved.