1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ログをメトリクスに変換: Loki、Python、Telegrafによるオープンソースの構築(前編)

Posted at

スクリーンショット 2025-07-03 9.57.04.png

目次

1.はじめに
2.重要なポイント
3.Lokiのインストールと設定
4.シンプルなPythonパーサーを作成
5.スクリプトを実行するためのTelegrafの設定
6. メトリクスの可視化
7. まとめ

1. はじめに

モニタリングは必ずしも複雑である必要はありません。このガイドでは、ELKスタックを使用せず、最小限の労力で、軽量でオープンソースのセットアップを使用して、生のログを使用可能なメトリクスに変換する方法を紹介します。Loki、Python、Telegrafを使用して、ログをGraphiteメトリクスに変換し、簡単に監視やアラートを出すことができます。システム管理者、DevOps初心者、またはゼロからより革新的なモニタリングパイプラインを構築することに興味がある方に最適です。MetricFireのHosed Graphiteアカウントをまだお持ちでない方は、こちらから14日間の無料トライアルにサインアップしてください。

2. 重要なポイント

  • ログからのメトリクス: ログをメトリクスに変換することで、傾向分析、アラート、可視化が容易になり、詳細なログデータと実用的な洞察のギャップを埋めることができます。

  • 軽量スタック: Loki、Python、Telegrafのようなオープンソースのツールを使用することで、ELKスタックのような大規模なログ管理プラットフォームの複雑さとリソースの要求を回避します。

  • カスタマイズ可能な解析: Pythonスクリプトは、ログがどのように解析され、どのメトリクスが抽出されるかを完全にコントロールすることができます。

  • ブリッジとしてのTelegraf: Telegrafは、カスタムスクリプトを実行し、結果のメトリクスを直接Graphite(またはサポートされている他の出力)に転送することで、プロセスを簡素化します。

  • より良い観察可能性: ログとメトリクスを組み合わせることで、システムの観測性が向上し、異常の早期発見と迅速なインシデント対応が可能になります。

  • コスト効率の良いモニタリング: このセットアップは、コストを大幅に増やしたり、ツールを乱立させることなく、観測可能性を拡大したいチームに最適です。

使用するツールまとめ

  • Loki: Elasticsearch に比べて超軽量な Grafana Labs のログデータベース。

  • Python: ログをメトリクスに解析する小さなスクリプト用のツール。

  • Telegraf: 私たちのスクリプトを実行し、Hosted Graphiteアカウントにメトリクスを転送するメトリクスエージェントです。

以下の例(Linux用)に従って、システムログからGraphiteメトリクスを作成します。このセットアップにはいくつかの可動部分があることは承知しています。そこで、私たちの「ログからメトリクスへ」シリーズのパート2をチェックしてください。

3. Lokiのインストールと設定

LokiはGrafana Labsによって構築されたログ構造化データベースである。これはログのPrometheusのようなもので、生のログコンテンツの代わりにラベルをインデックス化するため、高速で効率的です。このセットアップでは、Lokiをローカルで実行し、ログをディスクに保存し、シンプルなPythonスクリプトを使ってHTTP経由でクエリを実行します。PromtailもElasticsearchもクラウドバケットも必要ありません!

sudo wget https://github.com/grafana/loki/releases/download/v2.9.4/loki-linux-amd64.zip -O /usr/local/bin/loki.zip

cd /usr/local/bin
sudo unzip loki.zip
sudo mv loki-linux-amd64 loki
sudo chmod +x loki

Lokiの設定ファイルを/etc/loki/loki-config.yamlに作成します:

auth_enabled: false

server:
  http_listen_port: 3100

ingester:
  lifecycler:
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1

schema_config:
  configs:
    - from: 2024-01-01
      store: boltdb-shipper
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h

storage_config:
  boltdb_shipper:
    active_index_directory: /tmp/loki/index
    cache_location: /tmp/loki/cache
    cache_ttl: 24h
  filesystem:
    directory: /tmp/loki/chunks

limits_config:
  max_entries_limit_per_query: 5000

table_manager:
  retention_deletes_enabled: true
  retention_period: 24h

compactor:
  working_directory: /tmp/loki/compactor

必要なデータ・ディレクトリを作成し、rootパーミッションを割り当てる:

sudo mkdir -p /tmp/loki/index
sudo mkdir -p /tmp/loki/cache
sudo mkdir -p /tmp/loki/chunks
sudo mkdir -p /tmp/loki/compactor

sudo chown -R root:root /tmp/loki

Lokiを手動で実行し、localhost:3100をリッスンする。

sudo /usr/local/bin/loki -config.file=/etc/loki/loki-config.yaml

