# ログのデータモデル付録

> Source: https://www.ymotongpoo.com/works/otel-specs-ja/spec/logs/data-model-appendix/


注: この文書は仕様ではなく、ログの[データモデル](../data-model/)仕様を補足するために提供されています。これらの例はあくまで説明のためのものであり、網羅的・規範的なものではありません。正確な詳細が必要な場合は、それぞれのエクスポーターのドキュメントを参照してください。

## Appendix A. Example Mappings

この節には、他のイベント・ログフォーマットをこのデータモデルへマッピングする例が含まれています。

### RFC5424 Syslog

<table>
  <tr>
    <td>プロパティ</td>
    <td>型</td>
    <td>説明</td>
    <td>統一モデルのフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>TIMESTAMP</td>
    <td>Timestamp</td>
    <td>発生元のクロックで計測された、イベントが発生した時刻。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>SEVERITY</td>
    <td>enum</td>
    <td>イベントの重要度を定義します。例: <code>Debug</code></td>
    <td>Severity</td>
  </tr>
  <tr>
    <td>FACILITY</td>
    <td>enum</td>
    <td>イベントの発生元を記述します。UNIXプロセスの定義済みリストです。イベント発生源のアイデンティティの一部です。例: <code>mail system</code></td>
    <td>`Attributes["syslog.facility"]`</td>
  </tr>
  <tr>
    <td>VERSION</td>
    <td>number</td>
    <td>メタ情報: イベントとは直交するプロトコルバージョン。</td>
    <td>`Attributes["syslog.version"]`</td>
  </tr>
  <tr>
    <td>HOSTNAME</td>
    <td>string</td>
    <td>イベントの発生場所を記述します。FQDN、IPアドレスなどが値として考えられます。</td>
    <td>`Resource["host.name"]`</td>
  </tr>
  <tr>
    <td>APP-NAME</td>
    <td>string</td>
    <td>ユーザー定義のアプリケーション名。イベント発生源のアイデンティティの一部です。</td>
    <td>`Resource["service.name"]`</td>
  </tr>
  <tr>
    <td>PROCID</td>
    <td>string</td>
    <td>明確には定義されていません。プロトコル操作のためのメタフィールドとして使われることも、イベント発生源のアイデンティティの一部として使われることもあります。</td>
    <td>`Attributes["syslog.procid"]`</td>
  </tr>
  <tr>
    <td>MSGID</td>
    <td>string</td>
    <td>イベントの種別を定義します。イベント発生源のアイデンティティの一部です。例: `"TCPIN"`</td>
    <td>`Attributes["syslog.msgid"]`</td>
  </tr>
  <tr>
    <td>STRUCTURED-DATA</td>
    <td>array of maps of string to string</td>
    <td>SD-IDに応じてさまざまな用途があります。<br>
イベント発生源のアイデンティティを記述できます。<br>
イベントの特定の発生を記述するデータを含められます。<br>
タイムスタンプ値の品質など、メタ情報になることもあります。</td>
    <td>SD-IDのorigin.swVersionは`Resource["service.version"]`にマッピングされます。SD-IDのorigin.ipは`Attributes["client.address"]`にマッピングされます。残りのSD-IDは`Attributes["syslog.*"]`にマッピングされます。</td>
  </tr>
  <tr>
    <td>MSG</td>
    <td>string</td>
    <td>イベントに関する自由形式のテキストメッセージ。通常は人間が読める形式です。</td>
    <td>Body</td>
  </tr>
</table>

### Windows Event Log

<table>
  <tr>
    <td>プロパティ</td>
    <td>型</td>
    <td>説明</td>
    <td>統一モデルのフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>TimeCreated</td>
    <td>Timestamp</td>
    <td>イベントが記録された時刻を識別するタイムスタンプ。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>Level</td>
    <td>enum</td>
    <td>イベントの重大度レベルを含みます。</td>
    <td>Severity</td>
  </tr>
  <tr>
    <td>Computer</td>
    <td>string</td>
    <td>イベントが発生したコンピューターの名前。</td>
    <td>`Resource["host.name"]`</td>
  </tr>
  <tr>
    <td>EventID</td>
    <td>uint</td>
    <td>プロバイダーがイベントを識別するために使った識別子。</td>
    <td>`Attributes["winlog.event_id"]`</td>
  </tr>
  <tr>
    <td>Message</td>
    <td>string</td>
    <td>メッセージ文字列。</td>
    <td>Body</td>
  </tr>
  <tr>
    <td>その他すべてのフィールド。</td>
    <td>any</td>
    <td>イベント内のその他すべてのフィールド。</td>
    <td>`Attributes["winlog.*"]`</td>
  </tr>
