# OpenTelemetryプロジェクトのパッケージレイアウト

> Source: https://www.ymotongpoo.com/works/otel-specs-ja/spec/library-layout/


このドキュメントは、OpenTelemetryプロジェクトの基本的なパッケージレイアウトの「見た目と使い勝手」を記述するためのものです。このパッケージレイアウトは意図的に汎用的なものであり、言語固有のパッケージ構造を強制しようとするものではありません。

## APIパッケージ

以下は、OpenTelemetry APIパッケージの汎用的なパッケージ構造の提案です。

典型的なトップレベルのディレクトリレイアウトは次のとおりです。

```
api
   ├── context
   │   └── propagation
   ├── metrics
   ├── trace
   │   └── propagation
   ├── baggage
   │   └── propagation
   ├── internal
   └── logs
```

> 小文字、camelCase、snake_caseのいずれの名前を使うかは言語に依存します。

### `/api/context`

このディレクトリは、プロセス内でのコンテキスト伝搬を提供するAPIを記述します。

### `/api/metrics`

このディレクトリは、アプリケーションのメトリクスを記録するために使える[Metrics API](/works/otel-specs-ja/spec/metrics/api/)を記述します。

### `/api/baggage`

このディレクトリは、コンテキスト伝搬とメトリクスイベントの属性を管理するために使える[Baggage API](/works/otel-specs-ja/spec/baggage/api/)を記述します。

### `/api/trace`

[Trace API](/works/otel-specs-ja/spec/trace/api/)は、いくつかの主要なクラスから構成されます。

- `Tracer`はすべての操作に使われます。[Tracer](/works/otel-specs-ja/spec/trace/api/#tracer)の節を参照してください。
- `Span`は現在の操作の実行に関する情報を保持する、可変のオブジェクトです。[Span](/works/otel-specs-ja/spec/trace/api/#span)の節を参照してください。

### `/api/internal`（_オプション_）

ユーザーに公開すべきでない、ライブラリのコンポーネントや実装です。言語にイディオマティックな内部コンポーネントのレイアウトがある場合は、その言語のイディオマティックなスタイルに従ってください。

### `/api/logs`（_将来的に_）

> TODO：ログの操作

## SDKパッケージ

以下は、OpenTelemetry SDKパッケージの汎用的なパッケージ構造の提案です。

典型的なトップレベルのディレクトリレイアウトは次のとおりです。

```
sdk
   ├── context
   ├── metrics
   ├── resource
   ├── trace
   ├── baggage
   ├── internal
   └── logs
```

> 小文字、camelCase、snake_caseのいずれの名前を使うかは言語に依存します。

### `/sdk/context`

このディレクトリは、`api/context`に対するSDKの実装を記述します。

### `/sdk/metrics`

このディレクトリは、`api/metrics`に対するSDKの実装を記述します。

### `/sdk/resource`

[resourceディレクトリ](/works/otel-specs-ja/spec/resource/sdk/)は、主に統計情報やトレースが記録される対象のエンティティに関する情報を捕捉する[Resource](/works/otel-specs-ja/spec/overview/#リソース)型を定義します。例えば、Kubernetesのコンテナから公開されるメトリクスは、クラスタ、名前空間、Pod、コンテナ名を指定するリソースに結び付けられます。

### `/sdk/baggage`

> TODO

### `/sdk/trace`

このディレクトリは、[Tracing SDK](/works/otel-specs-ja/spec/trace/sdk/)の実装を記述します。

### `/sdk/internal`（_オプション_）

ユーザーに公開すべきでない、ライブラリのコンポーネントや実装です。言語にイディオマティックな内部コンポーネントのレイアウトがある場合は、その言語のイディオマティックなスタイルに従ってください。

### `/sdk/logs`（_将来的に_）

> TODO：ログの操作

