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
490
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
100
BigQuery経由で使うGoogleスプレッドシートのスキーマ管理
masutaka
0
230
本を聴く毎日を送っています
masutaka
0
50
ボッチLookML開発者兼データ整備人を連れてきたよ!
masutaka
0
90
ここがつらいよ普段使いのLinux
masutaka
0
200
4月から取り組んできたLookerの導入から実装までのお話
masutaka
0
130
デプロイで止まらないバッチ処理を求めて
masutaka
1
96
デプロイ元をCircleCIからHerokuに乗り換えた
masutaka
0
87
esaを支えたい技術
masutaka
0
850
Other Decks in Programming
See All in Programming
pytest プラグインを開発して DRY に自動テストを書こう
inuatsu
2
250
sqlcを利用してsqlに型付けを
kamiyam
0
240
Pythonによるイベントソーシングへの挑戦と現状に対する考察 / Challenging Event Sourcing with Python and Reflections on the Current State
nrslib
3
950
Rails 8 Frontend: 10 commandments & 7 deadly sins in 2025
yshmarov
1
620
perl for shell, awk and sed programmers
mackee
1
620
Modern Functional Fluent CFML REST by Luis Majano
ortus24
0
140
NANIMACHI
naokiito
0
940
Cloud Adoption Frameworkにみる組織とクラウド導入戦略(縮小版)
tomokusaba
1
180
Unlocking Python's Core Magic
leew
0
120
ROS 2のZenoh対応とZenohのROS 2対応
takasehideki
2
270
CSC509 Lecture 02
javiergs
PRO
0
160
フロントエンドの現在地とこれから
koba04
10
4.4k
Featured
See All Featured
Clear Off the Table
cherdarchuk
91
320k
What's in a price? How to price your products and services
michaelherold
243
11k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
125
18k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Agile that works and the tools we love
rasmusluckow
327
21k
The Cult of Friendly URLs
andyhume
77
6k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
158
15k
From Idea to $5000 a Month in 5 Months
shpigford
380
46k
How To Stay Up To Date on Web Technology
chriscoyier
786
250k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
504
140k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.8k
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は作らないとない
終わり