Diary of a Perpetual Student

Perpetual Student: A person who remains at university far beyond the normal period

Advent Calendar を Mackerel で監視する 〜新卒の暮らし方を添えて〜

この記事ははてなエンジニア Advent Calendar 2022 1日目の記事です。


こんにちは、id:arthur-1 です。2022年に新卒入社して、Mackerel 開発チームのアプリケーションエンジニアをやっています。 arthur-1 という id に掛けて、トップバッターをいただきました。よろしくお願いします。

今日は Advent Calendar を Mackerel で監視している話をします。

Advent Calendar で何を監視したいのか

id:arthur-1 は、Mackerel Advent Calendar 2022 の運営をしています。こちらは、Mackerel ユーザーが TIPS やノウハウ、利用事例などを載せていく自由参加のカレンダーになっています。

Advent Calendar 企画の主催になると、どれだけの方が参加しているか、枠がパンパンになっていないか(あるいは、スカスカでないか)気になるものです。

Qiita の Advent Calendar であれば、以下のような指標をモニタリングしたいな、と思いました:

  • 寄稿数: カレンダーの埋まっている枠の数
  • 参加者数: 寄稿した人の数
  • 購読者数: 購読した Qiita ユーザの数

例えば、購読者数をグラフにすることで、「Twitter のある投稿により購読者数が激増した」などの事実が分かればマーケティングの参考になります。また、寄稿数が一定以下であるかの監視を設定することで、カレンダーの空き枠が残りわずかになったときにカレンダーを増やす、などのアクションを取ることができます。

Mackerel にメトリックを投稿する

Advent Calendar のページを定期的にスクレイピングして、Mackerel にサービスメトリックとして投稿する mackerel-adcal-counter を開発しました。

以下のように、グラフで Advent Calendar に関するメトリックを閲覧できます。

グラフアノテーションを使うと出来事を記録できて便利

infrastructure

AWS 上に構築しました。EventBridge Rules を用いて、定期的に Lambda を実行するようにしました。

構成図

application

Lambda のハンドラは Go 言語で作りました。Go は入社前は触ったことがなかったので、練習のために使ってみました。

github.com

スクレイピング周りで地獄のようなクエリが生まれているのが味わい深いのでぜひ読んでみてください。

工夫したポイントとしては、interface を用いて、Qiita 以外の Advent Calendar にも対応する余地を残したことです。Adventar のメトリックも収集できるようにしたかったら、具体的な実装を counter/adventar/counter.go に書く、というイメージです。

counter/counter.go

package counter

type CountResult struct {
    Entries      uint64
    Participants uint64
    Subscribers  uint64
}

type Counter interface {
    Count() (*CountResult, error)
}

counter/qiita/counter.go

package qiita

import "mackerel-adcal-counter/counter"

type Counter struct {
    url string
}

var _ counter.Counter = &Counter{}

func NewCounter(url string) *Counter {
    return &Counter{
        url: url,
    }
}

func (c *Counter) Count() (*counter.CountResult, error) {
    entriesCnt := uint64(0)
    participantsCnt := uint64(0)
    subscribersCnt := uint64(0)

    /* ここに Qiita へのスクレイピングの実装 */

    result := &counter.CountResult{
        Entries:      entriesCnt,
        Participants: participantsCnt,
        Subscribers:  subscribersCnt,
    }
    return result, nil
}

Mackerel でアラートを設定する

メトリック化できてしまえばあとは簡単です。思い思いに監視ルールを設定しましょう。

自分は、枠がいっぱいになったのに気づいてカレンダーのページを増やせるように、以下のような監視ルールを設定しました。

これで、Advent Calendar のモニタリングができました!

プロダクトに愛着を持って仕事をする

唐突ですが、せっかくなので、新卒っぽい話を少しだけします。

新卒入社して Mackerel チームに配属されるまで、 Mackerel というサービス自体に触れたことはありませんでした。チームに入ってからは、この記事のネタのようなちょっとしたことでも積極的に Mackerel を使ってみることにしています。

実際に使ってみて気づいた改善ポイントは、issue やアイデア帳という形で残したり、すぐ実装できるものであればその場で改修したりしています。

dogfooding を通じて、プロダクトに愛着を持ち、プロダクトの未来を描くことができていると実感しています。この取り組みは、仕事のモチベーション向上にも大きく寄与しています。

最後に

Advent Calendar のモニタリングを Mackerel でしたい人は、本エントリをぜひ参考にしてください。

また Mackerel の Advent Calendar も参加・閲覧どうぞよろしくお願いします!

qiita.com


prev: undefined

next: 2日目は id:pokutuna さんの Slack チャンネルのロボット帝国化を防ぐ feed-pruning-proxy です