MAP filter(Ansible)でPrometheusのフェッチ先を特定

Prometheusの有名なAnsibleロールであるcloudalchemy.prometheusprometheus_targets 変数を使ってfile_sd_configを設定できる。

メトリックスのフェッチ対象にあたる target フィールドを map フィルタと groups hostvars の2変数を組み合わせて Ansibleホストグループ から決定してみる。

ここでは ec2 を前提に書く。ただし ec2 ではそもそも ec2_sd があるのでそれを使うのが良い。

前提と目標

  • 監視対象は AWS EC2上で稼働している
    • ダイナミックインベントリ(ec2.py)を利用する
  • Ansible Roleに cloudalchemy.prometheus を利用する
  • 基本的なメトリックスの提供に node_exporterを使う
  • システムの稼働しているステージ(dev/prod的な)は env 変数に格納されてることにする

実施例

例えば下の様に設定することになる。

1
2
3
4
5
6
7
8
 prometheus_targets:
    node:
    - targets: "{{ groups['all'] |
                      map('extract', hostvars, 'ec2_private_ip_address') |
                      map('regex_replace', '^(.*)$','\\1:9100') | list }}"
      labels:
        env: "{{ env }}"
        job: node

説明

Ansibleの map フィルタはよくある感じで引数に指定されたフィルタを全ての要素に対して作用した結果を返す。 map フィルタの第1引数は適用するフィルタ名で以降はそのフィルタの引数になる。 extra を使うと第2引数に指定されたディレクトリの値を取得できる。第3引数を指定するとそこから更にフィールドを限定できる

これを使って、グループに所属しているホスト名の ec2_private_ip_address の一覧を作っている。

明日は ec2_sd を使った設定について書く。

comments powered by Disqus