koudenpaのブログ

趣味のブログです。株式会社はてなでWebアプリケーションエンジニアをやっています。職業柄IT関連の記事が多いと思います。

Mackerelエージェントから他のサービスに投稿したい Vol.1

前回の記事には書いていないことも含まれているあらすじ。

Goのディレクトリ構成の『い』の字すら無視したGit Cloneからのビルドの結果、Mackerelエージェントは全くビルドされる気配がなかった。

go get コマンドを叩いた後も、インストールしていないGCCが求められ、環境面の面倒くささを目の当たりにしてテンションがすでに下がっている。

果たしてARMクロスビルドしてRaspberry Pi向けのカスタムMackerelエージェントを構成することはできるのだろうか?

  • ローカルマシンでエージェントをビルド
  • 呼び出すAPIベースを変更(バイナリ埋め込み)

の2本でお届けします。


ローカルマシンでエージェントをビルド

というわけで、Windows向けのGCCをインストール、パスを通してからビルド、実行した。

PS C:\Users\koudenpa\go\src\github.com\7474\mackerel-agent> .\build-sandbox.bat
C:\Users\koudenpa\go\src\github.com\7474\mackerel-agent>echo on
C:\Users\koudenpa\go\src\github.com\7474\mackerel-agent>go build -o build/mackerel-agent.exe
PS C:\Users\koudenpa\go\src\github.com\7474\mackerel-agent> cd .\build\
PS C:\Users\koudenpa\go\src\github.com\7474\mackerel-agent\build> .\mackerel-agent.exe init -apikey xxx
PS C:\Users\koudenpa\go\src\github.com\7474\mackerel-agent\build> .\mackerel-agent.exe2018/04/24 19:10:04 INFO <main> Starting mackerel-agent version:0.54.1, rev:, apibase:https://api.mackerelio.com
2018/04/24 19:10:11 INFO <command> Start: apibase = https://api.mackerelio.com, hostName = DESKTOP-xxx, hostID = xxx

メトリック届いている。

f:id:koudenpa:20180424191620p:plain

これでVol.1のノルマは達成だ。


呼び出すAPIベースを変更(バイナリ埋め込み)

コードを眺めていると、さしあたって呼び出し先を変更するだけならビルドオプションでAPIベースURIを指定すればよい様子だったので試した。

サンドボックスビルド用のビルドファイルを追加。 · 7474/mackerel-agent@36b2eaf · GitHub

呼び出し先のAPIスタブはなんとなくAzure Function AppをVisualStudioで雑にスキャフォルドしてローカルで実行した。

GitHub - 7474/MackerelDashFunctionApp: Mackerelエージェントの変更を試す際に使用しているアプリケーションです。

エージェントの実行ログ。

PS C:\Users\koudenpa\go\src\github.com\7474\mackerel-agent> .\build\mackerel-agent.exe
# 変更したAPIベースになっている
2018/04/24 21:15:53 INFO <main> Starting mackerel-agent version:0.54.1, rev:, apibase:http://localhost:7071
2018/04/24 21:16:00 INFO <command> Start: apibase = http://localhost:7071, hostName = , hostID = xxx
# APIスタブで 201 を返したら期待と違うと失敗
2018/04/24 21:17:01 WARNING <command> Failed to post metrics value (will retry): API error. status: 201, msg: api request failed
# リトライでキー重複エラーしてAPIスタブも失敗
2018/04/24 21:18:01 WARNING <command> Failed to post metrics value (will retry): API error. status: 500, msg: api request failed

APIスタブに呼び出しログが出ている。

f:id:koudenpa:20180424211736p:plain

ローカルストレージにそれっぽいメトリックが保存されている。

f:id:koudenpa:20180424213205p:plain

単に投稿先を変えたいだけで、認証もAPIキーで行うようなら、これだけの修正で実現できてしまうようだ。

そりゃぁ、開発の便宜上呼び出し先のURIは平易に変更できるようになっているよなぁ。という感じである。

ビルドすらできなかった前回からしたら格段の進歩だが、Goのコードは全く触っていない。 次はこうもいくまい。

設定項目を増やす、認証やプロトコルの変更を睨んでAPI呼び出しを変更できるようにする(Go的には何ていうのか知らん)、など順次試していきたい。


余談。

f:id:koudenpa:20180424213815p:plain

フォーク数がちょうど 74 で縁起が良い。


追記。

そりゃぁ、開発の便宜上呼び出し先のURIは平易に変更できるようになっているよなぁ。という感じである。

ビルドオプションを変えるという行為が平易だと思ってるようならお前はアホだ。

もう少しコードを読んでいたら、普通に設定ファイル内容を読み込んでいた。 つまり、ビルドオプションでデフォルトのAPIベースをローカルホストにしているバイナリでも、以下の様な設定ファイルを食べさせることで元のMackerelにメトリックを投稿できる。

apikey = "xxx"
apibase = "https://api.mackerelio.com"

こうやって、印象的な出来事が起きるたびに要素技術や実装が身に刻まれていくのだ。

消して道化ではないぞ! 心を強く持つんだ!!

さらについき。

> mackerel-agent.exe -h
Usage: mackerel-agent [options]

main process of mackerel-agent

Options:
  -apibase string
        API base (default "http://localhost:7071")
...

まぁ、そういうこともあるさ。基本は大事。