OTEP-0097: ログのデータモデル

OpenTelemetryが理解するログレコードのためのデータモデルを導入します。

目次

動機

これは、アプリケーションのログファイル、機械生成のイベント、システムログなど、さまざまなソースからのログを表現できるデータモデルとセマンティック規約の提案です。 既存のログ形式は、このデータモデルに一意にマッピングできます。 このデータモデルからの逆マッピングも、対象のログ形式が同等の機能を持つ範囲において可能です。

このデータモデルの目的は、ログレコードとは何か、ロギングシステムによって記録、転送、保存、解釈される必要があるデータは何かについて、共通の理解を持つことです。

この提案は、Standalone Log のためのデータモデルを定義します。 その関連する部分は、将来のOTEPでEmbedded Logのために採用されることがあります。

設計上の注記

要件

このデータモデルは、以下の要件を満たすように設計されました。

  • 既存のログ形式をこのデータモデルに一意にマッピングできる必要があります。 任意のログ形式からこのデータモデルへ、そして元のログ形式に戻すログデータの変換は、理想的には同一のデータになるべきです。

  • 他のログ形式からこのデータモデルへのマッピングは、意味的に妥当であるべきです。 このデータモデルは、既存のログ形式の特定の要素のセマンティクスを保持しなければなりません。

  • 任意のログ形式Aからこのデータモデルへログデータを変換し、さらにこのデータモデルから別のログ形式Bへ変換した場合、理想的には、ログ形式Aからログ形式Bへの妥当な直接変換に劣らない意味のあるログデータの変換になるべきです。

  • データを保存または送信する必要がある具体的な実装において、このデータモデルを効率的に表現できる必要があります。 私たちが主に関心を持つのは、効率性の2つの側面です。 シリアライズ/デシリアライズにかかるCPU使用率と、シリアライズされた形式での容量要件です。 これは、データモデルそのものではなくデータモデルの具体的な表現方法によって左右される間接的な要件ですが、それでも留意しておく価値があります。

このデータモデルは、次の3種類のログとイベントをうまく表現することを目指しています。

  • システム形式です。 これらは、オペレーティングシステムによって生成される、私たちが制御できないログとイベントです。 (私たちが変更できるアプリケーションによってデータが生成される場合を除いて)形式を変更したり、含まれる情報に影響を与えたりすることはできません。 システム形式の例としてはSyslogがあります。

  • サードパーティアプリケーションです。 これらはサードパーティのアプリケーションによって生成されます。 含まれる情報について、たとえば形式をカスタマイズするなど、ある程度の制御ができる場合があります。 例としてはApacheのログファイルがあります。

  • ファーストパーティアプリケーションです。 これらは私たちが開発するアプリケーションであり、ログやイベントがどのように生成され、ログにどのような情報を含めるかについて、ある程度の制御ができます。 必要であれば、アプリケーションのソースコードを変更できる可能性が高いです。

フィールドの種類

このデータモデルは、(レコードの物理的な形式やエンコーディングに関わらず)ログレコードの論理モデルを定義します。 各レコードには、2種類のフィールドが含まれます。

  • 特定の型と意味を持つ、名前付きのトップレベルフィールド。

  • キーと値のペアのリストに格納されるフィールドで、さまざまな型の任意の値を含むことができます。 よく知られたフィールドのキーと値は、そのフィールドを扱うすべての関係者がデータについて同じ解釈を持てるように、キー名と可能な値についてのセマンティック規約に従います。 Resource フィールドと Attributes フィールドのセマンティック規約への参照、および付録Aの例を参照してください。

この2種類のフィールドを持つ理由は次のとおりです。

  • 名前付きのトップレベルフィールドを効率的に表現できることです。 これらのフィールドはほぼ常に存在します(たとえば、フィールドが列挙されるもののワイヤー上では名前を持たないProtocol Buffersのようなエンコーディングを使用する場合など)。

  • 名前付きフィールドの型を強制できることです。 これは、型チェックを行うコンパイル言語にとって非常に有用です。

  • キーと値のペアのリストを介して、頻度の低いデータを表現できる柔軟性です。 これには、標準化されたセマンティクスを持つよく知られたデータだけでなく、アプリケーションがログに含めたい任意のカスタムデータも含まれます。

