diff --git a/content/ja/client_sdks/setup.mdoc.md b/content/ja/client_sdks/setup.mdoc.md new file mode 100644 index 00000000000..249382673fd --- /dev/null +++ b/content/ja/client_sdks/setup.mdoc.md @@ -0,0 +1,66 @@ +--- +content_filters: +- label: SDK + option_group_id: client_sdk_platform_options + trait_id: platform +private: true +title: クライアントSDKのセットアップ +--- +## 概要 + +以下の手順に従って、あなたのプラットフォーム用のDatadog SDKをインストールおよび構成してください。 + + +{% if equals($platform, "browser") %} +{% partial file="sdk/setup/browser.mdoc.md" /%} +{% /if %} + + +{% if equals($platform, "android") %} +{% partial file="sdk/setup/android.mdoc.md" /%} +{% /if %} + + +{% if equals($platform, "ios") %} +{% partial file="sdk/setup/ios.mdoc.md" /%} +{% /if %} + + +{% if equals($platform, "flutter") %} +{% partial file="sdk/setup/flutter.mdoc.md" /%} +{% /if %} + + +{% if equals($platform, "react_native") %} + +React Native SDKの最小サポートバージョンはReact Native v0.65+です。古いバージョンとの互換性は、初期設定では保証されていません。 + +{% tabs %} +{% tab label="React Native" %} + +{% partial file="sdk/setup/react-native.mdoc.md" /%} + +{% /tab %} +{% tab label="Expo" %} + +{% partial file="sdk/setup/react-native-expo.mdoc.md" /%} + +{% /tab %} +{% /tabs %} + +{% /if %} + + +{% if equals($platform, "kotlin_multiplatform") %} +{% partial file="sdk/setup/kotlin-multiplatform.mdoc.md" /%} +{% /if %} + + +{% if equals($platform, "roku") %} +{% partial file="sdk/setup/roku.mdoc.md" /%} +{% /if %} + + +{% if equals($platform, "unity") %} +{% partial file="sdk/setup/unity.mdoc.md" /%} +{% /if %} \ No newline at end of file diff --git a/content/ja/logs/log_configuration/parsing.md b/content/ja/logs/log_configuration/parsing.md index e380b3fd837..90b4289176b 100644 --- a/content/ja/logs/log_configuration/parsing.md +++ b/content/ja/logs/log_configuration/parsing.md @@ -10,60 +10,60 @@ algolia: aliases: - /ja/logs/parsing/ - /ja/logs/processing/parsing -description: Grok プロセッサーを使用したログのパース +description: Grokプロセッサを使用してログを解析します。 further_reading: - link: https://learn.datadoghq.com/courses/log-pipelines tag: Learning Center - text: ログパイプラインの構築と変更の方法 + text: ログパイプラインの構築と修正方法を学びます。 - link: /logs/log_configuration/processors tag: Documentation - text: ログの処理方法 + text: ログを処理する方法を学びます。 - link: https://www.youtube.com/watch?v=AwW70AUmaaQ&list=PLdh-RwQzDsaM9Sq_fi-yXuzhmE7nOlqLE&index=3 tag: Video - text: 'Datadog のヒントとコツ: Grok パースを使用してログからフィールドを抽出する' + text: Datadogのヒントとコツ:Grok解析を使用してログからフィールドを抽出します。 - link: /logs/faq/how-to-investigate-a-log-parsing-issue/ tag: FAQ - text: ログパースの問題を調査する方法 + text: ログ解析の問題を調査するにはどうすればよいですか? - link: /logs/guide/log-parsing-best-practice/ tag: FAQ - text: ログパース - ベストプラクティス + text: ログ解析 - ベストプラクティス - link: /logs/logging_without_limits/ tag: Documentation - text: Datadog によってインデックス化されるログのボリュームの制御 -title: パース + text: Datadogによってインデックスされたログの量を制御します。 +title: 解析 --- -{{< learning-center-callout header="ラーニングセンターで Grok パースを試す" btn_title="Enroll Now" btn_url="https://learn.datadoghq.com/courses/log-pipelines">}} - ログパイプラインの構築と変更、パイプラインスキャナーによる管理、および一貫性を保つための処理済みログ全体での属性名の標準化について学びます。 +{{< learning-center-callout header="学習センターでGrok解析を試してみてください。" btn_title="Enroll Now" btn_url="https://learn.datadoghq.com/courses/log-pipelines">}} + ログパイプラインの構築と修正、パイプラインスキャナーによる管理、処理されたログ全体での属性名の標準化を学びます。 {{< /learning-center-callout >}} ## 概要 {#overview} -Datadog は JSON 形式のログを自動的にパースします。その他の形式については、Datadog では Grok パーサーを使用してログを強化できます。 -Grok 構文を使用すると、純粋な正規表現よりも簡単にログをパースできます。Grok パーサーを使用すると、半構造化テキストメッセージから属性を抽出できます。 +Datadogは自動的にJSON形式のログを解析します。他の形式については、DatadogはGrokパーサーの助けを借りてログを強化することを許可します。 +Grok構文は、純粋な正規表現よりもログを解析するための簡単な方法を提供します。Grokパーサーは、半構造化テキストメッセージから属性を抽出することを可能にします。 -Grok には、整数、IP アドレス、ホスト名などをパースするための再利用可能なパターンが用意されています。これらの値は、文字列として Grok パーサーに送信する必要があります。 +Grokには、整数、IPアドレス、ホスト名などを解析するための再利用可能なパターンが付属しています。これらの値は、文字列としてgrokパーサーに送信する必要があります。 -次の `%{MATCHER:EXTRACT:FILTER}` 構文を使用してパースルールを記述できます。 +`%{MATCHER:EXTRACT:FILTER}` 構文を使用して解析ルールを書くことができます: -* **Matcher**: 何を期待するか (数値、単語、空白以外など) を記述するルール (別のトークンルールへの参照の場合もあります)。 +* **マッチャー**:期待されるもの(数、単語、空白でないものなど)を説明するルール(別のトークンルールへの参照の可能性があります)。 -* **Extract** (オプション): *Matcher* によって一致したテキスト部分のキャプチャ先を表す識別子。 +* **抽出**(オプション):*マッチャー*によって一致したテキストのキャプチャ先を表す識別子。 -* **Filter** (オプション): 一致した内容を変換するためのポストプロセッサー。 +* **フィルター**(オプション):変換のための一致の後処理。 -典型的な非構造化ログの例: +クラシックな非構造化ログの例: ```text john connected on 11/08/2017 ``` -次のパースルールを使用します。 +次の解析ルールを使用して: ```text MyParsingRule %{word:user} connected on %{date("MM/dd/yyyy"):date} ``` -処理後、次の構造化ログが生成されます。 +処理後、次の構造化ログが生成されます: ```json { @@ -72,155 +72,155 @@ MyParsingRule %{word:user} connected on %{date("MM/dd/yyyy"):date} } ``` -**注**: +**注意**: -* 1 つの Grok パーサー内に複数のパースルールがある場合: - * 任意のログに一致できるのは 1 つのみです。上から下へ向かって最初に一致したルールによってパースが実行されます。 - * 各ルールは、リスト内でそのルールより上の行で定義されているパースルールを参照できます。 -*同じ Grok パーサー内では、一意のルール名を使用する必要があります。 -*ルール名に使用できるのは、英数字、`_`、および `.` のみです。先頭は英数字である必要があります。 -*値が null または空のプロパティは表示されません。 -*各ルールはログの最初から最後まで適用されるため、ログエントリ全体に一致するようにパースルールを定義する必要があります。 -*特定のログでは、大きな空白が生じることがあります。改行と空白を考慮するには、`\n` と `\s+` を使用します。 +* 1つのGrokパーサー内に複数の解析ルールがある場合: + * 任意のログに対して一致するのは1つだけです。上から下に一致する最初のものが、解析を行うものです。 + * 各ルールは、リスト内で自分自身の上に定義された解析ルールを参照できます。 +*同じGrokパーサー内でユニークなルール名を持つ必要があります。 +*ルール名には、英数字、`_`、および`.`のみを含める必要があります。英数字で始める必要があります。 +*nullまたは空の値を持つプロパティは表示されません。 +*各ルールはログの最初から最後まで適用されるため、ログエントリ全体に一致するように解析ルールを定義する必要があります。 +*特定のログは、大きな空白のギャップを生成することがあります。`\n`と`\s+`を使用して、改行と空白を考慮してください。 ###マッチャーとフィルター {#matcher-and-filter} -
クエリ時 (ログエクスプローラー内) で利用可能な Grok パース機能は、マッチャー (dataintegernotSpacenumber、および word) とフィルター (number および integer) の限定されたサブセットをサポートします。

-次のマッチャーとフィルターのフルセットは、取り込み時Grok パーサー機能に特有のものです。
+
Grok解析機能は、クエリ時ログエクスプローラー内)で利用可能で、限られたサブセットのマッチャー(データ整数空白でない、および単語)とフィルター(および整数)をサポートします。