</table>

### SignalFx Events

<table>
  <tr>
    <td>フィールド</td>
    <td>型</td>
    <td>説明</td>
    <td>統一モデルのフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>Timestamp</td>
    <td>Timestamp</td>
    <td>発生元のクロックで計測された、イベントが発生した時刻。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>EventType</td>
    <td>string</td>
    <td>イベント種別を記述する、機械が理解できる短い文字列。SignalFx固有の概念です。名前空間を持ちません。例: k8sのEvent Reasonフィールド。</td>
    <td>`Attributes["com.splunk.signalfx.event_type"]`</td>
  </tr>
  <tr>
    <td>Category</td>
    <td>enum</td>
    <td>イベントの発生元とその理由を記述します。SignalFx固有の概念です。例: AGENT。</td>
    <td>`Attributes["com.splunk.signalfx.event_category"]`</td>
  </tr>
  <tr>
    <td>Dimensions</td>
    <td>map&lt;string, string></td>
    <td>EventTypeとCategoryと合わせて、イベント発生源のアイデンティティを定義するのに役立ちます。同じイベント発生源から来るイベントが時間をおいて複数回発生しても、それらはすべてDimensionsの値を持ちます。</td>
    <td>Resource</td>
  </tr>
  <tr>
    <td>Properties</td>
    <td>map&lt;string, any></td>
    <td>特定のイベント発生に関する追加情報。特定のイベント発生源に対して固定されているDimensionsとは異なり、Propertiesは同じイベント発生源から来るイベントの発生ごとに異なる値を持てます。</td>
    <td>Attributes</td>
  </tr>
</table>

### Splunk HEC

HECから統一モデルへ、次のマッピングを適用します。

<table>
  <tr>
    <td>フィールド</td>
    <td>型</td>
    <td>説明</td>
    <td>統一モデルのフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>time</td>
    <td>numeric, string</td>
    <td>秒単位のエポックタイム形式によるイベント時刻。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>host</td>
    <td>string</td>
    <td>イベントデータに割り当てるhostの値。通常はデータを送信しているクライアントのホスト名です。</td>
    <td>`Resource["host.name"]`</td>
  </tr>
  <tr>
    <td>source</td>
    <td>string</td>
    <td>イベントデータに割り当てるsourceの値。例えば、開発中のアプリケーションからデータを送信している場合、このキーをそのアプリケーションの名前に設定できます。</td>
    <td>`Resource["com.splunk.source"]`</td>
  </tr>
  <tr>
    <td>sourcetype</td>
    <td>string</td>
    <td>イベントデータに割り当てるsourcetypeの値。</td>
    <td>`Resource["com.splunk.sourcetype"]`</td>
  </tr>
  <tr>
    <td>event</td>
    <td>any</td>
    <td>イベントの生のbodyをJSONで表現したもの。文字列、数値、文字列配列、数値配列、JSONオブジェクト、JSON配列のいずれかです。</td>
    <td>Body</td>
  </tr>
  <tr>
    <td>fields</td>
    <td>map&lt;string, any></td>
    <td>明示的なカスタムフィールドを含むJSONオブジェクトを指定します。</td>
    <td>Attributes</td>
  </tr>
  <tr>
    <td>index</td>
    <td>string</td>
    <td>イベントデータのインデックス付けに使われるインデックスの名前。トークンにindexesパラメータが設定されている場合、ここで指定するインデックスは許可されたインデックスのリストに含まれていなければなりません。</td>
    <td>`Attributes["com.splunk.index"]`</td>
  </tr>