このデータモデルを設計する際、トップレベルの名前付きフィールドをいつ使用するかを決定するために、以下の考え方に従いました。

  • そのフィールドは、すべてのレコードにとって必須であるか、よく知られたログおよびイベント形式で頻繁に存在する(Timestamp など)か、今後登場するロギングシステムのログレコードで頻繁に存在すると期待される(TraceId など)必要があります。

  • そのフィールドのセマンティクスは、既知のすべてのログおよびイベント形式で同一であり、このデータモデルに直接かつ一意にマッピングできる必要があります。

上記の両方の条件が、そのフィールドにレコードのトップレベル構造の中の場所を与えるために必要でした。

ログおよびイベントレコードの定義

注記: 以下では型 any を使用します。 これはスカラー値(数値、文字列、真偽値)、または値の配列やマップになり得ます。 配列やマップの値については任意の深さのネストが許可されます(本質的にはJSONオブジェクトと同等のものを表現できます)。

付録Aには、既存のログ形式が以下で定義されるフィールドにどのようにマッピングされるかを示す多くの例が含まれています。 フィールドの意味について疑問がある場合は、これらの例を確認すると役立つでしょう。

ログレコードのフィールドの一覧は以下のとおりです。

Field NameDescription
Timestampイベントが発生した時刻です。
TraceIdリクエストのトレースIDです。
SpanIdリクエストのスパンIDです。
TraceFlagsW3Cのトレースフラグです。
SeverityText重大度のテキストです(ログレベルとも呼ばれます)。
SeverityNumber重大度の数値です。
Name短いイベント識別子です。
Bodyログレコードの本文です。
Resourceログのソースを説明します。
Attributesイベントに関する追加情報です。

以下は各フィールドの詳細な説明です。

フィールド: Timestamp

型: Timestamp、UNIXエポックからのナノ秒を表すuint64。

説明: 発生元のクロックで計測された、イベントが発生した時刻です。 このフィールドは省略可能で、タイムスタンプが不明な場合は存在しないことがあります。

トレースコンテキストフィールド

フィールド: TraceId

型: バイト列。

説明: W3C Trace Context で定義されているリクエストのトレースIDです。 リクエスト処理の一部であり、トレースIDが割り当てられているログに対して設定できます。 このフィールドは省略可能です。

フィールド: SpanId

型: バイト列。

説明: スパンIDです。 特定の処理スパンの一部であるログに対して設定できます。 SpanIdが存在する場合、TraceIdも存在すべきです(SHOULD)。 このフィールドは省略可能です。

フィールド: TraceFlags

型: バイト。

説明: W3C Trace Context 仕様で定義されているトレースフラグです。 本ドキュメントの執筆時点では、この仕様はSAMPLEDフラグという1つのフラグのみを定義しています。 このフィールドは省略可能です。

重大度フィールド

フィールド: SeverityText

型: 文字列。

説明: 重大度のテキストです(ログレベルとも呼ばれます)。 これは、発生元で知られているとおりの、重大度の元の文字列表現です。 このフィールドが存在せず SeverityNumber が存在する場合、SeverityNumber に対応する短い名前が代替として使用されることがあります。 このフィールドは省略可能です。

フィールド: SeverityNumber

型: 数値。

説明: このドキュメントで説明されている値に正規化された、重大度の数値です。 このフィールドは省略可能です。

SeverityNumber は整数値です。 小さい数値はより重大度の低いイベント(デバッグイベントなど)に対応し、大きい数値はより重大度の高いイベント(エラーやクリティカルなイベントなど)に対応します。 次の表は SeverityNumber の値の意味を定義します。

SeverityNumber rangeRange nameMeaning
1-4TRACEきめ細かいデバッグイベントです。デフォルト設定では通常無効になっています。
5-8DEBUGデバッグイベントです。
9-12INFO情報イベントです。イベントが発生したことを示します。
13-16WARN警告イベントです。エラーではありませんが、情報イベントよりも重要である可能性が高いです。
17-20ERRORエラーイベントです。何か問題が発生しました。
21-24FATALアプリケーションやシステムのクラッシュなど、致命的なエラーです。

各範囲内で小さい数値は重要度の低い(重大度の低い)イベントを表します。 各範囲内で大きい数値は重要度の高い(重大度の高い)イベントを表します。 たとえば SeverityNumber=17 は、SeverityNumber=20 のエラーよりも重大度の低いエラーを表します。

