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
ブラウザアプリの継続的パフォーマンスモニタリング (序) / Continuous ...
Search
moznion
September 03, 2026
Technology
72
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
15k
「データ無い! 腹立つ! 推論する!」から 「データ無い! 腹立つ! データを作る」へ チームでデータを作り、育てられるようにするまで / 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.3k
RubyKaigi Hack Space in Tokyo & 函館最速 "予習" 会 / RubyKaigi Hack Space in Tokyo & The Fastest Briefing of RubyKaigi 2026 in Hakodate
moznion
1
460
地に足の付いた現実的な技術選定から魔力のある体験を得る『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
DGX Sparkを2台使って いろいろ動かす話
sonoda_mj
1
100
AI駆動開発を組織で促すために
lycorptech_jp
PRO
7
9.1k
Genie Code ワークショップ 基礎編 / Genie-Code-Workshop-fundamental
databricksjapan
PRO
0
290
AI時代のキョウソウ戦略
ystk
2
120
「ミスを許さない手順書」を作ってみた 〜 個人的にはこれ以上できることはあまりなさそう/20260827-ssmjp-operation-procedure-update
opelab
17
17k
Jetpack Compose で挑む新聞紙面UI ─ 複合ジェスチャー・ポリゴン記事領域・適応的ページ構成という3つの壁/droidkaigi2026
nikkei_engineer_recruiting
0
120
LLMアプリ、 雰囲気で運用してませんか? 〜LLMOpsの現在地〜
taka_aki
1
660
Bet AI Day 2026丨Production-Ready AI Agents — エンタープライズの実務を任せるための設計と運用
layerx
PRO
2
1.6k
サーバー常駐型の 簡易障害調査AI エージェントを作ってみた話
masayoshi
1
510
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
5k
The Django UUID Story - DjangoCon US 2026
pauloxnet
0
370
指示待ちから変化に応じるClaude Codeへ!~環境からAgentへの帰り道を作る~
gotalab555
9
1.8k
Featured
See All Featured
Building the Perfect Custom Keyboard
takai
2
860
30 Presentation Tips
portentint
PRO
1
380
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Optimizing for Happiness
mojombo
378
71k
The Language of Interfaces
destraynor
162
27k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
270
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
880
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Accessibility Awareness
sabderemane
1
190
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
260
Product Roadmaps are Hard
iamctodd
55
13k
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.