</table>

統一モデルからHECへマッピングする際は、次の追加のマッピングを適用します。

<table>
  <tr>
    <td>統一モデルの要素</td>
    <td>型</td>
    <td>説明</td>
    <td>HECへのマッピング</td>
  </tr>
  <tr>
    <td>SeverityText</td>
    <td>string</td>
    <td>人間が読める文字列としてのイベントの重大度。</td>
    <td>`Fields["otel.log.severity.text"]`</td>
  </tr>
    <tr>
    <td>SeverityNumber</td>
    <td>string</td>
    <td>数値としてのイベントの重大度。</td>
    <td>`Fields["otel.log.severity.number"]`</td>
  </tr>
  <tr>
    <td>Name</td>
    <td>string</td>
    <td>変化する部分を含まない短いイベント識別子。</td>
    <td>`Fields["otel.log.name"]`</td>
  </tr>
  <tr>
    <td>TraceId</td>
    <td>string</td>
    <td>リクエストのトレースID。</td>
    <td>`Fields["trace_id"]`</td>
  </tr>
  <tr>
    <td>SpanId</td>
    <td>string</td>
    <td>リクエストのスパンID。</td>
    <td>`Fields["span_id"]`</td>
  </tr>
  <tr>
    <td>TraceFlags</td>
    <td>string</td>
    <td>W3Cのトレースフラグ。</td>
    <td>`Fields["trace_flags"]`</td>
  </tr>
</table>

### Log4j

<table>
  <tr>
    <td>フィールド</td>
    <td>型</td>
    <td>説明</td>
    <td>統一モデルのフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>Instant</td>
    <td>Timestamp</td>
    <td>発生元のクロックで計測された、イベントが発生した時刻。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>Level</td>
    <td>enum</td>
    <td>ログレベル。</td>
    <td>Severity</td>
  </tr>
  <tr>
    <td>Message</td>
    <td>string</td>
    <td>人間が読めるメッセージ。</td>
    <td>Body</td>
  </tr>
  <tr>
    <td>その他すべてのフィールド</td>
    <td>any</td>
    <td>構造化データ。</td>
    <td>Attributes</td>
  </tr>
</table>

### Zap

<table>
  <tr>
    <td>フィールド</td>
    <td>型</td>
    <td>説明</td>
    <td>統一モデルのフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>ts</td>
    <td>Timestamp</td>
    <td>発生元のクロックで計測された、イベントが発生した時刻。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>level</td>
    <td>enum</td>
    <td>ログレベル。</td>
    <td>Severity</td>
  </tr>
  <tr>
    <td>caller</td>
    <td>string</td>
    <td>呼び出し元関数のファイル名と行番号。
</td>
    <td>Attributes、key=未定</td>
  </tr>
  <tr>
    <td>msg</td>
    <td>string</td>
    <td>人間が読めるメッセージ。</td>
    <td>Body</td>
  </tr>
  <tr>
    <td>その他すべてのフィールド</td>
    <td>any</td>
    <td>構造化データ。</td>
    <td>Attributes</td>
  </tr>
</table>

### Apache HTTP Server access log

<table>
  <tr>
    <td>フィールド</td>
    <td>型</td>
    <td>説明</td>
    <td>統一モデルのフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>%t</td>
    <td>Timestamp</td>
    <td>発生元のクロックで計測された、イベントが発生した時刻。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>%a</td>
    <td>string</td>
    <td>クライアントアドレス</td>
    <td>`Attributes["network.peer.address"]`</td>
  </tr>
  <tr>
    <td>%A</td>
    <td>string</td>
    <td>サーバーアドレス</td>
    <td>`Attributes["network.local.address"]`</td>
  </tr>
  <tr>
    <td>%h</td>
    <td>string</td>
    <td>クライアントのホスト名。</td>
    <td>`Attributes["client.address"]`</td>
  </tr>
  <tr>
    <td>%m</td>
    <td>string</td>
    <td>リクエストメソッド。</td>
    <td>`Attributes["http.request.method"]`</td>
  </tr>
  <tr>
    <td>%v,%p,%U,%q</td>
    <td>string</td>
    <td>組み合わせてURLを構成できる複数のフィールド。</td>
    <td>`Attributes["url.full"]`</td>
  </tr>
  <tr>
    <td>%>s</td>
    <td>string</td>
    <td>レスポンスステータス。</td>
    <td>`Attributes["http.response.status_code"]`</td>
  </tr>
  <tr>
    <td>その他すべてのフィールド</td>
    <td>any</td>
    <td>構造化データ。</td>
    <td>Attributes、key=未定</td>
  </tr>