SeverityNumber のマッピング

既存のロギングシステムおよび形式(略してソース形式)からのマッピングは、上の表で各範囲に与えられた意味に基づいて、その特定の形式の重大度(またはログレベル)がこのデータモデルの SeverityNumber にどのように対応するかを定義しなければなりません。

ソース形式にこの表の単一の範囲に一致する重大度が複数存在する場合、ソース形式の重大度は、そのソースの重大度がどれだけ重大(重要)であるかに応じて、その範囲内の数値が割り当てられなければなりません。

たとえば、ソース形式が「Error」と「Critical」をエラーイベントとして定義しており、「Critical」がより重要かつより重大な状況を表す場合、マッピングとして次の SeverityNumber の値を選択できます。「Error」→17、「Critical」→18。

ソース形式にその範囲の意味に一致する重大度が1つしかない場合は、その重大度にその範囲の最小値を割り当てることが推奨されます。

たとえば、ソース形式に「Informational」というログレベルがあり、類似の意味を持つ他のログレベルがない場合は、「Informational」に対して SeverityNumber=9 を使用することが推奨されます。

重大度やログレベルの概念を定義していないソース形式は、SeverityNumber フィールドと SeverityText フィールドを省略してもよい(MAY)です。 バックエンドとUIは、重大度情報が欠落しているログレコードを区別して表現してもよいですし、SeverityNumber フィールドと SeverityText フィールドが欠落しているログレコードを、あたかも SeverityNumber がINFO(数値の9)に設定されているかのように解釈してもよいです。

逆マッピング

SeverityNumber から特定の形式への逆マッピングを実行する際、その形式に対応するマッピングエントリが SeverityNumber に存在しない場合は、同じ重大度の範囲内にあり、数値的に最も近い対象の重大度を選択することが推奨されます。

たとえば、Zapには「Info」と呼ばれる、INFO範囲の重大度が1つしかありません。 逆マッピングを行う際、INFO範囲(数値9〜12)のすべての SeverityNumber の値は、Zapの「Info」レベルにマッピングされます。

エラーのセマンティクス

SeverityNumber が存在し、その値がERROR(数値17)以上である場合、そのログレコードはエラーの状況を表していることを示しています。 この事実をどのように利用するかを判断するのは、この値の読み手次第です(たとえば、UIはこのようなエラーを異なる色で表示したり、エラーのあるログレコードをすべて見つける機能を持たせたりしてもよいです)。

ログレコードがエラーのイベントを表しており、ソース形式が重大度やログレベルの概念を定義していない場合は、マッピング処理の間に SeverityNumber をERROR(数値17)に設定することが推奨されます。 ログレコードがエラーでないイベントを表す場合、SeverityNumber フィールドは省略してもよいですし、ERROR(数値17)未満の任意の数値に設定してもよいです。 この場合の推奨値はINFO(数値9)です。 マッピング例については付録Bを参照してください。

重大度の表示

次の表は、各 SeverityNumber の値に対する推奨される短縮名を定義します。 この短縮名は、たとえばUIで SeverityNumber を表現するために使用できます。

SeverityNumberShort Name
1TRACE
2TRACE2
3TRACE3
4TRACE4
5DEBUG
6DEBUG2
7DEBUG3
8DEBUG4
9INFO
10INFO2
11INFO3
12INFO4
13WARN
14WARN2
15WARN3
16WARN4
17ERROR
18ERROR2
19ERROR3
20ERROR4
21FATAL
22FATAL2
23FATAL3
24FATAL4

個々のログレコードを表示する際は、SeverityTextSeverityNumber の両方の値を表示することが推奨されます。 この場合に推奨される結合文字列は、短縮名で始まり、それに続けて括弧内に SeverityText を記載する形式です。

たとえば、「Informational」のSyslogレコードは INFO (Informational) として表示されます。 特定のログレコードで SeverityNumber は定義されているが SeverityText が存在しない場合は、短縮名のみを表示することが推奨されます(たとえば INFO)。

ドロップダウンリスト(または、取り得る値の集合を表現することを意図したその他のUI要素)を重大度の表現に使用する場合は、そのようなUI要素に短縮名を表示することが望ましいです。

