Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

データ可視化アプリの新星、PrometheusをCentOSにインストールする方法

SoundCloudが内製しているモニタリングシステム「Prometheus」がいま気になっております。
時系列データベースを用いた柔軟なクエリ言語を用い、ダッシュボードによる可視化やアラート機能もあるそうです。

f:id:yoshi-ken:20150205191805p:plain

とりあえず使ってみたので、紹介します。

環境

インストール

このドキュメントに従い、進めていきます。
http://prometheus.io/docs/introduction/getting_started/

git clone

$ cd /usr/local/src/
$ sudo git clone https://github.com/prometheus/prometheus.git
Initialized empty Git repository in /usr/local/src/prometheus/.git/
remote: Counting objects: 11061, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 11061 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (11061/11061), 4.73 MiB | 989 KiB/s, done.
Resolving deltas: 100% (5957/5957), done.
$ cd prometheus/

make build

$ make build
curl -o /usr/local/src/prometheus/.build/cache/go1.4.linux-amd64.tar.gz -L https://golang.org/dl/go1.4.linux-amd64.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0    85    0    85    0     0    217      0 --:--:-- --:--:-- --:--:--   418Warning: Failed to create the file
Warning: /usr/local/src/prometheus/.build/cache/go1.4.linux-amd64.tar.gz
  0 60.3M    0   735    0     0    871      0 20:11:03 --:--:-- 20:11:03   871
curl: (23) Failed writing body (0 != 735)
make: *** [/usr/local/src/prometheus/.build/cache/go1.4.linux-amd64.tar.gz] Error 23

sudoを付けて再実行します。

$ sudo make build
curl -o /.build/cache/go1.4.linux-amd64.tar.gz -L https://golang.org/dl/go1.4.linux-amd64.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0    85    0    85    0     0    234      0 --:--:-- --:--:-- --:--:--   416Warning: Failed to create the file /.build/cache/go1.4.linux-amd64.tar.gz
  0 60.3M    0   735    0     0    835      0 21:03:16 --:--:-- 21:03:16   835
curl: (23) Failed writing body (0 != 735)
make: *** [/.build/cache/go1.4.linux-amd64.tar.gz] Error 23

おっとこれはsudo経由での実行は意識されていないようです。
shコマンドの引数として実行してみましょう。

$ sudo sh -c "make build"
curl -o /usr/local/src/prometheus/.build/cache/go1.4.linux-amd64.tar.gz -L https://golang.org/dl/go1.4.linux-amd64.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 60.3M  100 60.3M    0     0  13.9M      0  0:00:04  0:00:04 --:--:-- 21.9M
[ -d "/usr/local/src/prometheus/.build/root/gopath/src/github.com/prometheus/prometheus" ] || { mkdir -vp /usr/local/src/prometheus/.build/root/gopath/src/github.com/prometheus ; ln -s "/usr/local/src/prometheus" "/usr/local/src/prometheus/.build/root/gopath/src/github.com/prometheus/prometheus" ; }
mkdir: created directory `/usr/local/src/prometheus/.build/root/gopath'
mkdir: created directory `/usr/local/src/prometheus/.build/root/gopath/src'
mkdir: created directory `/usr/local/src/prometheus/.build/root/gopath/src/github.com'
mkdir: created directory `/usr/local/src/prometheus/.build/root/gopath/src/github.com/prometheus'
[ -d "/usr/local/src/prometheus/.build/root/gopath/src/github.com/prometheus/prometheus" ]
tar -C /usr/local/src/prometheus/.build/root -xzf /usr/local/src/prometheus/.build/cache/go1.4.linux-amd64.tar.gz
touch /usr/local/src/prometheus/.build/root/go/bin/go
TMPDIR=/tmp GOROOT=/usr/local/src/prometheus/.build/root/go GOPATH=/usr/local/src/prometheus/.build/root/gopath /usr/local/src/prometheus/.build/root/go/bin/go get github.com/tools/godep
TMPDIR=/tmp GOROOT=/usr/local/src/prometheus/.build/root/go GOPATH=/usr/local/src/prometheus/.build/root/gopath /usr/local/src/prometheus/.build/root/gopath/bin/godep restore
go: missing Mercurial command. See http://golang.org/s/gogetcmd
package code.google.com/p/goprotobuf/proto: exec: "hg": executable file not found in $PATH
godep: restore: exit status 1
go: missing Mercurial command. See http://golang.org/s/gogetcmd
package github.com/matttproud/golang_protobuf_extensions/ext
  imports code.google.com/p/goprotobuf/proto: exec: "hg": executable file not found in $PATH
