apiVersion: v1
kind: ConfigMap

metadata:
  name: promtail
  namespace: monitoring

data:
  promtail.yaml: |
    # Promtailの設定
    server:
      http_listen_address: 127.0.0.1
      http_listen_port: 9080
      grpc_listen_port: 0

    positions:
      filename: /tmp/positions.yaml

    # Lokiへの接続設定
    clients:
      - url: http://loki:3100/loki/api/v1/push

    # ログ検出対象の設定
    scrape_configs:
      - job_name: kubernetes-pods-app
        kubernetes_sd_configs:
          - role: pod
        relabel_configs:
          # Pod の Labels に `name` キーがある場合、除外する
          # kube-system 系が該当する
          - action: drop
            regex: .+
            source_labels: [__meta_kubernetes_pod_label_name]
          # Pod の Labels の `app` キーに値がセットされていない場合、除外する
          - action: drop
            regex: ^$
            source_labels: [__meta_kubernetes_pod_label_app]
          # Pod の Labels の `app` キーが値である __service__ という label を作成する
          - target_label: __service__
            source_labels: [__meta_kubernetes_pod_label_app]
          # __host__ は現在ドキュメントに記載がないが、設定した値と同一のノードのみを対象にする
          - target_label: __host__
            source_labels: [__meta_kubernetes_pod_node_name]
          # namespace と __service__ を / で繋げた値をラベル名 job として利用する
          - action: replace
            separator: /
            replacement: $1
            target_label: job
            source_labels: [__meta_kubernetes_namespace, __service__]
          # ポッド名 を可視ラベルに
          - action: replace
            target_label: pod_name
            source_labels: [__meta_kubernetes_pod_name]
          # コンテナ名 を可視ラベルに
          - action: replace
            target_label: container_name
            source_labels: [__meta_kubernetes_pod_container_name]
          # Pod の Labels のキーバリューを label にする
          - action: labelmap
            regex: __meta_kubernetes_pod_label_(.+)
          # 実際にtailするログのPathを __path__ にセットする
          - target_label: __path__
            separator: /
            replacement: /var/log/pods/*$1/*.log
            source_labels: [__meta_kubernetes_pod_uid, __meta_kubernetes_pod_container_name]
        pipeline_stages:
          - docker:
          - match:
              selector: '{app=~"payment-.+", namespace="payment"}'
              stages:
              - json:
                  expressions:
                    level: level
                    error: error
              - labels:
                  level:
                  error:
      - job_name: kubernetes-systems