たとえば、重大度でログレコードをフィルタリングできる重大度のドロップダウンリストは、システムに知られているすべての異なる SeverityText の値を列挙するドロップダウンリスト(要素数が多くなる可能性があり、しばしば大文字小文字や省略の違いだけで異なります。たとえば「Info」と「Information」)と比較して、SeverityNumber の短縮名を含む(そのため要素数の上限が限られる)方が、より使いやすい可能性が高いです。

重大度の比較

重大度が未満/超過の比較に関わる文脈では、SeverityNumber フィールドを使用すべきです。 SeverityNumber は、別の SeverityNumber や、1〜24の範囲の数値(または対応する短縮名)と比較できます。

重大度が等価または不等価の比較に使用される場合(たとえばUIのフィルターなど)、マッチングを行う際には SeverityTextSeverityNumber の短縮名の両方を使用することを試みることが推奨されます(つまり、これらいずれかのフィールドとの一致もマッチとみなすべきです)。 たとえば、SeverityText フィールドが「Informational」に等しく、SeverityNumber フィールドがINFOに等しいレコードがある場合、そのレコードについて severity=“Informational”severity=“INFO” の両方の条件がTRUEになるようにすることが、ユーザー体験の観点からは望ましいでしょう。

フィールド: Name

型: 文字列。

説明: 変動する部分を含まない、短いイベント識別子です。 Name は何が起きたかを表します(たとえば「ProcessStarted」)。 50文字以内にすることが推奨されます。 一意性は一切保証されません。 通常、バックエンドでのフィルタリングやグルーピングの目的で使用されます。 このフィールドは省略可能です。

フィールド: Body

型: any。

説明: ログレコードの本文を含む値です(上記の any 型の説明を参照)。 たとえば、イベントを自由形式で説明する(複数行を含む)人間可読な文字列メッセージであってもよいですし、他の値の配列やマップで構成された構造化データであってもよいです。 同じソースから発生するイベントの発生ごとに異なる場合があります。 このフィールドは省略可能です。

フィールド: Resource

型: キーと値のペアのリスト。

説明: ログのソース、すなわちリソースを説明します。 各ペアの「キー」は string 型で、「値」は any 型です。 同じイベントソースから発生する複数回のイベントは時間をまたいで発生し得ますが、それらはすべて同じ Resource の値を持ちます。 たとえば、レコードを発行するアプリケーションに関する情報や、アプリケーションが実行されるインフラストラクチャに関する情報を含むことができます。 このデータモデルを表現するデータ形式は、同じソースから発生するログレコードのバッチごとに Resource フィールドを1回だけ記録できるように設計されることがあります。 リソースのセマンティック規約に従うべきです(SHOULD)。 このフィールドは省略可能です。

フィールド: Attributes

型: キーと値のペアのリスト。

説明: 特定のイベント発生に関する追加情報です。 各ペアの「キー」は string 型で、「値」は any 型です。 特定のソースに対して固定される Resource フィールドとは異なり、Attributes は同じソースから発生するイベントの発生ごとに異なる場合があります。 (TraceId/SpanId以外の)リクエストコンテキストに関する情報を含むことができます。 OpenTelemetryの属性のセマンティック規約に従うべきです(SHOULD)。 このフィールドは省略可能です。

ログレコードの例

以下は、ログレコードをJSONで表現する一つの可能な方法を示す例です。 これらはあくまでこのデータモデルの理解を助けるための例です。 これらの例を、このデータモデルをJSONで表現する_唯一の_方法として捉えないでください。

このドキュメントは、ログレコード表現の実際のエンコーディングと形式を定義しません。 形式の定義は、別のOTEPで行われます(たとえば、ログレコードはmsgpack、JSON、Protocol Bufferのメッセージなどとして表現される場合があります)。

例1

{
  "Timestamp": 1586960586000, // JSON needs to make a decision about
                              // how to represent nanoseconds.
  "Attributes": {
    "http.status_code": 500,
    "http.url": "http://example.com",
    "my.custom.application.tag": "hello",
  },
  "Resource": {
    "service.name": "donut_shop",
    "service.version": "semver:2.0.0",
    "k8s.pod.uid": "1138528c-c36e-11e9-a1a7-42010a800198",
  },
  "TraceId": "f4dbb3edd765f620", // this is a byte sequence
                                 // (hex-encoded in JSON)
  "SpanId": "43222c2d51a7abe3",
  "SeverityText": "INFO",
  "SeverityNumber": 9,
  "Body": "20200415T072306-0700 INFO I like donuts"
}

