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
HerokuでSidekiqを監視する方法を確立した
Search
Takashi Masuda
February 28, 2020
Programming
0
590
HerokuでSidekiqを監視する方法を確立した
2020-02-28 フィードフォース社内技術勉強会のプレゼン資料です。
https://developer.feedforce.jp/entry/2020/03/02/140000
Takashi Masuda
February 28, 2020
Tweet
Share
More Decks by Takashi Masuda
See All by Takashi Masuda
自分のブログをCloudFront+HerokuからCloud Runに移行した
masutaka
0
140
BigQuery経由で使うGoogleスプレッドシートのスキーマ管理
masutaka
0
300
本を聴く毎日を送っています
masutaka
0
63
ボッチLookML開発者兼データ整備人を連れてきたよ!
masutaka
0
110
ここがつらいよ普段使いのLinux
masutaka
0
320
4月から取り組んできたLookerの導入から実装までのお話
masutaka
0
160
デプロイで止まらないバッチ処理を求めて
masutaka
1
120
デプロイ元をCircleCIからHerokuに乗り換えた
masutaka
0
99
esaを支えたい技術
masutaka
0
990
Other Decks in Programming
See All in Programming
QA x AIエコシステム段階構築作戦
osu
0
270
대규모 트래픽을 처리하는 프론트 개발자의 전략
maryang
0
120
CEDEC 2025 『ゲームにおけるリアルタイム通信への QUIC導入事例の紹介』
segadevtech
3
850
Reactの歴史を振り返る
tutinoko
1
180
AHC051解法紹介
eijirou
0
470
構文解析器入門
ydah
7
2.1k
AIコーディングエージェント全社導入とセキュリティ対策
hikaruegashira
16
9.8k
A Gopher's Guide to Vibe Coding
danicat
0
110
Terraform やるなら公式スタイルガイドを読もう 〜重要項目 10選〜
hiyanger
13
3.1k
Claude Code と OpenAI o3 で メタデータ情報を作る
laket
0
130
MCP連携で加速するAI駆動開発/mcp integration accelerates ai-driven-development
bpstudy
0
290
PHPカンファレンス関西2025 基調講演
sugimotokei
6
1.2k
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Git: the NoSQL Database
bkeepers
PRO
431
65k
How to Think Like a Performance Engineer
csswizardry
25
1.8k
A better future with KSS
kneath
239
17k
Site-Speed That Sticks
csswizardry
10
770
Bash Introduction
62gerente
614
210k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
Speed Design
sergeychernyshev
32
1.1k
Faster Mobile Websites
deanohume
309
31k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.4k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Transcript
HerokuでSidekiqを監視する 方法を確立した 2020-02-28 @masutaka
自己紹介 • 増田貴士(@masutaka) • 株式会社フィードフォース • EC Boosterの雑用係 • 最近のマイブームは玄米とビタミンB群とボディクリーム
• 最近の悩みはドラクエウォークと足底筋膜炎との両立 https://www.feedforce.jp/
ビタミンB群 • ビタミンB1: 糖質をエネルギーにする • ビタミンB2: 脂肪をエネルギーにする • ビタミンB6: アミノ酸の代謝に必要
• ビタミンB12: ヘモグロビンの合成に必要 • 他、ナイアシン、パントテン酸、葉酸、ビオチン
EC Booster 国内初のGoogleショッピング広告自動運用ツール https://ecbooster.jp/
商品別レポート機能のリリース https://www.feedforce.jp/release/19886/
商品別レポート機能 広告出稿している商品一覧と詳細情報がわかる機 能。 Google Ads APIをバックグラウンドジョブで呼ぶだけ ではあるが、それだと情報が足りないので、S3 Selectも使って、ジョブ中でJoinしたりしている。 何が言いたいのかというと、時間がかかり得るバック グラウンド処理を含む機能。
EC Boosterの技術スタック Heroku App Web Dyno GraphQL Client (apollo-client) GraphQL
Server (graphql-ruby on Rails) Worker Dyno Chrome (headless mode) chromedriver sidekiq Heroku Postgres Heroku Redis
Sidekiq • Ruby実装のバックグラウンドジョブライブラリ • Webアプリで時間がかかる処理を非同期実行させたり、 定期実行バッチ処理などに使われる https://sidekiq.org/
ジョブの遅延とUXの低下 • ジョブが遅延すると、テーブル表示やCSVダウンロード が遅延する • ジョブの遅延がそのままUXの低下に繋がり得る
監視の必要性 • Sidekiqを監視をしないとジョブの遅延に気づけない • そこまでトラフィックはないのでログを毎日見るという 方法もあるけど...
HerokuでのSidekiq監視の知見が見つか らない。みんなどうしているんだろう?
Slack HerokuJP-UGで聞いてみた https://herokujp-ug.slack.com/archives/C9LRC3M25/p1578381627030100
メトリクス収集 • LibratoのCustom log-based metricsを使えば良さそう • sample#database.size=40.9MB のようなログを出力す るだけで、Libratoが勝手にメトリクスとして記録してく れるスゴい機能
https://devcenter.heroku.com/articles/librato#custom-log-based-metrics
トリガーはどうしようか? • ApplicationControllerとかにログを仕込む ◦ アクセスがなければメトリクスを収集できないし、多ければ収集しすぎる • Heroku Scheduler ($0/mo) ◦
最短インターバルが10分なのでダメ • Cron To Go Add-on ($8/mo) ◦ 最短インターバルは1分なのでギリギリ使える。しかし、そのたびにOne-Off Dynoが起動す るのは大げさすぎる • 専用のworker Dynoを起動して、loopでスクリプトを実 行 ($7~25/mo) ◦ 大げさだし、コスト感もダメ • 同じworker Dynoのsidekiq-cronで収集 ◦ 監視対象のキューが詰まっていたら自身が呼ばれない
これは難しい...
待てよ?以前調べた Ruby Language Metrics収集の 仕組みは使えないだろうか?
今日のために書きました https://developer.feedforce.jp/entry/2020/02/13/150000
できたーーーー https://github.com/feedforce/heroku-buildpack-sidekiq-metrics
メトリクス収集の仕組み Web.1 Dyno(Web.2以降のDynoでは収集しない) /app/bin/sidekiq-metrics (ruby script) /app/.profile.d/ruby-sidekiq-metrics.sh Sidekiq (1) 30秒に1回実行
(2) メトリク ス 取 得 Worker Dyno (3) 標準出力 Librato (Heroku Add-on) HerokuではLogplexというログ集約エンジンを介し て、各Add-on等にログが送られる
送っているログ Feb 28 12:26:20 ecbooster app/web.1 sample#sidekiq.default.size=0 sample#sidekiq.get_master_data.size=0 sample#sidekiq.mailers.size=0 sample#sidekiq.product_report.size=0
sample#sidekiq.slacks.size=0 sample#sidekiq.update_datafeed.size=43 sample#sidekiq.update_master_data.size=0 Feb 28 12:26:20 ecbooster app/web.1 sample#sidekiq.default.latency=0 sample#sidekiq.get_master_data.latency=0 sample#sidekiq.mailers.latency=0 sample#sidekiq.product_report.latency=0 sample#sidekiq.slacks.latency=0 sample#sidekiq.update_datafeed.latency=1577.5242395401 sample#sidekiq.update_master_data.latency=0
収集されるメトリクス • sidekiq.<キュー名>.size ◦ 各キューにおける待機状態のジョブ数 • sidekiq.<キュー名>.latency ◦ 各キューにおけるジョブの待機時間
設定したアラート1 • product_reportキューのレイテンシーが30を超えたら Slackに通知(もっと厳しくして良いかも)
設定したアラート2 • sidekiq.product_report.latencyのメトリクスが送信さ れなくなったらSlackに通知(メトリクス収集のバグを想 定)
かかった費用 • トリガー: heroku-buildpack-sidekiq-metrics ◦ $0/mo ◦ https://github.com/feedforce/heroku-buildpack-sidekiq-metrics • メトリクス収集:
Heroku Add-on Librato ◦ $21/mo (Nitro plan) ◦ https://elements.heroku.com/addons/librato
別解 • Sidekiq ProのMetrics ◦ https://github.com/mperham/sidekiq/wiki/Pro-Metrics ◦ $950/year • heroku-buildpack-datadog
◦ https://github.com/DataDog/heroku-buildpack-datadog ◦ $15/mo x Dyno number • 高い
今後の予定? • 各ジョブの実行数や成功数、失敗数等も収集するかも • とは言え、Bugsnagでエラーは把握しているし、sidekiq webでも見られるので優先順位は低い
感想 • 現在のEC Boosterに見合った監視を実装できたと思う • アプリケーションには何も実装していないため、取り外 しは簡単 • オーバースペックな技術は採用したくなかったので、そ の点は満足した
落ち穂拾い
よく分からなかったこと • ruby scriptの中でループしたかったが、標準出力がバッ ファリングされてしまい、定期的なログ出力ができな かった • https://github.com/feedforce/heroku-buildpack-s idekiq-metrics/pull/1 •
$stdout.sync = true はしていたのに。$stdout.flush まで必要だったのかな(未確認)
Heroku Redisのログ形式 2020-02-04T07:53:26.000Z ecbooster-sidekiq-metri-ck0pam app/heroku-redis source=REDIS addon=redis-defined-77910 sample#active-connections=10 sample#load-avg-1m=0.18 sample#load-avg-5m=0.125
sample#load-avg-15m=0.1 sample#read-iops=0 sample#write-iops=0 sample#memory-total=15664264kB sample#memory-free=12350252kB sample#memory-cached=1622852kB sample#memory-redis=507704bytes sample#hit-rate=0.11266 sample#evicted-keys=0 →今回使用したLibratoのCustom log-based metrics形式で出力していたこと を発見した。Heroku Postgresも。
Librato上でRedisの可視化やアラート設定が出来た ※ Heroku PostgresはLibratoに始めからグラフがあるのに、 Heroku Redisは作らないとない
終わり