オープンソース

一覧へ

7. データを解析する

本章では、OpenObserveに取り込んだログデータを解析する方法について説明します。
OpenObserveでは、取り込んだログに対してファンクションを適用し、ログ本文から必要な情報を取り出すことができます。

7.1. データ解析機能の概要

OpenObserveに取り込まれたログは、ログ検索画面で検索できます。
ただし、ログ本文が1つの文字列として保存されている場合、ログの中に含まれる情報を条件として利用しにくい場合があります。例えば以下のようなログがある場合、ログ本文の中には日時、ホスト名、プロセス名、メッセージなどの情報が含まれています。
Jun xx xx:xx:xx linux kernel: CIFS: Attempting to mount //192.168.2.134/share
このようなログをそのまま扱う場合、ログ本文に対してキーワード検索を行うことはできますが、プロセス名やメッセージ部分だけを条件にして検索したり、特定の項目ごとに集計したりする場合は、ログを項目ごとに分けて扱えるようにしておく必要があります。
ログデータを解析して項目ごとに分けることで、以下のような操作を行いやすくなります。
  • 特定のプロセス名を条件にしてログを検索する
  • 特定のメッセージを含むログだけを確認する
  • ホスト名やプロセス名ごとにログ件数を集計する
  • ダッシュボードやアラートの条件として利用する

ログを項目ごとに扱えるようにしておくことで、ログ本文全体に対するキーワード検索だけでなく、特定の項目を条件にした検索や可視化を行いやすくなります。

7.2. ファンクションについて

OpenObserveでは、ログデータを解析するためにファンクションを利用できます。ファンクションは、取り込まれたログデータに対して処理を行うための仕組みです。
ログデータは、収集方法やログの種類によって形式が異なります。例えば、ログ本文がbodyフィールドに1つの文字列として保存されている場合、ログの中に含まれるプロセス名やメッセージなどを、そのまま個別の条件として利用することはできません。
ファンクションを利用すると、ログ本文に対して処理を行い、検索や集計で扱いやすい形式に整えることができます。そのため、ログ本文全体に対するキーワード検索だけでなく、ログ内の特定の要素を利用した検索や可視化を行いやすくなります。
ファンクションは、対象となるログの形式に合わせて作成します。ログ形式が想定と異なる場合、期待した結果にならないことがあるため、対象とするログの内容を確認した上で利用します。

7.3. VRL

OpenObserveでは、VRLを利用してログデータを解析できます。

7.3.1. VRLとは

VRL(Vector Remap Language) は、もともとデータシッパーであるVectorのプロジェクトで開発・導入された言語です。Vectorでも、受け取ったデータを変更・追加・削除などを行うために利用します。
VRLは多くの機能を持つため、すべての機能について知りたい場合は、以下公式マニュアルを参照してください。
VRLは、vectorの起動時にRust言語に変換・コンパイルされて動作します。このため、他のソフトウェアでよくある、Node.jsやPython、Luaのようなスクリプト言語で動作する変換器とは異なり、非常に高速に動作します。

7.3.2. VRL内でのデータの取扱い

VRLでは、ログを一つのオブジェクトとして扱います。そして、ログは . (ドット)として表現されます。例えば、次のようなオブジェクトがあるとします。
{
"status": 200,
"timestamp": "2026-06-01T19:19:24.646170Z",
"message": "SUCCESS",
"username": "ub40fan4life"
}

このオブジェクト全体が . (ドット)と表現され、その配下にあるフィールドには .status や .timestamp などのようにアクセスできます。

7.3.3. データの代入

VRL内では、オブジェクトにデータを代入することができます。例えば、以下のように新しいフィールドを定義することができます。

# 文字列の代入

.sample = "sample message"

# 新しいオブジェクトの生成

.sample_obj = {}

また、既存のフィールドを上書きすることもできます。以下は .timestamp に格納されている日付情報を、Unixタイムスタンプに変換し、再代入する例です。

.timestamp = to_unix_timestamp!(.timestamp)

7.3.4. データ形式

VRLで利用できるデータ形式は以下の通りです。

# Integer(数値)

.int = 100
.int = 1_000_000

# Float(小数)

.float = 0.1

# String(文字列)

.str = "string"

# Array(配列)

.arr = ["str", 0]
.arr = ["str", 0]

# Boolean(論理値)

.bool = true
.bool = false

# Object(オブジェクト)

.obj = {"field": "value"}

# Regular Expression(正規表現)

.regexp = r'^Hello, World!$'

7.3.5. 式

VRLで利用できる主な式は以下の通りです。

# 加算

val = 1 + 1
str = "Hello " + "World"

# 減算

val = 2 - 1

# 乗算

val = 2 * 2

# 除算

val = 4 / 2

7.3.6. 比較演算子

VRLで利用できる比較演算子は以下の通りです。
  • ==
    • 左辺と右辺が等しい場合に真
  • !=
    • 左辺と右辺が等しくない場合に真
  • >=
    • 左辺が右辺以上の場合に真
  • >
    • 左辺が右辺より大きい場合に真
  • <=
    • 左辺が右辺以下の場合に真
  • <
    • 左辺が右辺より小さい場合に真

