用例: PrometheusのEC2_SD

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

今回は、そのなかで ec2_sd_configを利用したサービスディスカバリを設定する。

前提

  • 僕たちは ec2 を使っている
  • 僕たちは prometheus を使っている
  • 僕たちは grafana を使っている
  • ステージを表現する目的で Stage というタグを振ってる
  • コンテキスト内のコンポーネントを表現する目的で Group というタグを振る
  • monitor が含まれる Group では Grafana が動いている
  • Grafana のメトリクスは 3000 番ポートで提供されている

具体例

例えば下みたいに設定する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
scrape_configs:
  - job_name: "prometheus"
    metrics_path: "{{ prometheus_metrics_path }}"
    static_configs:
    - targets:
      - "{{ ansible_fqdn | default(ansible_host) | default('localhost') }}:9090"
  - job_name: "node"
    file_sd_configs:
    - files:
      - "{{ prometheus_config_dir }}/file_sd/node.yml"
  - job_name: "instance"
    ec2_sd_configs:
      - region:     "{{ aws_ops_region }}"
        access_key: "{{ _aws_ops_access_key }}"
        secret_key: "{{ _aws_ops_secret_key }}"
        port: 9100
    relabel_configs:
      - source_labels: [__meta_ec2_tag_Stage]
        target_label: env
        regex: '({{ env }})'
        replacement: "${1}"
  - job_name: "grafana"
    ec2_sd_configs:
      - region:     "{{ aws_ops_region }}"
        access_key: "{{ _aws_ops_access_key }}"
        secret_key: "{{ _aws_ops_secret_key }}"
        port: 3000
    relabel_configs:
      - source_labels: [__meta_ec2_tag_Stage]
        target_label: env
        regex: '({{ env }})'
        replacement: "${1}"
      - source_labels: [__meta_ec2_tag_Group]
        regex: '.*monitor.*'
        action: keep

よしなに説明

job_name はメトリックの job ってラベルの値になる。

relabel_configaction を指定をしないと replace になる。 target ラベルの値を regex,replacement で指定できる。 action の値に keep を指定した場合 regex でマッチしなかい対象をフェッチ対象から取り除く。ここでは __meta_ec2_tag_Stage を使って同一ステージのメトリックのみ取得する様に制限している。

access_key, secrete_key で認証するユーザーには AmazonEC2ReadOnlyAccess の許可を与えておく必要がある。また Prometheus が実行されるインスタンスに AmazonEC2ReadOnlyAccess が許可されているロールを与えている場合は鍵の設定は不要。

comments powered by Disqus