Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Loki入門

uesyn
September 26, 2019

 Loki入門

Cloud Native Meetup Tokyo #10でLokiについて話した発表資料です。

uesyn

September 26, 2019
Tweet

More Decks by uesyn

Other Decks in Technology

Transcript

  1. Profile 2 上村 真也 • 所属: Z Lab • Twitter: @uesyn

    • このMeetupの運営やってます
  2. 3

  3. 5 Lokiとは? • Log Aggregation System ◦ Horizontally-scalable ◦ Highly-available

    ◦ Multi-tenant • Grafana Labs ◦ Grafana連携(データソースの一つとして選択可能) • OSS ◦ https://github.com/grafana/loki https://grafana.com/oss/loki
  4. 11 • Like Prometheus, but for logs ◦ ログに付与されたラベルによるフィルタリング ◦

    さらに結果をgrepのように絞り込む • 全文検索で用いられるようなテキスト処理はしない ◦ ログに対して形態素解析して〜など lokiについて 例: {app="nginx", env="dev"} logの送り側がラベルをつけて送信
  5. lokiとCortex 12 • ほぼCNCFのCortexのアーキテクチャ ◦ Cortexから派生しているため • Cortexについては ◦ https://speakerdeck.com/uesyn/cortexfalsehua-wokube

    condewen-kitakatutatuteiuhua ◦ 上記の情報は古いかも https://github.com/grafana/loki/blob/master/docs/loki/README.md
  6. lokiのアーキテクチャ 13 • 主なコンポーネント ◦ Distributor ◦ Ingester ◦ Querier

    ◦ Chunk Store ◦ Table Manager Distributor Ingester Querier Chunk Store (Index) Chunk Store (Chunks) Promtail Table Manager fluentd その他 Clients
  7. Distributor 15 • Clientから受けたログをIngesterへ • ヘッダに含まれるIDでユーザを識別 ◦ マルチテナントで利用する場合は別途 Frontend の実装が必要

    • ステートレスなコンポーネント Distributor Ingester Querier Chunk Store (Index) Chunk Store (Chunks) Promtail Table Manager fluentd その他 Clients
  8. Ingester(1/2) 16 Distributor Ingester Querier Chunk Store (Index) Chunk Store

    (Chunks) Promtail Table Manager fluentd その他 Clients • Distributorから受けたログをChunk Storeへ • セミステートフルなコンポーネント ◦ 直近のログデータを保持
  9. Chunk Store 19 Distributor Ingester Querier Chunk Store (Index) Chunk

    Store (Chunks) Promtail Table Manager fluentd その他 Clients • loki自体はDBではない • 2種類のChunk Store ◦ Index ▪ ログ検索のための転置インデックス ▪ ラベルなどのメタデータを保持 ◦ Chunks ▪ 実際のログを保持 • 利用可能なDB ◦ Index ▪ Local ▪ DynamoDB ▪ Bigtable ▪ Cassandra ◦ Chunks ▪ Local ▪ Cloud Storage ▪ S3
  10. lokiのRead Path 20 • 赤矢印の流れ Distributor Ingester Querier Chunk Store

    (Index) Chunk Store (Chunks) Promtail Table Manager fluentd その他 Clients
  11. Querier 21 • ログのクエリを受ける • 直近のログはIngester, それ以外はChunk Store Distributor Ingester

    Querier Chunk Store (Index) Chunk Store (Chunks) Promtail Table Manager fluentd その他 Clients
  12. LogのRetention 22 • Table Managerにより制御 • Table Manager ◦ Retentionを管理

    ◦ 基本的にindexを対象 Distributor Ingester Querier Chunk Store (Index) Chunk Store (Chunks) Promtail Table Manager fluentd その他 Clients
  13. Table ManagerによるRetention 23 • Table level retention • Retentionに関する設定 ◦

    indexの下のperiod ▪ 1 table の期間 ◦ retention_deletes_enabled ▪ Retentionを有効にするか ◦ retention_period ▪ Retentionの期間 • 以下のテーブルが保持される ◦ 現在アクティブに使われているテーブル ◦ 過去のtable数(retention_period ÷ period) ... schema_config: configs: - from: “2018-04-15” index: period: 12h prefix: index_ ... table_manager: retention_deletes_enabled: true retention_period: 24h 24h(retention_period) ÷ 12h(period) = 2 table 次のページでこの設定の例を説明
  14. KubernetesとLoki(再掲) 33 Kubernetes Node Promtail App Log Service Discovery for

    apps on K8s ・CLIやAPIも Systemd Journal Send Logs with Labels
  15. Promtail 34 • lokiへラベル付きのログを送信するためのエージェント ◦ Prometheusと似たような設定項目 ◦ Kubernetesのアプリのログを対象する場合 Service Discoveryが利用可能

    • Kubernetes上でPromtailをデプロイする例 ◦ DaemonSetとして起動しノードで動くコンテナのログや Systemd Journalを収集 ◦ 特定のアプリのログだけを対象とする場合は Sidecarとして起動 Promtail Service Discovery Send Logs with Labels
  16. Promtailの設定について 35 • Prometheusの設定とよく似た項目 ◦ lokiへの接続方法 ◦ ログファイルのTarget Discovery ◦

    ログの処理に関する設定 等 - client: ... positions: filename: /run/promtail/positions.yaml server: http_listen_port: 3101 target_config: sync_period: 10s scrape_configs: - job_name: job1 static_configs: … - job_name: job2 kubernetes_sd_configs: ... relabel_configs: … pipeline_stages: ...
  17. Promtailの設定について 36 • Prometheusの設定とよく似た項目 ◦ lokiへの接続方法 ◦ ログファイルのTarget Discovery ◦

    ログの処理に関する設定 等 - client: ... positions: filename: /run/promtail/positions.yaml server: http_listen_port: 3101 target_config: sync_period: 10s scrape_configs: - job_name: job1 static_configs: … - job_name: job2 kubernetes_sd_configs: ... relabel_configs: … pipeline_stages: ...
  18. Promtailの設定について 37 • Prometheusの設定とよく似た項目 ◦ lokiへの接続方法 ◦ ログファイルのTarget Discovery ◦

    ログの処理に関する設定 等 - client: ... positions: filename: /run/promtail/positions.yaml server: http_listen_port: 3101 target_config: sync_period: 10s scrape_configs: - job_name: job1 static_configs: … - job_name: job2 kubernetes_sd_configs: ... relabel_configs: … pipeline_stages: ...
  19. static_configs 38 • Service Discoveryを利用しない設定 • labelsでログにつけるラベルを指定 • __path__ラベルでログのパスを指定 ◦

    ワイルドカードを使った指定も可能 static_configs: - targets: - localhost labels: job: someone_service host: yourhost __path__: /var/log/someone_service/*.log
  20. Promtailの設定について 39 • Prometheusの設定とよく似た項目 ◦ lokiへの接続方法 ◦ ログファイルのTarget Discovery ◦

    ログの処理に関する設定 等 - client: ... positions: filename: /run/promtail/positions.yaml server: http_listen_port: 3101 target_config: sync_period: 10s scrape_configs: - job_name: job1 static_configs: … - job_name: job2 kubernetes_sd_configs: ... relabel_configs: … pipeline_stages: ... 再掲
  21. kubernetes_sd_configsと relabel_configs 40 • kubernetes_sd_configs ◦ Prometheusと同じ • relabel_configs ◦

    ログを"読む前"の処理 ◦ relabelをすることで ▪ ラベル付与 ▪ ログ収集対象のコンテナの選択 ▪ ログのPath指定 etc... kubernetes_sd_configs: - role: pod relabel_configs: - action: relabelmap regex: __meta_kubernetes_pod_label_(.+) - replacement: /var/log/pods/*$1/*.log separator: / source_labels: - __meta_kubernetes_pod_uid - __meta_kubernetes_pod_container_name target_label: __path__
  22. Promtailの設定について 41 • Prometheusの設定とよく似た項目 ◦ lokiへの接続方法 ◦ ログファイルのTarget Discovery ◦

    ログの処理に関する設定 等 - client: ... positions: filename: /run/promtail/positions.yaml server: http_listen_port: 3101 target_config: sync_period: 10s scrape_configs: - job_name: job1 static_configs: … - job_name: job2 kubernetes_sd_configs: relabel_configs: … pipeline_stages: ... 再掲
  23. pipeline_stagesのstage 42 • ログを"読んだ後"の内容に対して処理 ◦ Prometheusのmetrics_relabel_configsに相当 • 各"stage"でログに対して様々な処理 ◦ ログをパースしてextracted

    mapへ ◦ extracted mapからtimestampをパース ◦ extracted mapからラベルの選択 etc… pipeline_stages: - json: expressions: log: - json: expressions: output: msg level: level timestamp: time hostname: hostname - output: source: output - labels: hostname: level: - timestamp: format: UnixNs source: timestamp
  24. extracted mapについて 43 key value time xxxx message yyyy host

    zzzz {time: "xxxx", message: "yyyy", host: "zzzz"} • ログの中身をパースした結果をmapへ ◦ Mapの中身をさらにパースすることも可能 • stage間でextracted mapは共有 "extracted map"
  25. ログをextracted mapへ 44 • json stage ◦ ログがjson形式の場合に利用 • regex

    stage ◦ 正規表現を用いる場合に利用 - json: expressions: time: - regex: expression: "^(?P<year>\\d+)" source: "time"
  26. extracted dataからラベル付与 45 • labels stage ◦ extracted mapから付与するラベルを選択 key

    value message yyyy stream_type stderr "extracted map" 付与されるラベル stream: stderr - labels: stream: stream_type 付与したいラベル名 付与したい値を持つ extracted mapのkey
  27. 保存するログの選択 46 • output stage ◦ lokiがログとして保存するコンテンツを選択する key value content

    yyyy stream_type stderr "extracted map" - output: source: content contentのvalueがログとして保存される
  28. タイムスタンプのパース 47 • timestamp stage ◦ extracted map中のタイムスタンプをパース key value

    timestamp 1562708916414 "extracted map" - timestamp: source: timestamp format: UnixMs
  29. 特定ラベルを持つものだけ処理 48 • match stage ◦ 条件に一致したログのみ処理する stageを設定 ▪ logql

    stream selectorで指定 ▪ https://github.com/grafana/loki/blob/master/docs/querying.md#log-stream-selector ◦ アプリごとに出力形式が異なる場合に便利 - match: selector: "{app=\"loki\"}" stages: ...
  30. ログからメトリクスを生成 49 • metrics stage ◦ extracted mapの値をPrometheusのメトリクスとして出力 ▪ Counter

    ▪ Gauge ▪ Histogram - metrics: http_response_time_seconds: type: Histogram description: "length of each log line" source: response_time config: buckets: [0.001, 0.0025, 0.005, 0.010, 0.025, 0.050] Histogramの例
  31. 設定済みstage 50 • デフォルトで設定されている便利な設定済みstage ◦ docker ◦ cri • 上記はコンテナランタイムから吐き出されるログから

    ◦ タイムスタンプ ◦ メッセージの抽出 ◦ 出力がstdout, stderrかをstreamラベルとして付与 等 • 細かなstageの設定をしなくても、これだけでとりあえず使える pipeline_stages: - docker: {}
  32. Promtailの設定確認(1/3) 51 - client: ... positions: filename: /run/promtail/positions.yaml server: http_listen_port:

    3101 target_config: sync_period: 10s scrape_configs: - job_name: job1 static_configs: … - job_name: job2 kubernetes_sd_configs: ... relabel_configs: … pipeline_stages: ... • 設定確認のためのwebserverを起動
  33. まとめ • lokiのアーキテクチャ ◦ Distributor ◦ Ingester ◦ Querier ◦

    Chunk Store ◦ Table Manager • Promtailの役割と設定について紹介 ◦ labelをつけてログをlokiへ送信 ◦ Prometheusの設定と似ているが大きな違いとして pipeline_stages 55