こんにちは、株式会社はてなで最近はマンガサービスのコードを書いている id:stefafafan です。この記事はMackerel Advent Calendar 2020の13日目の記事です。
今回はMackerelのOSSにPull Request送ったときの話をしてみます。
前提
一応簡単に前提から話すと、Mackerelというのは株式会社はてなが開発しているサーバ監視サービスです
mackerel.io
Webサービス本体のコード自体は公開されていないですが、監視対象のサーバにインストールされるエージェントやプラグイン、また公式ドキュメントのマークダウンなどは大体GitHubにオープンに公開されています。プラグインなどはAPIが公開されているので誰でも簡単に作れます。
今回はこの公開されているコードに対して誰でも気軽にPull Request送れますよという話をします。
いくつかのリポジトリの簡単な紹介
本題に入る前に、mackerelioで公開されているリポジトリは40件以上あるので、今回自分が触ったものを中心にいくつかのリポジトリをそもそもどういうものなのか簡単に紹介します。
mackerelio/documents
- ここには公式ドキュメントとして公開されるもととなるマークダウンのファイルが置かれています。
- https://mackerel.io/ja/docs/ あたりに公開されている文章などで「おや?」と思ったものがあれば上記リポジトリにPull Requestすると取り込んでもらえます。
mackerelio/mackerel-client-go
- mackerel-client-go は Mackerel の API を叩くGo言語のクライアントです。
- https://mackerel.io/ja/api-docs/ に載ってるAPIを利用したツールなどをGoで作りたいときに使うと良いでしょう。
mackerelio/mkr
mackerelio/mackerel-agent
- mackerel-agent は名前の通りサーバにインストールするエージェントのリポジトリです。こちらもGo製。
- インストールされたサーバの基本的なシステムメトリクスを収集し、MackerelのWebサーバに送ってくれます。
mackerelio/mackerel-agent-plugins
- mackerel-agent-plugins は公式でまとめてる mackerel-agent 向けのプラグイン集です。
- 例えばnginxが動いてる場合はnginx周りのメトリクスを追加で取得したいからこれに含まれてるmackerel-plugin-nginxを有効化するなど、mackerel-agent単体で取れるメトリクスよりも追加で色々取りたい場合に使います。
mackerelio/go-mackerel-plugin
- go-mackerel-plugin はGo言語でMackerelエージェント向けのプラグインを新規で作る際に利用できる便利なプログラムです。
- mackerel-agent-pluginはどれも「グラフ定義を作る」「値を取得する」を必ずやることになるので、これを使うと同じフォーマットで簡単にそれが実装できるというもの。
- mackerelio/go-mackerel-plugin-helper という似た名前のリポジトリもありますが、READMEいわくgo-mackerel-pluginを使うのが推奨されているらしい。
以前自分がPull Request送ったときの流れ
自分は普段からGoをバリバリ書いてるわけでもMackerelのOSSをバリバリ使い込んでるまではいかなかったので、実はOSSにPull Requestするのは少しハードルが高かったのですが、英語は得意なのでドキュメントを読んで知識を得つつタイポや文法ミスなどあればついでに直していくところから始める作戦でいきました。
まずはドキュメントに対するタイポミスなど簡単なところからPull Request
上記でやったこととしては、
- ドキュメントの簡単なタイポミス修正
- 英語の文法を改善したり、表記を統一したりした
- Pull Requestにする際はdescriptionに簡単に英語でやったことを書いた
レビューは比較的すぐに英語で返してもらえる。英語だけどはてなの人が基本返してくれてるので、知らない海外の人とやりとりするよりはハードルが低いかもしれない(自分の場合は同僚なのでその分さらにハードルは低かったです)。
これや他にも送ったdocumentsへのPull Requestはすべて取り込んでもらい、実際に公開されてるドキュメントにも反映してもらえました。
慣れてきたらAPIクライアント周りのコードを読んだり触ってみたりしていく
APIドキュメントを読んで雰囲気がわかってきたので、実際にmackerel-client-goのコードを手元にgit cloneし、中身を読んだりgoのテストを実行してみたりとしてました。その中でファイル名にタイポを見つけたので早速Pull Requestしました。
もっとコードとドキュメントを読んでるうちに、「APIはあるがmackerel-client-goには実装されていない」ものを見つけたので、通知チャンネル系のAPIに対応させちゃおうということでここでようやくコードを書いてみました。
普段業務でMackerelチームでGo言語を書いているエンジニアの方にレビューしてもらえるのでありがたいです。今回の変更ではGoのomitemptyの仕様についてなんとなく理解が深まったというメリットもありました。
APIクライアントを利用している他のOSSの様子を見ていく
mackerel-client-goがチャンネル系のAPIに対応していなかったということは、CLIツールであるmkrもチャンネル周りに対応していないということではないかということで次はこのリポジトリをgit cloneして中身を見ました。結果以下のPull Requestを作ることができた。
やったこととしては、
- そもそもimportしてるmackerel-client-goのバージョンをあげないとせっかく対応したchannel周りの実装がこっちでは使えないのであげた
- mkr monitorsというサブコマンドの実装を参考にmkr channelsサブコマンドを実装してみた
- Makefileを参照し、手元でビルドを作成して試しに実行する方法を見つけてそれで試した (make crossでMac向けのビルド作れそうだったのでそれでやった)
CLIツールの新しいサブコマンドを作るということで、全体的な設計がどうなっているかや、Goでテストを書くときの雰囲気などが少し味わえて良い体験でした。
無事取り込まれたら公式のブログにも取り上げてもらえた
mkr channels pullが実装したということで以下のブログにも取り上げてもらえました。
AWSインテグレーション・ALB連携により取得できるメトリック対象を追加しました - Mackerel ブログ #mackerelio
- mkr channels pull が利用可能になりました