例2

{
  "Timestamp": 1586960586000,
  ...
  "Body": {
    "i": "am",
    "an": "event",
    "of": {
      "some": "complexity"
    }
  }
}

例3

{
   "Timestamp": 1586960586000,
   "Attributes":{
      "http.scheme":"https",
      "http.host":"donut.mycie.com",
      "http.target":"/order",
      "http.method":"post",
      "http.status_code":500,
      "http.flavor":"1.1",
      "http.user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36",
   }
}

OTEPの議論中に解決された疑問

これらは、OTEPのプルリクエストで議論され、解決された未解決の疑問でした。

TraceFlagsTraceParentTraceState

質問: TraceFlags だけでなく、traceparent フィールドと tracestate フィールドを含むW3C Trace Context全体を保存すべきでしょうか。

回答: この議論では、traceparenttracestate が必要であるという証拠は見つかりませんでした。

重大度フィールド

質問: SeverityText/SeverityNumber フィールドの設計は十分に優れているでしょうか。

回答: 議論の結果、この設計は妥当であることが示されました。

Timestamp の要件

質問: この提案の初期の草稿では、Timestamp は単調増加でNTP同期されたソースから設定されるべきであると規定されていました。 混乱を避けるため、この要件は削除しました。 タイムスタンプのソースについて何らかの要件が必要でしょうか。

回答: 議論の結果、そのような要件を規定することはデータモデルの責務ではないことが明らかになりました。

セキュリティログ

質問: セキュリティログに対して特別な扱いが必要でしょうか。

回答: このOTEPでの議論では、データモデルの提案という文脈においてセキュリティログを特別に扱う必要性は見出されませんでした。

代替設計

エンベロープ方式を用いた代替設計も検討しましたが、総合的にこちらの設計より優れているとは判断しませんでした。

先行技術

RFC5424 Syslog

RFC5424 は、構造化されたログデータの形式とプロトコルを定義しています。 このプロトコルは広く普及していますが(残念ながら多くの実装は構造化データの推奨事項に従っていません)、Syslogをデータモデルの有力な候補としない、いくつかの欠点があります。

  • 構造化された属性を許容する一方で、メッセージの本文は文字列のみです。

  • 重大度は8つの数値にハードコードされており、カスタムの重大度テキストを許容しません。

  • 構造化データは任意のネストを許容せず、2階層のみです。

  • データソース(すなわちリソース)を指定するための明確な独立した場所がありません。 この目的を限定的に果たすハードコードされたフィールドがいくつか存在します(HOSTNAME、APP-NAME、FACILITY)。

Fluentd Forwardプロトコルモデル

Forwardプロトコル は、タイムスタンプ付きレコードとしてログEntryの概念を定義しています。 このレコードは、タグと任意のキーと値のペアのマップという2つの要素で構成されます。

このモデルは、あらゆるログレコードを表現できるほど汎用的です。 しかし、いくつかの欠点があります。

  • レコードのすべての属性は、(タグとタイムスタンプを除いて)汎用的なキーと値のペアで表現されます。 これは、最適化の機会を逃しています(設計上の注記を参照)。

  • データソース(すなわちリソース)を指定するための明確な独立した場所がありません。

  • キーがどのように命名されるべきか、どのような値が期待されるかについての言及がありません。 命名規則やキーと値のペアの標準化が欠如していることが、相互運用性を難しくしています。

付録A. マッピング例

このセクションには、他のイベントおよびログの形式をこのデータモデルにマッピングする例が含まれています。

RFC5424 Syslog

