Hitachi

JP1 Version 13 JP1/Integrated Management 3 - Manager 導入・設計ガイド


12.5.3 ログメトリクス機能

ログメトリクス機能は,JP1/IM - Agentのアドオンプログラムの1つとして,テキスト形式のログファイルに出力されたログメッセージを,メトリクスデータ(ログメトリクス)に変換する機能です。ログメトリクス機能は,OSSのFluentdおよびfluent-plugin-prometheusプラグインを利用して実装しています。

Fluentdで生成・計測したログメトリクスをPrometheusがスクレイプする際は,ユーザー独自のExporterのスクレイプ定義の機能を利用します。

PrometheusとJP1/IM - Manager間のログメトリクスの通信には,リモートライト機能を利用し,統合オペレーション・ビューアーの[トレンド]タブでのログメトリクスの表示には,ユーザー独自のメトリック定義の機能を利用します。

ログメトリクスの収集時刻は,PrometheusがFluentdをスクレイプした時刻(UTC時刻)となります。

ログメトリクス機能は,次のプラグイン機能で構成されます。

fluent-plugin-prometheusプラグインを踏まえたログメトリクス機能の詳細については,「12.5.3(3)fluent-plugin-prometheusプラグイン」を参照してください。

〈この項の構成〉

(1) インプットプラグイン機能

ログメッセージを読み込み,解析する機能と,Prometheusのスクレイプで利用するバインド番号,ポート番号,HTTPエンドポイントなどを設定する機能があります。

インプットプラグイン機能に必要な定義を次に示します。

■Prometheusのスクレイプで利用する設定

Fluentdで生成・計測したログメトリクスを,Prometheusがスクレイプする際に利用するバインド番号,ポート番号,HTTPエンドポイントを指定します。

■ログメトリクス機能の監視対象ログファイルの設定

ログメトリクス機能の監視対象とするログファイルを指定し,監視対象からログメッセージを読み取ります。

インプットプラグイン機能の定義は,ログメトリクス定義ファイル(fluentd_任意の名前_logmetrics.conf)で行います。ログメトリクス定義ファイルの詳細については,マニュアル「JP1/Integrated Management 3 - Manager コマンド・定義ファイル・APIリファレンス」の「10. IMエクスポーターの定義ファイル」で,「ログメトリクス定義ファイル(fluentd_任意の名前_logmetrics.conf)」を参照してください。

(2) アウトプットプラグイン機能

インプットプラグイン機能で処理したログメッセージからログメトリクスを生成する機能です。

ログメッセージをPrometheusのメトリクスデータとして成形し,数値化(ログメトリクスに変換)します。

アウトプットプラグイン機能の設定は,ログメトリクス定義ファイル(fluentd_任意の名前_logmetrics.conf)で行います。ログメトリクス定義ファイルの詳細については,マニュアル「JP1/Integrated Management 3 - Manager コマンド・定義ファイル・APIリファレンス」の「10. IMエクスポーターの定義ファイル」で,「ログメトリクス定義ファイル(fluentd_任意の名前_logmetrics.conf)」を参照してください。

(3) fluent-plugin-prometheusプラグイン

fluent-plugin-prometheusプラグインは,Fluentdの機能を拡張するプラグインです。fluentdレコードからメトリクスを計測し,それらのメトリクスをWebインターフェース経由で出力します。Prometheusと一緒に利用することが前提です。

また,fluent-plugin-prometheusプラグインの前提プログラムのprometheus-clientは,Prometheusのメトリクスタイプを定義するRuby用のPrometheusクライアントライブラリです。Prometheusサーバと一緒に利用することが前提です。PrometheusサーバがHTTPエンドポイントをスクレイプした際,prometheus-clientは,追跡対象であるメトリクスの現在の状態をPrometheusサーバに送信します。

ログメトリクス機能では,fluent-plugin-prometheusプラグインを構成するプラグインのうち,次のプラグインを利用できます。

(a) prometheus inputプラグイン

prometheus outputプラグインが収集したメトリクスを,Prometheusに出力するための設定を行うプラグインです。具体的には,Prometheusサーバが,収集したメトリクスをスクレイプするための,HTTPエンドポイントの設定を行います。ログメトリクス機能では「20273」を設定し,「http://localhost:20273/metrics」で収集したメトリクスにアクセスできます。

prometheus inputプラグインの設定は,ログメトリクス定義ファイル(fluentd_任意の名前_logmetrics.conf)で行います。

<設定例>

<source>
  @type prometheus
  bind バインド番号
  port リッスンポート番号
  metrics_path メトリクスパス
</source>

各パラメーターの詳細については,マニュアル「JP1/Integrated Management 3 - Manager コマンド・定義ファイル・APIリファレンス」の「10. IMエクスポーターの定義ファイル」で,「ログメトリクス定義ファイル(fluentd_任意の名前_logmetrics.conf)」を参照してください。

(b) prometheus outputプラグイン

prometheus outputプラグインは,Fluentdの<match>セクションを利用して,fluentdレコードからログメトリクスを生成・計測するプラグインです。fluentdレコードに対しては,単に読み込みを行うだけのため,fluentdレコード自体に影響は与えません。

prometheus outputプラグインの設定は,ログメトリクス定義ファイル(fluentd_任意の名前_logmetrics.conf)で行います。

<設定例>

<match>
  @type prometheus
  <metric>
    name 任意のログメトリクス名
    type ログメトリクスタイプ
    desc ログメトリクスの説明
    key ログからログメトリクスへの変換対象を判定するkey
    <labels>
      ラベルのキー1 ラベルの値1
      ラベルのキー2 ラベルの値2
    </labels>
  </metric>