+次の完全なマッチャーとフィルターのセットは、インジェスト時Grokパーサー機能に特有です。
-Datadog によってネイティブにインプリメントされているすべてのマッチャーとフィルターのリストは次のとおりです。 +Datadogによってネイティブに実装されたすべてのマッチャーとフィルターのリストは次のとおりです: {{< tabs >}} {{% tab "マッチャー" %}} `date("pattern"[, "timezoneId"[, "localeId"]])` -: 指定されたパターンで日付に一致し、パースして Unix タイムスタンプを生成します。[date マッチャーの例を参照してください](#parsing-dates)。 +指定されたパターンに一致する日付をマッチさせ、Unixタイムスタンプを生成します。[日付マッチャーの例を参照してください](#parsing-dates)。 `regex("pattern")` -: 正規表現に一致します。[regex マッチャーの例を確認してください](#regex)。 +正規表現に一致します。[正規表現マッチャーの例を確認してください](#regex)。 `notSpace` -: 次のスペースまでの任意の文字列に一致します。 +次のスペースまでの任意の文字列に一致します。 `boolean("truePattern", "falsePattern")` -: ブール値に一致してパースします。true と false のパターンをオプションで定義できます (デフォルトは `true` と `false`、大文字と小文字は区別されません)。 +真偽値をマッチさせ、オプションで真と偽のパターンを定義します(デフォルトは`true`と`false`で、大文字と小文字を区別しません)。 `numberStr` -: 10 進浮動小数点数に一致し、文字列としてパースします。 +小数点浮動小数点数に一致し、それを文字列として解析します。 `number` -: 10 進浮動小数点数に一致し、倍精度数としてパースします。 +小数点浮動小数点数に一致し、それを倍精度数として解析します。 `numberExtStr` -: 浮動小数点数 (指数表記をサポート) に一致し、文字列としてパースします。 +浮動小数点数に一致し(科学的表記のサポートあり)、それを文字列として解析します。 `numberExt` -: 浮動小数点数 (指数表記をサポート) に一致し、倍精度数としてパースします。 +浮動小数点数に一致し(科学的表記のサポートあり)、それを倍精度数として解析します。 `integerStr` -: 整数に一致し、文字列としてパースします。 +整数に一致し、それを文字列として解析します。 `integer` -: 整数に一致し、整数としてパースします。 +整数に一致し、それを整数として解析します。 `integerExtStr` -: 整数 (指数表記をサポート) に一致し、文字列としてパースします。 +整数に一致し(科学的表記のサポートあり)、それを文字列として解析します。 `integerExt` -: 整数 (指数表記をサポート) に一致し、整数としてパースします。 +整数に一致し(科学的表記のサポートあり)、それを整数として解析します。 `word` -: _単語_に一致します。これは単語の境界で始まり、a-z、A-Z、0-9、および `_` (アンダースコア) 文字を含み、単語の境界で終わります。正規表現の `\b\w+\b` に相当します。 +_単語_に一致し、単語境界で始まり、a-z、A-Z、0-9の文字を含み、`_`(アンダースコア)文字を含み、単語境界で終わります。正規表現の`\b\w+\b`に相当します。 `doubleQuotedString` -: 二重引用符で囲まれた文字列に一致します。 +ダブルクオートされた文字列に一致します。 `singleQuotedString` -: 一重引用符で囲まれた文字列に一致します。 +シングルクオートされた文字列に一致します。 `quotedString` -: 二重引用符または一重引用符で囲まれた文字列に一致します。 +ダブルクオートまたはシングルクオートされた文字列に一致します。 `uuid` -: UUID に一致します。 +UUIDに一致します。 `mac` -: MAC アドレスに一致します。 +MACアドレスに一致します。 `ipv4` -: IPv4 に一致します。 +IPV4に一致します。 `ipv6` -: IPv6 に一致します。 +IPV6に一致します。 `ip` -: IP (v4 または v6) に一致します。 +IP(v4またはv6)に一致します。 `hostname` -: ホスト名に一致します。 +ホスト名に一致します。 `ipOrHost` -: ホスト名または IP に一致します。 +ホスト名またはIPに一致します。 `port` -: ポート番号に一致します。 +ポート番号に一致します。 `data` -: スペースと改行を含む任意の文字列に一致します。正規表現の `.*` に相当します。上記のパターンのいずれも適切でない場合に使用します。 +スペースや改行を含む任意の文字列に一致します。正規表現での`.*`に相当します。上記のパターンが適切でない場合に使用します。 {{% /tab %}} {{% tab "フィルター" %}} `number` -: 一致した内容を倍精度数としてパースします。 +一致を倍精度数値として解析します。 `integer` -: 一致した内容を整数としてパースします。 +一致を整数として解析します。 `boolean` -: 大文字小文字を区別せず、'true' および 'false' 文字列をブール値としてパースします。 +'true'および'false'の文字列を大文字小文字を無視してブール値として解析します。 `nullIf("value")` -: 一致した内容が指定された値と等しい場合に null を返します。 +一致が提供された値と等しい場合はnullを返します。 `json` -: 正しくフォーマットされた JSON をパースします。 +適切にフォーマットされたJSONを解析します。 `rubyhash` -: `{name => "John", "job" => {"company" => "Big Company", "title" => "CTO"}}` のような、正しくフォーマットされた Ruby ハッシュをパースします。 +`{name => "John", "job" => {"company" => "Big Company", "title" => "CTO"}}`のような適切にフォーマットされたRubyハッシュを解析します。 `useragent([decodeuricomponent:true/false])` -: user-agent をパースし、そのエージェントが表すデバイス、OS、ブラウザを含む JSON オブジェクトを返します。[User Agent プロセッサーを確認してください][1]。 +ユーザーエージェントを解析し、デバイス、OS、およびエージェントによって表されるブラウザを含むJSONオブジェクトを返します。[ユーザーエージェントプロセッサを確認してください][1]。 `querystring` -: 一致する URL クエリ文字列 (例: `?productId=superproduct&promotionCode=superpromo`) 内のすべてのキーと値のペアを抽出します。 +一致するURLクエリ文字列内のすべてのキーと値のペアを抽出します(例えば、`?productId=superproduct&promotionCode=superpromo`)。 `decodeuricomponent` -: URI コンポーネントをデコードします。たとえば、`%2Fservice%2Ftest` を `/service/test` に変換します。 +URIコンポーネントをデコードします。例えば、`%2Fservice%2Ftest`を`/service/test`に変換します。 `lowercase` -: 小文字に変換された文字列を返します。 +小文字の文字列を返します。 `uppercase` -: 大文字に変換された文字列を返します。 +大文字の文字列を返します。 `keyvalue([separatorStr[, characterAllowList[, quotingStr[, delimiter]]]])` -: キーと値のパターンを抽出し、JSON オブジェクトを返します。[キーと値のフィルターの例](#key-value-or-logfmt)を参照してください。 +キー値パターンを抽出し、JSONオブジェクトを返します。[キー値フィルターの例](#key-value-or-logfmt)を参照してください。 `xml` -: 正しくフォーマットされた XML をパースします。[XML フィルターの例](#parsing-xml)を参照してください。 +適切にフォーマットされたXMLを解析します。[XMLフィルターの例](#parsing-xml)を参照してください。 `csv(headers[, separator[, quotingcharacter]])` -: 正しくフォーマットされた CSV または TSV の行をパースします。[CSV フィルターの例](#parsing-csv)を参照してください。 +適切にフォーマットされたCSVまたはTSV行を解析します。[CSVフィルターの例](#parsing-csv)を参照してください。 `scale(factor)` -: 期待される数値を指定された係数で乗算します。 +期待される数値を指定された係数で乗算します。 `array([[openCloseStr, ] separator][, subRuleOrFilter)` -: トークンの文字列シーケンスをパースし、配列として返します。[リストから配列へ](#list-to-array)の例を参照してください。 +トークンの文字列シーケンスを解析し、配列として返します。[リストから配列](#list-to-array)の例を参照してください。 `url` -: URL をパースし、トークン化されたすべてのメンバー (ドメイン、クエリパラメーター、ポートなど) を JSON オブジェクトで返します。[URL のパース方法に関する詳細][2]。 +URLを解析し、すべてのトークン化されたメンバー(ドメイン、クエリパラメータ、ポートなど)をJSONオブジェクトとして返します。[URLを解析する方法についての詳細][2]。 [1]: /ja/logs/log_configuration/processors/#user-agent-parser [2]: /ja/logs/log_configuration/processors/#url-parser @@ -229,33 +229,33 @@ Datadog によってネイティブにインプリメントされているすべ ## 高度な設定 {#advanced-settings} -Grok プロセッサーの下部にある [**Advanced Settings**] (高度な設定) セクションを使用すると、デフォルトの `message` 属性の代わりに特定の属性をパースしたり、複数のパースルールで共通のパターンを再利用するヘルパールールを定義したりできます。 +Grokプロセッサの下部にある**高度な設定**セクションを使用して、デフォルトの`message`属性の代わりに特定の属性を解析するか、複数の解析ルールにわたって共通のパターンを再利用するヘルパールールを定義します。 -###特定のテキスト属性のパース {#parsing-a-specific-text-attribute} +###特定のテキスト属性を解析する{#parsing-a-specific-text-attribute} -デフォルトの `message` 属性の代わりに、指定したテキスト属性に Grok プロセッサーを適用するには、**Extract from** フィールドを使用します。 +**から抽出**フィールドを使用して、デフォルトの`message`属性の代わりに指定されたテキスト属性にGrokプロセッサを適用します。 -たとえば、キーと値としてパースする必要がある `command.line` 属性を含むログを考えてみましょう。`command.line` から抽出してその内容をパースし、コマンドデータから構造化された属性を作成します。 +例えば、キー値として解析されるべき`command.line`属性を含むログを考えてみてください。`command.line`から内容を抽出し、コマンドデータから構造化された属性を作成します。 -{{< img src="/logs/processing/parsing/grok_advanced_settings_extract.png" alt="command.line 属性からの抽出を使用した高度な設定の例" style="width:80%;">}} +{{< img src="/logs/processing/parsing/grok_advanced_settings_extract.png" alt="コマンドライン属性の例を用いた高度な設定" style="width:80%;">}} -### 共通パターンを再利用するためのヘルパールールの使用 {#using-helper-rules-to-reuse-common-patterns} +### ヘルパールールを使用して共通のパターンを再利用する {#using-helper-rules-to-reuse-common-patterns} -パースルールのトークンを定義するには、**Helper Rules** フィールドを使用します。ヘルパールールを使用すると、パースルール全体で共通の Grok パターンを再利用できます。これは、同じ Grok パーサー内に同じトークンを使用するルールが複数ある場合に便利です。 +**ヘルパールール**フィールドを使用して、パースルールのトークンを定義します。ヘルパールールを使用すると、パースルール全体で共通のGrokパターンを再利用できます。これは、同じGrokパーサー内に同じトークンを使用する複数のルールがある場合に便利です。 -典型的な非構造化ログの例: +クラシックな非構造化ログの例: ```text john id:12345 connected on 11/08/2017 on server XYZ in production ``` -次のパースルールを使用します。 +次のパースルールを使用してください: ```text MyParsingRule %{user} %{connection} %{server} ``` -次のヘルパーを使用します。 +次のヘルパーを使用して: ```text user %{word:user.name} id:%{integer:user.id} @@ -265,29 +265,29 @@ server on server %{notSpace:server.name} in %{notSpace:server.env} ## 例 {#examples} -パーサーの使用方法を示す例: +パーサーの使用方法を示すいくつかの例: -* [キーと値または logfmt](#key-value-or-logfmt) +* [キー値またはlogfmt](#key-value-or-logfmt) * [日付のパース](#parsing-dates) -* [交互パターン](#alternating-pattern) +* [交互のパターン](#alternating-pattern) * [オプションの属性](#optional-attribute) -* [ネストされた JSON](#nested-json) -* [正規表現](#regex) +* [ネストされたJSON](#nested-json) +* [Regex](#regex) * [リストと配列](#list-to-array) -* [glog 形式](#glog-format) +* [Glog形式](#glog-format) * [XML](#parsing-xml) * [CSV](#parsing-csv) -### キーと値または logfmt {#key-value-or-logfmt} +### キー値またはlogfmt {#key-value-or-logfmt} -これはキーと値のコアフィルター `keyvalue([separatorStr[, characterAllowList[, quotingStr[, delimiter]]]])` です。次のように指定します。 +これはキー値コアフィルターです:`keyvalue([separatorStr[, characterAllowList[, quotingStr[, delimiter]]]])` どこで: -* `separatorStr`: キーと値の間のセパレーターを定義します。デフォルトは `=` です。 -* `characterAllowList`: デフォルトの `\\w.\\-_@` に加えて、エスケープされない追加の値を定義します。引用符で囲まれていない値 (たとえば `key=@valueStr`) にのみ使用されます。 -* `quotingStr`: 引用符を定義し、デフォルトの引用符検出 (`<>`、`""`、`''`) を置き換えます。 -* `delimiter`: 異なるキーと値のペアの間のセパレーターを定義します (たとえば、`key1=value1|key2=value2` では `|` が区切り文字です)。デフォルトは ` ` (通常のスペース)、`,`、および `;` です。 +* `separatorStr`:キーと値の間の区切り文字を定義します。デフォルトは `=` です。 +* `characterAllowList`: デフォルトの `\\w.\\-_@` に加えて、エスケープされていない追加の値文字を定義します。非引用値のみに使用されます(例えば、`key=@valueStr`)。 +* `quotingStr`: デフォルトの引用検出を置き換える引用を定義します: `<>`, `""`, `''`。 +* `delimiter`: 異なるキー値ペアの間の区切り文字を定義します(例えば、`|` は `key1=value1|key2=value2` の区切り文字です)。デフォルトは ` `(通常のスペース)、`,` および `;` です。 -**keyvalue** などのフィルターを使用すると、キーと値または logfmt 形式の文字列を属性に簡単にマッピングできます。 +フィルターを使用して、**keyvalue** のように、文字列をキー値または logfmt 形式の属性により簡単にマッピングします: **ログ:** @@ -301,8 +301,8 @@ user=john connect_date=11/08/2017 id=123 action=click rule %{data::keyvalue} ``` -パラメーター名はすでにログに含まれているため、指定する必要はありません。 -ルールパターンに **extract** 属性 `my_attribute` を追加すると、次のように表示されます。 +パラメータの名前を指定する必要はありません。すでにログに含まれています。 +ルールパターンに **extract** 属性 `my_attribute` を追加すると、次のようになります: ```json { @@ -314,7 +314,7 @@ rule %{data::keyvalue} } ``` -`=` がキーと値の間のデフォルトのセパレーターではない場合は、セパレーターを指定してパースルールにパラメーターを追加します。 +`=` がキーと値の間のデフォルトの区切り文字でない場合は、区切り文字を持つ解析ルールにパラメータを追加してください。 **ログ:** @@ -328,7 +328,7 @@ user: john connect_date: 11/08/2017 id: 123 action: click rule %{data::keyvalue(": ")} ``` -ログの属性値に特殊文字 (たとえば URL 内の `/` など) が含まれている場合は、パースルールの許可リストに追加します。 +ログに属性値の特殊文字が含まれている場合、例えば URL の `/` のように、解析ルールの許可リストに追加してください: **ログ:** @@ -342,9 +342,9 @@ url=https://app.datadoghq.com/event/stream user=john rule %{data::keyvalue("=","/:")} ``` -その他の例: +他の例: -| **生の文字列** | **パースルール** | **結果** | +| **生文字列** | **解析ルール** | **結果** | |:-----------------------------|:------------------------------------------------------|:--------------------------------------| | key=valueStr | `%{data::keyvalue}` | {"key": "valueStr"} | | key=\ | `%{data::keyvalue}` | {"key": "valueStr"} | @@ -357,7 +357,7 @@ rule %{data::keyvalue("=","/:")} | key1="value1"\|key2="value2" | %{data::keyvalue("=", "", "", "|")} | {"key1": "value1", "key2": "value2"} | **複数の引用文字列の例**: 複数の引用文字列が定義されている場合、デフォルトの動作は定義された引用文字に置き換えられます。 -キーと値は、`quotingStr` で指定されている内容に関わらず、引用文字のない入力に常に一致します。引用文字が使用されている場合、引用文字の間のすべてが抽出されるため、`characterAllowList` は無視されます。 +キーと値は、`quotingStr` に指定されている内容に関係なく、常に引用文字なしの入力と一致します。引用文字が使用される場合、`characterAllowList`は無視され、引用文字の間にあるすべての内容が抽出されます。 **ログ:** @@ -377,17 +377,17 @@ rule %{data::keyvalue("=","/:")} {"key1": "valueStr", "key2": "/valueStr2"} ``` -**注**: +**注意**: -* 空の値 (`key=`) または `null` 値 (`key=null`) は、出力 JSON に表示されません。 -*`data` オブジェクトで *keyvalue* フィルターを定義し、このフィルターが一致しない場合、空の JSON `{}` が返されます (たとえば、入力: `key:=valueStr`、パースルール: `rule_test %{data::keyvalue("=")}`、出力: `{}`)。 -*`""` を `quotingStr` として定義すると、引用に関するデフォルト設定が維持されます。 +* 空の値 (`key=`) または `null` の値 (`key=null`) は出力JSONに表示されません。 +*`data`オブジェクトに対して*キー値*フィルターを定義し、このフィルターが一致しない場合、空のJSON `{}`が返されます(例:入力: `key:=valueStr`、解析ルール: `rule_test %{data::keyvalue("=")}`、出力: `{}`)。 +*`""`を`quotingStr`として定義すると、引用のデフォルト設定が保持されます。 -###日付のパース {#parsing-dates} +###日付を解析する {#parsing-dates} -日付マッチャーは、タイムスタンプを EPOCH 形式 (測定単位: **ミリ秒**) に変換します。 +日付マッチャーは、あなたのタイムスタンプをEPOCH形式(単位は**ミリ秒**)に変換します。 -| **生の文字列** | **パースルール** | **結果** | +| **生の文字列** | **解析ルール** | **結果** | |:-------------------------------------|:----------------------------------------------------------|:------------------------| | 14:20:15 | `%{date("HH:mm:ss"):date}` | {"date": 51615000} | | 02:20:15 PM | `%{date("hh:mm:ss a"):date}` | {"date": 51615000} | @@ -403,19 +403,19 @@ rule %{data::keyvalue("=","/:")} | Thu Jun 16 08:29:03 20161 | `%{date("EEE MMM dd HH:mm:ss yyyy","UTC+5"):date}` | {"date": 1466047743000} | | Thu Jun 16 08:29:03 20161 | `%{date("EEE MMM dd HH:mm:ss yyyy","+3"):date}` | {"date": 1466054943000} | -1 独自のローカライズを行い、タイムスタンプが UTC _ではない_場合は、`timezone` パラメーターを使用します。 -サポートされているタイムゾーンの形式は次のとおりです。 +1 自分でローカライズを行い、タイムスタンプが_UTCではない_場合は、`timezone`パラメータを使用してください。 +サポートされているタイムゾーンの形式は次のとおりです: -* `GMT`、`UTC`、`UT`、または `Z` -* `+hh:mm`、`-hh:mm`、`+hhmm`、`-hhmm`。サポートされている最大範囲は、+18:00 から -18:00 まで (両端を含む) です。 -*`UTC+`、`UTC-`、`GMT+`、`GMT-`、`UT+`、または `UT-` で始まるタイムゾーン。サポートされている最大範囲は、+18:00 から -18:00 まで (両端を含む) です。 -*TZ データベースから取得されたタイムゾーン ID。詳細については、[TZ データベース名][2]を参照してください。 +* `GMT`、`UTC`、`UT`または`Z` +* `+hh:mm`, `-hh:mm`, `+hhmm`, `-hhmm`.最大サポート範囲は+18:00から-18:00まで(両端を含む)です。 +*`UTC+`、`UTC-`、`GMT+`、`GMT-`、`UT+`または`UT-`で始まるタイムゾーン。最大サポート範囲は+18:00から-18:00まで(両端を含む)です。 +*TZデータベースから取得したタイムゾーンID。詳細については、[TZデータベース名][2]を参照してください。 -**注**: 日付をパースしても、その値がログの公式な日付として設定される**わけではありません**。これを行うには、後続のプロセッサーで [ログ日付リマッパー][3]を使用します。 +**注意**: 日付を解析することは**その値をログの公式日付として設定しません**。このためには、後続のプロセッサで[ログ日付リマッパー][3]を使用してください。 ###交互パターン {#alternating-pattern} -1 つの属性のみが異なる 2 つの形式の可能性があるログがある場合は、`(|)` を使用した交互設定で単一のルールを設定します。このルールは、ブール演算の OR に相当します。 +2つの可能な形式のログがあり、1つの属性だけが異なる場合は、`(|)`を使用して交互に単一のルールを設定してください。このルールはブールORに相当します。 **ログ**: @@ -425,7 +425,7 @@ john connected on 11/08/2017 ``` **ルール**: -"id" は文字列ではなく整数であることに注意してください。 +「id」は整数であり、文字列ではないことに注意してください。 ```text MyParsingRule (%{integer:user.id}|%{word:user.firstname}) connected on %{date("MM/dd/yyyy"):connect_date} @@ -453,9 +453,9 @@ MyParsingRule (%{integer:user.id}|%{word:user.firstname}) connected on %{date("M } ``` -### オプションの属性 {#optional-attribute} +オプションの属性 {#optional-attribute} -ログによっては、一部の時間帯にのみ表示される値が含まれる場合があります。この場合、`()?` を使用して属性の抽出をオプションにします。 +一部のログには、時々のみ現れる値が含まれています。この場合、`()?`を使用して属性抽出をオプションにしてください。 **ログ**: @@ -470,7 +470,7 @@ john connected on 11/08/2017 MyParsingRule %{word:user.firstname} (%{integer:user.id} )?connected on %{date("MM/dd/yyyy"):connect_date} ``` -**注**: オプションセクションの最初の単語の後にスペースを入れると、ルールは一致しません。 +**注意**: オプションセクションの最初の単語の後にスペースを含めると、ルールは一致しません。 **結果**:
`(%{integer:user.id} )?` @@ -496,9 +496,9 @@ MyParsingRule %{word:user.firstname} (%{integer:user.id} )?connected on %{date(" } ``` -### ネストされた JSON {#nested-json} +###ネストされたJSON {#nested-json} -生のテキストプレフィックスの後にネストされた JSON オブジェクトをパースするには、`json` フィルターを使用します。 +生のテキストプレフィックスの後にネストされたJSONオブジェクトを解析するには、`json`フィルターを使用してください: **ログ**: @@ -525,7 +525,7 @@ parsing_rule %{date("MMM dd HH:mm:ss"):timestamp} %{word:vm} %{word:app}\[%{numb } ``` -### 正規表現 {#regex} +###正規表現 {#regex} **ログ**: @@ -550,9 +550,9 @@ MyParsingRule %{regex("[a-z]*"):user.firstname}_%{regex("[a-zA-Z0-9]*"):user.id} } ``` -### リストから配列へ {#list-to-array} +###リストを配列に {#list-to-array} -リストを単一の属性内の配列に抽出するには、`array([[openCloseStr, ] separator][, subRuleOrFilter)` フィルターを使用します。`subRuleOrFilter` はオプションであり、これらの [フィルター][4]を使用できます。 +`array([[openCloseStr, ] separator][, subRuleOrFilter)`フィルターを使用して、単一の属性内のリストを配列に抽出します。`subRuleOrFilter`はオプションであり、これらの[フィルター][4]を受け入れます。 **ログ**: @@ -579,7 +579,7 @@ myParsingRule Users %{data:users:array("[]",",")} have been added to the databas } ``` -**ログ**: +**ログ**: ```text Users {John-Oliver-Marc-Tom} have been added to the database @@ -591,29 +591,29 @@ Users {John-Oliver-Marc-Tom} have been added to the database myParsingRule Users %{data:users:array("{}","-")} have been added to the database ``` -**`subRuleOrFilter`** を使用したルール: +**ルールを使用して`subRuleOrFilter`**: ```text myParsingRule Users %{data:users:array("{}","-", uppercase)} have been added to the database ``` -### glog 形式 {#glog-format} +###Glogフォーマット{#glog-format} -Kubernetes コンポーネントは `glog` 形式でログを記録することがあります。この例は、パイプラインライブラリの Kube Scheduler アイテムのものです。 +Kubernetesコンポーネントは時々`glog`フォーマットでログを記録します。この例はパイプラインライブラリのKubeスケジューラー項目からのものです。 -ログ行の例: +例のログ行: ```text W0424 11:47:41.605188 1 authorization.go:47] Authorization is disabled ``` -パースルール: +解析ルール: ```text kube_scheduler %{regex("\\w"):level}%{date("MMdd HH:mm:ss.SSSSSS"):timestamp}\s+%{number:logger.thread_id} %{notSpace:logger.name}:%{number:logger.lineno}\] %{data:msg} ``` -抽出された JSON: +抽出されたJSON: ```json { @@ -628,11 +628,11 @@ kube_scheduler %{regex("\\w"):level}%{date("MMdd HH:mm:ss.SSSSSS"):timestamp}\s+ } ``` -### XML のパース {#parsing-xml} +### XMLを解析する{#parsing-xml} -XML パーサーは、XML 形式のメッセージを JSON に変換します。 +XMLパーサーはXML形式のメッセージをJSONに変換します。 -**ログ:** +**ログ:** ```text @@ -664,27 +664,27 @@ rule %{data::xml} } ``` -**注**: +**ノート**: -* XML の 2 つのタグの間に属性と文字列値の両方を持つタグが含まれている場合、`value` 属性が生成されます。例: `Harry Potter` は `{"title": {"lang": "en", "value": "Harry Potter" } }` に変換されます。 -* 繰り返されるタグは自動的に配列に変換されます。例: `Harry PotterEveryday Italian` は `{ "bookstore": { "book": [ "Harry Potter", "Everyday Italian" ] } }` に変換されます。 +* XMLに属性と2つのタグの間に文字列値の両方を持つタグが含まれている場合、`value`属性が生成されます。例えば:`Harry Potter`は`{"title": {"lang": "en", "value": "Harry Potter" } }`に変換されます。 +*繰り返しタグは自動的に配列に変換されます。例えば:`Harry PotterEveryday Italian`は`{ "bookstore": { "book": [ "Harry Potter", "Everyday Italian" ] } }`に変換されます。 -### CSV のパース {#parsing-csv} +### CSVを解析する{#parsing-csv} -**CSV** フィルターを使用すると、特定の文字 (デフォルトは `,`) で区切られている場合に、文字列を属性に簡単にマッピングできます。 +**CSV**フィルターを使用して、指定された文字(デフォルトでは`,`)で区切られた文字列を属性により簡単にマッピングします。 -CSV フィルターは `csv(headers[, separator[, quotingcharacter]])` として定義されます。次のように指定します。 +CSVフィルターは`csv(headers[, separator[, quotingcharacter]])`として定義されます。 -* `headers`: `,` で区切られたキー名を定義します。キー名は英字で始まる必要があり、任意の英数字および `_` を含めることができます。 -* `separator`: 異なる値を区切るために使用されるセパレーターを定義します。1 文字のみ使用できます。デフォルト: `,`。**注**: TSV のタブ文字を表すには、`separator` に `tab` を使用します。 -* `quotingcharacter`: 引用符を定義します。1 文字のみ使用できます。デフォルト: `"` +* `headers`:`,`で区切られたキー名を定義します。キー名はアルファベット文字で始まり、`_`に加えて任意の英数字を含むことができます。 +* `separator`: 異なる値を区切るために使用される区切り文字を定義します。1文字のみが受け入れられます。デフォルト: `,`。**注意**: TSVのタブ文字を表すために`tab`を使用してください。 +* `quotingcharacter`: 引用文字を定義します。1文字のみが受け入れられます。デフォルト: `"` -**注**: +**注意**: -* セパレーター文字を含む値は、引用符で囲む必要があります。 -*引用符を含む引用値は、引用符でエスケープする必要があります。たとえば、引用値内の `""` は `"` を表します。 -*ログに含まれる値の数がヘッダーのキーの数と一致しない場合、CSV パーサーは最初の値を照合します。 -*整数と倍精度数は、可能な場合は自動的にキャストされます。 +* 区切り文字を含む値は引用符で囲む必要があります。 +*引用された値に引用文字が含まれている場合は、引用文字でエスケープする必要があります。例えば、引用された値内の`""`は`"`を表します。 +*ログに値の数がヘッダーのキーの数と同じでない場合、CSVパーサーは最初のものを一致させます。 +*整数と倍精度浮動小数点数は、可能であれば自動的にキャストされます。 **ログ**: @@ -712,22 +712,22 @@ myParsingRule %{data:user:csv("first_name,name,st_nb,st_name,city")} } {{< /code-block >}} -その他の例: +他の例: -| **生の文字列** | **パースルール** | **結果** | +| **生文字列** | **解析ルール** | **結果** | |:-----------------------------|:-------------------------------------------------------------------------|:------------------------------------------------| | `John,Doe` | `%{data::csv("firstname,name")}` | {"firstname": "John", "name":"Doe"} | | `"John ""Da Man""",Doe` | `%{data::csv("firstname,name")}` | {"firstname": "John \"Da Man\"", "name":"Doe"} | | `'John ''Da Man''',Doe` | `%{data::csv("firstname,name",",","'")}` | {"firstname": "John 'Da Man'", "name":"Doe"} | -| John|Doe | %{data::csv("firstname,name","|")} | {"firstname": "John", "name":"Doe"} | +| ジョン|ドー | %{data::csv("firstname,name","|")} | {"firstname": "ジョン", "name":"ドー"} | | `value1,value2,value3` | `%{data::csv("key1,key2")}` | {"key1": "value1", "key2":"value2"} | | `value1,value2` | `%{data::csv("key1,key2,key3")}` | {"key1": "value1", "key2":"value2"} | | `value1,,value3` | `%{data::csv("key1,key2,key3")}` | {"key1": "value1", "key3":"value3"} | -| Value1    Value2    Value3 (TSV) | `%{data::csv("key1,key2,key3","tab")}` | {"key1": "value1", "key2": "value2", "key3":"value3"} | +| 値1    値2    値3 (TSV) | `%{data::csv("key1,key2,key3","tab")}` | {"key1": "value1", "key2": "value2", "key3":"value3"} | -### データマッチャーを使用して不要なテキストを破棄する {#use-data-matcher-to-discard-unneeded-text} +### 不要なテキストを破棄するためにデータマッチャーを使用します {#use-data-matcher-to-discard-unneeded-text} -必要な部分をパースした後、それ以降のテキストを破棄しても安全であることがわかっているログがある場合は、データマッチャーを使用して破棄できます。次のログの例では、`data` マッチャーを使用して末尾の `%` を破棄できます。 +必要なものを解析した後、その後のテキストが破棄しても安全であることがわかるログがある場合、データマッチャーを使用してそれを行うことができます。次のログの例では、`data`マッチャーを使用して最後の`%`を破棄できます。 **ログ**: @@ -750,11 +750,11 @@ MyParsingRule Usage\:\s+%{number:usage}%{data:ignore} } ``` -### ASCII 制御文字 {#ascii-control-characters} +### ASCII制御文字 {#ascii-control-characters} -ログに ASCII 制御文字が含まれている場合、それらは取り込み時にシリアル化されます。これらは、grok パーサー内でシリアル化された値を明示的にエスケープすることで処理できます。 +ログにASCII制御文字が含まれている場合、それらは取り込み時にシリアライズされます。これらは、grokパーサー内でシリアライズされた値を明示的にエスケープすることによって処理できます。 -##その他の参考資料 {#further-reading} +##さらに読む {#further-reading} {{< partial name="whats-next/whats-next.html" >}} diff --git a/content/ja/opentelemetry/instrument/dd_sdks/api_support.mdoc.md b/content/ja/opentelemetry/instrument/dd_sdks/api_support.mdoc.md new file mode 100644 index 00000000000..70e9d544f67 --- /dev/null +++ b/content/ja/opentelemetry/instrument/dd_sdks/api_support.mdoc.md @@ -0,0 +1,1453 @@ +--- +aliases: +- /ja/opentelemetry/interoperability/api_support +- /ja/opentelemetry/interoperability/otel_api_tracing_interoperability/ +- /ja/opentelemetry/instrument/api_support/dotnet/ +- /ja/opentelemetry/instrument/api_support/dotnet/logs +- /ja/opentelemetry/instrument/api_support/dotnet/metrics +- /ja/opentelemetry/instrument/api_support/dotnet/traces +- /ja/opentelemetry/instrument/api_support/go +- /ja/opentelemetry/instrument/api_support/go/metrics +- /ja/opentelemetry/instrument/api_support/go/traces +- /ja/opentelemetry/instrument/api_support/java +- /ja/opentelemetry/instrument/api_support/nodejs/ +- /ja/opentelemetry/instrument/api_support/nodejs/logs +- /ja/opentelemetry/instrument/api_support/nodejs/metrics +- /ja/opentelemetry/instrument/api_support/nodejs/traces +- /ja/opentelemetry/instrument/api_support/php +- /ja/opentelemetry/instrument/api_support/php/metrics +- /ja/opentelemetry/instrument/api_support/php/traces +- /ja/opentelemetry/instrument/api_support/python/ +- /ja/opentelemetry/instrument/api_support/python/logs +- /ja/opentelemetry/instrument/api_support/python/metrics +- /ja/opentelemetry/instrument/api_support/python/traces +- /ja/opentelemetry/instrument/api_support/ruby/ +- /ja/opentelemetry/instrument/api_support/ruby/metrics +- /ja/opentelemetry/instrument/api_support/ruby/traces +- /ja/opentelemetry/instrument/api_support/rust +- /ja/opentelemetry/instrument/api_support/rust/metrics +- /ja/opentelemetry/instrument/api_support/rust/traces +content_filters: +- label: Language + option_group_id: otel_api_support_language_options + trait_id: prog_lang +- label: Signal + option_group_id: otel_api_support_signal_options + trait_id: platform +description: OpenTelemetry APIを使用して、Datadog SDKを介してトレース、メトリクス、ログをDatadogに送信し、ベンダー中立の計測を維持します。 +further_reading: +- link: tracing/guide/instrument_custom_method + tag: Documentation + text: ビジネスロジックの深い可視性を得るためにカスタムメソッドを計測します。 +- link: tracing/connect_logs_and_traces + tag: Documentation + text: ログとトレースを接続します。 +- link: tracing/visualization/ + tag: Documentation + text: サービス、リソース、トレースを探索します。 +- link: https://www.datadoghq.com/blog/opentelemetry-instrumentation/ + tag: Blog + text: DatadogとOpenTelemetryイニシアチブについてもっと学びましょう。 +title: OpenTelemetry APIサポート +--- + + + + + +{% if equals($prog_lang, "java") %} +{% if equals($platform, "metrics") %} +{% alert level="danger" %} +この言語ではメトリクスのためのOpenTelemetry APIサポートは利用できません。代わりに[DogStatsD][200]を使用してカスタムメトリクスを送信してください。 +{% /alert %} +{% /if %} +{% if equals($platform, "logs") %} +{% alert level="danger" %} +この言語ではログのためのOpenTelemetry APIサポートは利用できません。代わりに[Datadog Log Collection][210]を使用してください。 +{% /alert %} +{% /if %} +{% /if %} + + +{% if equals($prog_lang, "php") %} +{% if equals($platform, "logs") %} +{% alert level="danger" %} +PHPではログのためのOpenTelemetry APIサポートは利用できません。代わりに[Datadog Log Collection][210]を使用してください。 +{% /alert %} +{% /if %} +{% /if %} + + +{% if equals($prog_lang, "ruby") %} +{% if equals($platform, "logs") %} +{% alert level="danger" %} +RubyではログのためのOpenTelemetry APIサポートは利用できません。代わりに[Datadog Log Collection][210]を使用してください。 +{% /alert %} +{% /if %} +{% /if %} + + + + + +{% if equals($platform, "traces") %} + +## 概要 + +OpenTelemetryトレースAPIを使用して、Datadog SDKでカスタムスパンを作成し、タグを追加し、イベントを記録するなどします。 + +{% if equals($prog_lang, "java") %} +{% partial file="opentelemetry/traces/java.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "python") %} +{% partial file="opentelemetry/traces/python.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "node_js") %} +{% partial file="opentelemetry/traces/nodejs.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "go") %} +{% partial file="opentelemetry/traces/go.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "ruby") %} +{% partial file="opentelemetry/traces/ruby.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "dot_net") %} +{% partial file="opentelemetry/traces/dotnet.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "php") %} +{% partial file="opentelemetry/traces/php.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "rust") %} +{% partial file="opentelemetry/traces/rust.mdoc.md" /%} +{% /if %} + +{% /if %} + + + + + + +{% if equals($platform, "metrics") %} + + +{% if includes($prog_lang, ["dot_net", "node_js", "python", "ruby", "go", "php", "rust"]) %} + +## 概要 + +OpenTelemetryメトリクスAPIを使用して、Datadog SDKでカスタムアプリケーションメトリクスを送信します。これは[DogStatsD][200]の代替です。 + + +{% if includes($prog_lang, ["dot_net", "node_js", "go", "rust"]) %} + +Datadog SDKはOpenTelemetry APIのネイティブ実装を提供します。これは、公式のOpenTelemetry SDKを必要とせずに標準のOTelインターフェースに対してコードを書くことができることを意味します。 + +{% alert level="info" %} +公式のOpenTelemetry SDKやOTLPエクスポーターパッケージをインストールしないでください。Datadog SDKはこの機能を提供します。両方をインストールすると、ランタイムの競合や重複データが発生する可能性があります。 +{% /alert %} +{% /if %} + + +{% if includes($prog_lang, ["python", "ruby", "php"]) %} + +このアプローチは、既存のOpenTelemetry SDKと連携します。この機能を有効にすると、Datadog SDKはOTel SDKを検出し、そのOTLPエクスポーターを構成して、Datadogエージェントにメトリクスを送信します。 +{% /if %} + +##前提条件 + +{% if equals($prog_lang, "dot_net") %} +- **.NETランタイム**: .NET 6+(または`System.Diagnostics.DiagnosticSource` v6.0.0+)が必要です。サポートされている楽器のバージョンのリストについては、[バージョンと楽器のサポート](#net-version-and-instrument-support)を参照してください。 +- **Datadog SDK**: dd-trace-dotnetバージョン3.30.0以降。 +{% /if %} +{% if equals($prog_lang, "node_js") %} +- **Datadog SDK**: `dd-trace-js`バージョン5.81.0以降。 +- **OpenTelemetry API**: `@opentelemetry/api`バージョン1.0.0から1.10.0まで。(Datadog SDKはこのAPIの実装を提供します)。 +{% /if %} +{% if equals($prog_lang, "python") %} +- **Datadog SDK**: dd-trace-pyバージョン3.18.0以降。 +{% /if %} +{% if equals($prog_lang, "ruby") %} +{% alert level="info" %} +Ruby用のOpenTelemetryメトリクスSDKは現在、[アルファ実装](https://github.com/open-telemetry/opentelemetry-ruby/tree/main/metrics_sdk)にあります。SDKに関する問題は、[opentelemetry-ruby/issues](https://github.com/open-telemetry/opentelemetry-ruby/issues)で報告してください。 +{% /alert %} +- **Datadog SDK**: `datadog` gemバージョン2.23.0以降。 +{% /if %} +{% if equals($prog_lang, "go") %} +- **Datadog SDK**: dd-trace-goバージョン2.6.0以降。 +{% /if %} +{% if equals($prog_lang, "php") %} +- **Datadog SDK**: dd-trace-phpバージョン1.16.0以降。 +- **OpenTelemetry PHP SDK**: バージョン1.0.0以降(`open-telemetry/sdk`)。 +- **OpenTelemetry OTLPエクスポーター**: OTLPエクスポーターパッケージ(`open-telemetry/exporter-otlp`)。 +{% /if %} +{% if equals($prog_lang, "rust") %} +- **Datadog SDK**: `datadog-opentelemetry`クレートバージョン0.3.0以降。 +- **Rust**: MSRV 1.84以降。 +{% /if %} +- **OTLP互換の宛先**: OTelメトリクスを受信するには、ポート4317(gRPC)または4318(HTTP)でリッスンしている宛先(エージェントまたはコレクター)が必要です。 +{% if includes($prog_lang, ["dot_net", "node_js", "python", "ruby", "go"]) %} +- **DogStatsD(ランタイムメトリクス)**:Datadog [ランタイムメトリクス][201]を使用している場合は、Datadogエージェントがポート8125(UDP)でDogStatsDトラフィックをリッスンしていることを確認してください。OTelの設定は、ランタイムメトリクスをOTLP経由でルーティングしません。 +{% /if %} + +##セットアップ + +アプリケーションでOTelメトリクスAPIサポートを有効にするための手順に従ってください。 + +{% if equals($prog_lang, "dot_net") %} +1.Datadog SDKをインストールしてください。ランタイムに応じたインストール手順に従ってください: + - [.NET Framework][202] + - [.NET Core][203] +2. 次の環境変数を設定してOTelメトリクスを有効にします: + ```sh + export DD_METRICS_OTEL_ENABLED=true + ``` +{% /if %} + +{% if equals($prog_lang, "node_js") %} +1. Datadog SDKをインストールします: + ```sh + npm install dd-trace + ``` +2. 次の環境変数を設定してOTelメトリクスを有効にします: + ```sh + export DD_METRICS_OTEL_ENABLED=true + ``` +3. アプリケーションを計測します: + ```javascript + // On application start + require('dd-trace').init(); + ``` +{% /if %} + +{% if equals($prog_lang, "python") %} +1. Datadog SDKをインストールします: + ```sh + pip install ddtrace + ``` +2. OTel SDKとエクスポーターをインストールします: + ```sh + pip install opentelemetry-sdk opentelemetry-exporter-otlp + ``` +3. 次の環境変数を設定してOTelメトリクスを有効にします: + ```sh + export DD_METRICS_OTEL_ENABLED=true + ``` +4. アプリケーションを計測します: + ```py + ddtrace-run python my_app.py + ``` +{% /if %} + +{% if equals($prog_lang, "ruby") %} +1. Datadog SDKとOTel gemを追加します: + ```ruby + # Add to your Gemfile + gem 'datadog', '~> 2.23.0' + gem 'opentelemetry-metrics-sdk', '~> 0.8' + gem 'opentelemetry-exporter-otlp-metrics', '~> 0.4' + ``` +2. 依存関係をインストールします: + ```sh + bundle install + ``` +3. 次の環境変数を設定してOTelメトリクスを有効にします: + ```sh + export DD_METRICS_OTEL_ENABLED=true + ``` +4. アプリケーションを設定します: + ```ruby + require 'opentelemetry/sdk' + require 'datadog/opentelemetry' + + Datadog.configure do |c| + # Configure Datadog settings here + end + + # Call after Datadog.configure to initialize metrics + OpenTelemetry::SDK.configure + ``` +{% /if %} + +{% if equals($prog_lang, "go") %} +1. Datadog SDKをインストールします: + ```sh + go get github.com/DataDog/dd-trace-go/v2 + ``` +2. 次の環境変数を設定してOTelメトリクスを有効にします: + ```sh + export DD_METRICS_OTEL_ENABLED=true + ``` +3. アプリケーションを設定します: + ```go + import ( + "context" + "time" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/opentelemetry/metric" + "go.opentelemetry.io/otel" + ) + + // Create MeterProvider with Datadog-specific defaults + mp, err := metric.NewMeterProvider() + if err != nil { + panic(err) + } + + // Set as global MeterProvider + otel.SetMeterProvider(mp) + + // Your application code here... + + // Shutdown to flush remaining metrics + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + metric.Shutdown(ctx, mp) + ``` +{% /if %} + +{% if equals($prog_lang, "php") %} +1. [公式インストール手順][400]に従ってDatadog PHPトレーサーをインストールします。 +2.必要なOpenTelemetryパッケージをインストールします: + ```sh + composer require open-telemetry/sdk + composer require open-telemetry/exporter-otlp + ``` +3. 次の環境変数を設定してOTelメトリクスを有効にします: + ```sh + export DD_METRICS_OTEL_ENABLED=true + ``` + または、`php.ini`に設定します: + ```ini + datadog.metrics_otel_enabled = true + ``` +4. アプリケーションを設定します。Datadog SDKは、アプリケーションがロードされると自動的にOpenTelemetry MeterProviderを設定します。追加のコード設定は必要ありません。 + + Datadogエージェントがデフォルト以外の場所で実行されている場合は、エンドポイントを設定してください: + ```sh + # Option 1: Using the Agent URL + export DD_TRACE_AGENT_URL=http://your-agent-host:8126 + + # Option 2: Using the Agent host + export DD_AGENT_HOST=your-agent-host + ``` + SDKは自動的に適切なOTLPエンドポイントを解決します(HTTPの場合はポート4318、gRPCの場合はポート4317)。 +{% /if %} + +{% if equals($prog_lang, "rust") %} +1.Datadog SDKを`Cargo.toml`に追加してください: + ```toml + [dependencies] + datadog-opentelemetry = { version = "0.3.0" } + opentelemetry = { version = "0.31", features = ["metrics"] } + ``` +2. 次の環境変数を設定してOTelメトリクスを有効にします: + ```sh + export DD_METRICS_OTEL_ENABLED=true + ``` +3. アプリケーションを設定します: + ```rust + // Initialize metrics with default configuration + let meter_provider = datadog_opentelemetry::metrics().init(); + + // Your application code here... + + // Shutdown to flush remaining metrics + meter_provider.shutdown().unwrap(); + ``` +{% /if %} + +## 例 + +標準のOpenTelemetry APIパッケージを使用してカスタムメトリクスを作成できます。 + +###カウンターを作成する + +この例では、OTelメトリクスAPIを使用して、アイテムが処理されるたびにインクリメントされるカウンターを作成します: + +{% if equals($prog_lang, "dot_net") %} + +```csharp +using System.Diagnostics.Metrics; + +// Define a meter +Meter meter = new("MyService", "1.0.0"); + +// Create a counter instrument +Counter requestsCounter = meter.CreateCounter("http.requests_total"); + +// Perform work +// ... + +// Record measurements +requestsCounter.Add(1, new("method", "GET"), new("status_code", "200")); +``` +{% /if %} + +{% if equals($prog_lang, "node_js") %} + +```javascript +const { metrics } = require('@opentelemetry/api'); + +const meter = metrics.getMeter('my-service', '1.0.0'); + +// Counter - monotonically increasing values +const requestCounter = meter.createCounter('http.requests', { + description: 'Total HTTP requests', + unit: 'requests' +}); +requestCounter.add(1, { method: 'GET', status: 200 }); +``` +{% /if %} + +{% if equals($prog_lang, "python") %} + +```python +import os +os.environ["DD_METRICS_OTEL_ENABLED"] = "true" +import ddtrace.auto # This must be imported before opentelemetry +from opentelemetry import metrics + +# ddtrace automatically configures the MeterProvider +meter = metrics.get_meter(__name__) + +# Counter - monotonically increasing values +counter = meter.create_counter("http.requests_total") +counter.add(1, {"method": "GET", "status_code": "200"}) +``` +{% /if %} + +{% if equals($prog_lang, "ruby") %} + +```ruby +require 'opentelemetry/api' + +# dd-trace-rb automatically configures the MeterProvider +meter = OpenTelemetry.meter_provider.meter('my-service', '1.0.0') + +# Counter - monotonically increasing values +counter = meter.create_counter('http.requests_total') +counter.add(1, attributes: { 'method' => 'GET', 'status_code' => '200' }) +``` +{% /if %} + +{% if equals($prog_lang, "go") %} + +```go +import ( + "context" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/opentelemetry/metric" + "go.opentelemetry.io/otel" + otelmetric "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/attribute" +) + +// Initialize MeterProvider (typically done once at startup) +mp, _ := metric.NewMeterProvider() +otel.SetMeterProvider(mp) + +// Get a meter +meter := otel.Meter("my-service") + +// Create a counter +counter, _ := meter.Int64Counter( + "http.requests_total", + otelmetric.WithDescription("Total number of HTTP requests"), +) + +// Record measurements +counter.Add(context.Background(), 1, + attribute.String("method", "GET"), + attribute.String("status_code", "200"), +) +``` +{% /if %} + +{% if equals($prog_lang, "php") %} + +```php +use OpenTelemetry\API\Globals; + +// dd-trace-php automatically configures the MeterProvider +$meter = Globals::meterProvider()->getMeter('my-service'); +$counter = $meter->createCounter('requests', 'requests', 'Total number of requests'); +$counter->add(1, ['method' => 'GET', 'route' => '/api/users']); +``` +{% /if %} + +{% if equals($prog_lang, "rust") %} + +```rust +use opentelemetry::global; +use opentelemetry::metrics::Counter; +use opentelemetry::KeyValue; + +// datadog-opentelemetry automatically configures the MeterProvider +let meter = global::meter("my-service"); +let counter: Counter = meter.u64_counter("requests").build(); +counter.add(1, &[KeyValue::new("method", "GET")]); +``` +{% /if %} + +### ヒストグラムを作成する + +この例では、OTelメトリクスAPIを使用してリクエストの所要時間を追跡するヒストグラムを作成します: + +{% if equals($prog_lang, "dot_net") %} + +```csharp +using System.Diagnostics.Metrics; + +// Define a meter +Meter meter = new("MyService", "1.0.0"); + +// Create a histogram instrument +Histogram responseTimeHistogram = meter.CreateHistogram("http.response.time"); + +// Perform work +var watch = System.Diagnostics.Stopwatch.StartNew(); +await Task.Delay(1_000); +watch.Stop(); + +// Record measurements +responseTimeHistogram.Record(watch.ElapsedMilliseconds, new("method", "GET"), new("status_code", "200")); +``` +{% /if %} + +{% if equals($prog_lang, "node_js") %} + +```javascript +const { metrics } = require('@opentelemetry/api'); + +const meter = metrics.getMeter('my-service', '1.0.0'); + +// Histogram - distribution of values +const durationHistogram = meter.createHistogram('http.duration', { + description: 'HTTP request duration', + unit: 'ms' +}); +durationHistogram.record(145, { route: '/api/users' }); +``` +{% /if %} + +{% if equals($prog_lang, "python") %} + +```python +import os +os.environ["DD_METRICS_OTEL_ENABLED"] = "true" +import ddtrace.auto # This must be imported before opentelemetry +from opentelemetry import metrics +import time + +# ddtrace automatically configures the MeterProvider +meter = metrics.get_meter(__name__) + +# Histogram - distribution of values +histogram = meter.create_histogram( + name="http.request_duration", + description="HTTP request duration", + unit="ms" +) + +start_time = time.time() +# ... simulate work ... +time.sleep(0.05) +end_time = time.time() + +duration = (end_time - start_time) * 1000 # convert to milliseconds +histogram.record(duration, {"method": "POST", "route": "/api/users"}) +``` +{% /if %} + +{% if equals($prog_lang, "ruby") %} + +```ruby +require 'opentelemetry/api' +require 'time' + +# dd-trace-rb automatically configures the MeterProvider +meter = OpenTelemetry.meter_provider.meter('my-service', '1.0.0') + +# Histogram - distribution of values +histogram = meter.create_histogram('http.request_duration', + description: 'HTTP request duration', + unit: 'ms' +) + +start_time = Time.now +# ... simulate work ... +sleep(0.05) +end_time = Time.now + +duration = (end_time - start_time) * 1000 # convert to milliseconds +histogram.record(duration, attributes: { 'method' => 'POST', 'route' => '/api/users' }) +``` +{% /if %} + +{% if equals($prog_lang, "go") %} + +```go +import ( + "context" + "time" + + "go.opentelemetry.io/otel" + otelmetric "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/attribute" +) + +// Get a meter (assuming MeterProvider is already configured) +meter := otel.Meter("my-service") + +// Create a histogram +histogram, _ := meter.Float64Histogram( + "http.request_duration", + otelmetric.WithDescription("HTTP request duration"), + otelmetric.WithUnit("ms"), +) + +// Measure request duration +start := time.Now() +// ... perform work ... +time.Sleep(50 * time.Millisecond) +duration := float64(time.Since(start).Nanoseconds()) / 1e6 + +histogram.Record(context.Background(), duration, + attribute.String("method", "POST"), + attribute.String("route", "/api/users"), +) +``` +{% /if %} + +{% if equals($prog_lang, "php") %} + +```php +use OpenTelemetry\API\Globals; + +// dd-trace-php automatically configures the MeterProvider +$meter = Globals::meterProvider()->getMeter('my-service'); +$histogram = $meter->createHistogram('http.request_duration', 'ms', 'HTTP request duration'); + +$start = microtime(true); +// ... perform work ... +usleep(50000); +$duration = (microtime(true) - $start) * 1000; + +$histogram->record($duration, ['method' => 'POST', 'route' => '/api/users']); +``` +{% /if %} + +{% if equals($prog_lang, "rust") %} + +```rust +use opentelemetry::global; +use opentelemetry::KeyValue; +use std::time::Instant; + +// Get a meter (assuming MeterProvider is already configured) +let meter = global::meter("my-service"); +let histogram = meter.f64_histogram("http.request_duration").build(); + +// Measure request duration +let start = Instant::now(); +// ... perform work ... +std::thread::sleep(std::time::Duration::from_millis(50)); +let duration = start.elapsed().as_secs_f64() * 1000.0; + +histogram.record(duration, &[ + KeyValue::new("method", "POST"), + KeyValue::new("route", "/api/users"), +]); +``` +{% /if %} + +## サポートされている設定 + +この機能を有効にするには、`DD_METRICS_OTEL_ENABLED=true`を設定する必要があります。 + +すべてのOTLPエクスポータ設定(エンドポイント、プロトコル、タイムアウトなど)、リソース属性、および時間的好みは、共有されたOpenTelemetry環境変数のセットを使用して構成されます。 + +{% if equals($prog_lang, "rust") %} +###トランスポート機能 + +デフォルトの機能にはgRPCトランスポートが含まれます。追加のトランスポートオプション: + +- gRPCトランスポートの場合:`features = ["metrics-grpc"]`(デフォルト) +- HTTPトランスポートの場合:`features = ["metrics-http"]` + +**注意**:HTTP/JSONプロトコルはサポートされていません。`grpc`または`http/protobuf`プロトコルのみを使用してください。 +{% /if %} + +すべての共有OTLP環境変数の完全なリストについては、[OpenTelemetry環境変数の相互運用性][204]を参照してください。 + +##他のセットアップから移行する + +### 既存のOTelセットアップ + +すでにOpenTelemetry SDKを手動OTLPエクスポータ設定で使用している場合は、次の手順に従って移行してください: + +{% if equals($prog_lang, "dot_net") %} +1. Datadog SDK(`dd-trace-dotnet`)をプロジェクトに追加し、その計測を有効にします。 +2.メトリクスのために`OtlpExporter`を手動で設定するコードを削除してください。Datadog SDKはこの設定を自動的に処理します。 +3.プロジェクトの依存関係から`OpenTelemetry`および`OpenTelemetry.Exporter.OpenTelemetryProtocol`パッケージを削除してください。 +4.`DD_METRICS_OTEL_ENABLED=true` 環境変数を設定してください。 +{% /if %} + +{% if equals($prog_lang, "node_js") %} +1.Datadog SDK(`dd-trace`)をプロジェクトに追加し、その計測を有効にします。 +2.`OTLPMetricsExporter`を手動で設定するコードを削除してください。Datadog SDKはこの設定を自動的に処理します。 +3.プロジェクトの依存関係から`@opentelemetry/sdk-node`および`@opentelemetry/exporter-otlp`パッケージを削除してください。 +4.`DD_METRICS_OTEL_ENABLED=true` 環境変数を設定してください。 +{% /if %} + +{% if equals($prog_lang, "python") %} +1.Datadog SDK(`dd-trace-py`)をプロジェクトに追加し、その計測を有効にします(例えば、`ddtrace-run`)。 +2.`OTLPMetricsExporter`を手動で設定するコードを削除してください。Datadog SDKはこの設定を自動的に処理します。 +3.`DD_METRICS_OTEL_ENABLED=true` 環境変数を設定してください。 +{% /if %} + +{% if equals($prog_lang, "ruby") %} +1.Datadog SDK(`datadog`)をプロジェクトに追加し、その計測を有効にします。 +2.`OTLPMetricsExporter`を手動で設定するコードを削除してください。Datadog SDKはこの設定を自動的に処理します。 +3.`DD_METRICS_OTEL_ENABLED=true` 環境変数を設定してください。 + +{% alert level="warning" %} +ランタイムおよびトレースメトリクスは引き続きStatsDを使用して送信されます。OpenTelemetry Metrics APIを通じて作成されたカスタムメトリクスのみがOTLPを使用して送信されます。`dd-trace-rb`の実装は、OTLPメトリクスをDatadogエージェントまたはOpenTelemetryコレクターにのみエクスポートすることをサポートしています。複数のエクスポーターはサポートされていません。 +{% /alert %} +{% /if %} + +{% if equals($prog_lang, "go") %} +1.Datadog SDK(`dd-trace-go/v2`)をプロジェクトに追加し、その計測を有効にしてください。 +2.`OTLPMetricsExporter`を手動で構成するコードを削除してください。Datadog SDKはこの設定を自動的に処理します。 +3.`DD_METRICS_OTEL_ENABLED=true`環境変数を設定してください。 + +{% alert level="warning" %} +ランタイムおよびトレースメトリクスは引き続きStatsDを使用して送信されます。OpenTelemetry Metrics APIを通じて作成されたカスタムメトリクスのみがOTLPを使用して送信されます。`dd-trace-go`の実装は、OTLPメトリクスをDatadogエージェントまたはOpenTelemetryコレクターにのみエクスポートすることをサポートしています。複数のエクスポーターはサポートされていません。 +{% /alert %} +{% /if %} + +{% if equals($prog_lang, "php") %} +1.[公式インストール手順][400]に従ってDatadog PHPトレーサーをインストールしてください。 +2.OTLPエクスポーターを手動で構成するコードを削除してください。Datadog SDKはこの設定を自動的に処理します。 +3.`DD_METRICS_OTEL_ENABLED=true`環境変数を設定してください。 +{% /if %} + +{% if equals($prog_lang, "rust") %} +1.Datadog SDK(`datadog-opentelemetry`)をプロジェクトに追加し、その計測を有効にしてください。 +2.`OTLPMetricsExporter`を手動で構成するコードを削除してください。Datadog SDKはこの設定を自動的に処理します。 +3.`DD_METRICS_OTEL_ENABLED=true`環境変数を設定してください。 + +{% alert level="warning" %} +ランタイムおよびトレースメトリクスは引き続きStatsDを使用して送信されます。OpenTelemetry Metrics APIを通じて作成されたカスタムメトリクスのみがOTLPを使用して送信されます。`datadog-opentelemetry`の実装は、OTLPメトリクスをDatadogエージェントまたはOpenTelemetryコレクターにのみエクスポートすることをサポートしています。複数のエクスポーターはサポートされていません。 +{% /alert %} +{% /if %} + +###既存のDogStatsD設定 + +現在Datadog DogStatsDクライアントを使用していて、OpenTelemetryメトリクスAPIに移行したい場合は、計測コードを更新する必要があります。主な違いは、OTelメトリクスがコードではなく環境変数を使用して構成され、最初に`Instrument`オブジェクトを作成することです。 + +##トラブルシューティング + +-が`DD_METRICS_OTEL_ENABLED`に設定されていることを確認してください。 +-OTLPの宛先がメトリクスを受信するように正しく構成されていることを確認してください。 +-Datadogエージェントにデータを送信している場合は、OTLPの取り込みが有効になっていることを確認してください。詳細については、[DatadogエージェントでのOTLP取り込みの有効化][205]を参照してください。 +{% if equals($prog_lang, "dot_net") %} +-Datadogの自動計測が有効であることを確認してください。この機能は、Datadogの自動計測に依存しています。メトリックデータを取得するためには、.NET計測フックを有効にするためのすべてのセットアップ手順を完了していることを確認してください。 +-OpenTelemetry SDKパッケージを削除した後、[System.Diagnostics.Metrics名前空間][206]のAPIが不足しているためにアプリケーションがコンパイルに失敗する場合は、`System.Diagnostics.DiagnosticSource`への直接のNuGetパッケージ参照を追加するか、.NETのバージョンをアップグレードする必要があります。詳細については、[.NETバージョンと計測サポート](#net-version-and-instrument-support)を参照してください。 +{% /if %} +{% if equals($prog_lang, "node_js") %} +-`dd-trace`が最初に初期化されていることを確認してください。Datadog SDKは、アプリケーションの最上部で初期化する必要があります。*他のモジュールがインポートされる前に*。 +-`@opentelemetry/api`がインストールされていることを確認してください。Node.js SDKはこのAPIパッケージを必要とします。 +{% /if %} +{% if equals($prog_lang, "python") %} +-`opentelemetry-sdk`がインストールされていることを確認してください。Python SDKは、Python環境に`opentelemetry-sdk`と`opentelemetry-exporter-otlp`がインストールされている必要があります。 +-`ddtrace-run`でアプリケーションを実行していることを確認してください(または`ddtrace`を手動でインポートして初期化していること)。 +{% /if %} +{% if equals($prog_lang, "ruby") %} +-Ruby環境に必要なgem(`opentelemetry-metrics-sdk`と`opentelemetry-exporter-otlp-metrics`)がインストールされていることを確認してください。 +-`Datadog.configure`が`OpenTelemetry::SDK.configure`の前に呼び出されていることを確認してください。Datadog SDKは、メータープロバイダーを適切に設定するために最初に構成する必要があります。 +{% /if %} +{% if equals($prog_lang, "go") %} +-`DD_METRICS_OTEL_ENABLED=true`が設定されていることを確認してください。dd-trace-goでは、メトリックはデフォルトで無効になっています。 +-Datadog SDKがインポートされていることを確認してください:`import "github.com/DataDog/dd-trace-go/v2/ddtrace/opentelemetry/metric"` +{% /if %} +{% if equals($prog_lang, "php") %} +- OpenTelemetry SDKのバージョンを確認してください。バージョン 1.0.0 以降が必要です。 +-`open-telemetry/exporter-otlp` パッケージがインストールされていることを確認してください。 +-アプリケーションが開始する前に `DD_METRICS_OTEL_ENABLED=true` が設定されていることを確認してください。 +-詳細なログを表示するには、`DD_TRACE_DEBUG=true` でデバッグログを有効にしてください。 +{% /if %} +{% if equals($prog_lang, "rust") %} +-プロトコルの選択に応じて、Cargo.toml ファイルにトランスポート機能 (`metrics-grpc` または `metrics-http`) が有効になっていることを確認してください。 +-プロトコル設定を確認してください。`grpc` および `http/protobuf` プロトコルのみがサポートされています。HTTP/JSON はサポートされていません。 +-メータープロバイダーを初期化する前に `DD_METRICS_OTEL_ENABLED=true` が設定されていることを確認してください。 +{% /if %} + +{% if equals($prog_lang, "dot_net") %} +###.NET バージョンとインストゥルメントのサポート + +特定の OpenTelemetry メトリックインストゥルメントのサポートは、インストールされている .NET ランタイムバージョンまたは `System.Diagnostics.DiagnosticSource` NuGet パッケージのバージョンに依存します。 + +各インストゥルメントタイプに必要な最小バージョンは次のとおりです: + +- **.NET 6+** (または `System.Diagnostics.DiagnosticSource` v6.0.0) は次のことをサポートします: + - `Counter` + - `Histogram` + - `ObservableCounter` + - `ObservableGauge` + +- **.NET 7+** (または `System.Diagnostics.DiagnosticSource` v7.0.0) は次のことをサポートします: + - `UpDownCounter` + - `ObservableUpDownCounter` + +- **.NET 9+** (または `System.Diagnostics.DiagnosticSource` v9.0.0) は次のことをサポートします: + - `Gauge` +{% /if %} + +{% /if %} + + +{% /if %} + + + + + + +{% if equals($platform, "logs") %} + + +{% if includes($prog_lang, ["dot_net", "node_js", "python", "go", "rust"]) %} + +## 概要 + +Datadog SDK を使用して OpenTelemetry Logs API でカスタムアプリケーションログを送信します。これは Datadog の従来のログインジェクションの代替手段です。 + + +{% if includes($prog_lang, ["dot_net", "node_js", "go", "rust"]) %} + +Datadog SDKはOpenTelemetry APIのネイティブ実装を提供します。これは、公式のOpenTelemetry SDKを必要とせずに標準のOTelインターフェースに対してコードを書くことができることを意味します。 + +{% alert level="info" %} +公式のOpenTelemetry SDKやOTLPエクスポーターパッケージをインストールしないでください。Datadog SDKはこの機能を提供します。両方をインストールすると、ランタイムの競合や重複データが発生する可能性があります。 +{% /alert %} +{% /if %} + + +{% if equals($prog_lang, "python") %} + +このアプローチは、既存のOpenTelemetry SDKと連携します。この機能を有効にすると、Datadog SDK は OTel SDK を検出し、その OTLP エクスポーターを構成してログを Datadog エージェントに送信します。 +{% /if %} + +##前提条件 + +{% if equals($prog_lang, "dot_net") %} +- **Datadog SDK**: `dd-trace-dotnet` バージョン [3.31.0][301] 以降。 +{% /if %} +{% if equals($prog_lang, "node_js") %} +- **Datadog SDK**: `dd-trace-js` バージョン 5.73.0 以降。 +- **OpenTelemetry Logs API**: `@opentelemetry/api-logs`パッケージは、`v0.200.0`から`v1.0`までのバージョンが必要です。 + +{% alert level="warning" %} +`@opentelemetry/api-logs`パッケージはまだ実験的であり、バージョン1.0はまだリリースされていません。このパッケージの新しいバージョンは、互換性に影響を与える破壊的変更を導入する可能性があります。 + +`@opentelemetry/api-logs`をアップグレードした後に問題が発生した場合は、[リポジトリに問題を報告してください](https://github.com/DataDog/dd-trace-js/issues)。 +{% /alert %} +{% /if %} +{% if equals($prog_lang, "python") %} +- **Datadog SDK**: `dd-trace-py`バージョン3.18.0以降。 +{% /if %} +{% if equals($prog_lang, "go") %} +- **Datadog SDK**: `dd-trace-go`バージョン2.5.0以降。 +- **OpenTelemetry Go SDK**: `go.opentelemetry.io/otel/log`バージョン0.13.0以降(Datadog SDKによって自動的に提供されます)。 +{% /if %} +{% if equals($prog_lang, "rust") %} +- **Datadog SDK**: `datadog-opentelemetry`クレートバージョン0.2.1以降。 +- **Rust**: MSRV 1.84.1以降。 +- **OpenTelemetry Rust SDK**: SDKは自動的にログの実装を提供します。 +{% /if %} +- **OTLP互換の宛先**: OTelログを受信するには、ポート4317(gRPC)または4318(HTTP)でリスニングしている宛先(エージェントまたはコレクター)が必要です。 + +##セットアップ + +アプリケーションでOTel Logs APIサポートを有効にするための手順に従ってください。 + +{% if equals($prog_lang, "dot_net") %} +1.Datadog SDKをインストールしてください。ランタイムに応じたインストール手順に従ってください: + - [.NET Framework][202] + - [.NET Core][203] +2.次の環境変数を設定してOTelログのエクスポートを有効にします: + ```sh + export DD_LOGS_OTEL_ENABLED=true + ``` +{% /if %} + +{% if equals($prog_lang, "node_js") %} +1. Datadog SDKをインストールします: + ```sh + npm install dd-trace + ``` +2.OpenTelemetry Logs APIパッケージをインストールします: + ```sh + npm install @opentelemetry/api-logs + ``` +3.次の環境変数を設定してOTelログのエクスポートを有効にします: + ```sh + export DD_LOGS_OTEL_ENABLED=true + ``` +4.アプリケーションの最初にDatadog SDK (`dd-trace`)を初期化します。他のモジュールがインポートされる前に: + ```javascript + // This must be the first line of your application + require('dd-trace').init() + + // Other imports can follow + const { logs } = require('@opentelemetry/api-logs') + const express = require('express') + ``` +{% /if %} + +{% if equals($prog_lang, "python") %} +1. Datadog SDKをインストールします: + ```sh + pip install ddtrace + ``` +2. OTel SDKとエクスポーターをインストールします: + ```sh + pip install opentelemetry-sdk opentelemetry-exporter-otlp>=1.15.0 + ``` +3.次の環境変数を設定してOTelログのエクスポートを有効にします: + ```sh + export DD_LOGS_OTEL_ENABLED=true + ``` +4. `ddtrace-run`を使用してアプリケーションを実行します: + ```sh + ddtrace-run python my_app.py + ``` + When enabled, `ddtrace` automatically detects the OTel packages and configures the `OTLPLogExporter` to send logs to your OTLP destination. +{% /if %} + +{% if equals($prog_lang, "go") %} +1.Datadog SDKをインストールします: + ```sh + go get github.com/DataDog/dd-trace-go/v2 + ``` +2.次の環境変数を設定してOTelログのエクスポートを有効にします: + ```sh + export DD_LOGS_OTEL_ENABLED=true + ``` +3. アプリケーションでロガープロバイダーを初期化します: + ```go + import ( + "context" + "log/slog" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/opentelemetry/log" + "go.opentelemetry.io/otel" + otellog "go.opentelemetry.io/otel/log" + ) + + // Initialize the global logger provider + err := log.InitGlobalLoggerProvider(context.Background()) + if err != nil { + panic(err) + } + + // Set as global logger provider + otel.SetLoggerProvider(log.GetGlobalLoggerProvider()) + + // Your application code here... + + // Shutdown to flush remaining logs + defer log.ShutdownGlobalLoggerProvider(context.Background()) + ``` +{% /if %} + +{% if equals($prog_lang, "rust") %} +1. Datadog SDKを`Cargo.toml`に追加します: + ```toml + [dependencies] + datadog-opentelemetry = { version = "0.3.0", features = ["logs-grpc"] } + opentelemetry = { version = "0.31", features = ["logs"] } + opentelemetry_sdk = { version = "0.31", features = ["logs"] } + ``` + **Note**: Use `features = ["logs-http"]` if you prefer HTTP/protobuf transport instead of gRPC. +2. 次の環境変数を設定してOTelログのエクスポートを有効にします: + ```sh + export DD_LOGS_OTEL_ENABLED=true + ``` +3. アプリケーションでロガープロバイダーを初期化します: + ```rust + use opentelemetry::global; + + // Initialize logs with default configuration + let logger_provider = datadog_opentelemetry::logs().init(); + + // Set as global logger provider + global::set_logger_provider(logger_provider.clone()); + + // Your application code here... + + // Shutdown to flush remaining logs + let _ = logger_provider.shutdown(); + ``` +{% /if %} + +## 例 + +{% if equals($prog_lang, "dot_net") %} +### 標準ログ{% #standard-logging-dotnet %} + +```csharp +using Microsoft.Extensions.Logging; + +// For a Console application, manually create a logger factory +using var loggerFactory = LoggerFactory.Create(builder => +{ + builder.SetMinimumLevel(LogLevel.Debug); +}); + +// Get a logger instance +var logger = loggerFactory.CreateLogger(); + +// This log will be exported via OTLP +logger.LogInformation("This is a standard log message."); +``` + +### トレースとログの相関{% #trace-log-correlation-dotnet %} + +この例は、アクティブなDatadogスパン内で発生したログが自動的に相関される方法を示しています。OTelトレーシングAPIまたは組み込みの.NETアクティビティAPIを使用してスパンを作成している場合は、`DD_TRACE_OTEL_ENABLED=true`を設定してOTelトレーシングAPIのサポートが有効になっていることを確認してください。 + +```csharp +using Microsoft.Extensions.Logging; +using System.Diagnostics; +using System.Threading.Tasks; + +// For a Console application, manually create a logger factory +using var loggerFactory = LoggerFactory.Create(builder => +{ + builder.SetMinimumLevel(LogLevel.Debug); +}); + +// Get a logger instance +var logger = loggerFactory.CreateLogger(); + +// Create an activity source +var activitySource = new ActivitySource("MyService", "1.0.0"); + +// Start an activity (span) +using (var activity = activitySource.StartActivity("do.work")) +{ + // This log is automatically correlated with the 'do.work' span + logger.LogInformation("This log is correlated to the active span."); + await Task.Delay(TimeSpan.FromMilliseconds(100)); + logger.LogWarning("So is this one."); +} +``` +{% /if %} + +{% if equals($prog_lang, "node_js") %} +### ログを発行する{% #emitting-log-nodejs %} + +Datadog SDKが初期化された後、標準のOpenTelemetry Logs APIを使用してロガーを取得し、ログレコードを発行できます。 + +```javascript +// Tracer must be initialized first +require('dd-trace').init() + +const { logs } = require('@opentelemetry/api-logs') +const logger = logs.getLogger('my-service', '1.0.0') + +// Emit a log record +logger.emit({ + severityText: 'INFO', + severityNumber: 9, + body: `User clicked the checkout button.`, + attributes: { + 'cart.id': 'c-12345', + 'user.id': 'u-54321' + } +}) +``` + +### トレースとログの相関{% #trace-log-correlation-nodejs %} + +トレースとログの相関は自動です。アクティブなDatadogトレース内でOTel Logs APIを使用してログを発行すると、`trace_id`と`span_id`が自動的にログレコードに追加されます。 + +```javascript +// Tracer must be initialized first +require('dd-trace').init() + +const { logs } = require('@opentelemetry/api-logs') +const express = require('express') + +const app = express() +const logger = logs.getLogger('my-service', '1.0.0') + +app.get('/api/users/:id', (req, res) => { + // This log is automatically correlated with the 'express.request' span + logger.emit({ + severityText: 'INFO', + severityNumber: 9, + body: `Processing user request for ID: ${req.params.id}`, + }) + res.json({ id: req.params.id, name: 'John Doe' }) +}) + +app.listen(3000) +``` +{% /if %} + +{% if equals($prog_lang, "python") %} +Datadog SDKは、Pythonの組み込み`logging`モジュールのOpenTelemetry Logs APIをサポートしています。既存のログコードを変更する必要はありません。 + +###標準ログ{% #standard-logging-python %} + +この例は、標準的なログメッセージを示しています。`DD_LOGS_OTEL_ENABLED=true`を使用すると、このログは自動的にキャプチャされ、OTLP形式にフォーマットされ、エクスポートされます。 + +```python +import logging +import time + +# Get a logger +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) + +# Add a handler to see logs in the console (optional) +handler = logging.StreamHandler() +logger.addHandler(handler) + +# This log will be exported via OTLP +logger.info("This is a standard log message.") +``` + +### トレースとログの相関{% #trace-log-correlation-python %} + +この例は、アクティブなDatadogスパン内で発生したログが自動的に相関される方法を示しています。 + +```python +from ddtrace import tracer +import logging +import time + +# Standard logging setup +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) +handler = logging.StreamHandler() +handler.setFormatter(logging.Formatter('%(message)s')) +logger.addHandler(handler) + +@tracer.wrap("do.work") +def do_work(): + # This log is automatically correlated with the 'do.work' span + logger.info("This log is correlated to the active span.") + time.sleep(0.1) + logger.warning("So is this one.") + +print("Starting work...") +do_work() +print("Work complete.") +``` +{% /if %} + +{% if equals($prog_lang, "go") %} +### 標準ログ{% #standard-logging-go %} + +Datadog SDKが初期化された後、標準のOpenTelemetry Logs APIを使用してログレコードを発行できます。 + +```go +import ( + "context" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/opentelemetry/log" + "go.opentelemetry.io/otel" + otellog "go.opentelemetry.io/otel/log" +) + +// Initialize the logger provider (typically done once at startup) +err := log.InitGlobalLoggerProvider(context.Background()) +if err != nil { + panic(err) +} +otel.SetLoggerProvider(log.GetGlobalLoggerProvider()) + +// Get a logger +logger := otel.GetLoggerProvider().Logger("my-service") + +// Create and emit a log record +var logRecord otellog.Record +logRecord.SetBody(otellog.StringValue("User clicked the checkout button")) +logRecord.SetSeverity(otellog.SeverityInfo) +logRecord.SetSeverityText("INFO") +logRecord.AddAttributes( + otellog.String("cart.id", "c-12345"), + otellog.String("user.id", "u-54321"), +) + +logger.Emit(context.Background(), logRecord) +``` + +### トレースとログの相関{% #trace-log-correlation-go %} + +トレースとログの相関は自動です。アクティブなDatadogトレース内でOTel Logs APIを使用してログを発行すると、`trace_id`と`span_id`が自動的にログレコードに追加されます。 + +```go +import ( + "context" + + "github.com/DataDog/dd-trace-go/v2/ddtrace/opentelemetry/log" + "go.opentelemetry.io/otel" + otellog "go.opentelemetry.io/otel/log" + "go.opentelemetry.io/otel/trace" +) + +// Initialize logger (typically done once at startup) +err := log.InitGlobalLoggerProvider(context.Background()) +if err != nil { + panic(err) +} +otel.SetLoggerProvider(log.GetGlobalLoggerProvider()) + +// Get tracer and logger +tracer := otel.Tracer("my-service") +logger := otel.GetLoggerProvider().Logger("my-service") + +// Start a span +ctx, span := tracer.Start(context.Background(), "process.user.request") +defer span.End() + +// Create and emit a log record that will be automatically correlated with the active span +var logRecord otellog.Record +logRecord.SetBody(otellog.StringValue("Processing user request for ID: 12345")) +logRecord.SetSeverity(otellog.SeverityInfo) +logRecord.SetSeverityText("INFO") + +logger.Emit(ctx, logRecord) +``` +{% /if %} + +{% if equals($prog_lang, "rust") %} +### 標準ログ{% #standard-logging-rust %} + +Datadog SDKが初期化された後、標準のOpenTelemetry Logs APIを使用してログレコードを発行できます。 + +```rust +use opentelemetry::global; +use opentelemetry::logs::{Logger, LogRecord, Severity}; +use opentelemetry::KeyValue; + +// Initialize logs (typically done once at startup) +let logger_provider = datadog_opentelemetry::logs().init(); +global::set_logger_provider(logger_provider.clone()); + +// Get a logger +let logger = global::logger_provider().logger("my-service"); + +// Emit a log record +let mut log_record = LogRecord::default(); +log_record.set_body("User clicked the checkout button".into()); +log_record.set_severity_number(Severity::Info); +log_record.set_severity_text("INFO"); +log_record.add_attribute(KeyValue::new("cart.id", "c-12345")); +log_record.add_attribute(KeyValue::new("user.id", "u-54321")); + +logger.emit(log_record); +``` + +### トレースとログの相関{% #trace-log-correlation-rust %} + +トレースとログの相関は自動です。アクティブなDatadogトレース内でOTel Logs APIを使用してログを発行すると、`trace_id`と`span_id`が自動的にログレコードに追加されます。 + +```rust +use opentelemetry::global; +use opentelemetry::logs::{Logger, LogRecord, Severity}; +use opentelemetry::trace::{Tracer, TracerProvider}; + +// Initialize logs and traces (typically done once at startup) +let logger_provider = datadog_opentelemetry::logs().init(); +global::set_logger_provider(logger_provider.clone()); + +// Get tracer and logger +let tracer = global::tracer("my-service"); +let logger = global::logger_provider().logger("my-service"); + +// Start a span +let span = tracer.start("process.user.request"); +let _guard = span.with_current_context(); + +// This log is automatically correlated with the active span +let mut log_record = LogRecord::default(); +log_record.set_body("Processing user request for ID: 12345".into()); +log_record.set_severity_number(Severity::Info); +log_record.set_severity_text("INFO"); + +logger.emit(log_record); +``` +{% /if %} + +## サポートされている構成 + +この機能を有効にするには、`DD_LOGS_OTEL_ENABLED=true`を設定する必要があります。 + +すべてのOTLPエクスポータ設定(エンドポイント、プロトコル、タイムアウトなど)、リソース属性、およびバッチプロセッサ設定は、共有のOpenTelemetry環境変数セットを使用して構成されます。 + +すべての共有OTLP環境変数の完全なリストについては、[OpenTelemetry環境変数の相互運用性][204]を参照してください。 + +##他のセットアップから移行する + +### 既存のOTelセットアップ + +手動OTLPエクスポータ構成でOpenTelemetry SDKをすでに使用している場合は、次の手順に従って移行してください: + +{% if equals($prog_lang, "dot_net") %} +1. Datadog SDK(`dd-trace-dotnet`)をプロジェクトに追加し、その計測を有効にします。 +2.ログのために`OtlpExporter`を手動で構成するコードを削除してください。Datadog SDKはこの構成を自動的に処理します。 +3.プロジェクトの依存関係から`OpenTelemetry`および`OpenTelemetry.Exporter.OpenTelemetryProtocol`パッケージを削除してください。 +4.`DD_LOGS_OTEL_ENABLED=true`環境変数を設定してください。 +{% /if %} + +{% if equals($prog_lang, "node_js") %} +1.OTel SDKおよびOTLPエクスポータパッケージを削除してください: + ```sh + npm uninstall @opentelemetry/sdk-logs @opentelemetry/exporter-otlp-logs + ``` +2. すべての手動OTel SDK初期化コードを削除してください(例:`new LoggerProvider()`、`addLogRecordProcessor()`、`new OTLPLogExporter()`)。 +3.Datadog SDKをインストールします:`npm install dd-trace` +4. `@opentelemetry/api-logs`パッケージを保持してください。 +5.`DD_LOGS_OTEL_ENABLED=true`を設定し、アプリケーションの先頭で`dd-trace`を初期化してください。 + +`logs.getLogger()`を使用する既存のコードは引き続き動作します。 +{% /if %} + +{% if equals($prog_lang, "python") %} +1.手動セットアップコードを削除してください(例:`LoggerProvider`、`BatchLogRecordProcessor`、および`OTLPLogExporter`のインスタンス化)。 +2.アプリケーションの`ddtrace-run`自動計測を有効にしてください。 +3.`DD_LOGS_OTEL_ENABLED=true`環境変数を設定してください。 + +Datadog SDKは、OTel SDKをプログラム的に設定します。 +{% /if %} + +{% if equals($prog_lang, "go") %} +1.プロジェクトにDatadog SDK(`dd-trace-go/v2`)を追加し、その計測を有効にしてください。 +2.`OTLPLogExporter`を手動で設定するコードを削除してください。Datadog SDKはこの構成を自動的に処理します。 +3.手動の`LoggerProvider`設定を削除し、`log.InitGlobalLoggerProvider()`に置き換えてください。 +4.`DD_LOGS_OTEL_ENABLED=true`環境変数を設定してください。 +{% /if %} + +{% if equals($prog_lang, "rust") %} +1.プロジェクトにDatadog SDK(`datadog-opentelemetry`)を追加し、その計測を有効にしてください。 +2.`OTLPLogExporter`を手動で設定するコードを削除してください。Datadog SDKはこの構成を自動的に処理します。 +3.手動のロガープロバイダー設定を`datadog_opentelemetry::logs().init()`に置き換えてください。 +4.`DD_LOGS_OTEL_ENABLED=true`環境変数を設定してください。 +{% /if %} + +###既存のDatadogログインジェクション + +Datadogの従来のログインジェクション(`DD_LOGS_INJECTION=true`がテキストログにトレースコンテキストを追加する場合)とエージェントを使用してログファイルを監視している場合: + +1. `DD_LOGS_OTEL_ENABLED=true`環境変数を設定してください。 +2.Datadog SDKは、ログに重複するトレースメタデータを防ぐために、古いログインジェクションスタイル(`DD_LOGS_INJECTION`)を自動的に無効にします。トレースの相関は、構造化されたOTLPペイロードによって処理されます。 +3.DatadogエージェントがOTLPログを受信するように設定されていることを確認してください(バージョン7.48.0以上が必要です)。 +4. このサービスのファイルベースのログ収集を無効にして、重複ログを避けてください。 + +##トラブルシューティング + +- `DD_LOGS_OTEL_ENABLED`が`true`に設定されていることを確認してください。 +-OTLP宛先がログを受信するように正しく設定されていることを確認してください。 +-Datadogエージェントにデータを送信している場合、OTLPの取り込みが有効になっていることを確認してください。詳細については、[DatadogエージェントでのOTLP取り込みの有効化][205]を参照してください。 +{% if equals($prog_lang, "dot_net") %} +-Datadogの自動計測が有効であることを確認してください。この機能は、Datadogの自動計測に依存しています。ログデータを取得するためには、.NET計測フックを有効にするためのすべての設定手順を完了していることを確認してください。 +{% /if %} +{% if equals($prog_lang, "node_js") %} +-`dd-trace`が最初に初期化されていることを確認してください。Datadog SDKは、アプリケーションの最上部で初期化される必要があります。*他のモジュールがインポートされる前に。 +-`@opentelemetry/api-logs`がインストールされていることを確認してください。Node.js SDKは、このAPIパッケージを必要とします。 +{% /if %} +{% if equals($prog_lang, "python") %} +-`opentelemetry-sdk`がインストールされていることを確認してください。Python SDKは、Python環境に`opentelemetry-sdk`と`opentelemetry-exporter-otlp`がインストールされていることを必要とします。 +-`ddtrace-run`がアクティブであることを確認してください。`ddtrace-run`でアプリケーションを実行していることを確認してください(または`ddtrace`を手動でインポートして初期化していることを確認してください)。 +{% /if %} +{% if equals($prog_lang, "go") %} +-`DD_LOGS_OTEL_ENABLED=true`が設定されていることを確認してください。dd-trace-goでは、デフォルトでログは無効になっています。 +-Datadog SDKがインポートされ、初期化されていることを確認してください:`import "github.com/DataDog/dd-trace-go/v2/ddtrace/opentelemetry/log"` +- ロガーを使用する前に`log.InitGlobalLoggerProvider()`が呼び出されていることを確認してください。 +{% /if %} +{% if equals($prog_lang, "rust") %} +-`DD_LOGS_OTEL_ENABLED=true`が設定されていることを確認してください。デフォルトでログは無効になっています。 +-`Cargo.toml`ファイルでトランスポート機能(`logs-grpc`または`logs-http`)が有効になっていることを確認してください。 +-ロガーを使用する前に`datadog_opentelemetry::logs().init()`が呼び出されていることを確認してください。 +-プロトコル設定を確認してください。`grpc`および`http/protobuf`のプロトコルのみがサポートされています。HTTP/JSONはサポートされていません。 +{% /if %} + +{% /if %} + + +{% /if %} + + + + + + + +[100]: /ja/tracing/setup/java/ +[101]: /ja/tracing/trace_collection/automatic_instrumentation/dd_libraries/java/?tab=wget#compatibility +[102]: /ja/tracing/glossary/#trace +[103]: https://opentelemetry.io/docs/specs/otel/trace/api/#add-events +[104]: https://opentelemetry.io/docs/specs/otel/trace/api/#record-exception +[105]: /ja/tracing/trace_collection/trace_context_propagation/ +[106]: /ja/tracing/security +[107]: /ja/tracing/guide/ignoring_apm_resources/ + + +[110]: /ja/tracing/setup/python/ + + +[120]: /ja/tracing/trace_collection/dd_libraries/nodejs#integration-instrumentation +[121]: https://opentelemetry.io/docs/instrumentation/js/automatic/ + + +[130]: https://opentelemetry.io/docs/instrumentation/go/manual/ + + +[140]: https://opentelemetry.io/docs/instrumentation/ruby/manual/ +[141]: /ja/tracing/trace_collection/dd_libraries/ruby#integration-instrumentation +[142]: https://opentelemetry.io/docs/languages/ruby/libraries/ + + +[150]: https://opentelemetry.io/docs/instrumentation/net/manual/ +[151]: /ja/tracing/trace_collection/dd_libraries/dotnet-framework/#installation-and-getting-started +[152]: /ja/tracing/trace_collection/dd_libraries/dotnet-core/#installation-and-getting-started +[153]: /ja/tracing/trace_collection/single-step-apm/ +[154]: https://opentelemetry.io/docs/instrumentation/net/libraries/ + + +[160]: https://opentelemetry.io/docs/languages/php/instrumentation/#instrumentation-setup +[161]: https://opentelemetry.io/docs/instrumentation/php/manual/ +[162]: /ja/tracing/trace_collection/dd_libraries/php#getting-started + + +[170]: https://crates.io/crates/datadog-opentelemetry +[171]: /ja/tracing/trace_collection/library_config/rust +[172]: /ja/tracing/trace_collection/trace_context_propagation/?tab=rust + + +[200]: /ja/extend/dogstatsd/ +[201]: /ja/tracing/metrics/runtime_metrics/ +[202]: /ja/tracing/trace_collection/automatic_instrumentation/dd_libraries/dotnet-framework/#install-the-tracer +[203]: /ja/tracing/trace_collection/automatic_instrumentation/dd_libraries/dotnet-core#install-the-tracer +[204]: /ja/opentelemetry/config/environment_variable_support +[205]: /ja/opentelemetry/setup/otlp_ingest_in_the_agent/?tab=host#enabling-otlp-ingestion-on-the-datadog-agent +[206]: https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.metrics +[210]: /ja/logs/log_collection/ + + +[301]: https://github.com/DataDog/dd-trace-dotnet/releases/tag/v3.31.0 + + +[400]: /ja/tracing/trace_collection/dd_libraries/php/#install-the-extension \ No newline at end of file diff --git a/content/ja/real_user_monitoring/application_monitoring/browser/advanced_configuration.mdoc.md b/content/ja/real_user_monitoring/application_monitoring/browser/advanced_configuration.mdoc.md new file mode 100644 index 00000000000..3fc40bc4fa5 --- /dev/null +++ b/content/ja/real_user_monitoring/application_monitoring/browser/advanced_configuration.mdoc.md @@ -0,0 +1,1881 @@ +--- +aliases: +- /ja/real_user_monitoring/installation/advanced_configuration/ +- /ja/real_user_monitoring/browser/modifying_data_and_context/ +- /ja/real_user_monitoring/browser/advanced_configuration/ +content_filters: +- option_group_id: rum_browser_sdk_source_options + trait_id: lib_src +- option_group_id: rum_browser_sdk_version_for_advanced_config_options + trait_id: rum_browser_sdk_version +description: RUMブラウザSDKを設定して、データ収集を変更し、ビュー名を上書きし、ユーザーセッションを管理し、アプリケーションのニーズに応じてサンプリングを制御します。 +further_reading: +- link: /real_user_monitoring/application_monitoring/browser/tracking_user_actions + tag: Documentation + text: ユーザーアクションの追跡 +- link: https://www.datadoghq.com/blog/real-user-monitoring-with-datadog/ + tag: Blog + text: リアルユーザーモニタリング +- link: /real_user_monitoring/application_monitoring/browser/data_collected/ + tag: Documentation + text: 収集されたRUMブラウザデータ +- link: /real_user_monitoring/explorer/ + tag: Documentation + text: Datadog内でビューを探索する +- link: /real_user_monitoring/explorer/visualize/ + tag: Documentation + text: イベントに視覚化を適用する +- link: /logs/log_configuration/attributes_naming_convention + tag: Documentation + text: Datadogの標準属性 +title: 高度な設定 +--- +## 概要 + +RUMによって収集された[data and context collected][1]を変更する方法はいくつかあり、あなたのニーズをサポートします: + +- 個人を特定できる情報などの機密データを保護すること。 +-サポートを助けるために、ユーザーの内部識別とユーザーセッションを接続すること。 +-データをサンプリングすることで、収集するRUMデータの量を減らすこと。 +-デフォルトの属性が提供する情報以上のコンテキストを提供すること。 + + +{% if semverIsAtLeast($rum_browser_sdk_version, "2.17.0") %} + +## デフォルトのRUMビュー名を上書きする + +[バージョン2.17.0][3]以降、ビュー名を追加し、`trackViewsManually`オプションを使用して手動でビューイベントを追跡することで、チームが所有する専用サービスに割り当てることができます。 + +RUMブラウザSDKは、ユーザーが訪れた新しいページごとに自動的に[ビューイベント][2]を生成します。または、ページURLが変更されたとき(シングルページアプリケーションの場合)。ビュー名は、現在のページURLから計算され、変数IDが自動的に削除されます。少なくとも1つの数字を含むパスセグメントは、変数IDと見なされます。例えば、`/dashboard/1234`と`/dashboard/9a`は`/dashboard/?`になります。 + +デフォルトのRUMビュー名を上書きするには: + +1. RUMブラウザSDKを初期化する際に`trackViewsManually`をtrueに設定します。 + + + {% if equals($lib_src, "npm") %} + ```javascript + import { datadogRum } from '@datadog/browser-rum'; + + datadogRum.init({ + ..., + trackViewsManually: true, + ... + }); + ``` + {% /if %} + + + + {% if equals($lib_src, "cdn_async") %} + ```javascript + window.DD_RUM.onReady(function() { + window.DD_RUM.init({ + ..., + trackViewsManually: true, + ... + }) + }) + ``` + {% /if %} + + + + {% if equals($lib_src, "cdn_sync") %} + ```javascript + window.DD_RUM && + window.DD_RUM.init({ + ..., + trackViewsManually: true, + ... + }); + ``` + {% /if %} + +2. 新しいページまたはルートの変更ごとにビューを開始する必要があります(シングルページアプリケーションの場合)。RUMデータはビューが開始されると収集されます。 +{% /if %} + + + + +{% if semverIsAtLeast($rum_browser_sdk_version, "4.13.0") %} + +### サービス名とバージョンを定義します。 + +[バージョン4.13.0][16]以降、関連するサービス名とバージョンをオプションで定義することもできます。 + +- **ビュー名**: デフォルトはページのURLパスです。 +- **サービス**: RUMアプリケーションを作成する際に指定したデフォルトサービスがデフォルトです。 +- **バージョン**: RUMアプリケーションを作成する際に指定したデフォルトバージョンがデフォルトです。 +{% /if %} + + + + + +{% if includes($rum_browser_sdk_version, ["lt_2_13_0", "gte_2_13_0", "gte_2_17_0"]) %} + +##ページビューを手動で追跡します。 + +以下の例は、RUMアプリケーションの`checkout`ページでページビューを手動で追跡します。サービスまたはバージョンを指定することはできません。 + + +{% if equals($lib_src, "npm") %} + +```javascript +datadogRum.startView('checkout') +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.startView('checkout') +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.startView('checkout') +``` +{% /if %} +{% /if %} + + + +{% if includes($rum_browser_sdk_version, ["gte_4_13_0", "gte_4_49_0", "gte_5_22_0"]) %} + +以下の例は、RUMアプリケーションの`checkout`ページでページビューを手動で追跡します。`checkout`をビュー名として使用し、`purchase`サービスをバージョン`1.2.3`に関連付けます。 + + +{% if equals($lib_src, "npm") %} + +```javascript +datadogRum.startView({ + name: 'checkout', + service: 'purchase', + version: '1.2.3' +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.startView({ + name: 'checkout', + service: 'purchase', + version: '1.2.3' + }) +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.startView({ + name: 'checkout', + service: 'purchase', + version: '1.2.3' +}) +``` +{% /if %} +{% /if %} + + + + +{% if semverIsAtLeast($rum_browser_sdk_version, "5.28.0") %} + +- **コンテキスト**: [バージョン5.28.0][19]以降、ビューとビューの子イベントにコンテキストを追加できます。 + +以下の例は、RUMアプリケーションの`checkout`ページでページビューを手動で追跡します。`checkout`をビュー名として使用し、`purchase`サービスをバージョン`1.2.3`に関連付けます。 + + + {% if equals($lib_src, "npm") %} + ```javascript + datadogRum.startView({ + name: 'checkout', + service: 'purchase', + version: '1.2.3', + context: { + payment: 'Done' + }, + }) + ``` + {% /if %} + + + + {% if equals($lib_src, "cdn_async") %} + ```javascript + window.DD_RUM.onReady(function() { + window.DD_RUM.startView({ + name: 'checkout', + service: 'purchase', + version: '1.2.3', + context: { + payment: 'Done' + }, + }) + }) + ``` + {% /if %} + + + + {% if equals($lib_src, "cdn_sync") %} + ```javascript + window.DD_RUM && window.DD_RUM.startView({ + name: 'checkout', + service: 'purchase', + version: '1.2.3', + context: { + payment: 'Done' + }, + }) + ``` + {% /if %} + +{% /if %} + + + +{% if semverIsAtLeast($rum_browser_sdk_version, "2.17.0") %} + +### Reactルーターの計測 + +React、Angular、Vue、または他のフロントエンドフレームワークを使用している場合、Datadogはフレームワークのルーターのレベルで`startView`ロジックを実装することを推奨します。 + +デフォルトのRUMビュー名をオーバーライドして、Reactアプリケーションで定義した方法に合わせるには、以下の手順に従う必要があります。 + +**注意**: これらの指示は**React Router v6**ライブラリに特有です。 + +1.RUMブラウザSDKを初期化する際は、`trackViewsManually`を`true`に設定してください。[上記の通り](#override-default-rum-view-names)。 + +2.各ルート変更のためにビューを開始してください。 + + {% if equals($lib_src, "npm") %} + ```javascript + import { matchRoutes, useLocation } from 'react-router-dom'; + import { routes } from 'path/to/routes'; + import { datadogRum } from "@datadog/browser-rum"; + + export default function App() { + // Track every route change with useLocation API + let location = useLocation(); + + useEffect(() => { + const routeMatches = matchRoutes(routes, location.pathname); + const viewName = routeMatches && computeViewName(routeMatches); + if (viewName) { + datadogRum.startView({name: viewName}); + } + }, [location.pathname]); + + ... + } + + // Compute view name out of routeMatches + function computeViewName(routeMatches) { + let viewName = ""; + for (let index = 0; index < routeMatches.length; index++) { + const routeMatch = routeMatches[index]; + const path = routeMatch.route.path; + // Skip pathless routes + if (!path) { + continue; + } + + if (path.startsWith("/")) { + // Handle absolute child route paths + viewName = path; + } else { + // Handle route paths ending with "/" + viewName += viewName.endsWith("/") ? path : `/${path}`; + } + } + + return viewName || '/'; + } + ``` + {% /if %} + + + {% if equals($lib_src, "cdn_async") %} + ```javascript + import { matchRoutes, useLocation } from 'react-router-dom'; + import { routes } from 'path/to/routes'; + + export default function App() { + // Track every route change with useLocation API + let location = useLocation(); + + useEffect(() => { + const routeMatches = matchRoutes(routes, location.pathname); + const viewName = routeMatches && computeViewName(routeMatches); + if (viewName) { + DD_RUM.onReady(function() { + DD_RUM.startView({name: viewName}); + }); + } + }, [location.pathname]); + + ... + } + + // Compute view name out of routeMatches + function computeViewName(routeMatches) { + let viewName = ""; + for (let index = 0; index < routeMatches.length; index++) { + const routeMatch = routeMatches[index]; + const path = routeMatch.route.path; + // Skip pathless routes + if (!path) { + continue; + } + + if (path.startsWith("/")) { + // Handle absolute child route paths + viewName = path; + } else { + // Handle route paths ending with "/" + viewName += viewName.endsWith("/") ? path : `/${path}`; + } + } + + return viewName || '/'; + } + ``` + {% /if %} + + + {% if equals($lib_src, "cdn_sync") %} + ```javascript + import { matchRoutes, useLocation } from 'react-router-dom'; + import { routes } from 'path/to/routes'; + + export default function App() { + // Track every route change with useLocation API + let location = useLocation(); + + useEffect(() => { + const routeMatches = matchRoutes(routes, location.pathname); + const viewName = routeMatches && computeViewName(routeMatches); + if (viewName) { + window.DD_RUM && + window.DD_RUM.startView({name: viewName}); + } + }, [location.pathname]); + + ... + } + + // Compute view name out of routeMatches + function computeViewName(routeMatches) { + let viewName = ""; + for (let index = 0; index < routeMatches.length; index++) { + const routeMatch = routeMatches[index]; + const path = routeMatch.route.path; + // Skip pathless routes + if (!path) { + continue; + } + + if (path.startsWith("/")) { + // Handle absolute child route paths + viewName = path; + } else { + // Handle route paths ending with "/" + viewName += viewName.endsWith("/") ? path : `/${path}`; + } + } + + return viewName || '/'; + } + ``` + {% /if %} +{% /if %} + + + +{% if semverIsAtLeast($rum_browser_sdk_version, "2.17.0") %} +### ビュー名を設定する + +`setViewName(name: string)`を使用して現在のビューの名前を更新してください。これにより、新しいビューを開始することなく、ビュー名を変更することができます。 + + {% if equals($lib_src, "npm") %} + ```javascript + import { datadogRum } from '@datadog/browser-rum'; + + datadogRum.setViewName(''); + + // Code example + datadogRum.setViewName('Checkout'); + ``` + {% /if %} + + + {% if equals($lib_src, "cdn_async") %} + ```javascript + window.DD_RUM.onReady(function() { + window.DD_RUM.setViewName(''); + }) + + // Code example + window.DD_RUM.onReady(function() { + window.DD_RUM.setViewName('Checkout'); + }) + ``` + {% /if %} + + + {% if equals($lib_src, "cdn_sync") %} + ```javascript + window.DD_RUM && window.DD_RUM.setViewName(''); + + // Code example + window.DD_RUM && window.DD_RUM.setViewName('Checkout'); + ``` + {% /if %} + +**注意**: ビュー名を変更すると、そのメソッドが呼び出された時点からビューとその子イベントに影響を与えます。 +{% /if %} + + +詳細については、[ブラウザモニタリングの設定][4]を参照してください。 + + +##RUMデータを豊かにし、制御する + +RUMブラウザSDKはRUMイベントをキャプチャし、その主要属性を埋め込みます。`beforeSend`コールバック関数は、RUMブラウザSDKによって収集されたすべてのイベントにアクセスすることを可能にします。これらはDatadogに送信される前のものです。 + +RUMイベントを傍受することで、次のことが可能になります: + +-追加のコンテキスト属性でRUMイベントを豊かにする +-RUMイベントを修正して、その内容を変更したり、機密のシーケンスを削除したりします([編集可能なプロパティのリスト](#modify-the-content-of-a-rum-event)を参照)。 +-選択したRUMイベントを破棄する + + +{% if semverIsAtLeast($rum_browser_sdk_version, "2.13.0") %} +[バージョン2.13.0][5]以降、`beforeSend`は2つの引数を取ります:RUMブラウザSDKによって生成された`event`と、RUMイベントの作成をトリガーした`context`です。 + +```javascript +function beforeSend(event, context) +``` + +潜在的な`context`の値は: + +| RUMイベントタイプ | コンテキスト | +|------------------|---------------------------| +| ビュー | [位置][6] | +| アクション | [イベント][7]および処理スタック | +| リソース(XHR) | [XMLHttpRequest][8]、[PerformanceResourceTiming][9]、および処理スタック | +| リソース (取得) | [リクエスト][10]、[レスポンス][11]、[パフォーマンスリソースタイミング][9]、およびスタックの処理 | +| リソース (その他) | [パフォーマンスリソースタイミング][9] | +| エラー | [エラー][12] | +| Long Task | [PerformanceLongTaskTiming][13] | + +詳細については、[RUMデータの強化と制御ガイド][14]を参照してください。 +{% /if %} + + +### RUMイベントを強化する + +[グローバルコンテキストAPI](#global-context)または[フィーチャーフラグデータ収集](#enrich-rum-events-with-feature-flags)で追加された属性に加えて、イベントに追加のコンテキスト属性を追加できます。例えば、フェッチレスポンスオブジェクトから抽出したデータでRUMリソースイベントにタグを付けます: + + {% if equals($lib_src, "npm") %} + ```javascript + import { datadogRum } from '@datadog/browser-rum'; + + datadogRum.init({ + ..., + beforeSend: (event, context) => { + // collect a RUM resource's response headers + if (event.type === 'resource' && event.resource.type === 'fetch') { + event.context.responseHeaders = Object.fromEntries(context.response.headers) + } + return true + }, + ... + }); + ``` + {% /if %} + + + {% if equals($lib_src, "cdn_async") %} + ```javascript + window.DD_RUM.onReady(function() { + window.DD_RUM.init({ + ..., + beforeSend: (event, context) => { + // collect a RUM resource's response headers + if (event.type === 'resource' && event.resource.type === 'fetch') { + event.context.responseHeaders = Object.fromEntries(context.response.headers) + } + return true + }, + ... + }) + }) + ``` + {% /if %} + + + {% if equals($lib_src, "cdn_sync") %} + ```javascript + window.DD_RUM && + window.DD_RUM.init({ + ..., + beforeSend: (event, context) => { + // collect a RUM resource's response headers + if (event.type === 'resource' && event.resource.type === 'fetch') { + event.context.responseHeaders = Object.fromEntries(context.response.headers) + } + return true + }, + ... + }); + ``` + {% /if %} + +ユーザーが複数のチームに所属している場合は、グローバルコンテキストAPIへの呼び出しに追加のキーと値のペアを追加してください。 + +RUMブラウザSDKは、`event.context`の外部で追加された属性を無視します。 + +###フィーチャーフラグでRUMイベントを強化する + +[フィーチャーフラグでRUMイベントデータを強化する][14]ことで、パフォーマンスモニタリングに関する追加のコンテキストと可視性を得ることができます。これにより、特定のユーザーエクスペリエンスがどのユーザーに表示されているか、またそれがユーザーのパフォーマンスに悪影響を与えているかを判断できます。 + +###RUMイベントの内容を変更する + +例えば、ウェブアプリケーションのURLからメールアドレスを削除するには: + + {% if equals($lib_src, "npm") %} + ```javascript + import { datadogRum } from '@datadog/browser-rum'; + + datadogRum.init({ + ..., + beforeSend: (event) => { + // remove email from view url + event.view.url = event.view.url.replace(/email=[^&]*/, "email=REDACTED") + }, + ... + }); + ``` + {% /if %} + + + {% if equals($lib_src, "cdn_async") %} + ```javascript + window.DD_RUM.onReady(function() { + window.DD_RUM.init({ + ..., + beforeSend: (event) => { + // remove email from view url + event.view.url = event.view.url.replace(/email=[^&]*/, "email=REDACTED") + }, + ... + }) + }) + ``` + {% /if %} + + + {% if equals($lib_src, "cdn_sync") %} + ```javascript + window.DD_RUM && + window.DD_RUM.init({ + ..., + beforeSend: (event) => { + // remove email from view url + event.view.url = event.view.url.replace(/email=[^&]*/, "email=REDACTED") + }, + ... + }); + ``` + {% /if %} + +次のイベントプロパティを更新できます: + +| 属性 | タイプ | 説明 | +| ------------------------------ | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `view.url` | 文字列 | アクティブなウェブページのURL。 | +| `view.referrer` | 文字列 | 現在要求されているページへのリンクがフォローされた前のウェブページのURL。 | +| `view.name` | 文字列 | 現在のビューの名前。 | +| `view.performance.lcp.resource_url` | 文字列 | 最大コンテンツフルペイントのリソースURL。 | +| `service` | 文字列 | アプリケーションのサービス名。 | +| `version` | 文字列 | アプリケーションのバージョン。例えば:1.2.3、6c44da20、または2020.02.13。 | +| `action.target.name` | 文字列 | ユーザーが操作した要素。自動収集されたアクションのみに適用されます。 | +| `error.message` | 文字列 | エラーを説明する簡潔で人間が読みやすい1行のメッセージ。 | +| `error.stack` | 文字列 | エラーに関するスタックトレースまたは補足情報。 | +| `error.resource.url` | 文字列 | エラーを引き起こしたリソースのURL。 | +| `resource.url` | 文字列 | リソースのURL。 | +| `long_task.scripts.source_url` | 文字列 | スクリプトリソースのURL | +| `long_task.scripts.invoker` | 文字列 | スクリプトが呼び出された方法を示す意味のある名前 | +| `context` | オブジェクト | [グローバルコンテキストAPI](#global-context)、[ビューコンテキストAPI](#view-context)、または手動でイベントを生成する際に追加された属性(例えば、`addError` と **`addAction`**)。| + +RUMブラウザSDKは、上記にリストされていないイベントプロパティへの変更を無視します。イベントプロパティに関する詳細は、[RUMブラウザSDK GitHubリポジトリ][15]を参照してください。 + +**注意**: 他のイベントとは異なり、ビューイベントはライフサイクル中の更新を反映するためにDatadogに複数回送信されます。新しいビューがアクティブな間でも、以前のビューイベントの更新を送信することができます。Datadogは、ビューイベントの内容を変更する際にこの動作に注意することを推奨します。 + +```javascript +beforeSend: (event) => { + // discouraged, as the current view name could be applied to both the active view and the previous views + event.view.name = getCurrentViewName() + + // recommended + event.view.name = getViewNameForUrl(event.view.url) +} +``` + +### RUMイベントを破棄する + +`beforeSend` APIを使用して、`false`を返すことでRUMイベントを破棄します。 + +{% if equals($lib_src, "npm") %} + +```javascript +import { datadogRum } from '@datadog/browser-rum'; + +datadogRum.init({ + ..., + beforeSend: (event) => { + if (shouldDiscard(event)) { + return false + } + ... + }, + ... +}); +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.init({ + ..., + beforeSend: (event) => { + if (shouldDiscard(event)) { + return false + }, + ... + }, + ... + }) +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && + window.DD_RUM.init({ + ..., + beforeSend: (event) => { + if (shouldDiscard(event)) { + return false + } + ... + }, + ... + }); +``` +{% /if %} + +**注意**: ビューイベントは破棄できません。 + +##ユーザーセッション + +RUMセッションにユーザー情報を追加することで、次のことが可能になります: + +- 特定のユーザーの旅を追跡する +- エラーの影響を最も受けているユーザーを把握する +- 最も重要なユーザーのパフォーマンスを監視する + +{% img src="real_user_monitoring/browser/advanced_configuration/user-api.png" alt=" RUM UIのユーザーAPI" /%} + + +{% if semverIsAtLeast($rum_browser_sdk_version, "6.4.0") %} +バージョン6.4.0以降では、次の属性が利用可能です: + +| 属性 | タイプ | 必須 | 説明 | +|------------|------|------|----------------------------------------------------------------------------------------------------| +| `usr.id` | 文字列 | はい | ユーザーの一意の識別子。 | +| `usr.name` | 文字列 | いいえ | ユーザーのフレンドリーな名前、デフォルトでRUM UIに表示されます。 | +| `usr.email` | 文字列 | いいえ | ユーザーのメールアドレス、ユーザー名が存在しない場合にRUM UIに表示されます。これはGravatarを取得するためにも使用されます。 | +{% /if %} + + + +{% if not(semverIsAtLeast($rum_browser_sdk_version, "6.4.0")) %} +以下の属性は、バージョン6.4.0以前ではオプションですが、Datadogは少なくとも1つの属性を提供することを強く推奨します。例えば、デフォルトのRUMダッシュボードの一部として`usr.id`に依存する関連データを表示するために、セッションにユーザーIDを設定する必要があります。 + +|属性 | タイプ | 説明 | +|------------|------|----------------------------------------------------------------------------------------------------| +| `usr.id` | 文字列 | ユーザーの一意の識別子。 | +| `usr.name` | 文字列 | ユーザーのフレンドリーな名前、デフォルトでRUM UIに表示されます。 | +| `usr.email` | 文字列 | ユーザーのメールアドレス、ユーザー名が存在しない場合にRUM UIに表示されます。これはGravatarを取得するためにも使用されます。| + +**注意**: `usr.name`が設定されていない場合、`usr.email`および`usr.id`が定義されていても、RUM UIには「公開ユーザー」と表示されます。 + +推奨される属性に追加の属性を加えることで、フィルタリング機能を向上させてください。例えば、ユーザープランやユーザーグループに関する情報を追加してください。 + +ユーザーセッションオブジェクトに変更を加えると、変更後に収集されたすべてのRUMイベントには更新された情報が含まれます。 + +**注意**: ログアウトのようにユーザーセッション情報を削除すると、ログアウト前の最後のビューのユーザー情報は保持されますが、後のビューやセッションレベルでは保持されません。セッションデータは最後のビューの値を使用します。 +{% /if %} + + +### ユーザーセッションを特定する + +`datadogRum.setUser()` + +{% if equals($lib_src, "npm") %} + +```javascript +datadogRum.setUser({ + id: '1234', + name: 'John Doe', + email: 'john@doe.com', + plan: 'premium', + ... +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.setUser({ + id: '1234', + name: 'John Doe', + email: 'john@doe.com', + plan: 'premium', + ... + }) +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.setUser({ + id: '1234', + name: 'John Doe', + email: 'john@doe.com', + plan: 'premium', + ... +}) +``` +{% /if %} + +### ユーザーセッションにアクセスする + +`datadogRum.getUser()` + +{% if equals($lib_src, "npm") %} + +```javascript +datadogRum.getUser() +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.getUser() +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.getUser() +``` +{% /if %} + +### ユーザーセッションプロパティを追加/上書きする + +`datadogRum.setUserProperty('', )` + +{% if equals($lib_src, "npm") %} + +```javascript +datadogRum.setUserProperty('name', 'John Doe') +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.setUserProperty('name', 'John Doe') +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.setUserProperty('name', 'John Doe') +``` +{% /if %} + +### ユーザーセッションプロパティを削除する + +`datadogRum.removeUserProperty('')` + +{% if equals($lib_src, "npm") %} + +```javascript +datadogRum.removeUserProperty('name') +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.removeUserProperty('name') +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.removeUserProperty('name') +``` +{% /if %} + +### ユーザーセッションプロパティをクリアする + +`datadogRum.clearUser()` + +{% if equals($lib_src, "npm") %} + +```javascript +datadogRum.clearUser() +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.clearUser() +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.clearUser() +``` +{% /if %} + +## アカウント + +ユーザーを異なるセットにグループ化するには、アカウントの概念を使用してください。 + +以下の属性が利用可能です: + +| 属性 | タイプ | 必須 | 説明 | +|----------------|--------|----------|------------------------------------------------------------| +| `account.id` | 文字列 | はい | ユニークなアカウント識別子。 | +| `account.name` | 文字列 | いいえ | アカウントのフレンドリーネーム、デフォルトでRUM UIに表示されます。| + +### アカウントを特定する + +`datadogRum.setAccount()` + +{% if equals($lib_src, "npm") %} + +```javascript +datadogRum.setAccount({ + id: '1234', + name: 'My Company Name', + ... +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.setAccount({ + id: '1234', + name: 'My Company Name', + ... + }) +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.setAccount({ + id: '1234', + name: 'My Company Name', + ... +}) +``` +{% /if %} + +### アカウントにアクセスする + +`datadogRum.getAccount()` + +{% if equals($lib_src, "npm") %} + +```javascript +datadogRum.getAccount() +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.getAccount() +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.getAccount() +``` +{% /if %} + +### アカウントプロパティを追加/上書きする + +`datadogRum.setAccountProperty('', )` + +{% if equals($lib_src, "npm") %} + +```javascript +datadogRum.setAccountProperty('name', 'My Company Name') +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.setAccountProperty('name', 'My Company Name') +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.setAccountProperty('name', 'My Company Name') +``` +{% /if %} + +### アカウントプロパティを削除する + +`datadogRum.removeAccountProperty('')` + +{% if equals($lib_src, "npm") %} + +```javascript +datadogRum.removeAccountProperty('name') +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.removeAccountProperty('name') +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.removeAccountProperty('name') +``` +{% /if %} + +### アカウントプロパティをクリアする + +`datadogRum.clearAccount()` + +{% if equals($lib_src, "npm") %} + +```javascript +datadogRum.clearAccount() +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.clearAccount() +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.clearAccount() +``` +{% /if %} + +## サンプリング + +デフォルトでは、収集されたセッションの数に対してサンプリングは適用されません。収集されたセッションの数に対して相対的なサンプリング(パーセント)を適用するには、RUMを初期化する際に`sessionSampleRate`パラメータを使用してください。 + +以下の例では、特定のRUMアプリケーションで全セッションの90%のみを収集します: + +{% if equals($lib_src, "npm") %} + +```javascript +import { datadogRum } from '@datadog/browser-rum'; + +datadogRum.init({ + applicationId: '', + clientToken: '', + site: '', + sessionSampleRate: 90, +}); +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.init({ + clientToken: '', + applicationId: '', + site: '', + sessionSampleRate: 90, + }) +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && + window.DD_RUM.init({ + clientToken: '', + applicationId: '', + site: '', + sessionSampleRate: 90, + }); +``` +{% /if %} + +サンプリングから除外されたセッションでは、そのセッションに関連するすべてのページビューとテレメトリは収集されません。 + +##ユーザートラッキングの同意 + +GDPR、CCPA、および同様の規制に準拠するために、RUMブラウザSDKでは初期化時にトラッキング同意値を提供できます。トラッキング同意に関する詳細は、[データセキュリティ][17]を参照してください。 + +`trackingConsent`初期化パラメータは、以下のいずれかの値にすることができます: + +1. `"granted"`(デフォルト):RUMブラウザSDKはデータの収集を開始し、Datadogに送信します。 +2. `"not-granted"`:RUMブラウザSDKはデータを収集しません。 + +RUMブラウザSDKが初期化された後にトラッキング同意値を変更するには、`setTrackingConsent()` APIコールを使用してください。RUMブラウザSDKは新しい値に応じて動作を変更します: + +-が`"granted"`から`"not-granted"`に変更された場合、RUMセッションは停止し、データはもはやDatadogに送信されません。 +-`"not-granted"`から`"granted"`に変更された場合、以前のセッションがアクティブでない場合は新しいRUMセッションが作成され、データ収集が再開されます。 + +この状態はタブ間で同期されず、ナビゲーション間で持続されません。RUMブラウザSDKの初期化時にユーザーの決定を提供する責任があります、または`setTrackingConsent()`を使用してください。 + +`setTrackingConsent()`が`init()`の前に使用されると、提供された値が初期化パラメータよりも優先されます。 + +{% if equals($lib_src, "npm") %} + +```javascript +import { datadogRum } from '@datadog/browser-rum'; + +datadogRum.init({ + ..., + trackingConsent: 'not-granted' +}); + +acceptCookieBannerButton.addEventListener('click', function() { + datadogRum.setTrackingConsent('granted'); +}); +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.init({ + ..., + trackingConsent: 'not-granted' + }); +}); + +acceptCookieBannerButton.addEventListener('click', () => { + window.DD_RUM.onReady(function() { + window.DD_RUM.setTrackingConsent('granted'); + }); +}); +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.init({ + ..., + trackingConsent: 'not-granted' +}); + +acceptCookieBannerButton.addEventListener('click', () => { + window.DD_RUM && window.DD_RUM.setTrackingConsent('granted'); +}); +``` +{% /if %} + +## ビューコンテキスト + + +[バージョン5.28.0][20]以降、ビューイベントのコンテキストは変更可能です。コンテキストは現在のビューにのみ追加でき、その子イベント(`action`、`error`、`timing`など)を`startView`、`setViewContext`、`setViewContextProperty`関数でポピュレートします。 + +###コンテキストでビューを開始する + +オプションで、[`startView`オプション](#override-default-rum-view-names)を使用してビューを開始する際にコンテキストを定義できます。 + +###ビューコンテキストを追加する + +RUMビューイベントと対応する子イベントのコンテキストを`setViewContextProperty(key: string, value: any)` APIで豊かにしたり、修正したりします。 + +{% if equals($lib_src, "npm") %} + +```javascript +import { datadogRum } from '@datadog/browser-rum'; + +datadogRum.setViewContextProperty('', ''); + +// Code example +datadogRum.setViewContextProperty('activity', { + hasPaid: true, + amount: 23.42 +}); +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.setViewContextProperty('', ''); +}) + +// Code example +window.DD_RUM.onReady(function() { + window.DD_RUM.setViewContextProperty('activity', { + hasPaid: true, + amount: 23.42 + }); +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.setViewContextProperty('', ''); + +// Code example +window.DD_RUM && window.DD_RUM.setViewContextProperty('activity', { + hasPaid: true, + amount: 23.42 +}); +``` +{% /if %} + +### ビューコンテキストを置き換える + +RUMビューイベントと対応する子イベントのコンテキストを`setViewContext(context: Context)` APIで置き換えます。 + +{% if equals($lib_src, "npm") %} + +```javascript +import { datadogRum } from '@datadog/browser-rum'; +datadogRum.setViewContext({ '': '' }); + +// Code example +datadogRum.setViewContext({ + originalUrl: 'shopist.io/department/chairs', +}); +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.setViewContext({ '': '' }); +}) + +// Code example +window.DD_RUM.onReady(function() { + window.DD_RUM.setViewContext({ + originalUrl: 'shopist.io/department/chairs', + }) +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && + window.DD_RUM.setViewContext({ '': '' }); + +// Code example +window.DD_RUM && + window.DD_RUM.setViewContext({ + originalUrl: 'shopist.io/department/chairs', + }); +``` +{% /if %} + +## エラーコンテキスト + +### dd_contextを使用してローカルエラーコンテキストを添付する + +エラーをキャプチャする際、エラーが生成される時点で追加のコンテキストを提供できます。`addError()` APIを通じて追加情報を渡す代わりに、エラーインスタンスに直接`dd_context`プロパティを添付できます。RUMブラウザSDKはこのプロパティを自動的に検出し、最終的なエラーイベントコンテキストに統合します。 + +```javascript +const error = new Error('Something went wrong') +error.dd_context = { component: 'Menu', param: 123, } +throw error +``` + +## グローバルコンテキスト + +### グローバルコンテキストプロパティを追加する + +RUMが初期化された後、`setGlobalContextProperty(key: string, value: any)` APIを使用してアプリケーションから収集されたすべてのRUMイベントに追加のコンテキストを追加します: + +{% if equals($lib_src, "npm") %} + +```javascript +import { datadogRum } from '@datadog/browser-rum'; + +datadogRum.setGlobalContextProperty('', ); + +// Code example +datadogRum.setGlobalContextProperty('activity', { + hasPaid: true, + amount: 23.42 +}); +``` + +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.setGlobalContextProperty('', ''); +}) + +// Code example +window.DD_RUM.onReady(function() { + window.DD_RUM.setGlobalContextProperty('activity', { + hasPaid: true, + amount: 23.42 + }); +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.setGlobalContextProperty('', ''); + +// Code example +window.DD_RUM && window.DD_RUM.setGlobalContextProperty('activity', { + hasPaid: true, + amount: 23.42 +}); +``` +{% /if %} + +### グローバルコンテキストプロパティを削除する + +以前に定義されたグローバルコンテキストプロパティを削除できます。 + +{% if equals($lib_src, "npm") %} + +```javascript +import { datadogRum } from '@datadog/browser-rum'; +datadogRum.removeGlobalContextProperty(''); + +// Code example +datadogRum.removeGlobalContextProperty('codeVersion'); +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.removeGlobalContextProperty(''); +}) + +// Code example +window.DD_RUM.onReady(function() { + window.DD_RUM.removeGlobalContextProperty('codeVersion'); +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && + window.DD_RUM.removeGlobalContextProperty(''); + +// Code example +window.DD_RUM && + window.DD_RUM.removeGlobalContextProperty('codeVersion'); +``` +{% /if %} + +### グローバルコンテキストを置き換える + +すべてのRUMイベントのデフォルトコンテキストを`setGlobalContext(context: Context)` APIで置き換えます。 + +{% if equals($lib_src, "npm") %} + +```javascript +import { datadogRum } from '@datadog/browser-rum'; +datadogRum.setGlobalContext({ '': '' }); + +// Code example +datadogRum.setGlobalContext({ + codeVersion: 34, +}); +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.setGlobalContext({ '': '' }); +}) + +// Code example +window.DD_RUM.onReady(function() { + window.DD_RUM.setGlobalContext({ + codeVersion: 34, + }) +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && + window.DD_RUM.setGlobalContext({ '': '' }); + +// Code example +window.DD_RUM && + window.DD_RUM.setGlobalContext({ + codeVersion: 34, + }); +``` +{% /if %} + +### グローバルコンテキストをクリアする + +グローバルコンテキストは`clearGlobalContext`を使用してクリアできます。 + +{% if equals($lib_src, "npm") %} + +```javascript +import { datadogRum } from '@datadog/browser-rum'; + +datadogRum.clearGlobalContext(); +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + window.DD_RUM.clearGlobalContext(); +}); +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.clearGlobalContext(); +``` +{% /if %} + +### グローバルコンテキストを読む + +RUMが初期化されると、`getGlobalContext()` APIを使用してグローバルコンテキストを読み取ります。 + +{% if equals($lib_src, "npm") %} + +```javascript +import { datadogRum } from '@datadog/browser-rum'; + +const context = datadogRum.getGlobalContext(); +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function() { + const context = window.DD_RUM.getGlobalContext(); +}); +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +const context = window.DD_RUM && window.DD_RUM.getGlobalContext(); +``` +{% /if %} + +## コンテキストのライフサイクル + +デフォルトでは、グローバルコンテキストとユーザーコンテキストは現在のページメモリに保存されるため、次のようにはなりません: + +- ページの完全なリロード後に保持されません +- 同じセッションの異なるタブやウィンドウ間で共有されません + +それらをセッションのすべてのイベントに追加するには、各ページに添付する必要があります。 + + +{% if semverIsAtLeast($rum_browser_sdk_version, "4.49.0") %} +バージョン4.49.0で`storeContextsAcrossPages`構成オプションが導入されたことで、これらのコンテキストは[`localStorage`][18]に保存でき、次の動作が可能になります: + +- コンテキストは完全なリロード後も保持されます +- コンテキストは同じオリジンで開かれたタブ間で同期されます + +ただし、この機能にはいくつかの**制限**があります: + +- これらのコンテキストに個人を特定できる情報(PII)を設定することは推奨されません。なぜなら、`localStorage`に保存されたデータはユーザーセッションを超えて存続するからです。 +- この機能は`trackSessionAcrossSubdomains`オプションと互換性がありません。なぜなら、`localStorage`データは同じオリジン間でのみ共有されるからです(login.site.com ≠ app.site.com) +- `localStorage` はオリジンごとに5 MiBに制限されているため、アプリケーション固有のデータ、Datadogコンテキスト、およびローカルストレージに保存された他のサードパーティデータは、この制限内に収める必要があります。そうしないと問題が発生します。 + +{% /if %} + + +## 内部コンテキスト + +DatadogブラウザRUM SDKが初期化された後、SDKの内部コンテキストにアクセスできます。これにより、SDKが内部で使用するセッションIDやアプリケーションの詳細などのコア識別子とメタデータが提供されます。 + +次の属性を探索できます: + +| 属性 | 説明 | +| -------------- | ----------------------------------------------------------------- | +| アプリケーションID | アプリケーションのIDです。 | +| セッションID | セッションのIDです。 | +| ユーザーアクション | アクションIDを含むオブジェクト(アクションが見つからない場合は未定義)。| +| ビュー | 現在のビューイベントに関する詳細を含むオブジェクトです。 | + +詳細については、[RUMブラウザデータ収集][2]を参照してください。 + +###例 + +```json +{ + application_id : "xxx", + session_id : "xxx", + user_action: { id: "xxx" }, + view : { + id : "xxx", + referrer : "", + url: "http://localhost:8080/", + name: "homepage" + } +} +``` + +特定の時間のコンテキストを取得するために、`startTime` パラメータをオプションで使用できます。パラメータが省略された場合、現在のコンテキストが返されます。 + +```typescript +getInternalContext (startTime?: 'number' | undefined) +``` + +{% if equals($lib_src, "npm") %} + +```javascript +import { datadogRum } from '@datadog/browser-rum' + +datadogRum.getInternalContext() // { session_id: "xxxx", application_id: "xxxx" ... } +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +window.DD_RUM.onReady(function () { + window.DD_RUM.getInternalContext() // { session_id: "xxxx", application_id: "xxxx" ... } +}) +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +window.DD_RUM && window.DD_RUM.getInternalContext() // { session_id: "xxxx", application_id: "xxxx" ... } +``` +{% /if %} + + +## マイクロフロントエンド + +RUMブラウザSDKは、`service` および `version` 属性を使用して、特定のマイクロフロントエンドにイベントを割り当てることで、マイクロフロントエンドアーキテクチャをサポートします。単一のRUM SDKインスタンスは、シェルレベルで実行されます。イベントは `service` および `version` によってセグメント化され、チームはダッシュボードをフィルタリングし、アラートを設定し、マイクロフロントエンドごとのパフォーマンスを追跡できます。 + +Datadogは、RUMイベントをマイクロフロントエンドに割り当てるための2つのアプローチを提供します: + +1. **自動割り当て**: ソースコードコンテキストを注入するビルドプラグインを使用し、手動のスタックトレース解析を排除します。 +2. **手動割り当て**: スタックトレースを解析し、サービス情報を抽出するために `beforeSend` コールバックを使用します。 + + +### 自動サービスおよびバージョン割り当て + +このアプローチは、ビルドプラグインを使用してソースコードコンテキストをバンドルに注入し、RUM SDKが自動的に読み取って正しい `service` および `version` でイベントを豊かにします。 + +####前提条件とサポートされているセットアップ + +- **分離されたバンドル**: 各マイクロフロントエンドは、異なるファイルパスを持つ独自のバンドルを持ちます。例えば、[モジュールフェデレーション][21]を使用します。 +- **サポートされているバンドラー**: [Datadogビルドプラグインによってサポートされているバンドラー][22]を使用します。 +- **ブラウザSDK**: ブラウザSDKのバージョンはv6.30.1以上です。 + +####セットアップガイド + +**ステップ1 - 各マイクロフロントエンドのために[ビルドプラグイン][23]を設定します** + +各マイクロフロントエンドのビルド設定で、ソースコードコンテキストのインジェクションを有効にします: + +{% tabs %} +{% tab label="Webpack" %} + +```javascript +const { datadogWebpackPlugin } = require('@datadog/webpack-plugin'); + +module.exports = { + plugins: [ + new datadogWebpackPlugin({ + rum: { + enable: true, + sourceCodeContext: { + service: 'foo-microfrontend', + version: process.env.APP_VERSION || '1.0.0' + } + } + }) + ] +}; +``` +{% /tab %} + +{% tab label="Vite" %} + +```javascript +import { datadogVitePlugin } from '@datadog/vite-plugin'; + +export default { + plugins: [ + datadogVitePlugin({ + rum: { + enable: true, + sourceCodeContext: { + service: 'foo-microfrontend', + version: process.env.APP_VERSION || '1.0.0' + } + } + }) + ] +}; +``` +{% /tab %} + +{% tab label="esbuild" %} + +```javascript +const { datadogEsbuildPlugin } = require('@datadog/esbuild-plugin'); + +require('esbuild').build({ + plugins: [ + datadogEsbuildPlugin({ + rum: { + enable: true, + sourceCodeContext: { + service: 'foo-microfrontend', + version: process.env.APP_VERSION || '1.0.0' + } + } + }) + ] +}); +``` +{% /tab %} + +{% tab label="ロールアップ" %} + +```javascript +import { datadogRollupPlugin } from '@datadog/rollup-plugin'; + +export default { + plugins: [ + datadogRollupPlugin({ + rum: { + enable: true, + sourceCodeContext: { + service: 'foo-microfrontend', + version: process.env.APP_VERSION || '1.0.0' + } + } + }) + ] +}; +``` +{% /tab %} + +{% tab label="Rspack" %} + +```javascript +const { datadogRspackPlugin } = require('@datadog/rspack-plugin'); + +module.exports = { + plugins: [ + new datadogRspackPlugin({ + rum: { + enable: true, + sourceCodeContext: { + service: 'foo-microfrontend', + version: process.env.APP_VERSION || '1.0.0' + } + } + }) + ] +}; +``` +{% /tab %} +{% /tabs %} + +**ステップ2 - シェルレベルでブラウザSDKを設定する** + +[シェルアプリケーション(メインエントリーポイント)でブラウザモニタリングを設定する][4]。ブラウザSDKは、コンテキストマップからの`service`と`version`を使用して、RUMイベント(エラー、カスタムアクション、XHR/Fetchリソース、長いタスク、バイタル)を自動的に強化します。 + +{% alert level="warning" %} +マイクロフロントエンドに一致しないイベントは、シェルレベルのサービスとバージョンにフォールバックします。 +{% /alert %} + +**ステップ3 - [Datadogでマイクロフロントエンドデータを探索する](#explore-micro-frontend-data-in-datadog)** + + + +{% if semverIsAtLeast($rum_browser_sdk_version, "5.22") %} + +###手動サービスおよびバージョンの帰属 + +`beforeSend`プロパティでは、サービスおよびバージョンのプロパティを上書きできます。イベントの発生元を特定するために、`context.handlingStack`プロパティを使用してください。 + +{% if equals($lib_src, "npm") %} + +```javascript +import { datadogRum } from '@datadog/browser-rum'; + +const SERVICE_REGEX = /some-pathname\/(?\w+)\/(?\w+)\//; + +datadogRum.init({ + ..., + beforeSend: (event, context) => { + const stack = context?.handlingStack || event?.error?.stack; + const { service, version } = stack?.match(SERVICE_REGEX)?.groups; + + if (service && version) { + event.service = service; + event.version = version; + } + + return true; + }, +}); +``` +{% /if %} + + +{% if equals($lib_src, "cdn_async") %} + +```javascript +const SERVICE_REGEX = /some-pathname\/(?\w+)\/(?\w+)\//; + +window.DD_RUM.onReady(function() { + window.DD_RUM.init({ + ..., + beforeSend: (event, context) => { + const stack = context?.handlingStack || event?.error?.stack; + const { service, version } = stack?.match(SERVICE_REGEX)?.groups; + + if (service && version) { + event.service = service; + event.version = version; + } + + return true; + }, + }); +}); +``` +{% /if %} + + +{% if equals($lib_src, "cdn_sync") %} + +```javascript +const SERVICE_REGEX = /some-pathname\/(?\w+)\/(?\w+)\//; + +window.DD_RUM && window.DD_RUM.init({ + ..., + beforeSend: (event, context) => { + const stack = context?.handlingStack || event?.error?.stack; + const { service, version } = stack?.match(SERVICE_REGEX)?.groups; + + if (service && version) { + event.service = service; + event.version = version; + } + + return true; + }, +}); +``` +{% /if %} + +正規表現は、アプリケーションのファイルパス構造に一致する必要があります。パターンを調整して、バンドルURLからサービスとバージョンを抽出します。RUMエクスプローラーの任意のクエリは、サービス属性を使用してイベントをフィルタリングできます。 + + +{% /if %} + +###制限事項 + +一部のイベントは、関連するハンドリングスタックがないため、起源に帰属できません: + +-自動的に収集されたアクションイベント +-XHRおよびFetch以外のリソースイベント +-自動的に収集されたビューイベント +-CORSおよびCSP違反 + +###Datadogでマイクロフロントエンドデータを探索する + +セットアップ後、RUMイベントの`service`と`version`は、どのマイクロフロントエンドが各イベントを生成したかを特定します。これらの属性をDatadogのいくつかの場所で使用します: + +- **サイドパネル**:`service`および`version`属性は、RUMエクスプローラーのセッション、ビュー、エラー、リソース、アクション、長いタスクのサイドパネルに表示されます。 +- **RUMサマリーダッシュボード**:`service`および`version`を使用して、RUMサマリーダッシュボードで特定のマイクロフロントエンドにパフォーマンスメトリクスを絞り込みます。 +- **カスタムダッシュボード**:`service`および`version`を使用して、各マイクロフロントエンドを独立して監視するダッシュボードを作成します。 + +[1]: /ja/real_user_monitoring/application_monitoring/browser/data_collected/ +[2]: /ja/real_user_monitoring/application_monitoring/browser/monitoring_page_performance/ +[3]: https://github.com/DataDog/browser-sdk/blob/main/CHANGELOG.md#v2170 +[4]: /ja/real_user_monitoring/application_monitoring/browser/setup/ +[5]: https://github.com/DataDog/browser-sdk/blob/main/CHANGELOG.md#v2130 +[6]: https://developer.mozilla.org/en-US/docs/Web/API/Location +[7]: https://developer.mozilla.org/en-US/docs/Web/API/Event +[8]: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest +[9]: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceResourceTiming +[10]: https://developer.mozilla.org/en-US/docs/Web/API/Request +[11]: https://developer.mozilla.org/en-US/docs/Web/API/Response +[12]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error +[13]: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceLongTaskTiming +[14]: /ja/real_user_monitoring/guide/enrich-and-control-rum-data +[15]: https://github.com/DataDog/browser-sdk/blob/main/packages/rum-core/src/rumEvent.types.ts +[16]: https://github.com/DataDog/browser-sdk/blob/main/CHANGELOG.md#v4130 +[17]: /ja/data_security/real_user_monitoring/#browser-rum-use-of-cookies +[18]: https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage +[19]: https://github.com/DataDog/browser-sdk/blob/main/CHANGELOG.md#v5280 +[20]: /ja/real_user_monitoring/application_monitoring/browser/advanced_configuration#override-default-rum-view-names +[21]: https://module-federation.io/ +[22]: https://github.com/DataDog/build-plugins?tab=readme-ov-file#usage +[23]: https://github.com/DataDog/build-plugins \ No newline at end of file diff --git a/content/ja/tracing/trace_collection/custom_instrumentation/server-side/_index.mdoc.md b/content/ja/tracing/trace_collection/custom_instrumentation/server-side/_index.mdoc.md new file mode 100644 index 00000000000..f345d3bfe89 --- /dev/null +++ b/content/ja/tracing/trace_collection/custom_instrumentation/server-side/_index.mdoc.md @@ -0,0 +1,236 @@ +--- +aliases: +- /ja/tracing/opentracing/java +- /ja/tracing/manual_instrumentation/java +- /ja/tracing/custom_instrumentation/java +- /ja/tracing/setup_overview/custom_instrumentation/java +- /ja/tracing/trace_collection/custom_instrumentation/java +- /ja/tracing/trace_collection/custom_instrumentation/java/dd-api +- /ja/tracing/trace_collection/custom_instrumentation/java/otel +- /ja/tracing/trace_collection/custom_instrumentation/dd_libraries/java +- /ja/tracing/trace_collection/otel_instrumentation/java/ +- /ja/tracing/trace_collection/custom_instrumentation/otel_instrumentation/java +- /ja/tracing/opentracing/python +- /ja/tracing/manual_instrumentation/python +- /ja/tracing/custom_instrumentation/python +- /ja/tracing/setup_overview/custom_instrumentation/python +- /ja/tracing/trace_collection/custom_instrumentation/python +- /ja/tracing/trace_collection/custom_instrumentation/python/dd-api +- /ja/tracing/trace_collection/custom_instrumentation/python/otel +- /ja/tracing/trace_collection/custom_instrumentation/dd_libraries/python +- /ja/tracing/trace_collection/otel_instrumentation/python/ +- /ja/tracing/trace_collection/custom_instrumentation/otel_instrumentation/python +- /ja/tracing/opentracing/nodejs +- /ja/tracing/manual_instrumentation/nodejs +- /ja/tracing/custom_instrumentation/nodejs +- /ja/tracing/setup_overview/custom_instrumentation/nodejs +- /ja/tracing/trace_collection/custom_instrumentation/nodejs +- /ja/tracing/trace_collection/custom_instrumentation/nodejs/dd-api +- /ja/tracing/trace_collection/custom_instrumentation/nodejs/otel +- /ja/tracing/trace_collection/custom_instrumentation/dd_libraries/nodejs +- /ja/tracing/trace_collection/otel_instrumentation/nodejs/ +- /ja/tracing/trace_collection/custom_instrumentation/otel_instrumentation/nodejs +- /ja/tracing/opentracing/go +- /ja/tracing/manual_instrumentation/go +- /ja/tracing/custom_instrumentation/go +- /ja/tracing/setup_overview/custom_instrumentation/go +- /ja/tracing/trace_collection/custom_instrumentation/go +- /ja/tracing/trace_collection/custom_instrumentation/go/dd-api +- /ja/tracing/trace_collection/custom_instrumentation/go/otel +- /ja/tracing/trace_collection/custom_instrumentation/dd_libraries/go +- /ja/tracing/trace_collection/otel_instrumentation/go/ +- /ja/tracing/trace_collection/custom_instrumentation/otel_instrumentation/go +- /ja/tracing/opentracing/ruby +- /ja/tracing/manual_instrumentation/ruby +- /ja/tracing/custom_instrumentation/ruby +- /ja/tracing/setup_overview/custom_instrumentation/ruby +- /ja/tracing/trace_collection/custom_instrumentation/ruby +- /ja/tracing/trace_collection/custom_instrumentation/ruby/dd-api +- /ja/tracing/trace_collection/custom_instrumentation/ruby/otel +- /ja/tracing/trace_collection/custom_instrumentation/dd_libraries/ruby +- /ja/tracing/trace_collection/otel_instrumentation/ruby/ +- /ja/tracing/trace_collection/custom_instrumentation/otel_instrumentation/ruby +- /ja/tracing/opentracing/dotnet +- /ja/tracing/manual_instrumentation/dotnet +- /ja/tracing/custom_instrumentation/dotnet +- /ja/tracing/setup_overview/custom_instrumentation/dotnet +- /ja/tracing/trace_collection/custom_instrumentation/dotnet +- /ja/tracing/trace_collection/custom_instrumentation/dotnet/dd-api +- /ja/tracing/trace_collection/custom_instrumentation/dotnet/otel +- /ja/tracing/trace_collection/custom_instrumentation/dd_libraries/dotnet +- /ja/tracing/trace_collection/otel_instrumentation/dotnet/ +- /ja/tracing/trace_collection/custom_instrumentation/otel_instrumentation/dotnet +- /ja/tracing/opentracing/php +- /ja/tracing/manual_instrumentation/php +- /ja/tracing/custom_instrumentation/php +- /ja/tracing/setup_overview/custom_instrumentation/php +- /ja/tracing/trace_collection/custom_instrumentation/php +- /ja/tracing/trace_collection/custom_instrumentation/php/dd-api +- /ja/tracing/trace_collection/custom_instrumentation/php/otel +- /ja/tracing/trace_collection/custom_instrumentation/dd_libraries/php +- /ja/tracing/trace_collection/otel_instrumentation/php/ +- /ja/tracing/trace_collection/custom_instrumentation/otel_instrumentation/php +- /ja/tracing/manual_instrumentation/cpp +- /ja/tracing/custom_instrumentation/cpp +- /ja/tracing/setup_overview/custom_instrumentation/cpp +- /ja/tracing/trace_collection/custom_instrumentation/cpp +- /ja/tracing/trace_collection/custom_instrumentation/cpp/dd-api +- /ja/tracing/trace_collection/custom_instrumentation/dd_libraries/cpp +- /ja/tracing/trace_collection/custom_instrumentation/rust +- /ja/tracing/trace_collection/custom_instrumentation/elixir +- /ja/tracing/trace_collection/custom_instrumentation/swift +- /ja/tracing/trace_collection/custom_instrumentation/dd_libraries/ +- /ja/tracing/trace_collection/custom_instrumentation/otel_instrumentation/ +content_filters: +- label: Language + option_group_id: custom_instrumentation_language_options + trait_id: prog_lang +- label: API + option_group_id: custom_instrumentation_api_options + trait_id: api_type +description: Datadog APIとOpenTelemetryを使用して、アプリケーション固有の可観測性データをキャプチャするために、カスタムスパン、タグ、および計測を追加します。 +further_reading: +- link: tracing/guide/instrument_custom_method + text: ビジネスロジックの深い可視性を得るために、カスタムメソッドを計測します。 +- link: tracing/connect_logs_and_traces + text: ログとトレースを接続します。 +- link: tracing/visualization/ + text: サービス、リソース、およびトレースを探索します。 +- link: https://www.datadoghq.com/blog/opentelemetry-instrumentation/ + text: DatadogとOpenTelemetryイニシアチブについてもっと学びましょう。 +title: サーバーサイドのカスタム計測 +--- + + + + + +{% if equals($prog_lang, "cpp") %} +{% if equals($api_type, "otel_api") %} +{% alert level="danger" %} +C++はOpenTelemetry APIをサポートしていません。APIのドロップダウンから**Datadog**を選択して、C++のカスタム計測ドキュメントを確認してください。 +{% /alert %} +{% /if %} +{% /if %} + + +{% if equals($prog_lang, "rust") %} +{% if equals($api_type, "dd_api") %} +{% alert level="danger" %} +RustはDatadog APIをサポートしていません。APIのドロップダウンから**OpenTelemetry**を選択して、Rustのカスタム計測ドキュメントを確認してください。 +{% /alert %} +{% /if %} +{% /if %} + + +{% if equals($prog_lang, "elixir") %} +{% if equals($api_type, "dd_api") %} +{% alert level="danger" %} +ElixirはDatadog APIをサポートしていません。APIのドロップダウンから**OpenTelemetry**を選択して、Elixirのカスタム計測ドキュメントを確認してください。 +{% /alert %} +{% /if %} +{% /if %} + + + + + +{% if equals($api_type, "otel_api") %} + + +{% if equals($prog_lang, "elixir") %} +DatadogはElixirトレースライブラリを提供していません。Datadogにトレースを送信するには、[Elixir用OpenTelemetry SDK][8]を使用してください。 +{% /if %} + + +{% if not(includes($prog_lang, ["cpp", "elixir"])) %} + +## 概要 + +{% partial file="opentelemetry/traces/otel-custom-instrumentation-overview.mdoc.md" /%} + +{% if equals($prog_lang, "java") %} +{% partial file="opentelemetry/traces/java.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "python") %} +{% partial file="opentelemetry/traces/python.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "node_js") %} +{% partial file="opentelemetry/traces/nodejs.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "go") %} +{% partial file="opentelemetry/traces/go.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "ruby") %} +{% partial file="opentelemetry/traces/ruby.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "dot_net") %} +{% partial file="opentelemetry/traces/dotnet.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "php") %} +{% partial file="opentelemetry/traces/php.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "rust") %} +{% partial file="opentelemetry/traces/rust.mdoc.md" /%} +{% /if %} + +{% /if %} +{% /if %} + + + + + + + +{% if equals($api_type, "dd_api") %} +{% if not(includes($prog_lang, ["rust", "elixir"])) %} + +## 概要 + +Datadog APIを使用して、プログラム的にトレースを作成、変更、または削除してDatadogに送信します。これは、自動計測によってキャプチャされない社内コードのトレース、トレースからの不要なスパンの削除、スパンへのタグの追加を含む、スパンに対するより深い可視性とコンテキストを提供するのに役立ちます。 + +{% if equals($prog_lang, "java") %} +{% partial file="tracing/custom_instrumentation/dd_api/java.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "python") %} +{% partial file="tracing/custom_instrumentation/dd_api/python.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "node_js") %} +{% partial file="tracing/custom_instrumentation/dd_api/nodejs.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "go") %} +{% partial file="tracing/custom_instrumentation/dd_api/go.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "ruby") %} +{% partial file="tracing/custom_instrumentation/dd_api/ruby.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "dot_net") %} +{% partial file="tracing/custom_instrumentation/dd_api/dotnet.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "php") %} +{% partial file="tracing/custom_instrumentation/dd_api/php.mdoc.md" /%} +{% /if %} + +{% if equals($prog_lang, "cpp") %} +{% partial file="tracing/custom_instrumentation/dd_api/cpp.mdoc.md" /%} +{% /if %} + +{% /if %} +{% /if %} + + +[8]: https://opentelemetry.io/docs/languages/beam/ \ No newline at end of file