プロパティ説明統合モデルフィールドへのマッピング
TIMESTAMPTimestamp発生元のクロックで計測された、イベントが発生した時刻です。Timestamp
SEVERITYenumイベントの重要度を定義します。例: `Debug`Severity
FACILITYenumイベントの発生元を説明します。あらかじめ定義されたUNIXプロセスの一覧です。イベントソースの識別情報の一部です。例: `mail system``Attributes["syslog.facility"]`
VERSIONnumberメタ情報: プロトコルのバージョンで、イベントとは直交しています。`Attributes["syslog.version"]`
HOSTNAMEstringイベントが発生した場所を説明します。取り得る値はFQDN、IPアドレスなどです。`Resource["host.hostname"]`
APP-NAMEstringユーザーが定義したアプリケーション名です。イベントソースの識別情報の一部です。`Resource["service.name"]`
PROCIDstring明確に定義されていません。プロトコル操作の目的でメタフィールドとして使われることも、イベントソースの識別情報の一部として使われることもあります。`Attributes["syslog.procid"]`
MSGIDstringイベントの種類を定義します。イベントソースの識別情報の一部です。例: `"TCPIN"`Name
STRUCTURED-DATAarray of maps of string to stringSD-IDによってさまざまな用途があります。 イベントソースの識別情報を説明できます。 イベントの特定の発生を説明するデータを含められます。 メタ情報(たとえばタイムスタンプ値の品質など)にもなり得ます。SD-ID origin.swVersionは `Resource["service.version"]` にマッピングされます

SD-ID origin.ipは Attributes["net.host.ip"] にマッピングされます

それ以外のSD-IDは Attributes["syslog.*"] にマッピングされます

MSGstringイベントに関する自由形式のテキストメッセージです。通常は人間が読める形式です。Body

Windowsイベントログ

プロパティ説明統合モデルフィールドへのマッピング
TimeCreatedTimestampイベントがログに記録された時刻を識別するタイムスタンプです。Timestamp
Levelenumイベントの重大度レベルを含みます。Severity
Computerstringイベントが発生したコンピューターの名前です。`Resource["host.hostname"]`
EventIDuintプロバイダーがイベントを識別するために使用した識別子です。Name
Messagestringメッセージ文字列です。Body
それ以外のフィールド。anyイベント内のその他すべてのフィールドです。`Attributes["winlog.*"]`

SignalFxイベント

フィールド説明統合モデルフィールドへのマッピング
TimestampTimestamp発生元のクロックで計測された、イベントが発生した時刻です。Timestamp
EventTypestringイベントの種類を説明する、機械が理解できる短い文字列です。SignalFx固有の概念です。名前空間を持ちません。例: k8sのEvent Reasonフィールド。Name
Categoryenumイベントの発生元と理由を説明します。SignalFx固有の概念です。例: AGENT。この属性がSignalFxのEventに存在しない場合、LogRecordではnull属性値に設定すべきです。これにより、SignalFxのイベントがLogRecordとして表現される際に一意に識別できるようになります。`Attributes["com.splunk.signalfx.event_category"]`
Dimensionsmap of string to stringEventTypeおよびCategoryと合わせて、イベントソースの識別情報を定義するのに役立ちます。同じイベントソースから発生する複数回のイベントは時間をまたいで発生し得ますが、それらはすべて同じDimensionsの値を持ちます。SignalFxでは、イベントのDimensionsはEventTypeとともに、個々のEvent Time Series(ETS)を決定します。Attributes
Propertiesmap of string to any特定のイベント発生に関する追加情報です。特定のイベントソースに対して固定されるDimensionsとは異なり、Propertiesは同じイベントソースから発生するイベントの発生ごとに異なる値を持つことができます。SignalFxでは、イベントのPropertiesはイベントに関する追加のメタデータとみなされ、Event Time Series(ETS)の識別情報には影響しません。`Attributes["com.splunk.signalfx.event_properties"]`

Splunk HEC

フィールド説明統合モデルフィールドへのマッピング
timenumeric, string秒単位のエポックタイム形式でのイベント時刻です。Timestamp
hoststringイベントデータに割り当てるホストの値です。通常は、データの送信元となるクライアントのホスト名です。`Resource["host.hostname"]`
sourcestringイベントデータに割り当てるソースの値です。たとえば、開発中のアプリケーションからデータを送信している場合、このキーをそのアプリケーションの名前に設定できます。`Resource["service.name"]`
sourcetypestringイベントデータに割り当てるsourcetypeの値です。`Attributes["source.type"]`
eventanyイベントの生の本文をJSONで表現したものです。文字列、数値、文字列配列、数値配列、JSONオブジェクト、またはJSON配列になり得ます。Body
fieldsMap of any明示的なカスタムフィールドを含むJSONオブジェクトを指定します。Attributes
indexstringイベントデータのインデックス作成に使用するインデックスの名前です。トークンにindexesパラメーターが設定されている場合、ここで指定するインデックスは許可されたインデックスの一覧内でなければなりません。未定、おそらくattributesに入ります