</match>

各パラメーターの詳細については,マニュアル「JP1/Integrated Management 3 - Manager コマンド・定義ファイル・APIリファレンス」の「10. IMエクスポーターの定義ファイル」で,「ログメトリクス定義ファイル(fluentd_任意の名前_logmetrics.conf)」を参照してください。

■メトリクスタイプ

Prometheusのメトリクスタイプのうち,ログメトリクス機能では,次のメトリクスタイプを利用できます。

  • counter

    単調に増加する値を持つメトリクスを表します。処理された要求の数,完了したタスク,エラーの数などを表すのに適しています。

    Fluentdの再起動時にだけ,累積した値をリセットできます。

    定義内のkeyが空の場合は,レコードの内容に関係なく,レコードの数だけ,メトリクスの値が1ずつ増加します。

    値が減少する可能性のあるメトリクスの場合はgaugeを指定してください。

    <設定例>

      <metric>
        name logmetrics1※1
        type counter※1
        desc The description of the logmetrics1.※1
        key hoge※2
        <labels>※2
          ラベルのキー1 ラベルの値1
          ラベルのキー2 ラベルの値2
        </labels>
      </metric>

    注※1 指定は必須です。

    注※2 指定は任意です。ラベルセクションについては,下記の「■ラベル」を参照してください。

  • gauge

    任意に上下できる値を持つメトリクスを表します。温度,現在のメモリ使用量,同時リクエスト数などを表すのに適しています。

    <設定例>

      <metric>
        name logmetrics2※1
        type gauge※1
        desc The description of the logmetrics2.※1
        key hoge※1
        <labels>※2
          ラベルのキー1 ラベルの値1
          ラベルのキー2 ラベルの値2
        </labels>
      </metric>

    注※1 指定は必須です。

    注※2 指定は任意です。ラベルセクションについては,下記の「■ラベル」を参照してください。

■ラベル

<labels>で示すラベルセクションを利用することで,fluentdレコードから,Prometheusのラベルとして静的な値または動的な値を設定できます。

<設定例>

<labels>
  ラベルのキー1 ラベルの値1
  ラベルのキー2 ラベルの値2
</labels>

すべてのラベルセクションで,形式は共通です。<labels>で囲まれたラベルセクション内の各1行に,1つのラベルのキーと値を入力します。ラベルの値に入力した文字列をそのままラベルの値として設定しますが,次に示すレコードアクセサーまたはプレースホルダーを利用して値を指定することもできます。

  • レコードアクセサー

    Prometheusのレコードアクセサーを利用すると,fluentdレコード内の入れ子構造になっているfluentdフィールドから,ラベルの値を指定できます。レコードアクセサーでラベルの値を指定する場合は,先頭に「$.」または「$[」を付与します。

    例えば,次に示すfluentdレコードの例の場合,criticalにアクセスしたい場合は,

    $.event.level」または「$['event']['level']」と指定します。

    存在しないレコードに対して,レコードアクセサーでアクセスしようとした場合,そのラベルの値には空を設定します。

    <fluentdレコードの例>

    {
      "log": "some message",
      "event": {
         "level": "critical", 
         "detail": {
             "category": "application error"
          }
      }
    }
  • プレースホルダー

    プレースホルダーを利用して,ラベルの値を指定できます。なお,fluentdレコードを利用するプレースホルダーは推奨されていないため,fluentdレコードを利用したい場合は,レコードアクセサーを利用してください。

    すでに定義済みのプレースホルダーを次に示します。

    プレースホルダー

    ${hostname}

    Fluentdが稼働しているホストのホスト名

    ${worker_id}

    fluentdワーカーID

    ${tag}

    Fluentdのタグ名

    ${tag_parts[N]}

    FluentdのタグのN+1番目の部分※1

    ${tag_prefix[N]}

    Fluentdのタグの0〜N+1番目の部分※1

    ${tag_suffix[N]}

    Fluentdのタグの「タグサイズ※2N」番目の部分※1

    注※1 プレースホルダーは,prometheus outputプラグインだけで利用できます。Nに対して,タグサイズ※2以上の値を入力した場合,プレースホルダーはそのままの文字列をラベルの値に設定します。

    注※2 タグサイズとは,タグ内のドット「.」で区切られた部分の個数(「.」の個数+1)です。例えば,タグが「1.2.3」である場合,タグサイズは3となります。

■上位のラベルセクションとメトリクスセクション内のラベルセクション

prometheus outputプラグインでは,<metric>で示すメトリクスセクションを複数定義できます。<match>のような上位のラベルセクションでは,すべてのメトリクスのためのラベルを定義でき,メトリクスごとのラベルは,メトリクスセクション内のラベルセクションで定義できます。両方で定義されたラベルはマージされます。

例えば,次に示す設定例の場合,メトリクス「LogMetrics1」は,taghostnamekeydata_typeのラベルを持つことになります。

<設定例>

<match>
  @type Prometheus
  <metric>
    name LogMetrics1
    type counter
    desc The total number of foo in message.
    key foo
    <labels>※1
      key foo
      data_type ${type}
    </labels>
  </metric>
  <metric>
    name LogMetrics2
    type counter
    desc The total number of bar in message.
    key bar
    <labels>※2
      key bar
    </labels>
  </metric>
  <labels>※3
    tag ${tag}
    hostname ${hostname}
  </labels>
</match>

注※1 メトリクスLogMetrics1のラベルセクション

注※2 メトリクスLogMetrics2のラベルセクション

注※3 上位のラベルセクション