</table>

### CloudTrail Log Event

<table>
  <tr>
    <td>フィールド</td>
    <td>型</td>
    <td>説明</td>
    <td>統一モデルのフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>eventTime</td>
    <td>string</td>
    <td>リクエストが行われた日時（協定世界時、UTC）。</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>eventSource</td>
    <td>string</td>
    <td>リクエストが行われたサービス。この名前は通常、スペースを含まないサービス名の短縮形に.amazonaws.comを付けたものです。</td>
    <td>`Resource["service.name"]`？</td>
  </tr>
  <tr>
    <td>awsRegion</td>
    <td>string</td>
    <td>リクエストが行われたAWSリージョン（us-east-2など）。</td>
    <td>`Resource["cloud.region"]`</td>
  </tr>
  <tr>
    <td>sourceIPAddress</td>
    <td>string</td>
    <td>リクエストが行われたIPアドレス。</td>
    <td>`Attributes["client.address"]`</td>
  </tr>
  <tr>
    <td>errorCode</td>
    <td>string</td>
    <td>リクエストがエラーを返した場合のAWSサービスのエラー。</td>
    <td>`Attributes["cloudtrail.error_code"]`</td>
  </tr>
  <tr>
    <td>errorMessage</td>
    <td>string</td>
    <td>リクエストがエラーを返した場合の、そのエラーの説明。</td>
    <td>Body</td>
  </tr>
  <tr>
    <td>その他すべてのフィールド</td>
    <td>*</td>
    <td></td>
    <td>`Attributes["cloudtrail.*"]`</td>
  </tr>
</table>

### Google Cloud Logging

| フィールド | 型 | 説明 | 統一モデルのフィールドへのマッピング |
| ----- | ---- | ----------- | --------------------------- |
| timestamp | string | ログエントリが記述するイベントが発生した時刻。 | Timestamp |
| resource | MonitoredResource | このログエントリを生成した監視対象リソース。 | Resource |
| log_name | string | log_nameフィールドのURLエンコードされたLOG_IDサフィックスは、このエントリがどのログストリームに属するかを識別します。 | `Attributes["gcp.log_name"]` |
| json_payload | google.protobuf.Struct | JSONオブジェクトとして表現された構造体として表されるログエントリのペイロード。 | Body |
| proto_payload | google.protobuf.Any | Protocol Bufferとして表現されるログエントリのペイロード。 | Body |
| text_payload | string | Unicode文字列（UTF-8）として表現されるログエントリのペイロード。 | Body |
| severity | LogSeverity | ログエントリの重大度。 | Severity |
| trace | string | ログエントリに関連付けられたトレース（あれば）。 | TraceId |
| span_id | string | ログエントリに関連付けられたトレース内のスパンID。 | SpanId |
| labels | map<string,string> | ログエントリに関する追加情報を提供する、ユーザー定義のキーと値の組の集合。 | Attributes |
| http_request | HttpRequest | ログエントリに関連付けられたHTTPリクエスト（あれば）。 | `Attributes["gcp.http_request"]` |
| trace_sampled | boolean | ログエントリに関連付けられたトレースのサンプリング判定。 | TraceFlags.SAMPLED |
| その他すべてのフィールド | | | `Attributes["gcp.*"]` |

### Elastic Common Schema