Log4j

フィールド説明統合モデルフィールドへのマッピング
InstantTimestamp発生元のクロックで計測された、イベントが発生した時刻です。Timestamp
Levelenumログレベルです。Severity
Messagestring人間が読めるメッセージです。Body
それ以外のすべてのフィールドany構造化データです。Attributes

Zap

フィールド説明統合モデルフィールドへのマッピング
tsTimestamp発生元のクロックで計測された、イベントが発生した時刻です。Timestamp
levelenumログレベルです。Severity
callerstring呼び出し元関数のファイル名と行番号です。Attributes、キーは未定
msgstring人間が読めるメッセージです。Body
それ以外のすべてのフィールドany構造化データです。Attributes

Apache HTTPサーバーアクセスログ

フィールド説明統合モデルフィールドへのマッピング
%tTimestamp発生元のクロックで計測された、イベントが発生した時刻です。Timestamp
%astringクライアントのIPアドレスです。`Attributes["net.peer.ip"]`
%AstringサーバーのIPアドレスです。`Attributes["net.host.ip"]`
%hstringリモートホスト名です。`Attributes["net.peer.name"]`
%mstringリクエストメソッドです。`Attributes["http.method"]`
%v,%p,%U,%qstringURLに組み合わせられる複数のフィールドです。`Attributes["http.url"]`
%>sstringレスポンスステータスです。`Attributes["http.status_code"]`
それ以外のすべてのフィールドany構造化データです。Attributes、キーは未定

CloudTrailログイベント

フィールド説明統合モデルフィールドへのマッピング
eventTimestring協定世界時(UTC)で表された、リクエストが行われた日時です。Timestamp
eventSourcestringリクエストの送信先となったサービスです。この名前は通常、サービス名からスペースを除いた短縮形に.amazonaws.comを付加したものです。`Resource["service.name"]`?
awsRegionstringリクエストの送信先となったAWSリージョンです(例: us-east-2)。`Resource["cloud.region"]`
sourceIPAddressstringリクエストの送信元となったIPアドレスです。`Resource["net.peer.ip"]` または `Resource["net.host.ip"]`?未定
errorCodestringリクエストがエラーを返した場合のAWSサービスのエラーです。Name
errorMessagestringリクエストがエラーを返した場合の、そのエラーの説明です。Body
それ以外のすべてのフィールド*`Attributes["cloudtrail.*"]`

Google Cloud Logging

FieldTypeDescriptionMaps to Unified Model Field
timestampstringログエントリが説明するイベントが発生した時刻です。Timestamp
resourceMonitoredResourceこのログエントリを生成した監視対象リソースです。Resource
log_namestringこのエントリがどのログストリームに属するかを識別する、log_nameフィールドのURLエンコードされたLOG_IDサフィックスです。Name
json_payloadgoogle.protobuf.StructJSONオブジェクトとして表現された構造体で表されるログエントリのペイロードです。Body
proto_payloadgoogle.protobuf.Anyプロトコルバッファーとして表されるログエントリのペイロードです。Body
text_payloadstringUnicode文字列(UTF-8)で表されるログエントリのペイロードです。Body
severityLogSeverityログエントリの重大度です。Severity
tracestringログエントリに関連付けられたトレースです(存在する場合)。TraceId
span_idstringログエントリに関連付けられたトレース内のスパンIDです。SpanId
labelsmap<string,string>ログエントリに関する追加情報を提供する、ユーザー定義の(キー、値)データの集合です。Attributes
それ以外のすべてのフィールドAttributes["google.*"]

Elastic Common Schema