7.3.7. 論理演算子

VRLで利用できる論理演算子は以下の通りです。

  • &&
    • 左辺と右辺が真の場合に真
  • ||
    • 左辺または右辺が真の場合に真
  • !
    • 否定

7.3.8. 条件式

VRLでは、以下のように if 、 else 、 else if を使って条件分岐を行うことができます。

if (x == 1) {
"Hello, World1"
} else if (x == 2) {
"Hello, World2"
} else {
null
}

7.4. 利用できる関数

VRLでは、標準で多くの関数を実装しています。

7.4.1. 検査関数

検査関数は、指定した値のデータ型や状態を確認するための関数です。

関数 説明
is_array() 配列の場合に真を返します。
is_boolean() 論理値の場合に真を返します。
is_empty() 文字列か配列・オブジェクトの要素数が0の場合に真を返します。
is_null() nullの場合に真を返します。
is_integer() intの場合に真を返します。
is_string() intの場合に真を返します。
is_json() json形式の場合に真を返します。
is_timestamp() RFC3339形式の時刻情報の場合に真を返します。

7.4.2. 変換系の関数

変換系の関数は、文字列や数値、時刻情報などを別の形式に変換するための関数です。

関数 説明
decode_base64() base64エンコードされた文字列を、元の文字列にして返します。
encode_base64() 文字列をbase64エンコードして返します。
to_int() 引数をint型にして返します。
to_string() 引数をstring型にして返します。
to_unix_timestamp() RFC3339形式の時刻情報をUnixタイムスタンプに変換します。

7.4.3. フォーマットの解析関数

フォーマットの解析関数は、特定の形式で出力されたログを解析するための関数です。

関数 説明
parse_apache_log() apache形式のログを解析します。
parse_grok() GROKパターンを使いログを解析します。
parse_syslog() syslog形式のログを解析します。

7.5. ログデータをフィールド分解する

本章では、ファンクションを作成し、ログ本文をフィールドに分解する方法を記載します。例として、messagesストリームに保存されたログの body フィールドから、プロセス名とメッセージ部分を取り出すためのファンクションを作成します。

対象となるログは以下の通りです。

Jun 17 17:00:02 linux kernel: CIFS: Attempting to mount //192.168.2.134/share
このログでは、 kernel がプロセス名に相当し、 CIFS: Attempting to mount //192.168.2.134/share がメッセージ部分に相当します。
ファンクションを利用して、これらの値を新しいフィールドとして追加します。
抽出する項目の例は以下の通りです。
抽出する項目の例
フィールド名 内容
process_name ログを出力したプロセス名を格納します。例では kernel を格納します。
messages ログ本文のメッセージ部分を格納します。例では CIFS: Attempting to mount //192.168.2.134/share を格納します。
ファンクションを作成するには、OpenObserveのメニューから パイプライン -> 関数 の順にクリックするか、 ホーム画面中央の 関数 をクリックします。
_images/analysis1-1.png
ファンクションの一覧画面が表示されるため、画面右上の 関数を作成 をクリックします。
_images/analysis1-2.png _images/analysis1-3.png

以下の項目を設定します。

  • 名前
    • 作成するファンクションの名を指定します。管理画面上に表されます。
  • VRLファンクション
    • ログ本文を解析するための処理を記述します。例えば、ログ本文がbodyフィールドに保存されている場合、以下のようなVRLを設定します。
parsed = parse_regex!(.body, r'^\w+\s+\d+\s+\d+:\d+:\d+\s+\S+\s+(?P<process_name>[^[:]+)(?:[\d+])?:\s+(?P<message>.*)$')

.process_name = parsed.process_name
.message = parsed.message

上記の例では、body フィールドに格納されたログ本文を正規表現で解析し、以下のフィールドを追加しています。

追加するフィールド
フィールド名 内容
process_name ログを出力したプロセス名を格納します。例では kernel を格納します。
messages ログ本文のメッセージ部分を格納します。例では CIFS: Attempting to mount //192.168.2.134/share を格納します。
  • イベント
    • ファンクションのテストに使用するサンプルデータを指定します。実際に取り込まれるログに近い形式のデータを指定し、VRLのテストを行う際に使用します。上記VRLに合わせる場合、以下をイベントに指定します。
[
{
  "_timestamp": 1735128523652186,
  "body": "Jun 17 17:00:02 linux kernel: CIFS: Attempting to mount //192.168.2.134/share"
}
]
  • 出力
    • ファンクションをテストした結果が表示されます。作成したファンクションにより、想定したフィールドが追加されているか確認します。

設定が完了したら 関数をテスト をクリックしテストを行い、出力内容に問題なければ 保存 をクリックします。

ファンクション作成後は、ログ検索画面にて、対象のログにファンクションを適用します。

_images/analysis1-4.png
一覧へ