godep: restore: exit status 1
make: *** [dependencies] Error 1

hgコマンドが必要とのこと。mercurialをインストールします。

$ sudo yum -y install mercurial

次は、エラーを起こさずに実行できました。

$ sudo sh -c "make build"
TMPDIR=/tmp GOROOT=/usr/local/src/prometheus/.build/root/go GOPATH=/usr/local/src/prometheus/.build/root/gopath /usr/local/src/prometheus/.build/root/go/bin/go get github.com/tools/godep
TMPDIR=/tmp GOROOT=/usr/local/src/prometheus/.build/root/go GOPATH=/usr/local/src/prometheus/.build/root/gopath /usr/local/src/prometheus/.build/root/gopath/bin/godep restore
TMPDIR=/tmp GOROOT=/usr/local/src/prometheus/.build/root/go GOPATH=/usr/local/src/prometheus/.build/root/gopath /usr/local/src/prometheus/.build/root/go/bin/go get -d
make -C config
make[1]: Entering directory `/usr/local/src/prometheus/config'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/usr/local/src/prometheus/config'
make -C tools
make[1]: Entering directory `/usr/local/src/prometheus/tools'
make -C rule_checker
make[2]: Entering directory `/usr/local/src/prometheus/tools/rule_checker'
TMPDIR=/tmp GOROOT=/usr/local/src/prometheus/.build/root/go GOPATH=/usr/local/src/prometheus/.build/root/gopath /usr/local/src/prometheus/.build/root/go/bin/go build -o rule_checker .
make[2]: Leaving directory `/usr/local/src/prometheus/tools/rule_checker'
make[1]: Leaving directory `/usr/local/src/prometheus/tools'
make -C web
make[1]: Entering directory `/usr/local/src/prometheus/web'
# Note that embed-static.sh excludes map files and the
# non-minified bootstrap files.
../utility/embed-static.sh static templates | /usr/local/src/prometheus/.build/root/go/bin/gofmt > blob/files.go
make[1]: Leaving directory `/usr/local/src/prometheus/web'
TMPDIR=/tmp GOROOT=/usr/local/src/prometheus/.build/root/go GOPATH=/usr/local/src/prometheus/.build/root/gopath /usr/local/src/prometheus/.build/root/go/bin/go build -o prometheus -ldflags " -X main.buildVersion 0.10.0 -X main.buildRevision 982923f -X main.buildBranch master -X main.buildUser root@vm-local -X main.buildDate 20150205-18:56:43 -X main.goVersion 1.4" .

設定ファイルの作成

例に従い、次の内容の設定ファイルをprometheus.confとして作成しました。

# Global default settings.
global: {
  scrape_interval: "15s"     # By default, scrape targets every 15 seconds.
  evaluation_interval: "15s" # By default, evaluate rules every 15 seconds.

  # Attach these extra labels to all time series collected by this Prometheus instance.
  labels: {
    label: {
      name: "monitor"
      value: "tutorial-monitor"
    }
  }
}

# A job definition containing exactly one endpoint to scrape: Prometheus itself.
job: {
  # The job name is added as a label `job={job-name}` to any time series scraped from this job.
  name: "prometheus"
  # Override the global default and scrape targets from this job every 5 seconds.
  scrape_interval: "5s"

  # Let's define a group of static targets to scrape for this job. In this
  # case, only one.
  target_group: {
    # These endpoints are scraped via HTTP.
    target: "http://localhost:9090/metrics"
  }
}

起動

先ほどの設定ファイルの他、storage.local.pathでメトリクスデータを保存する先を指定して起動します。

$ ./prometheus -config.file=prometheus.conf -storage.local.path=/tmp/prometheus-metrics
prometheus, version 0.10.0 (branch: master, revision: 982923f)
  build user:       root@vms-local
  build date:       20150205-18:56:43
  go version:       1.4

ブラウザで確認

初期起動画面はこのような感じでした。
データがまだないので、何か入れて見たいと思います。

http://your-host:9090/にアクセスすると、status画面が表示されました。

prometheus-status.png

http://your-host:9090/metricsにアクセスすると、そのホストで保持しているメトリクス情報が出力されました。

prometheus-metrics.png

http://your-host:9090/alertsにアクセスすると、アラート情報があれば表示されるようです。

prometheus-alerts.png

http://your-host:9090/graphにアクセスすると、グラフを追加出来るようになっておりました。

prometheus-graph.png

データが無いので何とも言えませんが、割と気軽に始められました。
Fluentdとの連携など、引き続き検証を進めていきたいと思います。