フィールド説明統合モデルフィールドへのマッピング
@timestampdatetimeイベントが記録された時刻です。timestamp
messagestring任意の種類のメッセージです。body
labelskey/valueイベントに関連する任意のラベルです。attributes[*]
tagsarray of stringイベントに関連する値の一覧です。?
trace.idstringトレースIDです。TraceId
span.id*stringスパンIDです。SpanId
agent.ephemeral_idstringエージェントが作成したエフェメラルIDです。**resource
agent.idstringこのエージェントの一意な識別子です。**resource
agent.namestringエージェントに付けられた名前です。`Resource["telemetry.sdk.name"]`
agent.typestringエージェントの種類です。`Resource["telemetry.sdk.language"]`
agent.versionstringエージェントのバージョンです。`Resource["telemetry.sdk.version"]`
source.ip, client.ipstringリクエストの送信元となったIPアドレスです。`Attributes["net.peer.ip"]` または `Attributes["net.host.ip"]`
cloud.account.idstring対象のクラウドにおけるアカウントのIDです。`Resource["cloud.account.id"]`
cloud.availability_zonestringこのホストが実行されているアベイラビリティゾーンです。`Resource["cloud.zone"]`
cloud.instance.idstringホストマシンのインスタンスIDです。**resource
cloud.instance.namestringホストマシンのインスタンス名です。**resource
cloud.machine.typestringホストマシンのマシンタイプです。**resource
cloud.providerstringクラウドプロバイダーの名前です。例としてaws、azure、gcp、digitaloceanなどの値があります。`Resource["cloud.provider"]`
cloud.regionstringこのホストが実行されているリージョンです。`Resource["cloud.region"]`
cloud.image.id*string`Resource["host.image.name"]`
container.idstring一意なコンテナIDです。`Resource["container.id"]`
container.image.namestringコンテナのビルド元となったイメージの名前です。`Resource["container.image.name"]`
container.image.tagArray of stringコンテナイメージのタグです。**resource
container.labelskey/valueイメージのラベルです。attributes[*]
container.namestringコンテナ名です。`Resource["container.name"]`
container.runtimestringこのコンテナを管理するランタイムです。例: "docker"**resource
destination.addressstringイベントの宛先アドレスです。`Attributes["destination.address"]`
error.codestringエラーを説明するエラーコードです。`Attributes["error.code"]`
error.idstringエラーの一意な識別子です。`Attributes["error.id"]`
error.messagestringエラーメッセージです。`Attributes["error.message"]`
error.stack_tracestringこのエラーのスタックトレースをプレーンテキストで表したものです。`Attributes["error.stack_trace]
host.architecturestringオペレーティングシステムのアーキテクチャです。**resource
host.domainstringホストが属しているドメインの名前です。

たとえば、Windowsの場合はホストのActive Directoryドメインまたは NetBIOSドメイン名になり得ます。Linuxの場合はホストのLDAPプロバイダーのドメインになり得ます。

**resource
host.hostnamestringホストのホスト名です。

通常、ホストマシン上でhostnameコマンドが返す値が含まれます。

`Resource["host.hostname"]`
host.idstring一意なホストIDです。`Resource["host.id"]`
host.ipArray of stringホストのIPです。`Resource["host.ip"]`
host.macarray of stringホストのMACアドレスです。`Resource["host.mac"]`
host.namestringホストの名前です。

UNIXシステムでhostnameが返す値、完全修飾名、またはユーザーが指定した名前が含まれる場合があります。

`Resource["host.name"]`
host.typestringホストの種類です。`Resource["host.type"]`
host.uptimestringホストが稼働している秒数です。?
service.ephemeral_idstringこのサービスのエフェメラル識別子です。**resource
service.idstring実行中のサービスの一意な識別子です。サービスが多数のノードで構成されている場合、service.idはすべてのノードで同一であるべきです。**resource
service.namestringデータの収集元となるサービスの名前です。`Resource["service.name"]`
service.node.namestringそのサービスを提供する特定のノードです。`Resource["service.instance.id"]`
service.statestringサービスの現在の状態です。`Attributes["service.state"]`
service.typestringデータの収集元となるサービスの種類です。**resource
service.versionstringデータの収集元となるサービスのバージョンです。`Resource["service.version"]`

* まだECSに正式に組み込まれていません。

** OpenTelemetryのリソースのセマンティック規約に存在しないリソースです。

これは、最も関連性の高いフィールドを抜粋したものです。 網羅的な一覧については完全なリファレンスを参照してください。

付録B: SeverityNumber のマッピング例

SyslogWinEvtLogLog4jZapjava.util.loggingSeverityNumber
TRACEFINESTTRACE
DebugVerboseDEBUGDebugFINERDEBUG
FINEDEBUG2
CONFIGDEBUG3
InformationalInformationINFOInfoINFOINFO
NoticeINFO2
WarningWarningWARNWarnWARNINGWARN
ErrorErrorERRORErrorSEVEREERROR
CriticalCriticalDpanicERROR2
EmergencyPanicERROR3
AlertFATALFatalFATAL

参考文献