4. シンプルなPythonパーサーを作成

このPythonスクリプトは、/var/log/syslog の最後の500行を読み取り、SSHログインの成功や失敗、sudoコマンドの使用、cronジョブの実行など、一般的なシステムイベントの頻度をカウントします。これらのカウントは、TelegrafがHosted Graphiteアカウントに転送できるGraphiteフォーマットのメトリクスとして出力されます。これは、包括的なロギングスタックを必要とせずに、主要なシステムアクティビティ(ログイン試行やジョブスケジュールなど)を追跡するための軽量な方法を提供します。

新しいPythonファイルを作成するだけです: /etc/telegraf/parse_loki_metrics.py に新しいPythonファイルを作成します。

#!/usr/bin/env python3

import time
import re
from collections import deque

LOG_PATH = "/var/log/syslog"

# Patterns and counters for most common log events
patterns = {
    "logs.sshd.success": r"sshd.*Accepted password",
    "logs.sshd.failure": r"sshd.*Failed password",
    "logs.sudo.command": r"sudo: .*COMMAND=",
    "logs.cron.job": r"CRON\[.*\]:"
}

metrics = {key: 0 for key in patterns}

try:
    with open(LOG_PATH, "r") as f:
        recent_lines = deque(f, maxlen=500)
        for line in recent_lines:
            for metric, pattern in patterns.items():
                if re.search(pattern, line):
                    metrics[metric] += 1

    ts = int(time.time())
    for key, val in metrics.items():
        print(f"{key} {val} {ts}")

except Exception as e:
    print(f"logs.script_error 1 {int(time.time())}  # error: {e}")

スクリプトを実行可能にする:

sudo chmod +x /etc/telegraf/parse_loki_metrics.py

5. スクリプトを実行するためのTelegrafの設定

Telegrafのインスタンスがまだサーバーで稼動していない場合は、HG-CLIツールをインストールして、素早く簡単にTelegrafを稼動させてください:

curl -s "https://www.hostedgraphite.com/scripts/hg-cli/installer/" | sudo sh

Telegrafの設定ファイルを開いてください: /etc/telegraf/telegraf.confを開き、以下のセクションを追加してください:

[[inputs.exec]]
  commands = ["/etc/telegraf/parse_loki_metrics.py"]
  timeout = "15s"
  data_format = "graphite"
  name_prefix = "syslog-metrics."

syslogがsudoパーミッションでしかアクセスできない場合は、Telegrafの「commands」ラインを次のように更新する必要があるかもしれません:

  commands = ["/bin/bash -c '/usr/bin/python3 /etc/telegraf/parse_loki_metrics.py'"]

Telegrafサービスを再起動すると、Exec Input PluginがPythonスクリプトを実行し、出力を読み取り、Hosted Graphiteアカウントにデータを転送します。

telegraf --config /etc/telegraf/telegraf.conf

6. メトリクスの可視化

LokiとTelegrafの両方がサーバーで実行されると、メトリクスはHosted Graphiteアカウントに転送され、Metrics Search UI(prefix: telegraf.syslog-metrics.*付き)で見つけることができます。

これらのメトリクスを使用してHosted Grafanaでビジュアライゼーションを作成する方法については、ダッシュボードのドキュメントを参照してください:

スクリーンショット 2025-07-03 10.10.39.png

このアプローチのメリット

  • 軽量: ELKのような複雑なスタックのオーバーヘッドを回避。

  • カスタマイズ可能: Pythonパーサーをカスタマイズして、ニーズに最も適したメトリクスを抽出します。

  • スケーラブル: 小規模なセットアップにも大規模なインフラにも適しています。

7. まとめ

このセットアップを完了することで、生のシステムログを構造化されたリアルタイムのメトリクスに変換する強力なパイプラインが構築されます。無限のログ行を手動でふるいにかける代わりに、SSHログイン、cronジョブ、システムイベントなどの重要なアクティビティをGraphiteダッシュボードから直接監視できるようになりました。これにより、完全なELKスタックの複雑さ(またはコスト)なしに、システムの健全性を即座に可視化することができます。

DevOpsの役割において、ログを観測できることは、単にあれば良いということではなく、非常に重要です。ログをメトリクスとして監視することで、障害をより早く発見し、疑わしい活動をより早く検出し、インシデント対応を自動化することができます。これにより、事後的なトラブルシューティングから積極的なシステム管理へと移行することができます。なにより、このアプローチは、インフラ予算を圧迫することなく、1台のサーバーから全フリートまで拡張できるほど軽量です。

もっと詳しく知りたいですか?今すぐお問い合わせください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?