コンテンツにスキップ

設定ファイル@Prometheus

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. Prometheus

prometheus.ymlファイルによる設定

prometheus.ymlファイルとは

Prometheusを設定する。

/etc/prometheusディレクトリ配下におく。


globalセクション

▼ globalセクションとは

全てのメトリクス収集からアラートまでを共通で設定する。

▼ scrape_interval

収集間隔を設定する

global:
  scrape_interval: 15s

▼ evaluation_interval

アラート発火の条件とする間隔を設定する

global:
  evaluation_interval: 15s

▼ external_labels

Prometheusが外部ツール (例:Alertmanager、VictoriaMetrics、Grafana Mimirなど) にメトリクスを送信する時に、これに付与するラベルを設定する。

global:
  external_labels:
    cluster: foo-cluster
    env: prd


alertingセクション

▼ alertingセクションとは

アラートを設定する。

▼ alertmanagers

使用するAlertmanagerを設定する。

alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - <AlertmanagerのIPアドレス>:9093


rule_filesセクション

▼ rule_filesセクションとは

Prometheusのアラートルールを設定する。

rule_files:
  - /etc/prometheus/pod_cpu_utilized_rule.yaml
  - /etc/prometheus/pod_memory_utilized_rule.yaml
groups:
  - name: pod_cpu_utilized_rule
    rules:
      - alert: PodCpuUtilized
        # 値が長くなるため、『>-』で改行すると良い。
        # Prometheusのレコーディングルール (node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate) をPromQLで使用する。
        expr: >-
          max(node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate{namespace="foo-namespace", pod=~"foo-pod.*", container="foo-container"}) /
          min(kube_pod_container_resource_limits{namespace="foo-namespace", pod=~"foo-pod.*",resource="cpu",container="foo-container"})
          > 0.7
        for: 1m
        labels:
          app: foo
          env: prd
          severity: critical
        annotations:
          summary: PodのCPU使用率
          description: 【 {{ $labels.app }} 】{{ $labels.env }} 環境で、PodのCPU使用率が {{ $value }} になりました。
groups:
  - name: pod_memory_utilized_rule
    rules:
      - alert: PodMemoryUtilized
        expr: >-
          max(container_memory_working_set_bytes{namespace="foo-namespace", pod=~"foo-pod.*", container="foo-container"}) /
          min(kube_pod_container_resource_limits{namespace="foo-namespace", pod=~"foo-pod.*",resource="memory", container="foo-container"}) 
          > 0.7
        for: 1m
        labels:
          app: foo
          env: prd
          severity: critical
        annotations:
          summary: Podのメモリ使用率
          description: 【 {{ $labels.app }} 】{{ $labels.env }} 環境で、Podのメモリ使用率が {{ $value }} になりました。

▼ scrape_configsセクション

Retrievalのルールを設定する。

▼ static_configs

IPアドレスやポート番号の変わらない対象を監視する。

scrape_configs:
  # 自分で自分を監視する。
  - job_name: prometheus
    static_configs:
      - targets:
          - 127.0.0.1:9090'
        labels:
          cluster: prd
  # Node Exporterの稼働するサーバーを監視する。
  - job_name: node-exporter
    static_configs:
      - targets:
          - <Node Exporterの稼働するサーバーのIPアドレス>:9100
        labels:
          cluster: prd

labelsキーを使用して、メトリクスにフィルタリング用ラベルを追加できる。

scrape_configs:
  - job_name: victoria-metrics
    static_configs:
      - targets:
          - <VictoriaMetricsのIPアドレス>:9100
        # メトリクスに追加するラベルを設定する
        labels:
          cluster: prd

▼ sd_configs

IPアドレスやポート番号が動的に変化する対象を監視する。

監視対象のIPアドレスやポート番号が変わると、Prometheusはそれを検出し、自身の設定を動的に変更する。