<table>
  <tr>
    <td>フィールド</td>
    <td>型</td>
    <td>説明</td>
    <td>統一モデルのフィールドへのマッピング</td>
  </tr>
  <tr>
    <td>@timestamp</td>
    <td>datetime</td>
    <td>イベントが記録された時刻</td>
    <td>Timestamp</td>
  </tr>
  <tr>
    <td>message</td>
    <td>string</td>
    <td>任意の種別のメッセージ</td>
    <td>Body</td>
  </tr>
  <tr>
    <td>labels</td>
    <td>key/value</td>
    <td>イベントに関連する任意のラベル</td>
    <td>Attributes[*]</td>
  </tr>
  <tr>
    <td>tags</td>
    <td>array of string</td>
    <td>イベントに関連する値の一覧</td>
    <td>？</td>
  </tr>
  <tr>
    <td>trace.id</td>
    <td>string</td>
    <td>トレースID</td>
    <td>TraceId</td>
  </tr>
  <tr>
    <td>span.id*</td>
    <td>string</td>
    <td>スパンID</td>
    <td>SpanId</td>
  </tr>
  <tr>
    <td>agent.ephemeral_id</td>
    <td>string</td>
    <td>エージェントが生成した一時的なID</td>
    <td>**Resource</td>
  </tr>
  <tr>
    <td>agent.id</td>
    <td>string</td>
    <td>このエージェントの一意な識別子</td>
    <td>**Resource</td>
  </tr>
  <tr>
    <td>agent.name</td>
    <td>string</td>
    <td>エージェントに付けられた名前</td>
    <td>`Resource["telemetry.sdk.name"]`</td>
  </tr>
  <tr>
    <td>agent.type</td>
    <td>string</td>
    <td>エージェントの種別</td>
    <td>`Resource["telemetry.sdk.language"]`</td>
  </tr>
  <tr>
    <td>agent.version</td>
    <td>string</td>
    <td>エージェントのバージョン</td>
    <td>`Resource["telemetry.sdk.version"]`</td>
  </tr>
  <tr>
    <td>source.ip, client.ip</td>
    <td>string</td>
    <td>リクエストが行われたIPアドレス。</td>
    <td>`Attributes["client.address"]`</td>
  </tr>
  <tr>
    <td>cloud.account.id</td>
    <td>string</td>
    <td>対象のクラウド内でのアカウントのID</td>
    <td>`Resource["cloud.account.id"]`</td>
  </tr>
  <tr>
    <td>cloud.availability_zone</td>
    <td>string</td>
    <td>このホストが動作しているアベイラビリティゾーン。</td>
    <td>`Resource["cloud.zone"]`</td>
  </tr>
  <tr>
    <td>cloud.instance.id</td>
    <td>string</td>
    <td>ホストマシンのインスタンスID。</td>
    <td>**Resource</td>
  </tr>
  <tr>
    <td>cloud.instance.name</td>
    <td>string</td>
    <td>ホストマシンのインスタンス名。</td>
    <td>**Resource</td>
  </tr>
  <tr>
    <td>cloud.machine.type</td>
    <td>string</td>
    <td>ホストマシンのマシン種別。</td>
    <td>**Resource</td>
  </tr>
  <tr>
    <td>cloud.provider</td>
    <td>string</td>
    <td>クラウドプロバイダー名。値の例はaws、azure、gcp、digitaloceanです。</td>
    <td>`Resource["cloud.provider"]`</td>
  </tr>
  <tr>
    <td>cloud.region</td>
    <td>string</td>
    <td>このホストが動作しているリージョン。</td>
    <td>`Resource["cloud.region"]`</td>
  </tr>
  <tr>
    <td>cloud.image.id*</td>
    <td>string</td>
    <td></td>
    <td>`Resource["host.image.name"]`</td>
  </tr>
  <tr>
    <td>container.id</td>
    <td>string</td>
    <td>一意なコンテナID</td>
    <td>`Resource["container.id"]`</td>
  </tr>
  <tr>
    <td>container.image.name</td>
    <td>string</td>
    <td>コンテナがビルドされたイメージの名前。</td>
    <td>`Resource["container.image.name"]`</td>
  </tr>
  <tr>
    <td>container.image.tag</td>
    <td>Array of string</td>
    <td>コンテナイメージのタグ。</td>
    <td>**Resource</td>
  </tr>
  <tr>
    <td>container.labels</td>
    <td>key/value</td>
    <td>イメージのラベル。</td>
    <td>Attributes[*]</td>
  </tr>
  <tr>
    <td>container.name</td>
    <td>string</td>
    <td>コンテナ名。</td>
    <td>`Resource["container.name"]`</td>
  </tr>
  <tr>
    <td>container.runtime</td>
    <td>string</td>
    <td>このコンテナを管理しているランタイム。例: "docker"</td>
    <td>**Resource</td>
  </tr>
  <tr>
    <td>destination.address</td>
    <td>string</td>
    <td>イベントの宛先アドレス</td>
    <td>`Attributes["destination.address"]`</td>
  </tr>
  <tr>
    <td>error.code</td>
    <td>string</td>
    <td>エラーを記述するエラーコード。</td>
    <td>`Attributes["error.code"]`</td>
  </tr>
  <tr>
    <td>error.id</td>
    <td>string</td>
    <td>エラーの一意な識別子。</td>
    <td>`Attributes["error.id"]`</td>
  </tr>
  <tr>
    <td>error.message</td>
    <td>string</td>
    <td>エラーメッセージ。</td>
    <td>`Attributes["error.message"]`</td>
  </tr>
  <tr>
    <td>error.stack_trace</td>
    <td>string</td>
    <td>このエラーのスタックトレース（プレーンテキスト）。</td>
    <td>`Attributes["error.stack_trace]</td>
  </tr>
  <tr>
    <td>host.architecture</td>
    <td>string</td>
    <td>オペレーティングシステムのアーキテクチャ</td>
    <td>**Resource</td>
  </tr>
  <tr>
    <td>host.domain</td>
    <td>string</td>
    <td>ホストが属するドメインの名前。<br>例えば、WindowsではホストのアクティブディレクトリドメインやNetBIOSドメイン名になります。LinuxではホストのLDAPプロバイダーのドメインになります。</td>
    <td>**Resource</td>
  </tr>
  <tr>
    <td>host.name</td>
    <td>string</td>
    <td>ホストのホスト名。<br>通常はホストマシンでhostnameコマンドが返す値を含みます。</td>
    <td>`Resource["host.name"]`</td>
  </tr>
  <tr>
    <td>host.id</td>
    <td>string</td>
    <td>一意なホストID。</td>
    <td>`Resource["host.id"]`</td>
  </tr>
  <tr>
    <td>host.ip</td>
    <td>Array of string</td>
    <td>ホストのIP</td>
    <td>`Resource["host.ip"]`</td>
  </tr>
  <tr>
    <td>host.mac</td>
    <td>array of string</td>
    <td>ホストのMACアドレス</td>
    <td>`Resource["host.mac"]`</td>
  </tr>
  <tr>
    <td>host.name</td>
    <td>string</td>
    <td>ホストの名前。<br>UNIXシステムでhostnameが返す値、FQDN、あるいはユーザーが指定した名前を含むことがあります。</td>
    <td>`Resource["host.name"]`</td>
  </tr>
  <tr>
    <td>host.type</td>
    <td>string</td>
    <td>ホストの種別。</td>
    <td>`Resource["host.type"]`</td>
  </tr>
  <tr>
    <td>host.uptime</td>
    <td>string</td>
    <td>ホストが起動してからの秒数。</td>
    <td>？</td>
  </tr>
  <tr>
    <td>service.ephemeral_id</td>
    <td>string</td>
    <td>このサービスの一時的な識別子</td>
    <td>**Resource</td>
  </tr>
  <tr>
    <td>service.id</td>
    <td>string</td>
    <td>実行中のサービスの一意な識別子。サービスが多数のノードから構成される場合、service.idはすべてのノードで同じであるべきです。</td>
    <td>**Resource</td>
  </tr>
  <tr>
    <td>service.name</td>
    <td>string</td>
    <td>データの収集元であるサービスの名前。</td>
    <td>`Resource["service.name"]`</td>
  </tr>
  <tr>
    <td>service.node.name</td>
    <td>string</td>
    <td>そのサービスを提供している特定のノード</td>
    <td>`Resource["service.instance.id"]`</td>
  </tr>
  <tr>
    <td>service.state</td>
    <td>string</td>
    <td>サービスの現在の状態。</td>
    <td>`Attributes["service.state"]`</td>
  </tr>
  <tr>
    <td>service.type</td>
    <td>string</td>
    <td>データの収集元であるサービスの種別。</td>
    <td>**Resource</td>
  </tr>
  <tr>
    <td>service.version</td>
    <td>string</td>
    <td>データの収集元であるサービスのバージョン。</td>
    <td>`Resource["service.version"]`</td>
  </tr>
</table>

\* まだECSに正式に取り込まれていません。

\*\* [OpenTelemetryのリソースに関するセマンティック規約](https://opentelemetry.io/docs/specs/semconv/resource/)には存在しないリソースです。

これは最も関連性の高いフィールドを選んだものです。網羅的な一覧については[完全なリファレンス](https://www.elastic.co/docs/reference/ecs/ecs-field-reference)を参照してください。

### ETW (Event Tracing for Windows)

次の表は、ETWイベントのフィールドがログのデータモデルへどのようにマッピングされるかを示します。ETWのヘッダーメタデータは`etw.*`属性の下に保持され、TDHでデコードされたTraceLoggingのペイロードフィールドは、そのフィールド名をキーとする属性として追加されます。

| ETWフィールド            | 型      | 説明                                                                  | 統一モデルのフィールドへのマッピング                                            |
| ---------------------- | --------- | --------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| TimeStamp              | Timestamp | `EVENT_HEADER.TimeStamp`を、トレース・セッションのタイムスタンプメタデータ（QPC、システム時刻、CPUサイクルカウンターなど）に従ってUNIXエポックナノ秒に変換した値 | Timestamp                                                             |
| Level                  | uint8     | イベントの重大度・詳細レベル                                              | Severity（`SeverityNumber`と`SeverityText`）および`Attributes["etw.level"]` |
| Event name             | string    | TraceLoggingのイベント名（TDH経由）。取得できない場合は`etw.<EventId>`にフォールバックします            | `EventName`                                                          |
| Payload                | any       | ETWには単一のメッセージフィールドがありません。デコードされたフィールドは`Attributes`へ格納され、`Body`は空のままになります          | Body                                                         |
| ProviderId             | GUID      | プロバイダーGUID。ハイフン区切りの16進文字列でフォーマットされます                         | `Attributes["etw.provider.id"]`                                      |
| EventId                | uint16    | イベントディスクリプタから得られるイベント識別子                                  | `Attributes["etw.event.id"]`                                        |
| Opcode                 | uint8     | イベントディスクリプタから得られるOpcode                                            | `Attributes["etw.opcode"]`                                          |
| Version                | uint8     | イベントディスクリプタから得られるバージョン                                           | `Attributes["etw.version"]`                                         |
| Keywords               | uint64    | イベントディスクリプタから得られるKeywordsのビットマスク                                  | `Attributes["etw.keywords"]`                                        |
| ProcessId              | uint32    | イベントヘッダーから得られる発行元プロセスID                                   | `Attributes["etw.process.id"]`                                      |
| ThreadId               | uint32    | イベントヘッダーから得られる発行元スレッドID                                    | `Attributes["etw.thread.id"]`                                       |
| ActivityId             | GUID      | 相関ID。ゼロでない場合にのみ発行されます                                  | `Attributes["etw.activity.id"]`                                     |
| Decoded payload fields | any       | フィールド名をキーとする、TDHでデコードされたTraceLoggingフィールド                        | `Attributes[<field name>]`                                          |

ETWの`Level`は8ビットの値であり、その意味は[`EVENT_DESCRIPTOR`](https://learn.microsoft.com/windows/win32/api/evntprov/ns-evntprov-event_descriptor)によって定義されます。`SeverityText`には、発生元で知られている元のETWレベル名がそのまま入ります。

| ETWレベル | ETW名         | SeverityNumber  | SeverityText              |
| --------- | ---------------- | --------------- | ------------------------- |
| 0         | LOG_ALWAYS       | 0 (UNSPECIFIED) | LOG_ALWAYS                |
| 1         | CRITICAL         | 21 (FATAL)      | CRITICAL                  |
| 2         | ERROR            | 17 (ERROR)      | ERROR                     |
| 3         | WARNING          | 13 (WARN)       | WARNING                   |
| 4         | INFO             | 9 (INFO)        | INFO                      |
| 5         | VERBOSE          | 5 (DEBUG)       | VERBOSE                   |
| 6–15      | reserved         | 0 (UNSPECIFIED) | (none)                    |
| 16–255    | provider-defined | 0 (UNSPECIFIED) | provider-defined (if any) |

`Level 0`（`LOG_ALWAYS`）は重大度では**なく**、フィルタリングの指示です。ETWは`event.level <= session.level`のときにイベントを配信するため、レベル0のイベントは設定されたセッションレベルにかかわらず常に配信されます。重大度の情報を持たないため、特定の重大度を作り出すのではなく`SeverityNumber`は`UNSPECIFIED (0)`にマッピングされます。元の発生源名は`SeverityText`に`LOG_ALWAYS`としてそのまま記録されます。レベル6〜15はMicrosoftによって予約されており、プロバイダーが定義に使うことはできないため、名前を持ちません。レベル16〜255は[プロバイダー定義のカスタムレベル](https://learn.microsoft.com/windows/win32/wes/defining-severity-levels)です。各プロバイダーのマニフェストが名前（`NotValid`など）を割り当てることがありますが、プロバイダー間で標準化された名前はないため、`SeverityText`はそのレベルに対してプロバイダーが定義した値（あれば）になります。いずれの範囲も標準化された重大度を持たず、`UNSPECIFIED (0)`にマッピングされます。いずれの場合も、元のETWレベルは`Attributes["etw.level"]`に保持されるため、マッピングは可逆的です。

このマッピングの実装例として、OpenTelemetry otel-arrowプロジェクトの[ETW receiver](https://github.com/open-telemetry/otel-arrow/tree/main/rust/otap-dataflow/crates/contrib-nodes/src/receivers/etw_receiver)があります。この参照は説明のためのものであり非規範的です。上記のマッピングは特定の実装に紐づくものではありません。

## Appendix B: `SeverityNumber` example mappings

|Syslog               |WinEvtLog  |ETW        |Log4j |Zap   |java.util.logging|.NET (Microsoft.Extensions.Logging)|SeverityNumber|
|---------------------|-----------|-----------|------|------|-----------------|-----------------------------------|--------------|
|                     |           |           |TRACE |      | FINEST          |LogLevel.Trace                     |TRACE (1)     |
|Debug (7)            |Verbose    |VERBOSE    |DEBUG |Debug | FINER           |LogLevel.Debug                     |DEBUG (5)     |
|                     |           |           |      |      | FINE            |                                   |DEBUG2 (6)    |
|                     |           |           |      |      | CONFIG          |                                   |DEBUG3 (7)    |
|Informational (6)    |Information|INFO       |INFO  |Info  | INFO            |LogLevel.Information               |INFO (9)      |
|Notice (5)           |           |           |      |      |                 |                                   |INFO2 (10)    |
|Warning (4)          |Warning    |WARNING    |WARN  |Warn  | WARNING         |LogLevel.Warning                   |WARN (13)     |
|Error (3)            |Error      |ERROR      |ERROR |Error | SEVERE          |LogLevel.Error                     |ERROR (17)    |
|Critical (2)         |Critical   |           |      |Dpanic|                 |                                   |ERROR2 (18)   |
|Alert (1)            |           |           |      |Panic |                 |                                   |ERROR3 (19)   |
|Emergency (0)        |           |CRITICAL   |FATAL |Fatal |                 |LogLevel.Critical                  |FATAL (21)    |

## 参考文献

- [OTEP0097 ログのデータモデル、Appendix A. Example Mappings](https://github.com/open-telemetry/opentelemetry-specification/blob/v1.60.0/oteps/logs/0097-log-data-model.md#appendix-a-example-mappings)

