Grafanaチームは、メトリクスクエリやビジュアライゼーションといったGrafana機能と連携したロギングプラットフォーム、Lokiのαバージョンを発表した。Lokiは、新しいクライアントエージェントpromtailと、ログメタデータのインデックスとストレージのためのサーバーサイドコンポーネントを追加する。
Lokiはメトリクス、ログ、トレーシング間にトレーサビリティを加えることを目指している。ただし、最初のリリースのターゲットは、メトリクスとログをリンクすることだ。ログはまず、Kubernetes podをサポートする新しいエージェントにより集約され、インデックス付けされる。後のクエリのため、Prometheusと同じKubernetes APIとリラベリング設定を使用して、メトリクスとログのメタデータが同じままになるようにする。PrometheusはLokiを使うための必要条件ではないが、Prometheusがあるとより簡単になる。発表記事では「私たちにとって、メトリクスとログのメタデータのマッチングは重要であり、まずはKubernetesのみをターゲットにすることにした」と説明している。
Lokiの設計ドキュメントによると、設計の裏側には「ログとメトリクスのコンテキストスイッチのコストを最小限にする」という意図がある。ここでのログと時系列データの相関は、通常のメトリクスコレクタが生成したデータと、ログから生成されたカスタムメトリクスの両方に適用される。AWSやGCPのようなパブリッククラウドプロバイダーはカスタムメトリクス抽出を提供しており、AWSはメトリクスからログにナビゲートする機能も提供している。いずれもログデータをクエリするために異なるクエリ言語を使っている。またLokiは、クラッシュ時にKubernetes podのような一時的なソースからログが失われるという問題の解決も目指している。
Lokiは、クライアントサイドのpromtailエージェントと、サーバーサイドのdistributorおよびingesterコンポーネントで構成される。querierコンポーネントはクエリを処理するためのAPIを公開する。ingesterおよびdistributorコンポーネントの大部分は、スケーラブルで高可用なPrometheus-as-a-serviceを提供するCortexのコードから持ってきたものだ。distributorはpromtailエージェントからログデータを受け取り、ログデータのラベルとユーザーIDから一貫したハッシュを生成し、それを複数のingesterに送信する。ingesterはそのエントリを受け取り、gzipで圧縮した「チャンク(chunk)」(特定のラベルとタイムスパンのログのセット)を構築する。ingesterはログの内容ではなくメタデータ(ラベル)に基づいてインデックスを構築するため、簡単にクエリして時系列メトリクスラベルと関連づけることができる。これは運用の複雑さと機能の間のトレードオフとして行われた。チャンクは定期的にAmazon S3などのオブジェクトストアにフラッシュされ、CassandraやBigtable、DynamoDBにインデックス付けされる。
クエリAPIは時間範囲とラベルのセレクタを引数にとり、マッチするチャンクのインデックスをチェックする。また、まだフラッシュされていない最近のデータについてingesterに問い合わせる。検索には正規表現が使えるが、ログの内容はインデックス付けされていないため、インデックス付けされた場合よりも遅くなる可能性がある。Lokiはオープンソースであり、Grafanaのサイトで試すことができる。