scrape_configs:
  # AWS EC2をサービスディスカバリーで監視する
  - job_name: aws-ec2
    ec2_sd_configs:
      - port: 9100
        filters:
          - name: tag:Name
            values:
              - foo-instance
  # https://prometheus.io/docs/prometheus/latest/configuration/configuration/#endpoints
  - job_name: foo-endpoints
    kubernetes_sd_configs:
      # Service配下のEndpointを監視する
      - role: endpoints
      # ラベルでフィルタリングする
      - source_labels:
          - __meta_kubernetes_namespace
          - __meta_kubernetes_endpoint_port_name
        # ラベル値
        regex: foo-namespace;http-foo
        action: keep
  # https://prometheus.io/docs/prometheus/latest/configuration/configuration/#endpointslice
  - job_name: bar-endpointslice
    kubernetes_sd_configs:
      # Service配下のEndpointSliceを監視する
      - role: endpointslice
      # ラベルでフィルタリングする
      - source_labels:
          - __meta_kubernetes_namespace
          - __meta_kubernetes_endpoint_port_name
        # ラベル値
        regex: bar-namespace;http-bar
        action: keep


02. Alertmanager

globalセクション

全てのアラートを共通で設定する。

global:
  slack_api_url: https://hooks.slack.com/services/*****
  resolve_timeout: 5m


routeセクション

▼ routeセクションとは

合致条件に応じて、受信したアラートを特定の通知先にルーティングする。

▼ receiver

アラートのルーティング先の名前を設定する。

receiverキーは別のreceiversキー配下で設定し、これを呼び出す。

route:
  # WarningレベルはSlackのレシーバーを選ぶ。
  - receiver: slack-foo-channel
    match:
      severity: warning
  # CriticalレベルはPagerDutyのレシーバーを選ぶ。
  - receiver: pagerduty-foo-service
    match:
      severity: critical

▼ match

アラートのラベルと値を使用して、ルーティング時の合致条件を設定する。

アラートのラベルは、Prometheusのrule_filesセクションで設定する。

route:
  # WarningレベルはSlackのレシーバーを選ぶ。
  - receiver: slack-foo-channel
    match:
      severity: warning
  # CriticalレベルはPagerDutyのレシーバーを選ぶ。
  - receiver: pagerduty-foo-service
    match:
      severity: critical


receiversセクション

▼ receiversセクションとは

アラートの通知先をレシーバーとして設定する。

▼ discord_configs

receivers:
  - name: discord-foo-channel
    discord_configs:
      - ...

▼ email_configs

receivers:
  - name: email-foo
    email_configs:
      - ...

▼ pagerduty_configs

通知先とするPagerDutyのServiceを設定する。

receivers:
  # PagerDutyに通知する。
  - name: pagerduty-foo-service
    pagerduty_configs:
      - routing_key: *****

▼ pushover_configs

receivers:
  - name: pushover-foo
    pushover_configs:
      - ...

▼ slack_configs

通知先とするSlackのチャンネルを設定する。

globalセクション配下でSlackのURLを設定する必要がある。

global:
  slack_api_url: https://hooks.slack.com/services/*****
  resolve_timeout: 5m

receivers:
  # Slackに通知する。
  - name: slack-foo-channel
    slack_configs:
      - channel: prd-foo-channel

▼ sns_configs

receivers:
  - name: sns-foo-topics
    sns_configs:
      - ...

▼ webex_configs

receivers:
  - name: webex-foo
    webex_configs:
      - ...

▼ webhook_configs

receivers:
  - name: webhook-foo
    webhook_configs:
      - ...

インシデント管理ツールが専用のエンドポイントを公開していれば、Alertmanagerからツールにアラートを送信できる。

  receivers:
    - name: slack-incident-io
      webhook_configs:
        - url: https://api.incident.io/v2/alert_events/alertmanager/*****
          send_resolved: true
          http_config:
            authorization:
              credentials: *****