mackerel-agentの新パッケージの話とか容量削減とか
TIME rest time current/total
TopicsPlaceHolder

mackerel-agentの新パッケージの話とか容量削減とか

Kichijoji.pm #11

Jul 14th, 2017

Profile

songmu

【宣伝】エンジニア募集中です!

Mackerel

Architecture

Technology Stack

外形監視サブシステム

TSDB刷新中

時系列データベースという概念をクラウドの技で再構築する

mackerel-agent

mackerel-agentのプラグイン機構

公式プラグイン等

これらもGoで書かれており、RPM/debパッケージも提供しています。 識者を募集しています

パッケージング周りのコードとかは、各リポジトリの packaging/ 以下にあります。(本来は分けたほうが良さそう)

Travisでパッケージ作成

様子

package v2提供開始

https://mackerel.io/ja/blog/entry/announcement/20170616

様々な問題の解消

古いOSのサポートを停止し、後方互換を気にしなくて良くなったお陰で、様々な問題が解消可能に

/usr/local/bin 問題

→ 新パッケージでは /usr/bin のみに配置することで解決

noarch/all問題

→ 新パッケージでは x86_64 ビルドのみ提供

SHA1署名問題

→ SHA256にしました(astj++)

Systemd直接対応

→ Unitファイルちゃんと書いた(astj++)

(余談) mackerel-agentのsupervisorモード

プラグインの容量問題

本題

既存の課題

おさらい

→一個一個は数MBでも数多くなると容量が大変なことに

方針

どういうこと?

こうなってる

mackerel-plugin*
mackerel-plugin-accesslog@ -> mackerel-plugin
mackerel-plugin-apache2@ -> mackerel-plugin
mackerel-plugin-aws-cloudfront@ -> mackerel-plugin
mackerel-plugin-aws-dynamodb@ -> mackerel-plugin
mackerel-plugin-aws-ec2-cpucredit@ -> mackerel-plugin
mackerel-plugin-aws-ec2-ebs@ -> mackerel-plugin
mackerel-plugin-aws-elasticache@ -> mackerel-plugin
mackerel-plugin-aws-elasticsearch@ -> mackerel-plugin
mackerel-plugin-aws-elb@ -> mackerel-plugin
mackerel-plugin-aws-kinesis-streams@ -> mackerel-plugin
mackerel-plugin-aws-lambda@ -> mackerel-plugin
mackerel-plugin-aws-rds@ -> mackerel-plugin
mackerel-plugin-aws-ses@ -> mackerel-plugin
mackerel-plugin-conntrack@ -> mackerel-plugin
mackerel-plugin-docker@ -> mackerel-plugin
mackerel-plugin-elasticsearch@ -> mackerel-plugin
mackerel-plugin-fluentd@ -> mackerel-plugin
mackerel-plugin-gostats@ -> mackerel-plugin
...

エポックメイキングなローテク

BusyBox は、Coreutilsなど標準UNIXコマンドで重要な多数のプログラムを単一の実行ファイルに「詰め込んで」提供する、特殊な方式のプログラムである(その詰め込み方法を指して呼ぶこともある)。

Nagiosのcheck_tcpとかもそうなってる。(check_smtpなどはcheck_tcpへのシンボリックリンクになっている)

互換は崩さず移行する

ディレクトリ構造の変更(Before)

mackerel-plugin-uptime/
└── uptime.go

ディレクトリ構造の変更(After)

mackerel-plugin-uptime/
├── lib/
│   └── uptime.go
└── main.go

やったこと

既存のpluginの一斉書き換え

mackerel-pluginコマンドの作成

mackerel-plugin.go

https://github.com/mackerelio/mackerel-agent-plugins/blob/master/mackerel-plugin.go

//go:generate sh -c "perl tool/gen_mackerel_plugin.pl > mackerel-plugin_gen.go"
func run(args []string) int {
    var plug string
    f, _ := exec.LookPath(args[0])
    fi, _ := os.Lstat(f)
    base := filepath.Base(f)
    // ここで処理を分岐している
    if fi.Mode()&os.ModeSymlink == os.ModeSymlink && strings.HasPrefix(base, "mackerel-plugin-") {
        // if mackerel-plugin is symbolic linked from mackerel-plugin-memcached, run the memcached plugin
        plug = strings.TrimPrefix(base, "mackerel-plugin-")
    ...

mackerel-plugin_gen.go

様子

パッケージサイズ削減 🎉

今後の展望

おまけ

様子

動機

作ったもの

postailer

axslogparser

go-ltsv

type Log struct {
    VirtualHost  string `ltsv:"vhost"`
    Host         string
    User         string
    Time         time.Time `ltsv:"-"`
    TimeStr      string    `ltsv:"time"`
    Request      string    `ltsv:"req"`
    ...