Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Loki入門
Search
uesyn
September 26, 2019
Technology
8
2.6k
Loki入門
Cloud Native Meetup Tokyo #10でLokiについて話した発表資料です。
uesyn
September 26, 2019
Tweet
Share
More Decks by uesyn
See All by uesyn
PodSecurityPolicyの安全な移行の道のり / On the safe migration of PodSecurityPolicy
uesyn
1
1.1k
PodSecurityPolicyの廃止に備えて、 一足先にPodSecurity Admissionを試してみよう! / from-psp-to-podsecurity
uesyn
4
1.8k
Kubernetes v1.19 変更点調査のまとめ / k8s-v119-updates
uesyn
1
260
そのクラスタ本当にアップグレードして大丈夫? Storage Version の更新も忘れずにしよう! / k8s-storage-version-migration
uesyn
2
3.8k
次世代のログ基盤 Grafana Lokiを始めよう! / prometheus-meetup-tokyo-3-lets-start-the-loki
uesyn
7
15k
kindでも"type LoadBalancer"を使いたい! / kubernetes-meetup-tokyo-24-kind-with-type-loadbalancer
uesyn
0
1.6k
Cortexの話をKubeConで聞きたかったっていう話
uesyn
4
2k
kubernetesでGPUを 管理するために スケジューラをいじってみた
uesyn
2
2.8k
Other Decks in Technology
See All in Technology
ABEMAにおける 生成AI活用の現在地 / The Current Status of Generative AI at ABEMA
dekatotoro
0
650
あとはAIに任せて人間は自由に生きる
kentaro
3
1.1k
株式会社ARAV 採用案内
maqui
0
340
キャリアを支え組織力を高める「多層型ふりかえり」 / 20250821 Kazuki Mori
shift_evolve
PRO
2
300
Claude Code x Androidアプリ 開発
kgmyshin
1
570
サービスロボット最前線:ugoが挑むPhysical AI活用
kmatsuiugo
0
190
知られざるprops命名の慣習 アクション編
uhyo
10
2.4k
浸透しなさいRFC 5322&7208
hinono
0
120
広島銀行におけるAWS活用の取り組みについて
masakimori
0
130
kintone開発チームの紹介
cybozuinsideout
PRO
0
73k
AIエージェント就活入門 - MCPが履歴書になる未来
eltociear
0
440
「守る」から「進化させる」セキュリティへ ~AWS re:Inforce 2025参加報告~ / AWS re:Inforce 2025 Participation Report
yuj1osm
1
110
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
Bash Introduction
62gerente
614
210k
The Straight Up "How To Draw Better" Workshop
denniskardys
236
140k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.6k
A Modern Web Designer's Workflow
chriscoyier
695
190k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
The Invisible Side of Design
smashingmag
301
51k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
283
13k
Transcript
Loki入門
Profile 2 上村 真也 • 所属: Z Lab • Twitter: @uesyn
• このMeetupの運営やってます
3
このスライドは個人の見解であり、 所属する組織の公式見解ではありません。 4
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
実施の画面 6 https://www.youtube.com/watch?time_continue=5&v=7n342UsAMo0
KubernetesとLoki 7 Kubernetes Node Promtail App Log Service Discovery ・CLIやAPIも
Systemd Journal Send Logs with Labels
Lokiを動かす 8 https://github.com/grafana/loki/blob/master/production/README.md#running-loki
KubernetesとLoki 9 Promtail App Log Service Discovery ・CLIやAPIも Systemd Journal
Kubernetes Node Send Logs with Labels 再掲
loki
11 • Like Prometheus, but for logs ◦ ログに付与されたラベルによるフィルタリング ◦
さらに結果をgrepのように絞り込む • 全文検索で用いられるようなテキスト処理はしない ◦ ログに対して形態素解析して〜など lokiについて 例: {app="nginx", env="dev"} logの送り側がラベルをつけて送信
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
lokiのアーキテクチャ 13 • 主なコンポーネント ◦ Distributor ◦ Ingester ◦ Querier
◦ Chunk Store ◦ Table Manager Distributor Ingester Querier Chunk Store (Index) Chunk Store (Chunks) Promtail Table Manager fluentd その他 Clients
ログの書き込みの流れ 14 • 赤矢印の流れで書き込みされる Distributor Ingester Querier Chunk Store (Index)
Chunk Store (Chunks) Promtail Table Manager fluentd その他 Clients
Distributor 15 • Clientから受けたログをIngesterへ • ヘッダに含まれるIDでユーザを識別 ◦ マルチテナントで利用する場合は別途 Frontend の実装が必要
• ステートレスなコンポーネント Distributor Ingester Querier Chunk Store (Index) Chunk Store (Chunks) Promtail Table Manager fluentd その他 Clients
Ingester(1/2) 16 Distributor Ingester Querier Chunk Store (Index) Chunk Store
(Chunks) Promtail Table Manager fluentd その他 Clients • Distributorから受けたログをChunk Storeへ • セミステートフルなコンポーネント ◦ 直近のログデータを保持
17 Ingester(2/2) 画像:https://grafana.com/blog/2018/12/12/loki-prometheus-inspired-open-source-logging-for-cloud-natives/ • Logをまとめて(Chunk)をChunk Storeへ ◦ Chunk Storeへの頻繁な書き込みの抑制 ◦
Chunkがいっぱいになったら書き込む (もしかしたら一定時間経過後も? )
18 DistributorとIngester • DistributorはコンシステントハッシングによりIngesterを決定 画像:https://grafana.com/blog/2018/12/12/loki-prometheus-inspired-open-source-logging-for-cloud-natives/
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
lokiのRead Path 20 • 赤矢印の流れ Distributor Ingester Querier Chunk Store
(Index) Chunk Store (Chunks) Promtail Table Manager fluentd その他 Clients
Querier 21 • ログのクエリを受ける • 直近のログはIngester, それ以外はChunk Store Distributor Ingester
Querier Chunk Store (Index) Chunk Store (Chunks) Promtail Table Manager fluentd その他 Clients
LogのRetention 22 • Table Managerにより制御 • Table Manager ◦ Retentionを管理
◦ 基本的にindexを対象 Distributor Ingester Querier Chunk Store (Index) Chunk Store (Chunks) Promtail Table Manager fluentd その他 Clients
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 次のページでこの設定の例を説明
Table ManagerによるRetention 24 period テーブル time
Table ManagerによるRetention 25 period period 2tables! time
Table ManagerによるRetention 26 period period 2tables! time
Table ManagerによるRetention 27 period period 2tables! period time
Table ManagerによるRetention 28 period period 2tables! period time
Table ManagerによるRetention 29 period period 削除 period 2tables! time
LogのRetentionのバグ?仕様? 30 • IndexやChunkが削除されても削除部分のログが参照できる仕様?バグ?が存在 ◦ Lokiのキャッシュの仕組みがまだ理解できておらず説明できません … ◦ Issue :
Retention/Deleting old data doesn't work #881(この人は解決しているらしい )
Lokiのコンポーネントについて 31 • 様々なコンポーネントがあるが、全て一つの実行ファイルから起動 ◦ シングルプロセスで全てのコンポーネントを動かすことも可能 ◦ lokiの設定でどのコンポーネントを動かすかを指定 • コンポーネントを分離して動かすドキュメントはない(2019/9/17時点)
Promtail
KubernetesとLoki(再掲) 33 Kubernetes Node Promtail App Log Service Discovery for
apps on K8s ・CLIやAPIも Systemd Journal Send Logs with Labels
Promtail 34 • lokiへラベル付きのログを送信するためのエージェント ◦ Prometheusと似たような設定項目 ◦ Kubernetesのアプリのログを対象する場合 Service Discoveryが利用可能
• Kubernetes上でPromtailをデプロイする例 ◦ DaemonSetとして起動しノードで動くコンテナのログや Systemd Journalを収集 ◦ 特定のアプリのログだけを対象とする場合は Sidecarとして起動 Promtail Service Discovery Send Logs with Labels
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: ...
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: ...
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: ...
static_configs 38 • Service Discoveryを利用しない設定 • labelsでログにつけるラベルを指定 • __path__ラベルでログのパスを指定 ◦
ワイルドカードを使った指定も可能 static_configs: - targets: - localhost labels: job: someone_service host: yourhost __path__: /var/log/someone_service/*.log
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: ... 再掲
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__
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: ... 再掲
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
extracted mapについて 43 key value time xxxx message yyyy host
zzzz {time: "xxxx", message: "yyyy", host: "zzzz"} • ログの中身をパースした結果をmapへ ◦ Mapの中身をさらにパースすることも可能 • stage間でextracted mapは共有 "extracted map"
ログをextracted mapへ 44 • json stage ◦ ログがjson形式の場合に利用 • regex
stage ◦ 正規表現を用いる場合に利用 - json: expressions: time: - regex: expression: "^(?P<year>\\d+)" source: "time"
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
保存するログの選択 46 • output stage ◦ lokiがログとして保存するコンテンツを選択する key value content
yyyy stream_type stderr "extracted map" - output: source: content contentのvalueがログとして保存される
タイムスタンプのパース 47 • timestamp stage ◦ extracted map中のタイムスタンプをパース key value
timestamp 1562708916414 "extracted map" - timestamp: source: timestamp format: UnixMs
特定ラベルを持つものだけ処理 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: ...
ログからメトリクスを生成 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の例
設定済みstage 50 • デフォルトで設定されている便利な設定済みstage ◦ docker ◦ cri • 上記はコンテナランタイムから吐き出されるログから
◦ タイムスタンプ ◦ メッセージの抽出 ◦ 出力がstdout, stderrかをstreamラベルとして付与 等 • 細かなstageの設定をしなくても、これだけでとりあえず使える pipeline_stages: - docker: {}
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を起動
Promtailの設定確認(2/3) 52
Promtailの設定確認(3/3) 53
Promtailのより細かな情報 54 • 以下のURLを参照 ◦ https://grafana.com/blog/2019/07/25/lokis-path-to-ga-adding-structure-to-unstructured-logs/ ◦ https://github.com/grafana/loki/blob/master/docs/logentry/processing-log-lines.md
まとめ • lokiのアーキテクチャ ◦ Distributor ◦ Ingester ◦ Querier ◦
Chunk Store ◦ Table Manager • Promtailの役割と設定について紹介 ◦ labelをつけてログをlokiへ送信 ◦ Prometheusの設定と似ているが大きな違いとして pipeline_stages 55