Mackerelの外形監視システムをGoで書いた話とgo-check-pluginsの話
TIME rest time current/total
TopicsPlaceHolder

Mackerelの外形監視システムをGoで書いた話とgo-check-pluginsの話

Go All-Stars

Oct 11th, 2015

Profile

songmu

最近作ったgoライブラリ

prompter

Goでプロンプト簡単に出すやつ

twitterID := prompter.Prompt("Enter your twitter ID", "")
lang := prompter.Choose("Which language do you like the most?", []string{"Perl", "Golang", "Scala", "Ruby"}, "Perl")
passwd := prompter.Password("Enter your password")
var likeSushi bool = prompter.YN("Do you like sushi?", true)
var likeBeer bool = prompter.YesNo("Do you like beer?", false)

以下の様な要件を満たします。

enslaver

プロセスをずっと殺さないようにしてくれる君

% go get github.com/Songmu/enslaver/cmd/enslaver
% enslaver perl -E 'while (1) { 0.2 > rand() ? (die "DEAD") : (warn "ALIVE!\n");sleep 1 }'

雑なbotを常駐させておくときとかに便利

 

Mackerelの既存の技術スタック

既存のGoプロダクト

新しいGoプロダクト(今日話す話)

URL外形監視システム

MackerelのURL外形監視機能

システムの要件

選択したアーキテクチャー

概念図

実装

見どころ

HTTPサーバー実装

フレームワーク

Graceful Restart

Goの常駐プロセスの監視

github.com/fukata/golang-stats-api-handler

http.HandleFunc("/api/stats", stats_api.Handler)

goroutineの活用とRedis

goroutineの活用とRedis

外部リソースへのHTTPリクエストの制御

github.com/hakobe/paranoidhttp

ホットデプロイ

デプロイ

daemontools & Server::Starter

#!/bin/sh
exec 2>&1
set -eu
export PERL_PATH="/opt/perl-5.22.0/"
exec $PERL_PATH/bin/start_server --port 8000 -- /path/to/mackerel-external-monitor

Goでサブシステムを書いてみて

外形監視システムの話、終わり

第2部 go-check-plugins

go-check-plugins

https://github.com/mackerelio/go-check-plugins

チェックプラグインとは?

チェック監視のためのスクリプト共通プロトコル

などで採用されている

SPEC

実行ファイルのexit codeが監視結果となる

標準出力が、監視のメッセージとなる

go-check-pluginsはSensuやConsulでも利用可能!

go-check-pluginsの現状

以上

We are Hiring

hatena