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.7k
履歴テーブル、今回はこう作りました 〜 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
え、こんなに早く改修できるの?──新人エンジニアとスクラムマスターの2人が語る、AI×アジャイル開発の現場
ysasago
2
680
Railsのように考える: See through the Master
snoozer05
PRO
5
1.3k
Vibe Coding で作ったプロダクトをどう安全に動かすか / How to Safely Run Products Built with Vibe Coding
glidenote
0
510
銀行勘定系システムにおける開発プロセス刷新×AIによる環境モダナイゼーション / Development Process Transformation and AI-Driven Environment Modernization
muit
1
2.6k
「今盗んで、後で解く」に備える ― AWSのポスト量子暗号入門
yama3133
1
110
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
5
25k
負債のメタファと2026年 / Debt Metaphor in Agentic Engineering Age 202609 Edition
twada
PRO
11
6.3k
Claude in Chrome 入門 / Introduction to Claude in Chrome
cielo1985
0
890
.NET WebAssemblyで実現するクライアントサイドAI推論:NuGetからViteまで、2つのエコシステムを繋ぐビルド戦略
yamachu
1
600
Slack上でインフラをトラブルシュートする! Agentic Platform Engineeringの第一歩
teru0x1
5
1.9k
Azure Serverless 2026:Production-ready な AI エージェント基盤 / Azure Serverless 2026: Production-Ready AI Agent Platform
miyake
2
540
Kiro Meetup #8 Kiro アップデート (2026/3/21〜2026/9/24)
katzueno
1
150
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
30 Presentation Tips
portentint
PRO
1
400
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
550
How to train your dragon (web standard)
notwaldorf
97
6.8k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
500
The Pragmatic Product Professional
lauravandoore
37
7.4k
Speed Design
sergeychernyshev
33
2.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
50
10k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
560
Marketing to machines
jonoalderson
1
5.8k
Practical Orchestrator
shlominoach
192
12k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
280
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.