From 542620f29d3550a18eec6cbf72f4c6dd43fca7f1 Mon Sep 17 00:00:00 2001 From: Heston Hoffman Date: Thu, 21 May 2026 15:11:56 -0700 Subject: [PATCH] (maint) Clean up gitignore --- .husky/check-cdocs-gitignore.py | 105 +- content/.gitignore | 186 +-- content/es/profiler/enabling/_index.md | 33 - .../android/integrated_libraries.md | 153 --- .../browser/setup/client.md | 169 --- .../browser/troubleshooting.md | 157 --- .../flutter/integrated_libraries.md | 279 ---- .../ios/advanced_configuration.md | 1139 ----------------- .../unity/troubleshooting.md | 51 - content/fr/profiler/enabling/_index.md | 33 - .../browser/setup/client.md | 169 --- .../ios/advanced_configuration.md | 1139 ----------------- content/ja/profiler/enabling/_index.md | 33 - .../ios/advanced_configuration.md | 1137 ---------------- .../unity/troubleshooting.md | 51 - content/ko/profiler/enabling/_index.md | 33 - .../ios/advanced_configuration.md | 1138 ---------------- 17 files changed, 164 insertions(+), 5841 deletions(-) delete mode 100644 content/es/profiler/enabling/_index.md delete mode 100644 content/es/real_user_monitoring/application_monitoring/android/integrated_libraries.md delete mode 100644 content/es/real_user_monitoring/application_monitoring/browser/setup/client.md delete mode 100644 content/es/real_user_monitoring/application_monitoring/browser/troubleshooting.md delete mode 100644 content/es/real_user_monitoring/application_monitoring/flutter/integrated_libraries.md delete mode 100644 content/es/real_user_monitoring/application_monitoring/ios/advanced_configuration.md delete mode 100644 content/es/real_user_monitoring/application_monitoring/unity/troubleshooting.md delete mode 100644 content/fr/profiler/enabling/_index.md delete mode 100644 content/fr/real_user_monitoring/application_monitoring/browser/setup/client.md delete mode 100644 content/fr/real_user_monitoring/application_monitoring/ios/advanced_configuration.md delete mode 100644 content/ja/profiler/enabling/_index.md delete mode 100644 content/ja/real_user_monitoring/application_monitoring/ios/advanced_configuration.md delete mode 100644 content/ja/real_user_monitoring/application_monitoring/unity/troubleshooting.md delete mode 100644 content/ko/profiler/enabling/_index.md delete mode 100644 content/ko/real_user_monitoring/application_monitoring/ios/advanced_configuration.md diff --git a/.husky/check-cdocs-gitignore.py b/.husky/check-cdocs-gitignore.py index f8f4b803c2f..2a51589c784 100644 --- a/.husky/check-cdocs-gitignore.py +++ b/.husky/check-cdocs-gitignore.py @@ -13,73 +13,110 @@ GITIGNORE_PATH = Path("content/.gitignore") -def get_gitignored_paths(): - """Parse content/.gitignore and return .md file paths.""" +def get_gitignore_patterns(): + """Parse content/.gitignore and return .md file patterns.""" if not GITIGNORE_PATH.exists(): return [] - paths = [] + patterns = [] for line in GITIGNORE_PATH.read_text().splitlines(): stripped = line.strip() if not stripped or stripped.startswith("#"): continue if stripped.endswith(".md"): # Paths in the gitignore are relative to content/, e.g. /en/foo/bar.md - # Convert to repo-relative paths: content/en/foo/bar.md - repo_path = "content" + stripped - paths.append(repo_path) - return paths + # Convert to repo-relative patterns: content/en/foo/bar.md + repo_pattern = "content" + stripped + patterns.append(repo_pattern) + return patterns -def is_tracked(file_path): - """Check if a file is currently tracked by git.""" +def get_tracked_files(pattern): + """Return list of tracked files matching a pattern (may contain globs).""" result = subprocess.run( - ["git", "ls-files", "--error-unmatch", file_path], + ["git", "ls-files", pattern], capture_output=True, text=True, ) - return result.returncode == 0 + if result.returncode != 0 or not result.stdout.strip(): + return [] + return result.stdout.strip().splitlines() + + +def has_mdoc_source(file_path): + """Check if a .mdoc.md source file exists alongside the compiled .md file.""" + mdoc_path = Path(file_path).with_suffix("").with_suffix(".mdoc.md") + return mdoc_path.exists() + + +def classify_tracked_files(tracked): + """Split tracked files into compiled output (has local mdoc) vs orphaned translations.""" + compiled = [] + orphaned = [] + for path in tracked: + if has_mdoc_source(path): + compiled.append(path) + else: + orphaned.append(path) + return compiled, orphaned def main(): - paths = get_gitignored_paths() - if not paths: + patterns = get_gitignore_patterns() + if not patterns: print("✅ No Cdocs paths found in content/.gitignore to check.") sys.exit(0) tracked = [] - for path in paths: - if is_tracked(path): - tracked.append(path) - - if tracked: - err = sys.stderr - print("\n❌ Tracked Cdocs files found!", file=err) - print("=" * 50, file=err) + for pattern in patterns: + tracked.extend(get_tracked_files(pattern)) + + if not tracked: + print("✅ No tracked Cdocs files found. All gitignored files are untracked.") + sys.exit(0) + + compiled, orphaned = classify_tracked_files(tracked) + err = sys.stderr + + print("\n❌ Tracked Cdocs files found!", file=err) + print("=" * 50, file=err) + + if compiled: print( - "\nThe following files are listed in content/.gitignore" - " but are still tracked by git:\n", + "\nThe following compiled Cdocs files are tracked but should not be.\n" + "They have a .mdoc.md source and the compiled output should be untracked:\n", file=err, ) - for path in tracked: + for path in compiled: print(f" - {path}", file=err) - - print("\nTo fix this, run the following commands:\n", file=err) - for path in tracked: + print("\nTo fix, run:\n", file=err) + for path in compiled: print(f" git rm --cached {path}", file=err) - print( - "\nThen commit the result. The files will remain on disk" - " but will no longer be tracked by git.\n", + "\nThe files will remain on disk but will no longer be tracked by git.", file=err, ) - print("=" * 50, file=err) + + if orphaned: print( - f"\nFound {len(tracked)} tracked file(s) that should be untracked." - " Please fix before committing.\n", + "\nThe following files are orphaned translations with no .mdoc.md source.\n" + "The English version is a Cdocs page, so these outdated files should be deleted:\n", file=err, ) - sys.exit(1) + for path in orphaned: + print(f" - {path}", file=err) + print("\nTo fix, run:\n", file=err) + for path in orphaned: + print(f" git rm {path}", file=err) + + print("\n" + "=" * 50, file=err) + total = len(compiled) + len(orphaned) + print( + f"\nFound {total} tracked file(s) that should be untracked or deleted." + " Please fix before committing.\n", + file=err, + ) + sys.exit(1) print("✅ No tracked Cdocs files found. All gitignored files are untracked.") sys.exit(0) diff --git a/content/.gitignore b/content/.gitignore index aec3399366f..7f6c43dd7e1 100644 --- a/content/.gitignore +++ b/content/.gitignore @@ -5,100 +5,100 @@ # This file lists compiled Cdocs files to keep them out of version control. For more information, see the internal Cdocs documentation: https://datadoghq.atlassian.net/wiki/spaces/docs4docs/pages/4898063037/Cdocs+Build -/en/opentelemetry/instrument/dd_sdks/api_support.md -/en/tracing/trace_collection/custom_instrumentation/server-side/_index.md -/en/cloud_cost_management/allocation/container_cost_allocation.md -/en/error_tracking/error_grouping.md -/en/logs/error_tracking/error_grouping.md -/en/real_user_monitoring/error_tracking/error_grouping.md -/en/tracing/error_tracking/error_grouping.md -/en/client_sdks/setup.md -/en/real_user_monitoring/application_monitoring/android/setup.md -/en/real_user_monitoring/application_monitoring/browser/setup/client.md -/en/real_user_monitoring/application_monitoring/flutter/setup.md -/en/real_user_monitoring/application_monitoring/ios/setup.md -/en/real_user_monitoring/application_monitoring/kotlin_multiplatform/setup.md -/en/real_user_monitoring/application_monitoring/react_native/setup/_index.md -/en/real_user_monitoring/application_monitoring/roku/setup.md -/en/real_user_monitoring/application_monitoring/unity/setup.md -/en/real_user_monitoring/application_monitoring/browser/advanced_configuration.md -/en/real_user_monitoring/correlate_with_other_telemetry/profiling/_index.md -/en/real_user_monitoring/guide/proxy-mobile-rum-data.md -/en/real_user_monitoring/guide/proxy-rum-data.md -/en/client_sdks/advanced_configuration.md -/en/real_user_monitoring/application_monitoring/android/advanced_configuration.md -/en/real_user_monitoring/application_monitoring/flutter/advanced_configuration.md -/en/real_user_monitoring/application_monitoring/ios/advanced_configuration.md -/en/real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration.md -/en/real_user_monitoring/application_monitoring/react_native/advanced_configuration.md -/en/real_user_monitoring/application_monitoring/roku/advanced_configuration.md -/en/real_user_monitoring/application_monitoring/unity/advanced_configuration.md -/en/client_sdks/data_collected.md -/en/real_user_monitoring/application_monitoring/android/data_collected.md -/en/real_user_monitoring/application_monitoring/browser/data_collected.md -/en/real_user_monitoring/application_monitoring/flutter/data_collected.md -/en/real_user_monitoring/application_monitoring/ios/data_collected.md -/en/real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected.md -/en/real_user_monitoring/application_monitoring/react_native/data_collected.md -/en/real_user_monitoring/application_monitoring/roku/data_collected.md -/en/real_user_monitoring/application_monitoring/unity/data_collected.md -/en/client_sdks/integrated_libraries.md -/en/real_user_monitoring/application_monitoring/android/integrated_libraries.md -/en/real_user_monitoring/application_monitoring/flutter/integrated_libraries.md -/en/real_user_monitoring/application_monitoring/ios/integrated_libraries.md -/en/real_user_monitoring/application_monitoring/kotlin_multiplatform/integrated_libraries.md -/en/real_user_monitoring/application_monitoring/react_native/integrated_libraries.md -/en/client_sdks/troubleshooting.md -/en/real_user_monitoring/application_monitoring/android/troubleshooting.md -/en/real_user_monitoring/application_monitoring/browser/troubleshooting.md -/en/real_user_monitoring/application_monitoring/flutter/troubleshooting.md -/en/real_user_monitoring/application_monitoring/ios/troubleshooting.md -/en/real_user_monitoring/application_monitoring/kotlin_multiplatform/troubleshooting.md -/en/real_user_monitoring/application_monitoring/react_native/troubleshooting.md -/en/real_user_monitoring/application_monitoring/roku/troubleshooting.md -/en/real_user_monitoring/application_monitoring/unity/troubleshooting.md -/en/real_user_monitoring/application_monitoring/android/frustration_signals.md -/en/real_user_monitoring/application_monitoring/flutter/frustration_signals.md -/en/real_user_monitoring/application_monitoring/ios/frustration_signals.md -/en/real_user_monitoring/application_monitoring/kotlin_multiplatform/frustration_signals.md -/en/real_user_monitoring/application_monitoring/react_native/frustration_signals.md -/en/session_replay/mobile/privacy_options.md -/en/session_replay/mobile/setup_and_configuration.md -/en/synthetics/notifications/template_variables/browser.md -/en/synthetics/notifications/template_variables/mobile.md -/en/synthetics/notifications/template_variables/multistep.md -/en/synthetics/notifications/template_variables/api.md /en/a_demo/stepper.md -/en/dd_e2e/cdocs/_index.md /en/dd_e2e/cdocs/content_filtering.md -/en/dd_e2e/cdocs/components/stepper_closed.md -/en/dd_e2e/cdocs/components/stepper_open.md /en/dd_e2e/cdocs/headings_and_toc.md -/en/dd_e2e/cdocs/components/alert_box.md -/en/dd_e2e/cdocs/components/callout.md -/en/dd_e2e/cdocs/components/check_mark.md -/en/dd_e2e/cdocs/components/code_block.md -/en/dd_e2e/cdocs/components/collapse_content.md -/en/dd_e2e/cdocs/components/definition_list.md -/en/dd_e2e/cdocs/components/image.md -/en/dd_e2e/cdocs/components/region_param.md -/en/dd_e2e/cdocs/components/site_region.md -/en/dd_e2e/cdocs/components/superscript.md -/en/dd_e2e/cdocs/components/table.md -/en/dd_e2e/cdocs/components/tabs.md -/en/dd_e2e/cdocs/components/tooltip.md -/en/dd_e2e/cdocs/components/underline.md -/en/dd_e2e/cdocs/components/video.md -/en/dd_e2e/cdocs/integration/content_filtering.md -/en/dd_e2e/cdocs/integration/headings_and_toc.md -/en/dd_e2e/cdocs/integration/sticky_data.md -/en/dd_e2e/cdocs/integration/conditionally_displayed_filters/hide_if.md -/en/dd_e2e/cdocs/integration/conditionally_displayed_filters/show_if.md -/en/dd_e2e/cdocs/integration/dynamic_options.md -/en/dd_e2e/cdocs/components/glossary_tooltip.md -/en/dd_e2e/cdocs/components/ui.md -/en/dd_e2e/cdocs/components/agent_only.md -/en/dd_e2e/cdocs/components/icon.md /en/agent/tooltip_test.md -/en/experiments/guide/connecting_a_data_warehouse.md -/en/profiler/enabling/_index.md +/*/client_sdks/advanced_configuration.md +/*/client_sdks/data_collected.md +/*/client_sdks/integrated_libraries.md +/*/client_sdks/setup.md +/*/client_sdks/troubleshooting.md +/*/cloud_cost_management/allocation/container_cost_allocation.md +/*/dd_e2e/cdocs/_index.md +/*/dd_e2e/cdocs/components/agent_only.md +/*/dd_e2e/cdocs/components/alert_box.md +/*/dd_e2e/cdocs/components/callout.md +/*/dd_e2e/cdocs/components/check_mark.md +/*/dd_e2e/cdocs/components/code_block.md +/*/dd_e2e/cdocs/components/collapse_content.md +/*/dd_e2e/cdocs/components/definition_list.md +/*/dd_e2e/cdocs/components/glossary_tooltip.md +/*/dd_e2e/cdocs/components/icon.md +/*/dd_e2e/cdocs/components/image.md +/*/dd_e2e/cdocs/components/region_param.md +/*/dd_e2e/cdocs/components/site_region.md +/*/dd_e2e/cdocs/components/stepper_closed.md +/*/dd_e2e/cdocs/components/stepper_open.md +/*/dd_e2e/cdocs/components/superscript.md +/*/dd_e2e/cdocs/components/table.md +/*/dd_e2e/cdocs/components/tabs.md +/*/dd_e2e/cdocs/components/tooltip.md +/*/dd_e2e/cdocs/components/ui.md +/*/dd_e2e/cdocs/components/underline.md +/*/dd_e2e/cdocs/components/video.md +/*/dd_e2e/cdocs/integration/conditionally_displayed_filters/hide_if.md +/*/dd_e2e/cdocs/integration/conditionally_displayed_filters/show_if.md +/*/dd_e2e/cdocs/integration/content_filtering.md +/*/dd_e2e/cdocs/integration/dynamic_options.md +/*/dd_e2e/cdocs/integration/headings_and_toc.md +/*/dd_e2e/cdocs/integration/sticky_data.md +/*/error_tracking/error_grouping.md +/*/experiments/guide/connecting_a_data_warehouse.md +/*/logs/error_tracking/error_grouping.md +/*/opentelemetry/instrument/dd_sdks/api_support.md +/*/profiler/enabling/_index.md +/*/real_user_monitoring/application_monitoring/android/advanced_configuration.md +/*/real_user_monitoring/application_monitoring/android/data_collected.md +/*/real_user_monitoring/application_monitoring/android/frustration_signals.md +/*/real_user_monitoring/application_monitoring/android/integrated_libraries.md +/*/real_user_monitoring/application_monitoring/android/setup.md +/*/real_user_monitoring/application_monitoring/android/troubleshooting.md +/*/real_user_monitoring/application_monitoring/browser/advanced_configuration.md +/*/real_user_monitoring/application_monitoring/browser/data_collected.md +/*/real_user_monitoring/application_monitoring/browser/setup/client.md +/*/real_user_monitoring/application_monitoring/browser/troubleshooting.md +/*/real_user_monitoring/application_monitoring/flutter/advanced_configuration.md +/*/real_user_monitoring/application_monitoring/flutter/data_collected.md +/*/real_user_monitoring/application_monitoring/flutter/frustration_signals.md +/*/real_user_monitoring/application_monitoring/flutter/integrated_libraries.md +/*/real_user_monitoring/application_monitoring/flutter/setup.md +/*/real_user_monitoring/application_monitoring/flutter/troubleshooting.md +/*/real_user_monitoring/application_monitoring/ios/advanced_configuration.md +/*/real_user_monitoring/application_monitoring/ios/data_collected.md +/*/real_user_monitoring/application_monitoring/ios/frustration_signals.md +/*/real_user_monitoring/application_monitoring/ios/integrated_libraries.md +/*/real_user_monitoring/application_monitoring/ios/setup.md +/*/real_user_monitoring/application_monitoring/ios/troubleshooting.md +/*/real_user_monitoring/application_monitoring/kotlin_multiplatform/advanced_configuration.md +/*/real_user_monitoring/application_monitoring/kotlin_multiplatform/data_collected.md +/*/real_user_monitoring/application_monitoring/kotlin_multiplatform/frustration_signals.md +/*/real_user_monitoring/application_monitoring/kotlin_multiplatform/integrated_libraries.md +/*/real_user_monitoring/application_monitoring/kotlin_multiplatform/setup.md +/*/real_user_monitoring/application_monitoring/kotlin_multiplatform/troubleshooting.md +/*/real_user_monitoring/application_monitoring/react_native/advanced_configuration.md +/*/real_user_monitoring/application_monitoring/react_native/data_collected.md +/*/real_user_monitoring/application_monitoring/react_native/frustration_signals.md +/*/real_user_monitoring/application_monitoring/react_native/integrated_libraries.md +/*/real_user_monitoring/application_monitoring/react_native/setup/_index.md +/*/real_user_monitoring/application_monitoring/react_native/troubleshooting.md +/*/real_user_monitoring/application_monitoring/roku/advanced_configuration.md +/*/real_user_monitoring/application_monitoring/roku/data_collected.md +/*/real_user_monitoring/application_monitoring/roku/setup.md +/*/real_user_monitoring/application_monitoring/roku/troubleshooting.md +/*/real_user_monitoring/application_monitoring/unity/advanced_configuration.md +/*/real_user_monitoring/application_monitoring/unity/data_collected.md +/*/real_user_monitoring/application_monitoring/unity/setup.md +/*/real_user_monitoring/application_monitoring/unity/troubleshooting.md +/*/real_user_monitoring/correlate_with_other_telemetry/profiling/_index.md +/*/real_user_monitoring/error_tracking/error_grouping.md +/*/real_user_monitoring/guide/proxy-mobile-rum-data.md +/*/real_user_monitoring/guide/proxy-rum-data.md +/*/session_replay/mobile/privacy_options.md +/*/session_replay/mobile/setup_and_configuration.md +/*/synthetics/notifications/template_variables/api.md +/*/synthetics/notifications/template_variables/browser.md +/*/synthetics/notifications/template_variables/mobile.md +/*/synthetics/notifications/template_variables/multistep.md +/*/tracing/error_tracking/error_grouping.md +/*/tracing/trace_collection/custom_instrumentation/server-side/_index.md diff --git a/content/es/profiler/enabling/_index.md b/content/es/profiler/enabling/_index.md deleted file mode 100644 index 4dd1d79c326..00000000000 --- a/content/es/profiler/enabling/_index.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -aliases: -- /es/tracing/faq/profiling_migration/ -- /es/tracing/profiler/enabling/ -further_reading: -- link: getting_started/profiler - tag: Documentación - text: Empezando con el generador de perfiles -- link: profiler/profile_visualizations - tag: Documentación - text: Más información sobre las visualizaciones de perfiles disponibles -- link: profiler/profiler_troubleshooting - tag: Documentación - text: Solucionar los problemas que surjan al utilizar el generador de perfiles -title: Habilitar el perfilador -type: multi-code-lang ---- - -El generador de perfiles se incluye en las bibliotecas de rastreo de Datadog. Si ya estás utilizando [APM para recopilar trazas (traces)][1] para tu aplicación, puedes omitir la instalación de librería e ir directamente a habilitar el generador de perfiles. - -Selecciona tu lenguaje a continuación para saber cómo activar un generador de perfiles para tu aplicación: - - -{{< partial name="profiling/profiling-languages.html" >}} - - -## Referencias adicionales - -{{< partial name="whats-next/whats-next.html" >}} - - - -[1]: /es/tracing/trace_collection/ diff --git a/content/es/real_user_monitoring/application_monitoring/android/integrated_libraries.md b/content/es/real_user_monitoring/application_monitoring/android/integrated_libraries.md deleted file mode 100644 index afc26ed33c5..00000000000 --- a/content/es/real_user_monitoring/application_monitoring/android/integrated_libraries.md +++ /dev/null @@ -1,153 +0,0 @@ ---- -aliases: -- /es/real_user_monitoring/android/integrated_libraries/ -- /es/real_user_monitoring/mobile_and_tv_monitoring/integrated_libraries/android -- /es/real_user_monitoring/mobile_and_tv_monitoring/android/integrated_libraries -description: Integra bibliotecas populares de Android como Coil, OkHttp y Retrofit - con RUM para monitorizar automáticamente las solicitudes de red y la carga de imágenes. -further_reading: -- link: https://github.com/DataDog/dd-sdk-android - tag: Código fuente - text: Código fuente de dd-sdk-android -title: Bibliotecas de Android y Android TV para RUM ---- - -Esta página enumera las bibliotecas integradas que puedes utilizar para aplicaciones Android y Android TV. - -## Coil (Coroutine Image Loader). - -Si utilizas Coil para cargar imágenes en tu aplicación, consulta la [biblioteca dedicada de Coil][1] de Datadog. - -## Fresco - -Si utilizas Fresco para cargar imágenes en tu aplicación, consulta la [biblioteca dedicada de Fresco][2] de Datadog. - -## Glide - -Si utilizas Glide para cargar imágenes en tu aplicación, consulta la [biblioteca dedicada de Glide][3] de Datadog. - -## Jetpack Compose - -Si utilizas Jetpack Compose en tu aplicación, consulta la [biblioteca dedicada de Jetpack Compose][7] de Datadog. - -## RxJava - -Si utilizas RxJava en tu aplicación, consulta [la biblioteca dedicada de RxJava][8] de Datadog. - -## Picasso - -Si utilizas Picasso, utilízalo con el `OkHttpClient` que ha sido instrumentado con el SDK de Datadog para RUM e información de APM sobre solicitudes de red realizadas por Picasso. - -{{< tabs >}} -{{% tab "Kotlin" %}} - ```kotlin - val picasso = Picasso.Builder(context) - .downloader(OkHttp3Downloader(okHttpClient)) - // ... - .build() - Picasso.setSingletonInstance(picasso) - ``` -{{% /tab %}} -{{% tab "Java" %}} - ```java - final Picasso picasso = new Picasso.Builder(context) - .downloader(new OkHttp3Downloader(okHttpClient)) - // ... - .build(); - Picasso.setSingletonInstance(picasso); - ``` -{{% /tab %}} -{{< /tabs >}} - -## Retrofit - -Si utilizas Retrofit, utilízalo con el `OkHttpClient` que ha sido instrumentado con el SDK de Datadog para RUM e información de APM sobre solicitudes de red realizadas con Retrofit. - -{{< tabs >}} -{{% tab "Kotlin" %}} - ```kotlin - val retrofitClient = Retrofit.Builder() - .client(okHttpClient) - // ... - .build() - ``` -{{% /tab %}} -{{% tab "Java" %}} - ```java - final Retrofit retrofitClient = new Retrofit.Builder() - .client(okHttpClient) - // ... - .build(); - ``` -{{% /tab %}} -{{< /tabs >}} - -## SQLDelight - -Si utilizas SQLDelight en tu aplicación, consulta [biblioteca dedicada de SQLDelight][4] de Datadog. - -## SQLite - -Siguiendo la [documentación de la API generada][5] de SQLiteOpenHelper, solo tienes que proporcionar la implementación de -`DatabaseErrorHandler` -> `DatadogDatabaseErrorHandler` en el constructor. - -De este modo se detecta si una base de datos está dañada y se envía un evento de error -RUM correspondiente. - -{{< tabs >}} -{{% tab "Kotlin" %}} - ```kotlin - class : SqliteOpenHelper( - , - , - , - , - DatadogDatabaseErrorHandler()) { - // ... - - } - ``` -{{% /tab %}} -{{% tab "Java" %}} - ```java - public class extends SqliteOpenHelper { - public (){ - super(, - , - , - , - new DatadogDatabaseErrorHandler()); - } - } - ``` -{{% /tab %}} -{{< /tabs >}} - -## Apollo (GraphQL) - -Si utilizas Kotlin Coroutines, consulta la [biblioteca dedicada con extensiones para Apollo][11] de Datadog y la [configuración de red avanzada de Android][12]. - -## Android TV (Leanback) - -Si utilizas la API de Leanback para añadir acciones a tu aplicación Android TV, consulta [biblioteca dedicada de Android TV][6] de Datadog. - -## Kotlin Coroutines - -Si utilizas Kotlin Coroutines, consulta la [biblioteca dedicada con extensiones para RUM][9] y con [extensiones para traza][10]. - -## Referencias adicionales - -{{< partial name="whats-next/whats-next.html" >}} - -[1]: https://github.com/DataDog/dd-sdk-android/tree/develop/integrations/dd-sdk-android-coil -[2]: https://github.com/DataDog/dd-sdk-android/tree/develop/integrations/dd-sdk-android-fresco -[3]: https://github.com/DataDog/dd-sdk-android/tree/develop/integrations/dd-sdk-android-glide -[4]: https://github.com/DataDog/dd-sdk-android/tree/develop/integrations/dd-sdk-android-sqldelight -[5]: https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper -[6]: https://github.com/DataDog/dd-sdk-android/tree/develop/integrations/dd-sdk-android-tv -[7]: https://github.com/Datadog/dd-sdk-android/tree/develop/integrations/dd-sdk-android-compose -[8]: https://github.com/Datadog/dd-sdk-android/tree/develop/integrations/dd-sdk-android-rx -[9]: https://github.com/Datadog/dd-sdk-android/tree/develop/integrations/dd-sdk-android-rum-coroutines -[10]: https://github.com/Datadog/dd-sdk-android/tree/develop/integrations/dd-sdk-android-trace-coroutines -[11]: https://github.com/DataDog/dd-sdk-android/tree/develop/integrations/dd-sdk-android-apollo -[12]: /es/real_user_monitoring/application_monitoring/android/advanced_configuration?tab=kotlin#apollo-instrumentation \ No newline at end of file diff --git a/content/es/real_user_monitoring/application_monitoring/browser/setup/client.md b/content/es/real_user_monitoring/application_monitoring/browser/setup/client.md deleted file mode 100644 index cd771b55364..00000000000 --- a/content/es/real_user_monitoring/application_monitoring/browser/setup/client.md +++ /dev/null @@ -1,169 +0,0 @@ ---- -aliases: - - /es/real_user_monitoring/setup - - /es/real_user_monitoring/browser/setup/client -description: >- - Configura el SDK del navegador RUM utilizando instrumentación del lado del - cliente con NPM o CDN para monitorear la experiencia del usuario, el - rendimiento y los errores en aplicaciones web. -further_reading: - - link: >- - /real_user_monitoring/application_monitoring/browser/advanced_configuration/ - tag: Documentación - text: Configuración avanzada - - link: /session_replay/browser/ - tag: Documentación - text: Configura la reproducción de sesión - - link: /real_user_monitoring/error_tracking/browser/ - tag: Documentación - text: Configura el seguimiento de errores - - link: /real_user_monitoring/correlate_with_other_telemetry/ - tag: Documentación - text: Correlaciona eventos RUM con otra telemetría -title: Configuración del monitoreo del navegador en el lado del cliente ---- -

Descripción general

El SDK del navegador de Datadog habilita el Real User Monitoring (RUM) para tus aplicaciones web, proporcionando una visibilidad integral de la experiencia del usuario y el rendimiento de la aplicación. Con RUM, puedes monitorear los tiempos de carga de páginas, las interacciones del usuario, la carga de recursos y los errores de la aplicación en tiempo real.

RUM te ayuda a:

  • Monitorea la experiencia del usuario con métricas de rendimiento detalladas para cargas de página, acciones del usuario y solicitudes de recursos
  • Realiza el seguimiento del recorrido del usuario a través de tu aplicación con capacidades de reproducción de sesión
  • Identifica cuellos de botella en el rendimiento y correlaciona el rendimiento del frontend y del backend con trazas de APM

El SDK del navegador es compatible con todos los navegadores modernos de escritorio y móviles y proporciona la recolección automática de métricas clave de rendimiento, interacciones del usuario y errores de la aplicación. Después de la configuración, puedes gestionar tus configuraciones de RUM por aplicación en Datadog y visualizar los datos recolectados en tableros y en el RUM Explorer.

This page describes how to instrument your web applications with the Datadog Browser SDK. The Browser SDK supports Real User Monitoring (RUM), Error Tracking, Session Replay, and Product Analytics.

The Browser SDK supports all modern desktop and mobile browsers.

Setup

Choose your setup method:

  • Server-side auto-instrumentation: Automatically inject the RUM SDK into HTML responses through your web server or proxy.
  • Agentic Onboarding (in Preview): Use AI coding agents (Cursor, Claude Code) to automatically instrument your application with one prompt.
  • Manual client-side setup (below): Manually add the SDK to your application code.

Manual client-side setup

Create the application in the UI

  1. In Datadog, navigate to Digital Experience > Add an Application and select the JavaScript (JS) application type.
  2. Enter a name for your application, then click Create Application. This generates a clientToken and an applicationId for your application.

Install the Browser SDK

Choose the installation method for the Browser SDK.

- -

Installing through Node Package Manager (npm) registry is recommended for modern web applications. The Browser SDK is packaged with the rest of your frontend JavaScript code. It has no impact on page load performance. However, the SDK may miss errors, resources, and user actions triggered before the SDK is initialized. Datadog recommends using a matching version with the Browser Logs SDK.

Add @datadog/browser-rum to your package.json file, for example if you use npm cli:

npm install --save @datadog/browser-rum
-

Installing through CDN async is recommended for web applications with performance targets. The Browser SDK loads from Datadog's CDN asynchronously, ensuring the SDK download does not impact page load performance. However, the SDK may miss errors, resources, and user actions triggered before the SDK is initialized.

Add the generated code snippet to the head tag of every HTML page you want to monitor in your application.

<script>
-  (function(h,o,u,n,d) {
-    h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
-    d=o.createElement(u);d.async=1;d.src=n,d.crossOrigin=''
-    n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
-  })(window,document,'script','https://www.datadoghq-browser-agent.com/us1/v7/datadog-rum.js','DD_RUM')
-</script>
-
<script>
-  (function(h,o,u,n,d) {
-    h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
-    d=o.createElement(u);d.async=1;d.src=n,d.crossOrigin=''
-    n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
-  })(window,document,'script','https://www.datadoghq-browser-agent.com/eu/v7/datadog-rum.js','DD_RUM')
-</script>
-
<script>
-  (function(h,o,u,n,d) {
-    h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
-    d=o.createElement(u);d.async=1;d.src=n,d.crossOrigin=''
-    n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
-  })(window,document,'script','https://www.datadoghq-browser-agent.com/ap1/v7/datadog-rum.js','DD_RUM')
-</script>
-
<script>
-  (function(h,o,u,n,d) {
-    h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
-    d=o.createElement(u);d.async=1;d.src=n,d.crossOrigin=''
-    n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
-  })(window,document,'script','https://www.datadoghq-browser-agent.com/ap2/v7/datadog-rum.js','DD_RUM')
-</script>
-
<script>
-  (function(h,o,u,n,d) {
-    h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
-    d=o.createElement(u);d.async=1;d.src=n,d.crossOrigin=''
-    n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
-  })(window,document,'script','https://www.datadoghq-browser-agent.com/us3/v7/datadog-rum.js','DD_RUM')
-</script>
-
<script>
-  (function(h,o,u,n,d) {
-    h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
-    d=o.createElement(u);d.async=1;d.src=n,d.crossOrigin=''
-    n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
-  })(window,document,'script','https://www.datadoghq-browser-agent.com/us5/v7/datadog-rum.js','DD_RUM')
-</script>
-
<script>
-  (function(h,o,u,n,d) {
-    h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
-    d=o.createElement(u);d.async=1;d.src=n,d.crossOrigin=''
-    n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
-  })(window,document,'script','https://www.datadoghq-browser-agent.com/datadog-rum-v7.js','DD_RUM')
-</script>
-

Installing through CDN sync is recommended for collecting all events. The Browser SDK loads from Datadog's CDN synchronously, ensuring the SDK loads first and collects all errors, resources, and user actions. This method may impact page load performance.

Add the generated code snippet to the head tag (in front of any other script tags) of every HTML page you want to monitor in your application. Placing the script tag higher and loading it synchronously ensures Datadog RUM can collect all performance data and errors.

<script
-    src="https://www.datadoghq-browser-agent.com/us1/v7/datadog-rum.js"
-    type="text/javascript"
-    crossorigin>
-</script>
-
<script
-    src="https://www.datadoghq-browser-agent.com/eu/v7/datadog-rum.js"
-    type="text/javascript"
-    crossorigin>
-</script>
-
<script
-    src="https://www.datadoghq-browser-agent.com/ap1/v7/datadog-rum.js"
-    type="text/javascript"
-    crossorigin>
-</script>
-
<script
-    src="https://www.datadoghq-browser-agent.com/ap2/v7/datadog-rum.js"
-    type="text/javascript"
-    crossorigin>
-</script>
-
<script
-    src="https://www.datadoghq-browser-agent.com/us3/v7/datadog-rum.js"
-    type="text/javascript"
-    crossorigin>
-</script>
-
<script
-    src="https://www.datadoghq-browser-agent.com/us5/v7/datadog-rum.js"
-    type="text/javascript"
-    crossorigin>
-</script>
-
<script
-    src="https://www.datadoghq-browser-agent.com/datadog-rum-v7.js"
-    type="text/javascript">
-</script>
-
-

Initialize the Browser SDK

The SDK should be initialized as early as possible in the app lifecycle. This ensures all measurements are captured correctly.

In the initialization snippet, set an environment name, service name, and client token. See the full list of initialization parameters.

- -
import { datadogRum } from '@datadog/browser-rum';
-
-datadogRum.init({
-   applicationId: '<APP_ID>',
-   clientToken: '<CLIENT_TOKEN>',
-   // `site` refers to the Datadog site parameter of your organization
-   // see https://docs.datadoghq.com/getting_started/site/
-   site: '<DATADOG_SITE>',
-  //  service: 'my-web-application',
-  //  env: 'production',
-  //  version: '1.0.0',
-});
-
-

Types are compatible with TypeScript >= 3.8.2. For earlier versions of TypeScript, import JavaScript sources and use global variables to avoid any compilation issues.

import '@datadog/browser-rum/bundle/datadog-rum'
-
-window.DD_RUM.init({
-  ...
-})
-
<script>
-  window.DD_RUM.onReady(function() {
-    window.DD_RUM.init({
-      clientToken: '<CLIENT_TOKEN>',
-      applicationId: '<APP_ID>',
-      // `site` refers to the Datadog site parameter of your organization
-      // see https://docs.datadoghq.com/getting_started/site/
-      site: '<DATADOG_SITE>',
-      //  service: 'my-web-application',
-      //  env: 'production',
-      //  version: '1.0.0',
-    });
-  })
-</script>
-
<script>
-    window.DD_RUM && window.DD_RUM.init({
-      clientToken: '<CLIENT_TOKEN>',
-      applicationId: '<APP_ID>',
-      // `site` refers to the Datadog site parameter of your organization
-      // see https://docs.datadoghq.com/getting_started/site/
-      site: '<DATADOG_SITE>',
-      //  service: 'my-web-application',
-      //  env: 'production',
-      //  version: '1.0.0',
-
-    });
-</script>
-
-

To be compliant with GDPR, CCPA, and similar regulations, the Browser SDK lets you provide the tracking consent value at initialization.

Configure Content Security Policy (CSP)

If you're using the Datadog Content Security Policy (CSP) integration on your site, see the CSP documentation for additional setup steps.

Establecer tasas de muestreo de sesiones

Para controlar los datos que tu aplicación envía a Datadog RUM, puedes especificar una tasa de muestreo para las sesiones RUM al inicializar el SDK del navegador. Por ejemplo, para muestrear el 80% de las sesiones, establece sessionSampleRate en 80:

datadogRum.init({
-  applicationId: '<APP_ID>',
-  clientToken: '<CLIENT_TOKEN>',
-  site: '<DATADOG_SITE>',
-  sessionSampleRate: 80,
-  sessionReplaySampleRate: 20,
-  // ... other configuration options
-});
-

Para más información, consulte Browser RUM & Session Replay Sampling.

Comienza a monitorear tu aplicación

Ahora que has completado la configuración básica para RUM, tu aplicación está recopilando errores del navegador y puedes comenzar a monitorear y depurar problemas en tiempo real.

Visualiza los datos recopilados en tableros o crea una consulta de búsqueda en el RUM Explorer.

Tu aplicación aparece como pendiente en la página de Aplicaciones hasta que Datadog comience a recibir datos.

Próximos pasos

Consulta Configuración Avanzada.

Further reading

-
\ No newline at end of file diff --git a/content/es/real_user_monitoring/application_monitoring/browser/troubleshooting.md b/content/es/real_user_monitoring/application_monitoring/browser/troubleshooting.md deleted file mode 100644 index 465b7315476..00000000000 --- a/content/es/real_user_monitoring/application_monitoring/browser/troubleshooting.md +++ /dev/null @@ -1,157 +0,0 @@ ---- -aliases: -- /es/real_user_monitoring/browser/troubleshooting/ -description: Solucionar problemas comunes con el SDK de RUM Browser incluyendo datos - perdidos, bloqueadores de anuncios, restricciones de red y problemas de configuración. -further_reading: -- link: https://www.datadoghq.com/blog/real-user-monitoring-with-datadog/ - tag: Blog - text: Real User Monitoring -- link: /integrations/content_security_policy_logs/ - tag: Documentación - text: Política de seguridad de contenido -title: Solucionar problemas ---- - -Si experimentas algún comportamiento inesperado con Datadog Browser RUM, utiliza esta guía para resolver los problemas rápidamente. Si sigues teniendo problemas, contacta con el [equipo de asistencia de Datadog][1] para obtener más ayuda. Actualiza con regularidad el [SDK del RUM Browser][2] a la última versión, ya que cada nueva versión contiene mejoras y correcciones. - -## Datos faltantes - -Si no puedes ver ningún dato en RUM o si faltan datos de algún usuario: - -| Causas más frecuentes | Solución recomendada | -| ----------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Los bloqueadores de anuncios impiden que el SDK del RUM Browser se descargue o envíe datos a Datadog. | Algunos bloqueadores de anuncios amplían sus restricciones a las herramientas de rastreo de rendimiento y marketing. Consulta los documentos [Instalar el SDK del RUM Browser con npm][3] y [reenviar los datos recopilados a través de un proxy][4]. | -| Las reglas de red, las VPN o el software antivirus pueden impedir que se descargue el SDK del RUM Browser o que se envíen datos a Datadog. | Permite el acceso a los endpoints necesarios para descargar el SDK del RUM Browser o para enviar datos. La lista de endpoints está disponible en la [documentación sobre la Política de seguridad de contenido][5]. | -| Los scripts, paquetes y clientes inicializados antes del SDK del RUM Browser pueden provocar que se pierdan logs, recursos y acciones del usuario. Por ejemplo, inicializar ApolloClient antes que el SDK del RUM Browser puede provocar que las solicitudes `graphql` no se registren como recursos XHR en el RUM Explorer. | Check dónde se inicializa el SDK de RUM Browser y plantéate adelantar este paso en la ejecución del código de tu aplicación. | -| Si has configurado `trackViewsManually: true` y observas que no hay sesiones, es posible que la aplicación haya dejado de enviar información RUM repentinamente aunque no haya errores de red. | Asegúrate de iniciar una vista inicial una vez que hayas inicializado RUM para evitar cualquier pérdida de datos. Consulta [Configuración avanzada][6] para obtener más información.| - -Lee las [directrices de la política de seguridad de contenido][5] y asegúrate de que tu sitio web permita el acceso al CDN del SDK del RUM Browser y al endpoint de ingesta. - -## Problemas al ejecutar varias herramientas RUM en la misma aplicación - -Datadog solo admite un SDK por aplicación. Para garantizar una recopilación de datos óptima y la plena funcionalidad de todas las características del SDK de Datadog RUM, utiliza únicamente el SDK de Datadog RUM. - -### Inicialización del SDK del RUM Browser - -Check si el SDK del RUM Browser se inicializa ejecutando `window.DD_RUM.getInternalContext()` en la consola de tu navegador y verifica que se devuelvan `application_id`, `session_id` y el objeto de vista: - -{{< img src="real_user_monitoring/browser/troubleshooting/success_rum_internal_context.png" alt="El comando de obtención de contexto interno se ejecutó correctamente">}} - -Si el SDK del RUM Browser no está instalado o si no se inicializa correctamente, puedes ver el error `ReferenceError: DD_RUM is not defined` como el que se muestra a continuación: - -{{< img src="real_user_monitoring/browser/troubleshooting/error_rum_internal_context.png" alt="Error al obtener el comando de contexto interno">}} - -También puedes check la consola de herramientas de desarrollo de tu navegador o la pestaña de red si observas algún error relacionado con la carga del SDK del RUM Browser. - -**Nota**: Para garantizar resultados precisos, configura `sessionSampleRate` en 100. Para obtener más información, consulta [Configurar la configuración de Browser RUM y Browser RUM & Session Replay Sampling][9]. - -### Datos a la ingesta de Datadog - - -El SDK de RUM envía lotes de datos de eventos a la ingesta de Datadog cada vez que se cumple una de estas condiciones: - -- Cada 30 segundos -- Cuando se hayan alcanzado 50 eventos -- Cuando la carga útil sea >16 kB -- En `visibility:hidden` o `beforeUnload` - -Si se están enviando datos, deberías ver las solicitudes de red dirigidas a `api/v2/rum` (la parte del origen de la URL puede diferir debido a la configuración de RUM) en la sección Red de las herramientas de desarrollo de tu navegador: - -{{< img src="real_user_monitoring/browser/troubleshooting/network_intake-1.png" alt="Solicitudes de RUM a la entrada de Datadog">}} - -## Cookies de RUM - -El SDK del RUM Browser utiliza cookies para almacenar información de sesiones y seguir una [sesión de usuario][7] a través de diferentes páginas. Las cookies son de origen (se configuran en tu dominio) y no se utilizan para el rastreo entre sitios. Estas son las cookies configuradas por el SDK del RUM Browser. - -| Nombre de la cookie | Información | -| ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `_dd_s` | Cookie utilizada para agrupar todos los eventos generados a partir de una única sesión de usuario a través de múltiples páginas. Contiene el ID de sesión actual, si la sesión está excluida debido al muestreo y la fecha de expiración de la sesión. La cookie se prolonga 15 minutos más cada vez que el usuario interactúa con el sitio web, hasta la duración máxima de la sesión de usuario (4 horas).| -| `dd_site_test_*` | Cookie temporal utilizada para realizar un test de la compatibilidad con cookies. Caduca al instante. | -| `dd_cookie_test_*` | Cookie temporal utilizada para realizar un test de la compatibilidad con cookies. Caduca al instante. | - -**Nota**: Las cookies `_dd_l`, `_dd_r` y `_dd` se han sustituido con la `_dd_s` en versiones recientes del SDK del RUM Browser. - -## Identificadores de sesiones, cookies y aplicaciones RUM - -Existe una relación de uno a uno entre una sesión RUM y la aplicación RUM a la que pertenece. Por lo tanto, el dominio configurado para la cookie `_dd_s` está totalmente dedicado a la aplicación RUM que está monitorizando y no puede monitorizar ninguna aplicación adicional. - -## Limitaciones técnicas - -Cada evento enviado por el SDK del RUM Browser se crea con lo siguiente: - -- Contexto global del RUM -- Contexto del evento (si lo hay) -- Atributos específicos del evento - -Ejemplo: - -```javascript -window.DD_RUM && window.DD_RUM.setGlobalContextProperty('global', {'foo': 'bar'}) -window.DD_RUM && window.DD_RUM.addAction('hello', {'action': 'qux'}) -``` - -El código del ejemplo crea el siguiente evento de acción: - -```json -{ - "type": "action", - "context": { - "global": { - "foo": "bar" - }, - "action": "qux" - }, - "action": { - "id": "xxx", - "target": { - "name": "hello" - }, - "type": "custom" - }, - ... -} -``` - -Si un evento o una solicitud supera las [limitaciones técnicas del RUM enumeradas][16], es rechazado por la admisión de Datadog. - -## Advertencia "Customer data exceeds the recommended threshold" - -El SDK del navegador RUM permite configurar el [contexto global][10], la [información del usuario][11] y las [marcas de funciones][12] que luego se incluyen con los eventos recopilados. - -Para minimizar el impacto en el ancho de banda del usuario, el SDK del navegador RUM limita los datos enviados a la ingesta de Datadog. Sin embargo, el envío de grandes volúmenes de datos puede afectar al rendimiento de los usuarios con conexiones a Internet lentas. - -Para una mejor experiencia de usuario, Datadog recomienda mantener el tamaño del contexto global, la información del usuario y las marcas de funciones por debajo de 3 KiB. Si los datos superan este límite, se mostrará una advertencia: `The data exceeds the recommended 3KiB threshold.` - -Desde v5.3.0, el SDK del RUM Browser admite la compresión de datos a través de `compressIntakeRequest` [parámetro de inicialización][13]. Cuando está activado, este límite recomendado se amplía de 3 KiB a 16 KiB. - -## Advertencia de bloqueo de lectura de origen cruzado - -En los navegadores de Chromium, cuando el SDK del RUM Browser envía datos a la ingesta de Datadog, se muestra una advertencia CORB en la consola: `Cross-Origin Read Blocking (CORB) blocked cross-origin response`. - -La advertencia se muestra porque la ingesta devuelve un objeto JSON no vacío. Este comportamiento es un problema reportado [de Chromium][8]. No afecta al SDK del RUM Browser y se lo puede ignorar en forma segura. - -## Advertencia "Deobfuscation failed" - -Aparece una advertencia cuando falla el desenmascaramiento de un stack trace. Si el stack trace no está enmascarado para empezar, puedes ignorar esta advertencia. De lo contrario, utiliza la [página Símbolos de depuración de RUM][14] para ver todos tus mapas fuente subidos. Consulta [Investigar stack traces enmascarados con símbolos de depuración de RUM][15]. - -## Referencias adicionales - -{{< partial name="whats-next/whats-next.html" >}} - -[1]: /es/help -[2]: https://github.com/DataDog/browser-sdk/blob/main/CHANGELOG.md -[3]: /es/real_user_monitoring/application_monitoring/browser/setup/#npm -[4]: /es/real_user_monitoring/guide/proxy-rum-data/ -[5]: /es/integrations/content_security_policy_logs/#use-csp-with-real-user-monitoring-and-session-replay -[6]: /es/real_user_monitoring/application_monitoring/browser/advanced_configuration/?tab=npm#override-default-rum-view-names -[7]: /es/real_user_monitoring/application_monitoring/browser/data_collected/?tab=session -[8]: https://bugs.chromium.org/p/chromium/issues/detail?id=1255707 -[9]: /es/real_user_monitoring/guide/sampling-browser-plans/ -[10]: /es/real_user_monitoring/application_monitoring/browser/advanced_configuration/?tab=npm#global-context -[11]: /es/real_user_monitoring/application_monitoring/browser/advanced_configuration/?tab=npm#user-session -[12]: /es/real_user_monitoring/guide/setup-feature-flag-data-collection/?tab=browser -[13]: /es/real_user_monitoring/application_monitoring/browser/setup/#initialization-parameters -[14]: https://app.datadoghq.com/source-code/setup/rum -[15]: /es/real_user_monitoring/guide/debug-symbols -[16]: /es/real_user_monitoring/#technical-limitations \ No newline at end of file diff --git a/content/es/real_user_monitoring/application_monitoring/flutter/integrated_libraries.md b/content/es/real_user_monitoring/application_monitoring/flutter/integrated_libraries.md deleted file mode 100644 index 665a8491d26..00000000000 --- a/content/es/real_user_monitoring/application_monitoring/flutter/integrated_libraries.md +++ /dev/null @@ -1,279 +0,0 @@ ---- -aliases: -- /es/real_user_monitoring/flutter/integrated_libraries/ -- /es/real_user_monitoring/mobile_and_tv_monitoring/integrated_libraries/flutter -- /es/real_user_monitoring/mobile_and_tv_monitoring/flutter/integrated_libraries -description: Integre bibliotecas populares de Flutter con el kit de desarrollo de - software (SDK) de RUM para la monitorización automática de las solicitudes HTTP, - la navegación y otras funciones de la aplicación. -further_reading: -- link: https://github.com/DataDog/dd-sdk-flutter - tag: Código source (fuente) - text: Código source (fuente) de dd-sdk-flutter -title: Bibliotecas de Flutter para RUM ---- - -Esta página enumera las bibliotecas integradas que puedes utilizar para las aplicaciones Flutter. - -## Enrutamiento y seguimiento automático de vistas - -Si utilizas Flutter Navigator v2.0, tu configuración para el seguimiento automático de vistas varía en función de tu middleware de enrutamiento. En esta sección, se explica cómo integrarlo con los paquetes de enrutamiento más populares. - -### go_router - -Dado que [go_router][2] utiliza la misma interfaz de observador que Flutter Navigator v1, puedes añadir `DatadogNavigationObserver` a otros observadores como parámetro de `GoRouter`. - -```dart -final _router = GoRouter( - routes: [ - // Tu información de ruta aquí - ], - observers: [ - DatadogNavigationObserver(datadogSdk: DatadogSdk.instance), - ], -); -MaterialApp.router( - routerConfig: _router, - // Tu configuración restante -); -``` - -Si estás usando ShellRoutes, debes suministrar un observador separado a cada `ShellRoute`, como se muestra a continuación. Consulta [este error][3] para obtener más información. - -```dart -final _router = GoRouter( - routes: [ - ShellRoute(build: shellBuilder), - routes: [ - // Additional routes - ], - observers: [ - DatadogNavigationObserver(datadogSdk: DatadogSdk.instance), - ], - ], - observers: [ - DatadogNavigationObserver(datadogSdk: DatadogSdk.instance), - ], -); -MaterialApp.router( - routerConfig: _router, - // Your remaining setup -); -``` - -Además, si estás utilizando el parámetro `pageBuilder` de `GoRoute` sobre su parámetro `builder`, asegúrate de que estás pasando el valor `state.pageKey` y el valor `name` a tu `MaterialPage`. - -```dart -GoRoute( - name: 'My Home', - path: '/path', - pageBuilder: (context, state) { - return MaterialPage( - key: state.pageKey, // Necesario para que GoRouter llame a Observers - name: name, // Necesario para que Datadog obtenga el nombre de ruta correcto - child: _buildContent(), - ); - }, -), -``` - -### AutoRoute - -[AutoRoute][4] puede utilizar un `DatadogNavigationObserver` proporcionado como uno de los `navigatorObservers` como parte de su método de `config`. - -```dart -return MaterialApp.router( - routerConfig: _router.config( - navigatorObservers: () => [ - DatadogNavigationObserver( - datadogSdk: DatadogSdk.instance, - ), - ], - ), - // Tu configuración restante -); -``` - -Sin embargo, si utilizas el enrutamiento de pestaña de AutoRoute, deberás ampliar el observador predeterminado de Datadog con la interfaz `AutoRouteObserver` de AutoRoute. - -```dart -class DatadogAutoRouteObserver extends DatadogNavigationObserver - implements AutoRouterObserver { - DatadogAutoRouteObserver({required super.datadogSdk}); - - // solo sobreescribe las rutas de la pestaña del observador - @override - void didInitTabRoute(TabPageRoute route, TabPageRoute? previousRoute) { - datadogSdk.rum?.startView(route.path, route.name); - } - - @override - void didChangeTabRoute(TabPageRoute route, TabPageRoute previousRoute) { - datadogSdk.rum?.startView(route.path, route.name); - } -} -``` - -Este nuevo objeto sustituye al `DatadogNavigationObserver` más sencillo. - -### Beamer - -[Beamer][5] puede utilizar `DatadogNavigationObserver` como argumento para `BeamerDelegate`: - -```dart -final routerDelegate = BeamerDelegate( - locationBuilder: RoutesLocationBuilder( - routes: { - // Tu configuración de ruta - }, - ), - navigatorObservers: [ - DatadogNavigationObserver(DatadogSdk.instance), - ] -); -``` - -## Seguimiento de vistas web - -Real User Monitoring (RUM) te permite monitorizar vistas web y eliminar puntos ciegos en tus aplicaciones móviles híbridas. - -El SDK de Flutter de Datadog tiene paquetes para trabajar tanto con [`webview_flutter`][8] como con [`flutter_inappwebview`][9]. Para obtener más información, consulta la [página de documentación del seguimiento de vistas web][10]. - -## gRPC - -Datadog proporciona [`datadog_grpc_interceptor`][6] para su uso con el [paquete de grpc Flutter][7]. El interceptor gRPC rastrea automáticamente las solicitudes gRPC como recursos de RUM y permite el rastreo distribuido con APM. - -### Configuración - -Añade `datadog_grpc_interceptor` a tu `pubspec.yaml` o ejecuta `flutter pub add datadog_grpc_interceptor` desde tu terminal: - -```yaml -dependencies: - # Other dependencies - datadog_grpc_interceptor: ^1.1.0 -``` - -Para utilizar este complemento, crea una instancia de `DatadogGrpcInterceptor`, luego pásala a tu cliente gRPC generado: - -```dart -import 'package:datadog_grpc_interceptor/datadog_grpc_interceptor.dart' - -// Initialize Datadog - be sure to set the [DatadogConfiguration.firstPartyHosts] member -// Enable Datadog Distributed Tracing -final config = DatadogConfiguration( - // ... - firstPartyHosts = ['localhost'] -) - -// Create the gRPC channel -final channel = ClientChannel( - 'localhost', - port: 50051, - options: ChannelOptions( - // ... - ), -); - -// Create the gRPC interceptor with the supported channel -final datadogInterceptor = DatadogGrpcInterceptor(DatadogSdk.instance, channel); - -// Create the gRPC client, passing in the Datadog interceptor -final stub = GreeterClient(channel, interceptors: [datadogInterceptor]); -``` - -## GraphQL (gql_link) - -Datadog proporciona [`datadog_gql_link`][1] para su uso con la mayoría de bibliotecas de GraphQL Flutter, incluyendo `graphql_flutter` y `ferry`. El enlace rastrea automáticamente las solicitudes GraphQL como recursos de RUM, añade nombres de consulta, nombres de mutación y variables como atributos del recurso y permite el rastreo distribuido en APM. - -### Configuración - -Añade `datadog_gql_link` a tu `pubspec.yaml` o ejecuta `flutter pub add datadog_gql_link` desde tu terminal: - -```yaml -dependencies: - # Other dependencies - datadog_gql_link: ^1.0.0 -``` - -Cuando creas tu enlace GraphQL, añade el `DatadogGqlLink` encima de tu enlace de terminación. Por ejemplo: - -```dart -final graphQlUrl = "https://example.com/graphql"; - -final link = Link.from([ - DatadogGqlLink(DatadogSdk.instance, Uri.parse(graphQlUrl)), - HttpLink(graphQlUrl), -]); -``` - -Si estás rastreando llamadas a redes que no sean GraphQL con `datadog_tracking_http_client`, debes configurar el complemento de rastreo para ignorar las solicitudes a tu endpoint de GraphQL. De lo contrario, los recursos de GraphQL se reportan dos veces, y las trazas de APM pueden romperse. Ignora tu endpoints de GraphQL usando el parámetro `ignoreUrlPatterns` añadido a `datadog_tracking_http_client` versión 2.1.0. - -```dart -final datadogConfig = DatadogConfiguration( - // Tu configuración - )..enableHttpTracking( - ignoreUrlPatterns: [ - RegExp('example.com/graphql'), - ], - ); -``` - -## Dio - -
-Para la mayoría de las configuraciones de Dio, utiliza Datadog Tracking Http Client en lugar del interceptor Dio especializado. Solo utiliza el interceptor Dio si estás utilizando un HttpClientAdapter de Dio no estándar que no se puede rastrear con Datadog Tracking Http Client. -
- -Datadog proporciona [`datadog_dio`][6] para su uso con el [paquete Dio Flutter][7]. El interceptor de Dio rastrea automáticamente las solicitudes de un cliente de Dio dado como recursos de RUM y permite el rastreo distribuido con APM. - -### Instalación - -Añade `datadog_dio` a tu `pubspec.yaml` o ejecutando `flutter pub add datadog_dio` desde tu terminal: - -```yaml -dependencies: - # Other dependencies - datadog_dio: ^1.0.0 -``` - -Para utilizar este complemento, llama a `addDatadogInterceptor` al final de la inicialización de tu Dio: - -```dart -import 'package:datadog_dio/datadog_dio.dart' - -// Initialize Datadog - be sure to set the [DatadogConfiguration.firstPartyHosts] member -// Enable Datadog Distributed Tracing -final config = DatadogConfiguration( - // ... - firstPartyHosts = ['localhost'] -) - -// Create our Dio client -final dio = Dio() - // Dio configuration... - ..addDatadogInterceptor(DatadogSdk.instance); -``` - -Al llamar a `addDatadogInterceptor` se añade el interceptor de Datadog como el primer interceptor de tu lista. Esto asegura que todas las solicitudes de red de Dio se envíen a Datadog, ya que otros interceptores pueden no reenviar la información hacia abajo en la cadena. Llama a `addDatadogInterceptor` después de finalizar el resto de la configuración de Dio. - -### Utilización con otro rastreo de red de Datadog - -Para rastrear todas las solicitudes de red, incluidas las realizadas por `dart:io` y widgets como `NetworkImage`, utiliza `datadog_tracking_http_client` para capturar estas solicitudes. Sin embargo, según tu configuración, el método de sustitución global utilizado en `enableHttpTracking` puede hacer que los recursos se informen doblemente (una vez por la sustitución global y otra por el interceptor de Dio) - -Para evitar esto, utiliza el parámetro `ignoreUrlPatterns` cuando llames a `enableHttpTracking` para ignorar las solicitudes realizadas por tu cliente Dio. - -## Referencias adicionales - -{{< partial name="whats-next/whats-next.html" >}} - -[1]: https://pub.dev/packages/datadog_gql_link -[2]: https://pub.dev/packages?q=go_router -[3]: https://github.com/flutter/flutter/issues/112196 -[4]: https://pub.dev/packages/auto_route -[5]: https://pub.dev/packages/beamer -[6]: https://pub.dev/packages/datadog_grpc_interceptor -[7]: https://pub.dev/packages/grpc -[8]: https://pub.dev/packages/webview_flutter -[9]: https://pub.dev/packages/flutter_inappwebview -[10]: /es/real_user_monitoring/application_monitoring/web_view_tracking?tab=flutter -[11]: https://pub.dev/packages/datadog_dio \ No newline at end of file diff --git a/content/es/real_user_monitoring/application_monitoring/ios/advanced_configuration.md b/content/es/real_user_monitoring/application_monitoring/ios/advanced_configuration.md deleted file mode 100644 index 483bb5e51fe..00000000000 --- a/content/es/real_user_monitoring/application_monitoring/ios/advanced_configuration.md +++ /dev/null @@ -1,1139 +0,0 @@ ---- -aliases: -- /es/real_user_monitoring/ios/advanced_configuration -- /es/real_user_monitoring/mobile_and_tv_monitoring/advanced_configuration/ios -- /es/real_user_monitoring/mobile_and_tv_monitoring/ios/advanced_configuration -description: Configura los ajustes avanzados del SDK de RUM para iOS para enriquecer - las sesiones de usuario, rastrear eventos personalizados y controlar la recopilación - de datos para obtener mejores insights. -further_reading: -- link: https://github.com/DataDog/dd-sdk-ios - tag: Source Code - text: Código fuente de dd-sdk-ios -- link: /real_user_monitoring - tag: Documentation - text: RUM y reproducción de sesión -- link: /real_user_monitoring/application_monitoring/ios/supported_versions/ - tag: Documentation - text: Versiones compatibles para el seguimiento de RUM en iOS y tvOS -- link: https://github.com/DataDog/dd-sdk-ios-apollo-interceptor - tag: Source Code - text: Integración de Datadog para Apollo en iOS -title: Configuración Avanzada de iOS ---- -Si aún no has configurado el SDK de RUM para iOS, sigue las [instrucciones de configuración en la aplicación][1] o consulta la [documentación de configuración de RUM para iOS][2]. - -## Enriquecer las sesiones de usuario - -El RUM para iOS rastrea automáticamente atributos como la actividad del usuario, pantallas, errores y solicitudes de red. Consulta la [documentación de Recopilación de Datos de RUM][3] para aprender sobre los eventos de RUM y los atributos predeterminados. Puedes enriquecer aún más la información de la sesión de usuario y obtener un control más fino sobre los atributos recopilados al rastrear eventos personalizados. - -### Visualizaciones personalizadas - -Además de [rastrear visualizaciones automáticamente](#automatically-track-views), también puedes rastrear visualizaciones distintas específicas, como `viewControllers` cuando se vuelven visibles e interactivas. Detén el rastreo cuando la visualización ya no sea visible utilizando los siguientes métodos en `RUMMonitor.shared()`: - -- `.startView(viewController:)` -- `.stopView(viewController:)` - -Por ejemplo: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogRUM - -// in your `UIViewController`: -let rum = RUMMonitor.shared() - -override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - rum.startView(viewController: self) -} - -override func viewDidDisappear(_ animated: Bool) { - super.viewDidDisappear(animated) - rum.stopView(viewController: self) -} -``` - -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -@import DatadogRUM; -// in your `UIViewController`: - -DDRUMMonitor *rum = [DDRUMMonitor shared]; - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - - [rum startViewWithViewController:self name:nil attributes:nil]; -} - -- (void)viewDidDisappear:(BOOL)animated { - [super viewDidDisappear:animated]; - - [rum stopViewWithViewController:self attributes:nil]; -} -``` -{{% /tab %}} -{{< /tabs >}} - -Para más detalles y opciones disponibles, consulte [`RUMMonitorProtocol` en GitHub][4]. - -### Acciones personalizadas - -Además de [ rastrear acciones automáticamente](#automatically-track-user-actions), también puedes rastrear acciones personalizadas específicas de los usuarios (toques, clics y desplazamientos) con la API de `addAction(type:name:)`. - -Para registrar manualmente acciones instantáneas de RUM como `.tap` en `RUMMonitor.shared()`, use `.addAction(type:name:)`. Para acciones continuas de RUM como `.scroll`, use `.startAction(type:name:)` o `.stopAction(type:)`. - -Por ejemplo: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogRUM - -// in your `UIViewController`: - -let rum = RUMMonitor.shared() - -@IBAction func didTapDownloadResourceButton(_ sender: UIButton) { - rum.addAction( - type: .tap, - name: sender.currentTitle ?? "" - ) -} -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -- (IBAction)didTapDownloadResourceButton:(UIButton *)sender { - NSString *name = sender.currentTitle ? sender.currentTitle : @""; - [[DDRUMMonitor shared] addActionWithType:DDRUMActionTypeTap name:name attributes:@{}]; -} -``` -{{% /tab %}} -{{< /tabs >}} - -**Nota**: Al usar `.startAction(type:name:)` y `.stopAction(type:)`, la acción `type` debe ser la misma. Esto es necesario para que el SDK de RUM de iOS coincida el inicio de una acción con su finalización. - -Para más detalles y opciones disponibles, consulte [`RUMMonitorProtocol` en GitHub][4]. - -### Recursos personalizados - -Además de [ rastrear recursos automáticamente](#automatically-track-network-requests), también puedes rastrear recursos personalizados específicos como solicitudes de red o API de proveedores de terceros. Usa los siguientes métodos en `RUMMonitor.shared()` para recopilar manualmente recursos de RUM: - -- `.startResource(resourceKey:request:)` -- `.stopResource(resourceKey:response:)` -- `.stopResourceWithError(resourceKey:error:)` -- `.stopResourceWithError(resourceKey:message:)` - -Por ejemplo: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogRUM - -// in your network client: - -let rum = RUMMonitor.shared() - -rum.startResource( - resourceKey: "resource-key", - request: request -) - -rum.stopResource( - resourceKey: "resource-key", - response: response -) -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -// in your network client: - -[[DDRUMMonitor shared] startResourceWithResourceKey:@"resource-key" - request:request - attributes:@{}]; - -[[DDRUMMonitor shared] stopResourceWithResourceKey:@"resource-key" - response:response - attributes:@{}]; -``` -{{% /tab %}} -{{< /tabs >}} - -**Nota**: El `String` utilizado para `resourceKey` en ambas llamadas debe ser único para el recurso que está llamando. Esto es necesario para que el SDK de RUM de iOS coincida el inicio de un recurso con su finalización. - -Para más detalles y opciones disponibles, consulte [`RUMMonitorProtocol` en GitHub][4]. - -### Errores personalizados - -Para rastrear errores específicos, notifique a `RUMMonitor.shared()` cuando ocurra un error utilizando uno de los siguientes métodos: - -- `.addError(message:)` -- `.addError(error:)` - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -let rum = RUMMonitor.shared() -rum.addError(message: "error message.") -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -[[DDRUMMonitor shared] addErrorWithMessage:@"error message." stack:nil source:DDRUMErrorSourceCustom attributes:@{}]; -``` -{{% /tab %}} -{{< /tabs >}} - -Para más detalles y opciones disponibles, consulte [`RUMMonitorProtocol` en GitHub][4] y la [documentación de atributos de error][5]. - -## Rastrear atributos globales personalizados - -Además de los [atributos RUM predeterminados][6] capturados automáticamente por el SDK de RUM para iOS, puede optar por agregar información contextual adicional (como atributos personalizados) a sus eventos RUM para enriquecer su observabilidad dentro de Datadog. - -Los atributos personalizados te permiten filtrar y agrupar información sobre el comportamiento del usuario observado (por ejemplo, el valor del carrito, el nivel del comerciante o la campaña publicitaria) junto con información a nivel de código (como servicios de backend, cronología de sesiones, registros de errores y salud de la red). - -
Los atributos personalizados están destinados a piezas pequeñas y específicas de información (por ejemplo, IDs, banderas o etiquetas cortas). Evite adjuntar objetos grandes como cargas útiles completas de respuestas HTTP. Esto puede aumentar significativamente el tamaño del evento e impactar el rendimiento.
- -### Establecer un atributo global personalizado - -Para establecer un atributo global personalizado, use `RUMMonitor.shared().addAttribute(forKey:value:)`. - -* Para agregar un atributo, use `RUMMonitor.shared().addAttribute(forKey: "", value: "")`. -* Para actualizar el valor, use `RUMMonitor.shared().addAttribute(forKey: "", value: "")`. -* Para eliminar la clave, use `RUMMonitor.shared().removeAttribute(forKey: "")`. - -Para un mejor rendimiento en operaciones masivas (modificando múltiples atributos a la vez), use `.addAttributes(_:)` y `.removeAttributes(forKeys:)`. - -**Nota**: No puede crear facetas en atributos personalizados si utiliza espacios o caracteres especiales en los nombres de sus claves. Por ejemplo, use `forKey: "store_id"` en lugar de `forKey: "Store ID"`. - -### Rastrear sesiones de usuario - -Agregar información del usuario a sus sesiones de RUM facilita: - -* Seguir el recorrido de un usuario determinado -* Saber qué usuarios son los más afectados por errores -* Monitorear el rendimiento de sus usuarios más importantes - -{{< img src="real_user_monitoring/browser/advanced_configuration/user-api.png" alt="API de usuario en la interfaz de usuario de RUM" >}} - -| Atributo | Tipo | Descripción | -| ----------- | ------ | ------------------------------------------------------------------------------- | -| `usr.id` | Cadena | (Requerido) Identificador único del usuario. | -| `usr.name` | Cadena | (Opcional) Nombre amigable del usuario, mostrado por defecto en la interfaz de usuario de RUM. | -| `usr.email` | Cadena | (Opcional) Correo electrónico del usuario, mostrado en la interfaz de usuario de RUM si el nombre de usuario no está presente. | - -Para identificar sesiones de usuario, use la `Datadog.setUserInfo(id:name:email:)` API. - -Por ejemplo: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogCore - -Datadog.setUserInfo(id: "1234", name: "John Doe", email: "john@doe.com") -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -[DDDatadog setUserInfoWithId:@"1234" name:@"John Doe" email:@"john@doe.com" extraInfo:@{}]; -``` -{{% /tab %}} -{{< /tabs >}} - -## Rastrear eventos en segundo plano - -

Rastrear eventos en segundo plano puede llevar a sesiones adicionales, lo que puede afectar la facturación. Para preguntas, contacte al soporte de Datadog.

-
- -Puede rastrear eventos como fallos y solicitudes de red cuando su aplicación está en segundo plano (por ejemplo, no hay visualización activa disponible). - -Para rastrear eventos en segundo plano, agregue el siguiente fragmento durante la inicialización en su configuración de Datadog: - -```swift -import DatadogRUM - -RUM.enable( - with: RUM.Configuration( - ... - trackBackgroundEvents: true - ) -) -``` - -## Parámetros de inicialización - -Puede usar las siguientes propiedades en `Datadog.Configuration` al crear la configuración de Datadog para inicializar la biblioteca: - -`backgroundTasksEnabled` -: Esta bandera determina si los métodos `UIApplication` `beginBackgroundTask(expirationHandler:)` y `endBackgroundTask:` se utilizan para realizar cargas en segundo plano. Habilitar esta opción podría aumentar el tiempo que la aplicación opera en segundo plano en 30 segundos. Las tareas normalmente se detienen cuando no hay nada que subir o cuando se encuentra un obstáculo para la carga, como no tener conexión a internet o tener poca batería. Por defecto, esta opción está configurada en `false`. - -`batchProcessingLevel` -: El nivel de procesamiento por lotes define el número máximo de lotes procesados secuencialmente sin un retraso dentro de un ciclo de lectura/carga. El valor predeterminado es `.medium`. - -`batchSize` -: Establece el tamaño preferido de los datos agrupados que se suben a Datadog. Este valor impacta el tamaño y número de solicitudes realizadas por el SDK de RUM para iOS (lotes pequeños significan más solicitudes, pero cada solicitud se vuelve más pequeña en tamaño). Los valores disponibles incluyen: `.small`, `.medium` y `.large`. - -`bundle` -: El objeto de paquete que contiene el ejecutable actual. - -`clientToken` -: Ya sea el token del cliente de RUM (que soporta RUM, Logging y APM) o el token de cliente regular (que soporta Logging y APM). - -`encryption` -: Cifrado de datos a utilizar para la persistencia de datos en disco proporcionando un objeto que cumpla con el protocolo `DataEncryption`. - -`env` -: El nombre del entorno que se envía a Datadog. Esto puede ser utilizado para filtrar eventos por diferentes entornos (como `staging` o `production`). - -`proxyConfiguration` -: Un atributo de configuración de proxy que puede ser utilizado para habilitar un proxy personalizado para subir datos rastreados a la entrada de Datadog. - -`serverDateProvider` -: Una interfaz de sincronización NTP personalizada. Por defecto, el SDK de Datadog se sincroniza con grupos NTP dedicados proporcionados por el [Proyecto NTP Pool][7]. Usar diferentes grupos o establecer una implementación de no operación `ServerDateProvider` resulta en una desincronización de la instancia del SDK y los servidores de Datadog. Esto puede llevar a cambios significativos en el tiempo en sesiones de RUM o trazas distribuidas. - -`service` -: El nombre del servicio asociado con los datos enviados a Datadog. El valor predeterminado es el identificador del paquete de la aplicación. - -`site` -: El punto de conexión del servidor de Datadog al que se envían los datos. El valor predeterminado es `.us1`. - -`uploadFrequency` -: La frecuencia preferida para cargar datos a Datadog. Los valores disponibles incluyen: `.frequent`, `.average` y `.rare`. - -### Configuración de RUM - -Puedes usar las siguientes propiedades en `RUM.Configuration` al habilitar RUM: - -`actionEventMapper` -: Establece la función de limpieza de datos para las acciones. Esto se puede usar para modificar o eliminar eventos de acción antes de que sean enviados a Datadog. Para más información, consulte [Modificar o eliminar eventos de RUM](#modify-or-drop-rum-events). - -`appHangThreshold` -Establece el umbral para informar cuando una aplicación se cuelga. El valor mínimo permitido para esta opción es `0.1` segundos. Para deshabilitar el informe, establezca este valor en `nil`. Para más información, consulte [Agregar informe de cuelgue de aplicación][8]. - -`applicationID` -El identificador de la aplicación RUM. - -`customEndpoint` -Una URL de servidor personalizada para enviar datos RUM. - -`errorEventMapper` -La función de limpieza de datos para errores. Esto se puede usar para modificar o eliminar eventos de error antes de que se envíen a Datadog. Para más información, consulte [Modificar o eliminar eventos RUM](#modify-or-drop-rum-events). - -`longTaskEventMapper` -La función de limpieza de datos para tareas largas. Esto se puede usar para modificar o eliminar eventos de tareas largas antes de que se envíen a Datadog. Para más información, consulte [Modificar o eliminar eventos RUM](#modify-or-drop-rum-events). - -`longTaskThreshold` -El umbral para el seguimiento de tareas largas de RUM (en segundos). Por defecto, esto se envía a `0.1` segundos. - -`networkSettledResourcePredicate` -El predicado utilizado para clasificar los recursos "iniciales" para el cálculo del tiempo de vista de Tiempo-a-Red-Establecido (TNS). - -`nextViewActionPredicate` -El predicado utilizado para clasificar la acción "última" para el cálculo del tiempo de Interacción-a-Siguiente-Vista (INV). - -`onSessionStart` -(Opcional) El método que se llama cuando RUM inicia la sesión. - -`resourceEventMapper` -La función de limpieza de datos para los recursos. Esto se puede utilizar para modificar o eliminar eventos de recursos antes de que se envíen a Datadog. Para más información, consulte [Modificar o eliminar eventos RUM](#modify-or-drop-rum-events). - -`sessionSampleRate` -La tasa de muestreo para las sesiones de RUM. El valor `sessionSampleRate` debe estar entre `0.0` y `100.0`. Un valor de `0.0` significa que no se envían sesiones, mientras que `100.0` significa que se envían todas las sesiones a Datadog. El valor predeterminado es `100.0`. - -`telemetrySampleRate` -La tasa de muestreo para la telemetría interna del SDK utilizada por Datadog. Esta tasa controla el número de solicitudes reportadas al sistema de trazado. Esto debe ser un valor entre `0` y `100`. Por defecto, esto se establece en `20`. - -`trackAnonymousUser` -Cuando está habilitado, el SDK genera un ID de usuario anónimo único y no personal que se mantiene a través de los lanzamientos de la aplicación. Este ID se adjuntará a cada sesión de RUM, lo que le permitirá vincular sesiones que provienen del mismo usuario/dispositivo sin recopilar datos personales. Por defecto, esto está configurado en `true`. - -`trackBackgroundEvents` -Determina si se rastrean eventos de RUM cuando no hay una vista activa. Por defecto, esto está configurado en `false`. - -`trackFrustrations` -Determina si se habilita el rastreo automático de frustraciones del usuario. Por defecto, esto está configurado en `true`. - -`trackMemoryWarnings` -Determina si se habilita el rastreo automático de advertencias de memoria. Por defecto, esto está configurado en `true`. - -`trackWatchdogTerminations` -Determina si el SDK debe rastrear las terminaciones de la aplicación realizadas por Watchdog. La configuración predeterminada es `false`. - -`uiKitActionsPredicate` -Habilita el rastreo de interacciones del usuario (toques) como acciones de RUM. Puede usar la implementación predeterminada de `predicate` configurando el `DefaultUIKitRUMActionsPredicate` o implementar [su propia `UIKitRUMActionsPredicate`](#automatically-track-user-actions) personalizada para su aplicación. - -`uiKitViewsPredicate` -Habilita el rastreo de `UIViewControllers` como vistas de RUM. Puede utilizar la implementación predeterminada de `predicate` configurando el `DefaultUIKitRUMViewsPredicate` o implementar [su propia `UIKitRUMViewsPredicate`](#automatically-track-views) personalizada para su aplicación. - -`urlSessionTracking` -: Habilita el rastreo de `URLSession` tareas (solicitudes de red) como recursos de RUM. El parámetro `firstPartyHostsTracing` define los hosts que se clasifican como recursos `first-party` (si RUM está habilitado) y tienen información de seguimiento inyectada (si la función de seguimiento está habilitada). El parámetro `resourceAttributesProvider` define un cierre para proporcionar atributos personalizados para los recursos interceptados que se llama para cada recurso recopilado por el SDK de RUM para iOS. Este cierre se llama con información de la tarea y puede devolver atributos de recurso personalizados o `nil` si no se deben adjuntar atributos. - -`viewEventMapper` -: La devolución de llamada de limpieza de datos para vistas. Esto se puede utilizar para modificar eventos de vista antes de que se envíen a Datadog. Para más información, consulte [Modificar o eliminar eventos RUM](#modify-or-drop-rum-events). - -`vitalsUpdateFrequency` -: La frecuencia preferida para recopilar datos vitales móviles. Los valores disponibles incluyen: `.frequent` (cada 100 ms), `.average` (cada 500 ms), `.rare` (cada 1 s) y `.never` (que desactiva el monitoreo de vitales). - -### Seguimiento automático de vistas - -Puede realizar un seguimiento automático de vistas con UIKit y SwiftUI. - -{{% collapse-content title="UIKit" level="h4" expanded=true id="auto-track-views-uikit" %}} - -Para realizar un seguimiento automático de vistas (`UIViewControllers`), utilice la opción `uiKitViewsPredicate` al habilitar RUM. Por defecto, las vistas se nombran con el nombre de la clase del controlador de vista. Para personalizarlo, proporcione su propia implementación de `predicate` que cumpla con el protocolo `UIKitRUMViewsPredicate`: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -public protocol UIKitRUMViewsPredicate { - func rumView(for viewController: UIViewController) -> RUMView? -} -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```swift -@objc -public protocol DDUIKitRUMViewsPredicate: AnyObject { - func rumView(for viewController: UIViewController) -> DDRUMView? -} -``` -{{% /tab %}} -{{< /tabs >}} - -Dentro de la implementación `rumView(for:)`, su aplicación debe decidir si una instancia `UIViewController` dada debe iniciar una visualización RUM (devolver un valor) o no (devolver `nil`). El valor `RUMView` devuelto debe especificar el `name` y puede proporcionar información adicional `attributes` para la visualización RUM creada. - -Por ejemplo, puede configurar el predicado para usar una verificación de tipo explícita para cada controlador de vista en su aplicación: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -class YourCustomPredicate: UIKitRUMViewsPredicate { - - func rumView(for viewController: UIViewController) -> RUMView? { - switch viewController { - case is HomeViewController: return .init(name: "Home") - case is DetailsViewController: return .init(name: "Details") - default: return nil - } - } -} -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -@interface YourCustomPredicate : NSObject - -@end - -@implementation YourCustomPredicate - -- (DDRUMView * _Nullable)rumViewFor:(UIViewController * _Nonnull)viewController { - if ([viewController isKindOfClass:[HomeViewController class]]) { - return [[DDRUMView alloc] initWithName:@"Home" attributes:@{}]; - } - - if ([viewController isKindOfClass:[DetailsViewController class]]) { - return [[DDRUMView alloc] initWithName:@"Details" attributes:@{}]; - } - - return nil; -} - -@end -``` -{{% /tab %}} -{{< /tabs >}} - -Incluso, puede idear una solución más dinámica dependiendo de la arquitectura de su aplicación. - -Por ejemplo, si sus controladores de vista utilizan `accessibilityLabel` de manera consistente, puede nombrar las vistas por el valor de la etiqueta de accesibilidad: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -class YourCustomPredicate: UIKitRUMViewsPredicate { - - func rumView(for viewController: UIViewController) -> RUMView? { - guard let accessibilityLabel = viewController.accessibilityLabel else { - return nil - } - - return RUMView(name: accessibilityLabel) - } -} -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -@interface YourCustomPredicate : NSObject - -@end - -@implementation YourCustomPredicate - -- (DDRUMView * _Nullable)rumViewFor:(UIViewController * _Nonnull)viewController { - if (viewController.accessibilityLabel) { - return [[DDRUMView alloc] initWithName:viewController.accessibilityLabel attributes:@{}]; - } - - return nil; -} - -@end -``` -{{% /tab %}} -{{< /tabs >}} - -**Nota**: El SDK de RUM para iOS llama a `rumView(for:)` muchas veces mientras su aplicación está en ejecución. Datadog recomienda mantener su implementación rápida y de un solo hilo. -{{% /collapse-content %}} - -{{% collapse-content title="SwiftUI" level="h4" expanded=true id="auto-track-views-swiftui" %}} - -Para rastrear automáticamente vistas con SwiftUI, utilice la opción `swiftUIViewsPredicate` al habilitar RUM. - -El mecanismo para extraer un nombre de vista de SwiftUI se basa en la reflexión. Como resultado, los nombres de las vistas pueden no ser siempre significativos. Si no se puede extraer un nombre significativo, se utiliza un nombre genérico como `AutoTracked_HostingController_Fallback` o `AutoTracked_NavigationStackController_Fallback`. - -Puede usar el predicado predeterminado (`DefaultSwiftUIRUMViewsPredicate`) o proporcionar su propia implementación del protocolo `SwiftUIRUMViewsPredicate` para personalizar o filtrar los nombres de las vistas. - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -public protocol SwiftUIRUMViewsPredicate { - func rumView(for extractedViewName: String) -> RUMView? -} - -// Example: Custom predicate to ignore fallback names and rename views -class CustomSwiftUIPredicate: SwiftUIRUMViewsPredicate { - func rumView(for extractedViewName: String) -> RUMView? { - if extractedViewName == "AutoTracked_HostingController_Fallback" || - extractedViewName == "AutoTracked_NavigationStackController_Fallback" { - return nil // Ignore fallback names - } - if extractedViewName == "MySpecialView" { - return RUMView(name: "Special") - } - return RUMView(name: extractedViewName) - } -} -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -@protocol DDSwiftUIRUMViewsPredicate -- (DDRUMView * _Nullable)rumViewFor:(NSString * _Nonnull)extractedViewName; -@end - -@interface CustomSwiftUIPredicate : NSObject -@end - -@implementation CustomSwiftUIPredicate -- (DDRUMView * _Nullable)rumViewFor:(NSString * _Nonnull)extractedViewName { - if ([extractedViewName isEqualToString:@"AutoTracked_HostingController_Fallback"] || - [extractedViewName isEqualToString:@"AutoTracked_NavigationStackController_Fallback"]) { - return nil; // Ignore fallback names - } - if ([extractedViewName isEqualToString:@"MySpecialView"]) { - return [[DDRUMView alloc] initWithName:@"Special" attributes:@{}]; - } - return [[DDRUMView alloc] initWithName:extractedViewName attributes:@{}]; -} -@end -``` -{{% /tab %}} -{{< /tabs >}} - -**Notas:** -- Datadog recomienda habilitar el rastreo de vistas de UIKit también, incluso si su aplicación está construida completamente con SwiftUI. -- Las barras de pestañas no se rastrean automáticamente. Utilice [rastreo manual](#custom-views) para cada vista de pestaña para asegurarse de que se rastreen. -- Si utiliza tanto el rastreo automático como el manual, puede ver eventos duplicados. Para evitar esto, confía en un único método de instrumentación o utiliza un predicado personalizado para filtrar duplicados. -{{% /collapse-content %}} - -### Rastrear automáticamente las acciones del usuario - -#### UIKit - -Para rastrear automáticamente las acciones de toque del usuario con UIKit, configure la opción `uiKitActionsPredicate` al habilitar RUM. - -#### SwiftUI - -Para rastrear automáticamente las acciones de toque del usuario en SwiftUI, habilite la opción `swiftUIActionsPredicate` al habilitar RUM. - -**Notas:** -- Datadog recomienda habilitar el rastreo de acciones de UIKit incluso para aplicaciones puras de SwiftUI, ya que muchos componentes interactivos son UIKit en su núcleo. -- En tvOS, solo se rastrean las interacciones de presión en el control remoto. Solo se necesita un predicado de UIKit para esto. Si tiene una aplicación pura de SwiftUI pero desea rastrear las presiones del control remoto en tvOS, también debe habilitar la instrumentación de UIKit. -- La implementación difiere entre iOS 18+ e iOS 17 y anteriores: - - **iOS 18 y superiores:** La mayoría de las interacciones se rastrean de manera confiable con los nombres de componentes correctos (por ejemplo, `SwiftUI_Button`, `SwiftUI_NavigationLink`). - - **iOS 17 y anteriores:** El SDK no puede distinguir entre componentes interactivos y no interactivos (por ejemplo, Botón vs. Etiqueta). Por esa razón, las acciones se informan como `SwiftUI_Unidentified_Element`. -- Si utiliza tanto el rastreo automático como el manual, puede ver eventos duplicados. Esta es una limitación conocida. Para evitar esto, utilice solo un tipo de instrumentación: automática o manual. -- Puede usar el predicado predeterminado, `DefaultSwiftUIRUMActionsPredicate`, o proporcionar el suyo propio para filtrar o renombrar acciones. También puede deshabilitar la detección heredada (iOS 17 y anteriores) si solo desea un rastreo confiable en iOS 18+: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -// Use the default predicate by disabling iOS 17 and below detection -let predicate = DefaultSwiftUIRUMActionsPredicate(isLegacyDetectionEnabled: false) - -// Use your own predicate -class CustomSwiftUIActionsPredicate: SwiftUIRUMActionsPredicate { - func rumAction(for componentName: String) -> RUMAction? { - // Custom logic to filter or rename actions - return RUMAction(name: componentName) - } -} -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -// Use the default predicate by disabling iOS 17 and below detection -DDDefaultSwiftUIRUMActionsPredicate *swiftUIActionsPredicate = [[DDDefaultSwiftUIRUMActionsPredicate alloc] initWithIsLegacyDetectionEnabled:NO]; - -// Use your own predicate -@protocol DDSwiftUIRUMActionsPredicate -- (DDRUMAction * _Nullable)rumActionFor:(NSString * _Nonnull)componentName; -@end - -@interface CustomSwiftUIActionsPredicate : NSObject -@end - -@implementation CustomSwiftUIActionsPredicate -- (DDRUMAction * _Nullable)rumActionFor:(NSString * _Nonnull)componentName { - // Custom logic to filter or rename actions - return [[DDRUMAction alloc] initWithName:componentName attributes:@{}]; -} -@end -``` -{{% /tab %}} -{{< /tabs >}} - -#### Informe de acciones por versión de iOS - -La tabla a continuación muestra cómo iOS 17 e iOS 18 informan diferentes interacciones del usuario. - -| **Componente** | **iOS 18 nombre reportado** | **iOS 17 nombre reportado** | -|------------------|---------------------------------------------------|--------------------------------------| -| Botón | SwiftUI_Botón | SwiftUI_Elemento_No_Identificado | -| NavigationLink | NavigationLink | SwiftUI_Elemento_No_Identificado | -| Menú | SwiftUI_Menú (y sus elementos como _UIContextMenuCell)| SwiftUI_Menú (y sus elementos como _UIContextMenuCell) | -| Enlace | SwiftUI_Botón | SwiftUI_Elemento_No_Identificado | - -### Rastrear automáticamente las solicitudes de red - -Las solicitudes de red se rastrean automáticamente después de habilitar RUM con la `urlSessionTracking` configuración. - -#### (Opcional) Habilitar desglose de tiempo detallado - -Para obtener un desglose de tiempo detallado (resolución DNS, apretón de manos SSL, tiempo hasta el primer byte, tiempo de conexión y duración de la descarga), habilite `URLSessionInstrumentation` para su tipo de delegado: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -URLSessionInstrumentation.enableDurationBreakdown( - with: .init( - delegateClass: .self - ) -) - -let session = URLSession( - configuration: .default, - delegate: (), - delegateQueue: nil -) -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -DDURLSessionInstrumentationConfiguration *config = [[DDURLSessionInstrumentationConfiguration alloc] initWithDelegateClass:[ class]]; -[DDURLSessionInstrumentation enableWithConfiguration:config]; - -NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] - delegate:[[ alloc] init] - delegateQueue:nil]; -``` -{{% /tab %}} -{{< /tabs >}} - -**Notas**: -- Sin `URLSessionInstrumentation`, las solicitudes de red aún se rastrean. Habilitarlo proporciona un desglose de tiempo detallado para el análisis de rendimiento. -- Los datos de respuesta están disponibles en el `resourceAttributesProvider` callback (establecido en `RUM.Configuration.URLSessionTracking`) para tareas con controladores de finalización en modo automático, y para todas las tareas después de habilitar `URLSessionInstrumentation`. -- Para filtrar solicitudes específicas de ser rastreadas, use el `resourceEventMapper` en `RUM.Configuration` (ver [Modificar o eliminar eventos RUM](#modify-or-drop-rum-events)). - -
Tenga en cuenta la retención de delegados. -Si bien la instrumentación de Datadog no crea fugas de memoria directamente, depende de URLSession delegados. Según la documentación de Apple: -"El objeto de sesión mantiene una referencia fuerte al delegado hasta que su aplicación sale o invalida explícitamente la sesión. Si no invalida la sesión llamando al método invalidateAndCancel() o finishTasksAndInvalidate(), su aplicación genera fugas de memoria hasta que sale. -Para evitar fugas de memoria, asegúrese de invalidar cualquier instancia de URLSession que ya no necesite. -
- - -Si tiene más de un tipo de delegado en su aplicación que desea instrumentar, puede llamar a `URLSessionInstrumentation.enable(with:)` para cada tipo de delegado. - -Además, puede configurar hosts de primera parte utilizando `urlSessionTracking`. Esto clasifica los recursos que coinciden con el dominio dado como "primera parte" en RUM y propaga la información de trazado a su backend (si tiene habilitado el trazado). Las trazas de red se muestrean con una tasa de muestreo ajustable. Se aplica un muestreo del 20% por defecto. - -Por ejemplo, puede configurar `example.com` como el host de primera parte y habilitar tanto las características de RUM como de Tracing: - -[10]: https://developer.apple.com/documentation/foundation/urlsession/init(configuration:delegate:delegatequeue:)#parameters -{{< tabs >}} -{{% tab "Swift" %}} - -```swift - -import DatadogRUM - -RUM.enable( - with: RUM.Configuration( - applicationID: "", - uiKitViewsPredicate: DefaultUIKitRUMViewsPredicate(), - uiKitActionsPredicate: DefaultUIKitRUMActionsPredicate(), - urlSessionTracking: RUM.Configuration.URLSessionTracking( - firstPartyHostsTracing: .trace(hosts: ["example.com"], sampleRate: 20) - ) - ) -) - -URLSessionInstrumentation.enable( - with: .init( - delegateClass: .self - ) -) - -let session = URLSession( - configuration: .default, - delegate: (), - delegateQueue: nil -) -``` - -Esto rastrea todas las solicitudes enviadas con el `session` instrumentado. Las solicitudes que coinciden con el dominio `example.com` se marcan como "primera parte" y la información de trazado se envía a su backend para [conectar el recurso RUM con su traza][1]. - - -[1]: https://docs.datadoghq.com/es/real_user_monitoring/correlate_with_other_telemetry/apm?tab=browserrum -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -@import DatadogRUM; - -DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""]; -DDRUMURLSessionTracking *urlSessionTracking = [DDRUMURLSessionTracking new]; -[urlSessionTracking setFirstPartyHostsTracing:[DDRUMFirstPartyHostsTracing alloc] initWithHosts:@[@"example.com"] sampleRate:20]; -[configuration setURLSessionTracking:urlSessionTracking]; - -[DDRUM enableWith:configuration]; -``` -{{% /tab %}} -{{< /tabs >}} - -Para agregar atributos personalizados a los recursos, utilice la opción `URLSessionTracking.resourceAttributesProvider` al habilitar el RUM. Al establecer el cierre del proveedor de atributos, puede devolver atributos adicionales que se adjuntarán al recurso rastreado. - -Por ejemplo, puede querer agregar encabezados de solicitud y respuesta HTTP al recurso RUM: - -```swift -RUM.enable( - with: RUM.Configuration( - ... - urlSessionTracking: RUM.Configuration.URLSessionTracking( - resourceAttributesProvider: { request, response, data, error in - return [ - "request.headers" : redactedHeaders(from: request), - "response.headers" : redactedHeaders(from: response) - ] - } - ) - ) -) -``` - -Si no desea rastrear solicitudes, puede deshabilitar URLSessionInstrumentation para el tipo de delegado: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -URLSessionInstrumentation.disable(delegateClass: .self) -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -[DDURLSessionInstrumentation disableWithDelegateClass:[ class]]; -``` -{{% /tab %}} -{{< /tabs >}} - -#### Instrumentación de Apollo -Instrumentar Apollo en su aplicación iOS proporciona visibilidad de RUM sobre errores y rendimiento de GraphQL. Debido a que las solicitudes de GraphQL se envían todas a un único punto de conexión y, a menudo, devuelven 200 OK incluso en errores, la instrumentación HTTP por defecto carece de contexto. Permite que RUM capture el nombre de la operación, el tipo de operación y las variables (y opcionalmente la carga útil). Esto proporciona un contexto más detallado para cada solicitud de red. - -Esta integración es compatible con Apollo iOS 1.0+ y Apollo iOS 2.0+. Siga las instrucciones para la versión de Apollo iOS que tiene a continuación. - -1. [Configura][2] la monitorización de RUM con Datadog iOS RUM. - -2. Agregue lo siguiente al archivo de su aplicación `Package.swift`: - - ```swift - dependencies: [ - // For Apollo iOS 1.0+ - .package(url: "https://github.com/DataDog/dd-sdk-ios-apollo-interceptor", .upToNextMajor(from: "1.0.0")) - - // For Apollo iOS 2.0+ - .package(url: "https://github.com/DataDog/dd-sdk-ios-apollo-interceptor", .upToNextMajor(from: "2.0.0")) - ] - ``` - - Alternativamente, puede agregarlo usando Xcode: - 1. Vaya a **Archivo** → **Agregar Dependencias de Paquete**. - 2. Ingrese la URL del repositorio: `https://github.com/DataDog/dd-sdk-ios-apollo-interceptor`. - 3. Seleccione la versión del paquete que coincida con su versión principal de Apollo (elija `1.x.x` para Apollo iOS 1.0+ o `2.x.x` para Apollo iOS 2.0+). - -3. Configure la instrumentación de red según su versión de Apollo iOS: - - {{< tabs >}} - {{% tab "Apollo iOS 1.0+" %}} - - Configura la instrumentación de red para el URLSessionClient integrado de Apollo: - - ```swift - import Apollo - - URLSessionInstrumentation.enable(with: .init(delegateClass: URLSessionClient.self)) - ``` - - Agregue el interceptor de Datadog a la configuración de su cliente Apollo: - - ```swift - import Apollo - import DatadogApollo - - class CustomInterceptorProvider: DefaultInterceptorProvider { - override func interceptors(for operation: Operation) -> [ApolloInterceptor] { - var interceptors = super.interceptors(for: operation) - interceptors.insert(DatadogApolloInterceptor(), at: 0) - return interceptors - } - } - ``` - - {{% /tab %}} - {{% tab "Apollo iOS 2.0+" %}} - - Configure la instrumentación de red utilizando los `DatadogApolloDelegate` y `DatadogApolloURLSession` proporcionados: - - ```swift - import Apollo - import DatadogApollo - import DatadogCore - - // Create the Datadog delegate - let delegate = DatadogApolloDelegate() - - // Create the custom URLSession wrapper - let customSession = DatadogApolloURLSession( - configuration: .default, - delegate: delegate - ) - - // Enable Datadog instrumentation for the delegate - URLSessionInstrumentation.enable( - with: .init(delegateClass: DatadogApolloDelegate.self) - ) - - // Configure Apollo Client with the custom session - let networkTransport = RequestChainNetworkTransport( - urlSession: customSession, - interceptorProvider: NetworkInterceptorProvider(), - store: store, - endpointURL: url - ) - ``` - - Cree un proveedor de interceptores con el interceptor de Datadog: - - ```swift - import Apollo - import DatadogApollo - - struct NetworkInterceptorProvider: InterceptorProvider { - func graphQLInterceptors(for operation: Operation) -> [any GraphQLInterceptor] where Operation : GraphQLOperation { - return [DatadogApolloInterceptor()] + DefaultInterceptorProvider.shared.graphQLInterceptors(for: operation) - } - } - ``` - - {{% /tab %}} - {{< /tabs >}} - - Esto permite que Datadog RUM extraiga automáticamente el tipo de operación, nombre, variables y cargas útiles (opcional) de las solicitudes para enriquecer los recursos RUM de solicitudes GraphQL. - -
-
    -
  • La integración soporta versiones de Apollo iOS 1.0+ y 2.0+.
  • -
  • Las operaciones de tipo consulta y mutación son rastreadas, las operaciones de suscripción no lo son.
  • -
  • El envío de cargas útiles de GraphQL está deshabilitado por defecto. Para habilitarlo, establezca el indicador sendGraphQLPayloads en el constructor de DatadogApolloInterceptor de la siguiente manera:
  • -
- -

-   let datadogInterceptor = DatadogApolloInterceptor(sendGraphQLPayloads: true)
-     
-
- -### Rastrear errores automáticamente - -Todos los registros de "error" y "crítico" enviados con `Logger` se informan automáticamente como errores RUM y se vinculan a la vista RUM actual: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogLogs - -let logger = Logger.create() - -logger.error("message") -logger.critical("message") -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -@import DatadogLogs; - -DDLogger *logger = [DDLogger create]; -[logger error:@"message"]; -[logger critical:@"message"]; -``` -{{% /tab %}} -{{< /tabs >}} - -De manera similar, todos los tramos finalizados marcados como error se informan como errores RUM: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogTrace - -let span = Tracer.shared().startSpan(operationName: "operation") -// ... capture the `error` -span.setError(error) -span.finish() -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -// ... capture the `error` -id span = [[DDTracer shared] startSpan:@"operation"]; -[span setError:error]; -[span finish]; -``` -{{% /tab %}} -{{< /tabs >}} - -## Modificar o eliminar eventos RUM - -Para modificar atributos de un evento RUM antes de que se envíe a Datadog o para eliminar un evento por completo, utiliza la API de Event Mappers al configurar el SDK de RUM para iOS: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -let configuration = RUM.Configuration( - applicationID: "", - viewEventMapper: { RUMViewEvent in - return RUMViewEvent - } - resourceEventMapper: { RUMResourceEvent in - return RUMResourceEvent - } - actionEventMapper: { RUMActionEvent in - return RUMActionEvent - } - errorEventMapper: { RUMErrorEvent in - return RUMErrorEvent - } - longTaskEventMapper: { RUMLongTaskEvent in - return RUMLongTaskEvent - } -) -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""]; - -[configuration setViewEventMapper:^DDRUMViewEvent * _Nonnull(DDRUMViewEvent * _Nonnull RUMViewEvent) { - return RUMViewEvent; -}]; - -[configuration setErrorEventMapper:^DDRUMErrorEvent * _Nullable(DDRUMErrorEvent * _Nonnull RUMErrorEvent) { - return RUMErrorEvent; -}]; - -[configuration setResourceEventMapper:^DDRUMResourceEvent * _Nullable(DDRUMResourceEvent * _Nonnull RUMResourceEvent) { - return RUMResourceEvent; -}]; - -[configuration setActionEventMapper:^DDRUMActionEvent * _Nullable(DDRUMActionEvent * _Nonnull RUMActionEvent) { - return RUMActionEvent; -}]; - -[configuration setLongTaskEventMapper:^DDRUMLongTaskEvent * _Nullable(DDRUMLongTaskEvent * _Nonnull RUMLongTaskEvent) { - return RUMLongTaskEvent; -}]; -``` -{{% /tab %}} -{{< /tabs >}} - -Cada mapeador es un cierre de Swift con una firma de `(T) -> T?`, donde `T` es un tipo de evento RUM concreto. Esto permite cambiar partes del evento antes de que se envíe. - -Por ejemplo, para redactar información sensible en un `url` de un recurso RUM, implemente una función `redacted(_:) -> String` personalizada y utilícela en `resourceEventMapper`: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -let configuration = RUM.Configuration( - applicationID: "", - resourceEventMapper: { RUMResourceEvent in - var RUMResourceEvent = RUMResourceEvent - RUMResourceEvent.resource.url = redacted(RUMResourceEvent.resource.url) - return RUMResourceEvent - } -) -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""]; - -[configuration setResourceEventMapper:^DDRUMResourceEvent * _Nullable(DDRUMResourceEvent * _Nonnull RUMResourceEvent) { - return RUMResourceEvent; -}]; -``` -{{% /tab %}} -{{< /tabs >}} - -Devolver `nil` desde el mapeador de error, recurso o acción elimina el evento por completo; el evento no se envía a Datadog. El valor devuelto por el mapeador de eventos de vista no debe ser `nil` (para eliminar vistas, personalice su implementación de `UIKitRUMViewsPredicate`; lea más en [seguimiento automático de vistas](#automatically-track-views)). - -Dependiendo del tipo de evento, solo algunas propiedades específicas pueden ser modificadas: - -| Tipo de Evento | Clave de Atributo | Descripción | -| ---------------- | ------------------------------------ | ------------------------------------------------ | -| RUMActionEvent | `RUMActionEvent.action.target?.name` | Nombre de la acción. | -| | `RUMActionEvent.view.url` | URL de la vista vinculada a esta acción. | -| RUMErrorEvent | `RUMErrorEvent.error.message` | Mensaje de error. | -| | `RUMErrorEvent.error.stack` | Traza de pila del error. | -| | `RUMErrorEvent.error.resource?.url` | URL del recurso al que se refiere el error. | -| | `RUMErrorEvent.view.url` | URL de la vista vinculada a este error. | -| RUMResourceEvent | `RUMResourceEvent.resource.url` | URL del recurso. | -| | `RUMResourceEvent.view.url` | URL de la vista vinculada a este recurso. | -| RUMViewEvent | `RUMViewEvent.view.name` | Nombre de la vista. | -| | `RUMViewEvent.view.url` | URL de la vista. | -| | `RUMViewEvent.view.referrer` | URL que enlazó a la vista inicial de la página. | - -## Recuperar el ID de sesión RUM - -Recuperar el ID de sesión RUM puede ser útil para la solución de problemas. Por ejemplo, puede adjuntar el ID de sesión a solicitudes de soporte, correos electrónicos o informes de errores para que su equipo de soporte pueda encontrar más tarde la sesión del usuario en Datadog. - -Puede acceder al ID de sesión RUM en tiempo de ejecución sin esperar el evento `sessionStarted`: - -```swift -RumMonitor.shared().currentSessionID(completion: { sessionId in - currentSessionId = sessionId -}) -``` - -## Establecer consentimiento de seguimiento (cumplimiento del GDPR) - -Para cumplir con la regulación del GDPR, el SDK de RUM para iOS requiere el valor de consentimiento de seguimiento en la inicialización. - -La configuración `trackingConsent` puede ser uno de los siguientes valores: - -1. `.pending`: El SDK de RUM para iOS comienza a recopilar y agrupar los datos, pero no los envía a Datadog. El SDK de RUM para iOS espera el nuevo valor de consentimiento de seguimiento para decidir qué hacer con los datos agrupados. -2. `.granted`: El SDK de RUM para iOS comienza a recopilar los datos y los envía a Datadog. -3. `.notGranted`: El SDK de RUM para iOS no recopila ningún dato. No se envían registros, trazas ni eventos RUM a Datadog. - -Para cambiar el valor de consentimiento de seguimiento después de que el SDK de RUM para iOS esté inicializado, utilice la llamada a la API `Datadog.set(trackingConsent:)`. El SDK de RUM para iOS cambia su comportamiento de acuerdo con el nuevo valor. - -Por ejemplo, si el consentimiento de seguimiento actual es `.pending`: - -- Si cambia el valor a `.granted`, el SDK de RUM para iOS envía todos los datos actuales y futuros a Datadog; -- Si cambia el valor a `.notGranted`, el SDK de RUM para iOS elimina todos los datos actuales y no recopila datos futuros. - -## Agregar propiedades de usuario - -Puede usar la `Datadog.addUserExtraInfo(_:)` API para agregar propiedades de usuario adicionales a las propiedades establecidas anteriormente. - -```swift -import DatadogCore - -Datadog.addUserExtraInfo(["company": "Foo"]) -``` - -## Gestión de datos - -El SDK de iOS primero almacena eventos localmente y solo envía eventos cuando se cumplen las condiciones de [especificaciones de recepción][9]. - -### Eliminar todos los datos - -Tiene la opción de eliminar todos los datos no enviados almacenados por el SDK con la `Datadog.clearAllData()` API. - -```swift -import DatadogCore - -Datadog.clearAllData() -``` - -### Detener la recopilación de datos - -Puede usar la `Datadog.stopInstance()` API para detener una instancia nombrada del SDK (o la instancia predeterminada si el nombre es `nil`) de recopilar y enviar datos en adelante. - -```swift -import DatadogCore - -Datadog.stopInstance() -``` - -Llamar a este método desactiva el SDK y todas las funciones activas, como RUM. Para reanudar la recopilación de datos, debe reinicializar el SDK. Puede usar esta API si desea cambiar configuraciones dinámicamente. - -## Lectura adicional - -{{< partial name="whats-next/whats-next.html" >}} - -[1]: https://app.datadoghq.com/rum/application/create -[2]: /es/real_user_monitoring/application_monitoring/ios -[3]: /es/real_user_monitoring/application_monitoring/ios/data_collected/ -[4]: https://github.com/DataDog/dd-sdk-ios/blob/master/DatadogRUM/Sources/RUMMonitorProtocol.swift -[5]: /es/real_user_monitoring/application_monitoring/ios/data_collected/?tab=error#error-attributes -[6]: /es/real_user_monitoring/application_monitoring/ios/data_collected/?tab=session#default-attributes -[7]: https://www.ntppool.org/en/ -[8]: /es/real_user_monitoring/error_tracking/mobile/ios/#add-app-hang-reporting -[9]: /es/real_user_monitoring/application_monitoring/ios/setup \ No newline at end of file diff --git a/content/es/real_user_monitoring/application_monitoring/unity/troubleshooting.md b/content/es/real_user_monitoring/application_monitoring/unity/troubleshooting.md deleted file mode 100644 index 7d3b801f989..00000000000 --- a/content/es/real_user_monitoring/application_monitoring/unity/troubleshooting.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -aliases: -- /es/real_user_monitoring/mobile_and_tv_monitoring/troubleshooting/unity -- /es/real_user_monitoring/mobile_and_tv_monitoring/unity/troubleshooting -description: Aprende a solucionar problemas de monitorización con Unity. -further_reading: -- link: https://github.com/DataDog/dd-sdk-unity - tag: Código fuente - text: Código fuente de dd-sdk-unity -- link: https://github.com/DataDog/unity-package - tag: Código fuente - text: URL del paquete del SDK de Unity -- link: real_user_monitoring/unity/ - tag: Documentación - text: Más información sobre la monitorización de Unity -title: Solucionar problemas del SDK de Unity ---- - -## Información general - -Si experimentas un comportamiento inesperado con Datadog RUM, utiliza esta guía para solucionar esos problemas. Si sigues teniendo problemas, ponte en contacto con el [Equipo de soporte técnico de Datadog][1] para obtener más ayuda. - -## Configurar sdkVerbosity para facilitar la depuración - -Si puedes ejecutar tu aplicación, pero no ves los datos que esperas en el sitio de Datadog, intenta añadir lo siguiente a tu código como parte de la inicialización: - -{{< code-block lang="cs" >}} -DatadogSdk.Instance.SetSdkVerbosity(CoreLoggerLevel.Debug); -{{< /code-block >}} - -Esto hace que el SDK genere información adicional sobre lo que está haciendo y los errores que está encontrando, lo que puede ayudarlos a ti y al equipo de soporte técnico de Datadog a reducir el problema. - -## El SDK no envía datos - -
Datadog no admite el envío de datos desde el editor de Unity, solo desde simuladores, emuladores y dispositivos iOS y Android.
- -Si no ves ningún dato en Datadog: - -1. Asegúrate de que estás ejecutando tu aplicación en un simulador, emulador o dispositivo iOS o Android, y no desde el editor. -2. Comprueba que has establecido el `TrackingConsent` como parte de tu inicialización. El consentimiento de seguimiento se establece en `TrackingConsent.Pending` durante la inicialización -y debe configurarse en `TrackingConsent.Granted` antes de que Datadog envíe cualquier información. - - {{< code-block lang="cs" >}} -DatadogSdk.Instance.SetTrackingConsent(TrackingConsent.Granted); -{{< /code-block >}} - -## Referencias adicionales - -{{< partial name="whats-next/whats-next.html" >}} - -[1]: /es/help \ No newline at end of file diff --git a/content/fr/profiler/enabling/_index.md b/content/fr/profiler/enabling/_index.md deleted file mode 100644 index adcfbd876b1..00000000000 --- a/content/fr/profiler/enabling/_index.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -aliases: -- /fr/tracing/faq/profiling_migration/ -- /fr/tracing/profiler/enabling/ -further_reading: -- link: getting_started/profiler - tag: Documentation - text: Débuter avec le profileur -- link: profiler/profile_visualizations - tag: Documentation - text: En savoir plus sur les visualisations de profils disponibles -- link: profiler/profiler_troubleshooting - tag: Documentation - text: Résoudre les problèmes rencontrés en utilisant le profileur -title: Activer le profileur -type: multi-code-lang ---- - -Le profileur est fourni dans les bibliothèques de tracing Datadog. Si vous utilisez déjà [l'APM pour recueillir des traces][1] pour votre application, vous pouvez ignorer l'installation de la bibliothèque et passer directement à l'activation du profileur. - -Sélectionnez un langage ci-dessous pour découvrir comment activer un profileur pour votre application : - - -{{< partial name="profiling/profiling-languages.html" >}} - - -## Pour aller plus loin - -{{< partial name="whats-next/whats-next.html" >}} - - - -[1]: /fr/tracing/trace_collection/ \ No newline at end of file diff --git a/content/fr/real_user_monitoring/application_monitoring/browser/setup/client.md b/content/fr/real_user_monitoring/application_monitoring/browser/setup/client.md deleted file mode 100644 index 9d4976ca108..00000000000 --- a/content/fr/real_user_monitoring/application_monitoring/browser/setup/client.md +++ /dev/null @@ -1,169 +0,0 @@ ---- -aliases: - - /fr/real_user_monitoring/setup - - /fr/real_user_monitoring/browser/setup/client -description: >- - Configurez le SDK RUM Browser en utilisant l'instrumentation côté client avec - NPM ou CDN pour surveiller l'expérience utilisateur, la performance et les - erreurs dans les applications web. -further_reading: - - link: >- - /real_user_monitoring/application_monitoring/browser/advanced_configuration/ - tag: Documentation - text: Configuration avancée - - link: /session_replay/browser/ - tag: Documentation - text: Configurer la relecture de session - - link: /real_user_monitoring/error_tracking/browser/ - tag: Documentation - text: Configurer le suivi des erreurs - - link: /real_user_monitoring/correlate_with_other_telemetry/ - tag: Documentation - text: Corréler les événements RUM avec d'autres données de télémétrie -title: Configuration du suivi du navigateur côté client ---- -

Aperçu

Le Datadog Browser SDK permet la surveillance des utilisateurs réels (RUM) pour vos applications web, offrant une visibilité complète sur l'expérience utilisateur et la performance de l'application. Avec RUM, vous pouvez surveiller les temps de chargement des pages, les interactions des utilisateurs, le chargement des ressources et les erreurs d'application en temps réel.

RUM vous aide à :

  • Surveiller l'expérience utilisateur avec des métriques de performance détaillées pour les chargements de pages, les actions des utilisateurs et les requêtes de ressources
  • Suivre les parcours des utilisateurs à travers votre application avec les capacités de Relecture de Session
  • Identifier les goulets d'étranglement de performance et corréler la performance frontend et backend avec les traces APM

Le Browser SDK prend en charge tous les navigateurs modernes de bureau et mobiles et fournit une collecte automatique des métriques de performance clés, des interactions des utilisateurs et des erreurs d'application. Après la configuration, vous pouvez gérer vos configurations RUM par application dans Datadog et visualiser les données collectées dans des tableaux de bord et l'Explorateur RUM.

This page describes how to instrument your web applications with the Datadog Browser SDK. The Browser SDK supports Real User Monitoring (RUM), Error Tracking, Session Replay, and Product Analytics.

The Browser SDK supports all modern desktop and mobile browsers.

Setup

Choose your setup method:

  • Server-side auto-instrumentation: Automatically inject the RUM SDK into HTML responses through your web server or proxy.
  • Agentic Onboarding (in Preview): Use AI coding agents (Cursor, Claude Code) to automatically instrument your application with one prompt.
  • Manual client-side setup (below): Manually add the SDK to your application code.

Manual client-side setup

Create the application in the UI

  1. In Datadog, navigate to Digital Experience > Add an Application and select the JavaScript (JS) application type.
  2. Enter a name for your application, then click Create Application. This generates a clientToken and an applicationId for your application.

Install the Browser SDK

Choose the installation method for the Browser SDK.

- -

Installing through Node Package Manager (npm) registry is recommended for modern web applications. The Browser SDK is packaged with the rest of your frontend JavaScript code. It has no impact on page load performance. However, the SDK may miss errors, resources, and user actions triggered before the SDK is initialized. Datadog recommends using a matching version with the Browser Logs SDK.

Add @datadog/browser-rum to your package.json file, for example if you use npm cli:

npm install --save @datadog/browser-rum
-

Installing through CDN async is recommended for web applications with performance targets. The Browser SDK loads from Datadog's CDN asynchronously, ensuring the SDK download does not impact page load performance. However, the SDK may miss errors, resources, and user actions triggered before the SDK is initialized.

Add the generated code snippet to the head tag of every HTML page you want to monitor in your application.

<script>
-  (function(h,o,u,n,d) {
-    h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
-    d=o.createElement(u);d.async=1;d.src=n,d.crossOrigin=''
-    n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
-  })(window,document,'script','https://www.datadoghq-browser-agent.com/us1/v7/datadog-rum.js','DD_RUM')
-</script>
-
<script>
-  (function(h,o,u,n,d) {
-    h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
-    d=o.createElement(u);d.async=1;d.src=n,d.crossOrigin=''
-    n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
-  })(window,document,'script','https://www.datadoghq-browser-agent.com/eu/v7/datadog-rum.js','DD_RUM')
-</script>
-
<script>
-  (function(h,o,u,n,d) {
-    h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
-    d=o.createElement(u);d.async=1;d.src=n,d.crossOrigin=''
-    n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
-  })(window,document,'script','https://www.datadoghq-browser-agent.com/ap1/v7/datadog-rum.js','DD_RUM')
-</script>
-
<script>
-  (function(h,o,u,n,d) {
-    h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
-    d=o.createElement(u);d.async=1;d.src=n,d.crossOrigin=''
-    n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
-  })(window,document,'script','https://www.datadoghq-browser-agent.com/ap2/v7/datadog-rum.js','DD_RUM')
-</script>
-
<script>
-  (function(h,o,u,n,d) {
-    h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
-    d=o.createElement(u);d.async=1;d.src=n,d.crossOrigin=''
-    n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
-  })(window,document,'script','https://www.datadoghq-browser-agent.com/us3/v7/datadog-rum.js','DD_RUM')
-</script>
-
<script>
-  (function(h,o,u,n,d) {
-    h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
-    d=o.createElement(u);d.async=1;d.src=n,d.crossOrigin=''
-    n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
-  })(window,document,'script','https://www.datadoghq-browser-agent.com/us5/v7/datadog-rum.js','DD_RUM')
-</script>
-
<script>
-  (function(h,o,u,n,d) {
-    h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
-    d=o.createElement(u);d.async=1;d.src=n,d.crossOrigin=''
-    n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
-  })(window,document,'script','https://www.datadoghq-browser-agent.com/datadog-rum-v7.js','DD_RUM')
-</script>
-

Installing through CDN sync is recommended for collecting all events. The Browser SDK loads from Datadog's CDN synchronously, ensuring the SDK loads first and collects all errors, resources, and user actions. This method may impact page load performance.

Add the generated code snippet to the head tag (in front of any other script tags) of every HTML page you want to monitor in your application. Placing the script tag higher and loading it synchronously ensures Datadog RUM can collect all performance data and errors.

<script
-    src="https://www.datadoghq-browser-agent.com/us1/v7/datadog-rum.js"
-    type="text/javascript"
-    crossorigin>
-</script>
-
<script
-    src="https://www.datadoghq-browser-agent.com/eu/v7/datadog-rum.js"
-    type="text/javascript"
-    crossorigin>
-</script>
-
<script
-    src="https://www.datadoghq-browser-agent.com/ap1/v7/datadog-rum.js"
-    type="text/javascript"
-    crossorigin>
-</script>
-
<script
-    src="https://www.datadoghq-browser-agent.com/ap2/v7/datadog-rum.js"
-    type="text/javascript"
-    crossorigin>
-</script>
-
<script
-    src="https://www.datadoghq-browser-agent.com/us3/v7/datadog-rum.js"
-    type="text/javascript"
-    crossorigin>
-</script>
-
<script
-    src="https://www.datadoghq-browser-agent.com/us5/v7/datadog-rum.js"
-    type="text/javascript"
-    crossorigin>
-</script>
-
<script
-    src="https://www.datadoghq-browser-agent.com/datadog-rum-v7.js"
-    type="text/javascript">
-</script>
-
-

Initialize the Browser SDK

The SDK should be initialized as early as possible in the app lifecycle. This ensures all measurements are captured correctly.

In the initialization snippet, set an environment name, service name, and client token. See the full list of initialization parameters.

- -
import { datadogRum } from '@datadog/browser-rum';
-
-datadogRum.init({
-   applicationId: '<APP_ID>',
-   clientToken: '<CLIENT_TOKEN>',
-   // `site` refers to the Datadog site parameter of your organization
-   // see https://docs.datadoghq.com/getting_started/site/
-   site: '<DATADOG_SITE>',
-  //  service: 'my-web-application',
-  //  env: 'production',
-  //  version: '1.0.0',
-});
-
-

Types are compatible with TypeScript >= 3.8.2. For earlier versions of TypeScript, import JavaScript sources and use global variables to avoid any compilation issues.

import '@datadog/browser-rum/bundle/datadog-rum'
-
-window.DD_RUM.init({
-  ...
-})
-
<script>
-  window.DD_RUM.onReady(function() {
-    window.DD_RUM.init({
-      clientToken: '<CLIENT_TOKEN>',
-      applicationId: '<APP_ID>',
-      // `site` refers to the Datadog site parameter of your organization
-      // see https://docs.datadoghq.com/getting_started/site/
-      site: '<DATADOG_SITE>',
-      //  service: 'my-web-application',
-      //  env: 'production',
-      //  version: '1.0.0',
-    });
-  })
-</script>
-
<script>
-    window.DD_RUM && window.DD_RUM.init({
-      clientToken: '<CLIENT_TOKEN>',
-      applicationId: '<APP_ID>',
-      // `site` refers to the Datadog site parameter of your organization
-      // see https://docs.datadoghq.com/getting_started/site/
-      site: '<DATADOG_SITE>',
-      //  service: 'my-web-application',
-      //  env: 'production',
-      //  version: '1.0.0',
-
-    });
-</script>
-
-

To be compliant with GDPR, CCPA, and similar regulations, the Browser SDK lets you provide the tracking consent value at initialization.

Configure Content Security Policy (CSP)

If you're using the Datadog Content Security Policy (CSP) integration on your site, see the CSP documentation for additional setup steps.

Définir les taux d'échantillonnage de session

Pour contrôler les données que votre application envoie à Datadog RUM, vous pouvez spécifier un taux d'échantillonnage pour les sessions RUM lors de l'initialisation du Browser SDK. Par exemple, pour échantillonner 80 % des sessions, définissez sessionSampleRate à 80 :

datadogRum.init({
-  applicationId: '<APP_ID>',
-  clientToken: '<CLIENT_TOKEN>',
-  site: '<DATADOG_SITE>',
-  sessionSampleRate: 80,
-  sessionReplaySampleRate: 20,
-  // ... other configuration options
-});
-

Pour plus d'informations, consultez Échantillonnage RUM du Navigateur et Relecture de Session.

Commencez à surveiller votre application

Maintenant que vous avez terminé la configuration de base pour RUM, votre application collecte les erreurs du navigateur et vous pouvez commencer à surveiller et à déboguer les problèmes en temps réel.

Visualisez les données collectées dans des tableaux de bord ou créez une requête de recherche dans le RUM Explorer.

Votre application apparaît comme en attente sur la page des Applications jusqu'à ce que Datadog commence à recevoir des données.

Prochaines étapes

Voir Configuration avancée.

Further reading

-
\ No newline at end of file diff --git a/content/fr/real_user_monitoring/application_monitoring/ios/advanced_configuration.md b/content/fr/real_user_monitoring/application_monitoring/ios/advanced_configuration.md deleted file mode 100644 index cf068aa0bf1..00000000000 --- a/content/fr/real_user_monitoring/application_monitoring/ios/advanced_configuration.md +++ /dev/null @@ -1,1139 +0,0 @@ ---- -aliases: -- /fr/real_user_monitoring/ios/advanced_configuration -- /fr/real_user_monitoring/mobile_and_tv_monitoring/advanced_configuration/ios -- /fr/real_user_monitoring/mobile_and_tv_monitoring/ios/advanced_configuration -description: Configurez les paramètres avancés du SDK RUM iOS pour enrichir les sessions - utilisateur, suivre des événements personnalisés et contrôler la collecte de données - afin d'obtenir des insights plus pertinents. -further_reading: -- link: https://github.com/DataDog/dd-sdk-ios - tag: Source Code - text: Code source pour dd-sdk-ios -- link: /real_user_monitoring - tag: Documentation - text: RUM & Session Replay -- link: /real_user_monitoring/application_monitoring/ios/supported_versions/ - tag: Documentation - text: Versions prises en charge pour la surveillance RUM iOS et tvOS -- link: https://github.com/DataDog/dd-sdk-ios-apollo-interceptor - tag: Source Code - text: Intégration Datadog pour Apollo iOS -title: Configuration avancée iOS ---- -Si vous n'avez pas encore configuré le SDK RUM iOS, suivez les [instructions de configuration dans l'application][1] ou consultez la [documentation de configuration RUM iOS][2]. - -## Enrichir les sessions utilisateur - -Le RUM iOS suit automatiquement des attributs tels que l'activité des utilisateurs, les écrans, les erreurs et les requêtes réseau. Consultez la [documentation de collecte de données RUM][3] pour en savoir plus sur les événements RUM et les attributs par défaut. Vous pouvez enrichir davantage les informations de session utilisateur et obtenir un meilleur contrôle sur les attributs collectés en suivant des événements personnalisés. - -### Vues personnalisées - -En plus de [suivre automatiquement les vues](#automatically-track-views), vous pouvez également suivre des vues spécifiques telles que `viewControllers` lorsqu'elles deviennent visibles et interactives. Arrêtez de suivre lorsque la vue n'est plus visible en utilisant les méthodes suivantes dans `RUMMonitor.shared()` : - -- `.startView(viewController:)` -- `.stopView(viewController:)` - -Par exemple : - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogRUM - -// in your `UIViewController`: -let rum = RUMMonitor.shared() - -override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - rum.startView(viewController: self) -} - -override func viewDidDisappear(_ animated: Bool) { - super.viewDidDisappear(animated) - rum.stopView(viewController: self) -} -``` - -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -@import DatadogRUM; -// in your `UIViewController`: - -DDRUMMonitor *rum = [DDRUMMonitor shared]; - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - - [rum startViewWithViewController:self name:nil attributes:nil]; -} - -- (void)viewDidDisappear:(BOOL)animated { - [super viewDidDisappear:animated]; - - [rum stopViewWithViewController:self attributes:nil]; -} -``` -{{% /tab %}} -{{< /tabs >}} - -Pour plus de détails et les options disponibles, voir [`RUMMonitorProtocol` sur GitHub][4]. - -### Actions personnalisées - -En plus de [suivre automatiquement les actions](#automatically-track-user-actions), vous pouvez également suivre des actions utilisateur personnalisées (taps, clics et défilements) via l'API `addAction(type:name:)`. - -Pour enregistrer manuellement des actions RUM instantanées telles que `.tap` sur `RUMMonitor.shared()`, utilisez `.addAction(type:name:)`. Pour des actions RUM continues telles que `.scroll`, utilisez `.startAction(type:name:)` ou `.stopAction(type:)`. - -Par exemple : - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogRUM - -// in your `UIViewController`: - -let rum = RUMMonitor.shared() - -@IBAction func didTapDownloadResourceButton(_ sender: UIButton) { - rum.addAction( - type: .tap, - name: sender.currentTitle ?? "" - ) -} -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -- (IBAction)didTapDownloadResourceButton:(UIButton *)sender { - NSString *name = sender.currentTitle ? sender.currentTitle : @""; - [[DDRUMMonitor shared] addActionWithType:DDRUMActionTypeTap name:name attributes:@{}]; -} -``` -{{% /tab %}} -{{< /tabs >}} - -**Remarque** : Lors de l'utilisation de `.startAction(type:name:)` et `.stopAction(type:)`, l'action `type` doit être la même. Ceci est nécessaire pour que le SDK RUM iOS associe le début d'une action à son achèvement. - -Pour plus de détails et les options disponibles, voir [`RUMMonitorProtocol` sur GitHub][4]. - -### Ressources personnalisées - -En plus de [suivre automatiquement les ressources](#automatically-track-network-requests), vous pouvez également suivre des ressources spécifiques, telles que des requêtes réseau ou des API de fournisseurs tiers. Utilisez les méthodes suivantes sur `RUMMonitor.shared()` pour collecter manuellement des ressources RUM : - -- `.startResource(resourceKey:request:)` -- `.stopResource(resourceKey:response:)` -- `.stopResourceWithError(resourceKey:error:)` -- `.stopResourceWithError(resourceKey:message:)` - -Par exemple : - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogRUM - -// in your network client: - -let rum = RUMMonitor.shared() - -rum.startResource( - resourceKey: "resource-key", - request: request -) - -rum.stopResource( - resourceKey: "resource-key", - response: response -) -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -// in your network client: - -[[DDRUMMonitor shared] startResourceWithResourceKey:@"resource-key" - request:request - attributes:@{}]; - -[[DDRUMMonitor shared] stopResourceWithResourceKey:@"resource-key" - response:response - attributes:@{}]; -``` -{{% /tab %}} -{{< /tabs >}} - -**Remarque** : Le `String` utilisé pour `resourceKey` dans les deux appels doit être unique pour la ressource que vous appelez. Ceci est nécessaire pour que le SDK RUM iOS associe le début d'une ressource à son achèvement. - -Pour plus de détails et les options disponibles, voir [`RUMMonitorProtocol` sur GitHub][4]. - -### Erreurs personnalisées - -Pour suivre des erreurs spécifiques, notifiez `RUMMonitor.shared()` lorsqu'une erreur se produit en utilisant l'une des méthodes suivantes : - -- `.addError(message:)` -- `.addError(error:)` - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -let rum = RUMMonitor.shared() -rum.addError(message: "error message.") -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -[[DDRUMMonitor shared] addErrorWithMessage:@"error message." stack:nil source:DDRUMErrorSourceCustom attributes:@{}]; -``` -{{% /tab %}} -{{< /tabs >}} - -Pour plus de détails et d'options disponibles, voir [`RUMMonitorProtocol` sur GitHub][4] et la [documentation des attributs d'erreur][5]. - -## Suivre des attributs globaux personnalisés - -En plus des [attributs RUM par défaut][6] capturés automatiquement par le SDK RUM iOS, vous pouvez choisir d'ajouter des informations contextuelles supplémentaires (telles que des attributs personnalisés) à vos événements RUM pour enrichir votre observabilité au sein de Datadog. - -Les attributs personnalisés vous permettent de filtrer et de regrouper des informations sur le comportement des utilisateurs observés (comme la valeur du panier, le niveau du marchand ou la campagne publicitaire) avec des informations au niveau du code (comme les services backend, la chronologie de session, les journaux d'erreurs et la santé du réseau). - -
Les attributs personnalisés sont destinés à de petites informations ciblées (par exemple, des identifiants, des indicateurs ou des étiquettes courtes). Évitez d'attacher de grands objets tels que des charges utiles complètes de réponse HTTP. Cela peut augmenter considérablement la taille des événements et impacter les performances.
- -### Définir un attribut global personnalisé - -Pour définir un attribut global personnalisé, utilisez `RUMMonitor.shared().addAttribute(forKey:value:)`. - -* Pour ajouter un attribut, utilisez `RUMMonitor.shared().addAttribute(forKey: "", value: "")`. -* Pour mettre à jour la valeur, utilisez `RUMMonitor.shared().addAttribute(forKey: "", value: "")`. -* Pour supprimer la clé, utilisez `RUMMonitor.shared().removeAttribute(forKey: "")`. - -Pour de meilleures performances lors des opérations en masse (modification de plusieurs attributs à la fois), utilisez `.addAttributes(_:)` et `.removeAttributes(forKeys:)`. - -**Remarque** : Vous ne pouvez pas créer de facettes sur des attributs personnalisés si vous utilisez des espaces ou des caractères spéciaux dans vos noms de clés. Par exemple, utilisez `forKey: "store_id"` au lieu de `forKey: "Store ID"`. - -### Suivre les sessions des utilisateurs - -Ajouter des informations sur les utilisateurs à vos sessions RUM facilite : - -* Suivre le parcours d'un utilisateur donné -* Savoir quels utilisateurs sont les plus impactés par les erreurs -* Surveiller les performances de vos utilisateurs les plus importants - -{{< img src="real_user_monitoring/browser/advanced_configuration/user-api.png" alt="API utilisateur dans l'interface RUM" >}} - -| Attribut | Type | Description | -| ----------- | ------ | ------------------------------------------------------------------------------- | -| `usr.id` | Chaîne | (Requis) Identifiant unique de l'utilisateur. | -| `usr.name` | Chaîne | (Optionnel) Nom convivial de l'utilisateur, affiché par défaut dans l'interface RUM. | -| `usr.email` | Chaîne | (Optionnel) Email de l'utilisateur, affiché dans l'interface RUM si le nom de l'utilisateur n'est pas présent. | - -Pour identifier les sessions des utilisateurs, utilisez l'API `Datadog.setUserInfo(id:name:email:)`. - -Par exemple : - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogCore - -Datadog.setUserInfo(id: "1234", name: "John Doe", email: "john@doe.com") -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -[DDDatadog setUserInfoWithId:@"1234" name:@"John Doe" email:@"john@doe.com" extraInfo:@{}]; -``` -{{% /tab %}} -{{< /tabs >}} - -## Suivre les événements en arrière-plan - -

Le suivi des événements en arrière-plan peut entraîner des sessions supplémentaires, ce qui peut avoir un impact sur la facturation. Pour toute question, contactez le support Datadog.

-
- -Vous pouvez suivre des événements tels que des plantages et des requêtes réseau lorsque votre application est en arrière-plan (par exemple, aucune vue active n'est disponible). - -Pour suivre les événements en arrière-plan, ajoutez le code suivant lors de l'initialisation dans votre configuration Datadog : - -```swift -import DatadogRUM - -RUM.enable( - with: RUM.Configuration( - ... - trackBackgroundEvents: true - ) -) -``` - -## Paramètres d'initialisation - -Vous pouvez utiliser les propriétés suivantes dans `Datadog.Configuration` lors de la création de la configuration Datadog pour initialiser la bibliothèque : - -`backgroundTasksEnabled` -: Ce drapeau détermine si les méthodes `UIApplication` `beginBackgroundTask(expirationHandler:)` et `endBackgroundTask:` sont utilisées pour effectuer des téléchargements en arrière-plan. Activer ce drapeau pourrait augmenter le temps pendant lequel l'application fonctionne en arrière-plan de 30 secondes. Les tâches sont normalement arrêtées lorsqu'il n'y a rien à télécharger ou lorsqu'elles rencontrent un obstacle au téléchargement, comme l'absence de connexion Internet ou une batterie faible. Par défaut, ce drapeau est réglé sur `false`. - -`batchProcessingLevel` - : Le niveau de traitement par lots définit le nombre maximum de lots traités séquentiellement sans délai au sein d'un cycle de lecture/téléchargement. La valeur par défaut est `.medium`. - -`batchSize` - : Définit la taille préférée des données groupées téléchargées vers Datadog. Cette valeur impacte la taille et le nombre de requêtes effectuées par le SDK RUM iOS (de petits lots signifient plus de requêtes, mais chaque requête devient plus petite en taille). Les valeurs disponibles incluent : `.small`, `.medium` et `.large`. - -`bundle` - : L'objet bundle qui contient l'exécutable actuel. - -`clientToken` - : Soit le jeton client RUM (qui prend en charge RUM, Logging et APM) soit le jeton client régulier (qui prend en charge Logging et APM). - -`encryption` - : Chiffrement des données à utiliser pour la persistance des données sur disque en fournissant un objet conforme au protocole `DataEncryption`. - -`env` - : Le nom de l'environnement qui est envoyé à Datadog. Cela peut être utilisé pour filtrer les événements par différents environnements (comme `staging` ou `production`). - -`proxyConfiguration` - : Un attribut de configuration de proxy qui peut être utilisé pour activer un proxy personnalisé pour télécharger les données suivies vers l'entrée de Datadog. - -`serverDateProvider` - : Une interface de synchronisation NTP personnalisée. Par défaut, le SDK Datadog se synchronise avec des pools NTP dédiés fournis par le [NTP Pool Project][7]. L'utilisation de différents pools ou la définition d'une implémentation de non opération `ServerDateProvider` entraîne une désynchronisation de l'instance SDK et des serveurs Datadog. Cela peut entraîner des décalages horaires significatifs dans les sessions RUM ou les traces distribuées. - -`service` - : Le nom du service associé aux données envoyées à Datadog. La valeur par défaut est l'identifiant du bundle de l'application. - -`site` - : Le point de terminaison du serveur Datadog auquel les données sont envoyées. La valeur par défaut est `.us1`. - -`uploadFrequency` - : La fréquence préférée de téléchargement des données vers Datadog. Les valeurs disponibles incluent : `.frequent`, `.average` et `.rare`. - -### Configuration RUM - -Vous pouvez utiliser les propriétés suivantes dans `RUM.Configuration` lors de l'activation de RUM : - -`actionEventMapper` - : Définit le rappel de nettoyage des données pour les actions. Cela peut être utilisé pour modifier ou supprimer des événements d'action avant qu'ils ne soient envoyés à Datadog. Pour plus d'informations, voir [Modifier ou supprimer des événements RUM](#modify-or-drop-rum-events). - -`appHangThreshold` - : Définit le seuil de signalement lorsque une application se bloque. La valeur minimale autorisée pour cette option est de `0.1` secondes. Pour désactiver le signalement, définissez cette valeur à `nil`. Pour plus d'informations, voir [Ajouter le signalement des blocages d'application][8]. - -`applicationID` - : L'identifiant de l'application RUM. - -`customEndpoint` - : Une URL de serveur personnalisée pour l'envoi des données RUM. - -`errorEventMapper` - : Le rappel de nettoyage des données pour les erreurs. Cela peut être utilisé pour modifier ou supprimer des événements d'erreur avant qu'ils ne soient envoyés à Datadog. Pour plus d'informations, voir [Modifier ou supprimer des événements RUM](#modify-or-drop-rum-events). - -`longTaskEventMapper` - : Le rappel de nettoyage des données pour les tâches longues. Cela peut être utilisé pour modifier ou supprimer des événements de tâches longues avant qu'ils ne soient envoyés à Datadog. Pour plus d'informations, voir [Modifier ou supprimer des événements RUM](#modify-or-drop-rum-events). - -`longTaskThreshold` - : Le seuil pour le suivi des tâches longues RUM (en secondes). Par défaut, cela est envoyé à `0.1` secondes. - -`networkSettledResourcePredicate` - : Le prédicat utilisé pour classer les ressources "initiales" pour le calcul du temps de vue Time-to-Network-Settled (TNS). - -`nextViewActionPredicate` - : Le prédicat utilisé pour classer la "dernière" action pour le calcul du temps de vue Interaction-to-Next-View (INV). - -`onSessionStart` - : (Optionnel) La méthode qui est appelée lorsque RUM commence la session. - -`resourceEventMapper` - : Le rappel de nettoyage des données pour les ressources. Cela peut être utilisé pour modifier ou supprimer des événements de ressources avant qu'ils ne soient envoyés à Datadog. Pour plus d'informations, voir [Modifier ou supprimer des événements RUM](#modify-or-drop-rum-events). - -`sessionSampleRate` - : Le taux d'échantillonnage pour les sessions RUM. La valeur `sessionSampleRate` doit être comprise entre `0.0` et `100.0`. Une valeur de `0.0` signifie qu'aucune session n'est envoyée, tandis que `100.0` signifie que toutes les sessions sont envoyées à Datadog. La valeur par défaut est `100.0`. - -`telemetrySampleRate` - : Le taux d'échantillonnage pour la télémétrie interne du SDK utilisée par Datadog. Ce taux contrôle le nombre de requêtes signalées au système de traçage. Cela doit être une valeur comprise entre `0` et `100`. Par défaut, cela est réglé sur `20`. - -`trackAnonymousUser` - : Lorsque activé, le SDK génère un identifiant utilisateur anonyme unique et non personnel qui est conservé entre les lancements de l'application. Cet identifiant sera attaché à chaque session RUM, vous permettant de lier les sessions provenant du même utilisateur/appareil sans collecter de données personnelles. Par défaut, cela est réglé sur `true`. - -`trackBackgroundEvents` - : Détermine si les événements RUM sont suivis lorsque aucune vue n'est active. Par défaut, cela est réglé sur `false`. - -`trackFrustrations` - : Détermine si le suivi automatique des frustrations des utilisateurs est activé. Par défaut, cela est réglé sur `true`. - -`trackMemoryWarnings` - : Détermine si le suivi automatique des avertissements de mémoire est activé. Par défaut, cela est réglé sur `true`. - -`trackWatchdogTerminations` - : Détermine si le SDK doit suivre les terminaisons d'application effectuées par Watchdog. Le paramètre par défaut est `false`. - -`uiKitActionsPredicate` - : Active le suivi des interactions des utilisateurs (taps) en tant qu'actions RUM. Vous pouvez utiliser l'implémentation par défaut de `predicate` en réglant le `DefaultUIKitRUMActionsPredicate` ou implémenter [ votre propre `UIKitRUMActionsPredicate`](#automatically-track-user-actions) personnalisé pour votre application. - -`uiKitViewsPredicate` -Active le suivi de `UIViewControllers` en tant que vues RUM. Vous pouvez utiliser l'implémentation par défaut de `predicate` en définissant le `DefaultUIKitRUMViewsPredicate` ou implémenter [ votre propre `UIKitRUMViewsPredicate`](#automatically-track-views) personnalisé pour votre application. - -`urlSessionTracking` -: Permet de suivre les `URLSession` tâches (requêtes réseau) en tant que ressources RUM. Le paramètre `firstPartyHostsTracing` définit les hôtes qui sont classés comme ressources `first-party` (si RUM est activé) et qui ont des informations de traçage injectées (si la fonctionnalité de traçage est activée). Le paramètre `resourceAttributesProvider` définit une fermeture pour fournir des attributs personnalisés pour les ressources interceptées qui est appelée pour chaque ressource collectée par le SDK RUM iOS. Cette fermeture est appelée avec des informations de tâche et peut renvoyer des attributs de ressource personnalisés ou `nil` si aucun attribut ne doit être attaché. - -`viewEventMapper` -: Le rappel de nettoyage des données pour les vues. Cela peut être utilisé pour modifier les événements de vue avant qu'ils ne soient envoyés à Datadog. Pour plus d'informations, voir [Modifier ou supprimer les événements RUM](#modify-or-drop-rum-events). - -`vitalsUpdateFrequency` -: La fréquence préférée pour la collecte des données mobiles essentielles. Les valeurs disponibles incluent : `.frequent` (toutes les 100 ms), `.average` (toutes les 500 ms), `.rare` (toutes les 1 s), et `.never` (qui désactive la surveillance des données essentielles). - -### Suivre automatiquement les vues - -Vous pouvez suivre automatiquement les vues avec UIKit et SwiftUI. - -{{% collapse-content title="UIKit" level="h4" expanded=true id="auto-track-views-uikit" %}} - -Pour suivre automatiquement les vues (`UIViewControllers`), utilisez l'option `uiKitViewsPredicate` lors de l'activation de RUM. Par défaut, les vues sont nommées d'après le nom de la classe du contrôleur de vue. Pour le personnaliser, fournissez votre propre implémentation de `predicate` qui respecte le protocole `UIKitRUMViewsPredicate` : - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -public protocol UIKitRUMViewsPredicate { - func rumView(for viewController: UIViewController) -> RUMView? -} -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```swift -@objc -public protocol DDUIKitRUMViewsPredicate: AnyObject { - func rumView(for viewController: UIViewController) -> DDRUMView? -} -``` -{{% /tab %}} -{{< /tabs >}} - -Dans l'implémentation de `rumView(for:)`, votre application doit décider si une instance donnée de `UIViewController` doit démarrer une vue RUM (retourner une valeur) ou non (retourner `nil`). La valeur `RUMView` retournée doit spécifier le `name` et peut fournir des `attributes` supplémentaires pour la vue RUM créée. - -Par exemple, vous pouvez configurer le prédicat pour utiliser une vérification de type explicite pour chaque contrôleur de vue dans votre application : - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -class YourCustomPredicate: UIKitRUMViewsPredicate { - - func rumView(for viewController: UIViewController) -> RUMView? { - switch viewController { - case is HomeViewController: return .init(name: "Home") - case is DetailsViewController: return .init(name: "Details") - default: return nil - } - } -} -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -@interface YourCustomPredicate : NSObject - -@end - -@implementation YourCustomPredicate - -- (DDRUMView * _Nullable)rumViewFor:(UIViewController * _Nonnull)viewController { - if ([viewController isKindOfClass:[HomeViewController class]]) { - return [[DDRUMView alloc] initWithName:@"Home" attributes:@{}]; - } - - if ([viewController isKindOfClass:[DetailsViewController class]]) { - return [[DDRUMView alloc] initWithName:@"Details" attributes:@{}]; - } - - return nil; -} - -@end -``` -{{% /tab %}} -{{< /tabs >}} - -Vous pouvez même proposer une solution plus dynamique en fonction de l'architecture de votre application. - -Par exemple, si vos contrôleurs de vue utilisent `accessibilityLabel` de manière cohérente, vous pouvez nommer les vues par la valeur de l'étiquette d'accessibilité : - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -class YourCustomPredicate: UIKitRUMViewsPredicate { - - func rumView(for viewController: UIViewController) -> RUMView? { - guard let accessibilityLabel = viewController.accessibilityLabel else { - return nil - } - - return RUMView(name: accessibilityLabel) - } -} -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -@interface YourCustomPredicate : NSObject - -@end - -@implementation YourCustomPredicate - -- (DDRUMView * _Nullable)rumViewFor:(UIViewController * _Nonnull)viewController { - if (viewController.accessibilityLabel) { - return [[DDRUMView alloc] initWithName:viewController.accessibilityLabel attributes:@{}]; - } - - return nil; -} - -@end -``` -{{% /tab %}} -{{< /tabs >}} - -**Remarque** : Le SDK RUM iOS appelle `rumView(for:)` plusieurs fois pendant que votre application est en cours d'exécution. Datadog recommande de garder son implémentation rapide et à thread unique. -{{% /collapse-content %}} - -{{% collapse-content title="SwiftUI" level="h4" expanded=true id="auto-track-views-swiftui" %}} - -Pour suivre automatiquement les vues avec SwiftUI, utilisez l'option `swiftUIViewsPredicate` lors de l'activation de RUM. - -Le mécanisme pour extraire un nom de vue SwiftUI repose sur la réflexion. En conséquence, les noms de vue peuvent ne pas toujours être significatifs. Si un nom significatif ne peut pas être extrait, un nom générique tel que `AutoTracked_HostingController_Fallback` ou `AutoTracked_NavigationStackController_Fallback` est utilisé. - -Vous pouvez utiliser le prédicat par défaut (`DefaultSwiftUIRUMViewsPredicate`) ou fournir votre propre implémentation du protocole `SwiftUIRUMViewsPredicate` pour personnaliser ou filtrer les noms de vue. - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -public protocol SwiftUIRUMViewsPredicate { - func rumView(for extractedViewName: String) -> RUMView? -} - -// Example: Custom predicate to ignore fallback names and rename views -class CustomSwiftUIPredicate: SwiftUIRUMViewsPredicate { - func rumView(for extractedViewName: String) -> RUMView? { - if extractedViewName == "AutoTracked_HostingController_Fallback" || - extractedViewName == "AutoTracked_NavigationStackController_Fallback" { - return nil // Ignore fallback names - } - if extractedViewName == "MySpecialView" { - return RUMView(name: "Special") - } - return RUMView(name: extractedViewName) - } -} -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -@protocol DDSwiftUIRUMViewsPredicate -- (DDRUMView * _Nullable)rumViewFor:(NSString * _Nonnull)extractedViewName; -@end - -@interface CustomSwiftUIPredicate : NSObject -@end - -@implementation CustomSwiftUIPredicate -- (DDRUMView * _Nullable)rumViewFor:(NSString * _Nonnull)extractedViewName { - if ([extractedViewName isEqualToString:@"AutoTracked_HostingController_Fallback"] || - [extractedViewName isEqualToString:@"AutoTracked_NavigationStackController_Fallback"]) { - return nil; // Ignore fallback names - } - if ([extractedViewName isEqualToString:@"MySpecialView"]) { - return [[DDRUMView alloc] initWithName:@"Special" attributes:@{}]; - } - return [[DDRUMView alloc] initWithName:extractedViewName attributes:@{}]; -} -@end -``` -{{% /tab %}} -{{< /tabs >}} - -**Remarques :** -- Datadog recommande également d'activer le suivi des vues UIKit, même si votre application est entièrement construite avec SwiftUI. -- Les barres d'onglets ne sont pas suivies automatiquement. Utilisez [le suivi manuel](#custom-views) pour chaque vue d'onglet afin de vous assurer qu'elles sont suivies. -- Si vous utilisez à la fois le suivi automatique et manuel, vous pouvez voir des événements en double. Pour éviter cela, reposez-vous sur une seule méthode d'instrumentation ou utilisez un prédicat personnalisé pour filtrer les doublons. -{{% /collapse-content %}} - -### Suivi automatique des actions des utilisateurs - -#### UIKit - -Pour suivre automatiquement les actions de tapotement des utilisateurs avec UIKit, activez l'option `uiKitActionsPredicate` lors de l'activation de RUM. - -#### SwiftUI - -Pour suivre automatiquement les actions de tapotement des utilisateurs dans SwiftUI, activez l'option `swiftUIActionsPredicate` lors de l'activation de RUM. - -**Notes :** -- Datadog recommande d'activer le suivi des actions UIKit même pour les applications SwiftUI pures, car de nombreux composants interactifs sont basés sur UIKit en arrière-plan. -- Sur tvOS, seules les interactions de pression sur la télécommande sont suivies. Un prédicat UIKit est suffisant pour cela. Si vous avez une application SwiftUI pure mais que vous souhaitez suivre les pressions sur la télécommande sur tvOS, vous devez également activer l'instrumentation UIKit. -- L'implémentation diffère entre iOS 18+ et iOS 17 et inférieur : - - **iOS 18 et supérieur :** La plupart des interactions sont suivies de manière fiable avec des noms de composants corrects (par exemple, `SwiftUI_Button`, `SwiftUI_NavigationLink`). - - **iOS 17 et inférieur :** Le SDK ne peut pas distinguer entre les composants interactifs et non interactifs (par exemple, Bouton vs. Étiquette). Pour cette raison, les actions sont rapportées comme `SwiftUI_Unidentified_Element`. -- Si vous utilisez à la fois le suivi automatique et manuel, vous pouvez voir des événements en double. C'est une limitation connue. Pour éviter cela, utilisez uniquement un type d'instrumentation - soit automatique, soit manuel. -- Vous pouvez utiliser le prédicat par défaut, `DefaultSwiftUIRUMActionsPredicate`, ou fournir le vôtre pour filtrer ou renommer les actions. Vous pouvez également désactiver la détection des versions antérieures (iOS 17 et inférieur) si vous souhaitez uniquement un suivi fiable pour iOS 18+ : - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -// Use the default predicate by disabling iOS 17 and below detection -let predicate = DefaultSwiftUIRUMActionsPredicate(isLegacyDetectionEnabled: false) - -// Use your own predicate -class CustomSwiftUIActionsPredicate: SwiftUIRUMActionsPredicate { - func rumAction(for componentName: String) -> RUMAction? { - // Custom logic to filter or rename actions - return RUMAction(name: componentName) - } -} -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -// Use the default predicate by disabling iOS 17 and below detection -DDDefaultSwiftUIRUMActionsPredicate *swiftUIActionsPredicate = [[DDDefaultSwiftUIRUMActionsPredicate alloc] initWithIsLegacyDetectionEnabled:NO]; - -// Use your own predicate -@protocol DDSwiftUIRUMActionsPredicate -- (DDRUMAction * _Nullable)rumActionFor:(NSString * _Nonnull)componentName; -@end - -@interface CustomSwiftUIActionsPredicate : NSObject -@end - -@implementation CustomSwiftUIActionsPredicate -- (DDRUMAction * _Nullable)rumActionFor:(NSString * _Nonnull)componentName { - // Custom logic to filter or rename actions - return [[DDRUMAction alloc] initWithName:componentName attributes:@{}]; -} -@end -``` -{{% /tab %}} -{{< /tabs >}} - -#### Rapport d'actions par version iOS - -Le tableau ci-dessous montre comment iOS 17 et iOS 18 rapportent différentes interactions utilisateur. - -| **Composant** | **nom signalé iOS 18** | **nom signalé iOS 17** | -|------------------|---------------------------------------------------|--------------------------------------| -| Bouton | SwiftUI_Bouton | SwiftUI_Élément_Inconnu | -| NavigationLink | NavigationLink | SwiftUI_Élément_Inconnu | -| Menu | SwiftUI_Menu (et ses éléments comme _UIContextMenuCell)| SwiftUI_Menu (et ses éléments comme _UIContextMenuCell) | -| Lien | SwiftUI_Bouton | SwiftUI_Élément_Inconnu | - -### Suivre automatiquement les requêtes réseau - -Les requêtes réseau sont suivies automatiquement après avoir activé RUM avec la `urlSessionTracking` configuration. - -#### (Optionnel) Activer la répartition détaillée du temps - -Pour obtenir une répartition détaillée du temps (résolution DNS, poignée de main SSL, temps jusqu'au premier octet, temps de connexion et durée de téléchargement), activez `URLSessionInstrumentation` pour votre type de délégué : - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -URLSessionInstrumentation.enableDurationBreakdown( - with: .init( - delegateClass: .self - ) -) - -let session = URLSession( - configuration: .default, - delegate: (), - delegateQueue: nil -) -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -DDURLSessionInstrumentationConfiguration *config = [[DDURLSessionInstrumentationConfiguration alloc] initWithDelegateClass:[ class]]; -[DDURLSessionInstrumentation enableWithConfiguration:config]; - -NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] - delegate:[[ alloc] init] - delegateQueue:nil]; -``` -{{% /tab %}} -{{< /tabs >}} - -**Notes** : -- Sans `URLSessionInstrumentation`, les requêtes réseau sont toujours suivies. L'activation fournit une répartition détaillée du temps pour l'analyse des performances. -- Les données de réponse sont disponibles dans le `resourceAttributesProvider` rappel (défini dans `RUM.Configuration.URLSessionTracking`) pour les tâches avec des gestionnaires de complétion en mode automatique, et pour toutes les tâches après avoir activé `URLSessionInstrumentation`. -- Pour filtrer des requêtes spécifiques afin qu'elles ne soient pas suivies, utilisez le `resourceEventMapper` dans `RUM.Configuration` (voir [Modifier ou supprimer les événements RUM](#modify-or-drop-rum-events)). - -
Soyez attentif à la rétention des délégués. -Bien que l'instrumentation Datadog ne crée pas de fuites de mémoire directement, elle repose sur les délégués URLSession. Selon la documentation d'Apple : -"L'objet de session conserve une référence forte au délégué jusqu'à ce que votre application se termine ou invalide explicitement la session. Si vous n'invalidez pas la session en appelant la méthode invalidateAndCancel() ou finishTasksAndInvalidate(), votre application engendre des fuites de mémoire jusqu'à sa fermeture. -Pour éviter les fuites de mémoire, assurez-vous d'invalider toutes les instances de URLSession dont vous n'avez plus besoin. -
- - -Si vous avez plus d'un type de délégué dans votre application que vous souhaitez instrumenter, vous pouvez appeler `URLSessionInstrumentation.enable(with:)` pour chaque type de délégué. - -De plus, vous pouvez configurer les hôtes de première partie en utilisant `urlSessionTracking`. Cela classe les ressources qui correspondent au domaine donné comme "première partie" dans RUM et propage les informations de traçage à votre backend (si vous avez activé le traçage). Les traces réseau sont échantillonnées avec un taux d'échantillonnage ajustable. Un échantillonnage de 20 % est appliqué par défaut. - -Par exemple, vous pouvez configurer `example.com` comme hôte de première partie et activer à la fois les fonctionnalités RUM et de traçage : - -[10]: https://developer.apple.com/documentation/foundation/urlsession/init(configuration:delegate:delegatequeue:)#parameters -{{< tabs >}} -{{% tab "Swift" %}} - -```swift - -import DatadogRUM - -RUM.enable( - with: RUM.Configuration( - applicationID: "", - uiKitViewsPredicate: DefaultUIKitRUMViewsPredicate(), - uiKitActionsPredicate: DefaultUIKitRUMActionsPredicate(), - urlSessionTracking: RUM.Configuration.URLSessionTracking( - firstPartyHostsTracing: .trace(hosts: ["example.com"], sampleRate: 20) - ) - ) -) - -URLSessionInstrumentation.enable( - with: .init( - delegateClass: .self - ) -) - -let session = URLSession( - configuration: .default, - delegate: (), - delegateQueue: nil -) -``` - -Cela suit toutes les requêtes envoyées avec le `session` instrumenté. Les requêtes correspondant au domaine `example.com` sont marquées comme "première partie" et les informations de traçage sont envoyées à votre backend pour [connecter la ressource RUM à son Trace][1]. - - -[1]: https://docs.datadoghq.com/fr/real_user_monitoring/correlate_with_other_telemetry/apm?tab=browserrum -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -@import DatadogRUM; - -DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""]; -DDRUMURLSessionTracking *urlSessionTracking = [DDRUMURLSessionTracking new]; -[urlSessionTracking setFirstPartyHostsTracing:[DDRUMFirstPartyHostsTracing alloc] initWithHosts:@[@"example.com"] sampleRate:20]; -[configuration setURLSessionTracking:urlSessionTracking]; - -[DDRUM enableWith:configuration]; -``` -{{% /tab %}} -{{< /tabs >}} - -Pour ajouter des attributs personnalisés aux ressources, utilisez l'option `URLSessionTracking.resourceAttributesProvider` lors de l'activation du RUM. En définissant la fermeture du fournisseur d'attributs, vous pouvez renvoyer des attributs supplémentaires à attacher à la ressource suivie. - -Par exemple, vous pouvez vouloir ajouter les en-têtes de requête et de réponse HTTP à la ressource RUM : - -```swift -RUM.enable( - with: RUM.Configuration( - ... - urlSessionTracking: RUM.Configuration.URLSessionTracking( - resourceAttributesProvider: { request, response, data, error in - return [ - "request.headers" : redactedHeaders(from: request), - "response.headers" : redactedHeaders(from: response) - ] - } - ) - ) -) -``` - -Si vous ne souhaitez pas suivre les requêtes, vous pouvez désactiver URLSessionInstrumentation pour le type de délégué: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -URLSessionInstrumentation.disable(delegateClass: .self) -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -[DDURLSessionInstrumentation disableWithDelegateClass:[ class]]; -``` -{{% /tab %}} -{{< /tabs >}} - -#### instrumentation Apollo -L'instrumentation d'Apollo dans votre application iOS donne une visibilité RUM sur les erreurs et les performances de GraphQL. Parce que les requêtes GraphQL vont toutes à un seul point de terminaison et retournent souvent 200 OK même en cas d'erreurs, l'instrumentation HTTP par défaut manque de contexte. Cela permet à RUM de capturer le nom de l'opération, le type d'opération et les variables (et éventuellement la charge utile). Cela fournit un contexte plus détaillé pour chaque requête réseau. - -Cette intégration prend en charge à la fois Apollo iOS 1.0+ et Apollo iOS 2.0+. Suivez les instructions pour la version d'Apollo iOS que vous avez ci-dessous. - -1. [Configurez][2] la surveillance RUM avec Datadog iOS RUM. - -2. Ajoutez ce qui suit à votre fichier `Package.swift` de l'application: - - ```swift - dependencies: [ - // For Apollo iOS 1.0+ - .package(url: "https://github.com/DataDog/dd-sdk-ios-apollo-interceptor", .upToNextMajor(from: "1.0.0")) - - // For Apollo iOS 2.0+ - .package(url: "https://github.com/DataDog/dd-sdk-ios-apollo-interceptor", .upToNextMajor(from: "2.0.0")) - ] - ``` - - Alternativement, vous pouvez l'ajouter en utilisant Xcode: - 1. Allez à **Fichier** → **Ajouter des dépendances de package**. - 2. Entrez l'URL du dépôt : `https://github.com/DataDog/dd-sdk-ios-apollo-interceptor`. - 3. Sélectionnez la version du package qui correspond à votre version majeure d'Apollo (choisissez `1.x.x` pour Apollo iOS 1.0+ ou `2.x.x` pour Apollo iOS 2.0+). - -3. Configurez l'instrumentation réseau en fonction de votre version d'Apollo iOS: - - {{< tabs >}} - {{% tab "Apollo iOS 1.0+" %}} - - Configurez l'instrumentation réseau pour le URLSessionClient intégré d'Apollo: - - ```swift - import Apollo - - URLSessionInstrumentation.enable(with: .init(delegateClass: URLSessionClient.self)) - ``` - - Ajoutez l'intercepteur Datadog à votre configuration Apollo Client: - - ```swift - import Apollo - import DatadogApollo - - class CustomInterceptorProvider: DefaultInterceptorProvider { - override func interceptors(for operation: Operation) -> [ApolloInterceptor] { - var interceptors = super.interceptors(for: operation) - interceptors.insert(DatadogApolloInterceptor(), at: 0) - return interceptors - } - } - ``` - - {{% /tab %}} - {{% tab "Apollo iOS 2.0+" %}} - - Configurez l'instrumentation réseau en utilisant les `DatadogApolloDelegate` et `DatadogApolloURLSession` fournis : - - ```swift - import Apollo - import DatadogApollo - import DatadogCore - - // Create the Datadog delegate - let delegate = DatadogApolloDelegate() - - // Create the custom URLSession wrapper - let customSession = DatadogApolloURLSession( - configuration: .default, - delegate: delegate - ) - - // Enable Datadog instrumentation for the delegate - URLSessionInstrumentation.enable( - with: .init(delegateClass: DatadogApolloDelegate.self) - ) - - // Configure Apollo Client with the custom session - let networkTransport = RequestChainNetworkTransport( - urlSession: customSession, - interceptorProvider: NetworkInterceptorProvider(), - store: store, - endpointURL: url - ) - ``` - - Créez un fournisseur d'intercepteur avec l'intercepteur Datadog: - - ```swift - import Apollo - import DatadogApollo - - struct NetworkInterceptorProvider: InterceptorProvider { - func graphQLInterceptors(for operation: Operation) -> [any GraphQLInterceptor] where Operation : GraphQLOperation { - return [DatadogApolloInterceptor()] + DefaultInterceptorProvider.shared.graphQLInterceptors(for: operation) - } - } - ``` - - {{% /tab %}} - {{< /tabs >}} - - Cela permet à Datadog RUM d'extraire automatiquement le type d'opération, le nom, les variables et les charges utiles (facultatif) des requêtes pour enrichir les ressources RUM des requêtes GraphQL. - -
-
    -
  • L'intégration prend en charge les versions d'Apollo iOS 1.0+ et 2.0+.
  • -
  • Les opérations de type requête et mutation sont suivies, les opérations de subscription ne le sont pas.
  • -
  • L'envoi de charges utiles GraphQL est désactivé par défaut. Pour l'activer, définissez le drapeau sendGraphQLPayloads dans le constructeur de DatadogApolloInterceptor comme suit:
  • -
- -

-   let datadogInterceptor = DatadogApolloInterceptor(sendGraphQLPayloads: true)
-     
-
- -### Suivre automatiquement les erreurs - -Tous les journaux "erreur" et "critique" envoyés avec `Logger` sont automatiquement signalés comme des erreurs RUM et liés à la vue RUM actuelle : - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogLogs - -let logger = Logger.create() - -logger.error("message") -logger.critical("message") -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -@import DatadogLogs; - -DDLogger *logger = [DDLogger create]; -[logger error:@"message"]; -[logger critical:@"message"]; -``` -{{% /tab %}} -{{< /tabs >}} - -De même, tous les spans terminés marqués comme erreur sont signalés comme des erreurs RUM : - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogTrace - -let span = Tracer.shared().startSpan(operationName: "operation") -// ... capture the `error` -span.setError(error) -span.finish() -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -// ... capture the `error` -id span = [[DDTracer shared] startSpan:@"operation"]; -[span setError:error]; -[span finish]; -``` -{{% /tab %}} -{{< /tabs >}} - -## Modifier ou supprimer des événements RUM - -Pour modifier les attributs d'un événement RUM avant qu'il ne soit envoyé à Datadog ou pour supprimer un événement entièrement, utilisez l'API Event Mappers lors de la configuration du SDK RUM iOS : - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -let configuration = RUM.Configuration( - applicationID: "", - viewEventMapper: { RUMViewEvent in - return RUMViewEvent - } - resourceEventMapper: { RUMResourceEvent in - return RUMResourceEvent - } - actionEventMapper: { RUMActionEvent in - return RUMActionEvent - } - errorEventMapper: { RUMErrorEvent in - return RUMErrorEvent - } - longTaskEventMapper: { RUMLongTaskEvent in - return RUMLongTaskEvent - } -) -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""]; - -[configuration setViewEventMapper:^DDRUMViewEvent * _Nonnull(DDRUMViewEvent * _Nonnull RUMViewEvent) { - return RUMViewEvent; -}]; - -[configuration setErrorEventMapper:^DDRUMErrorEvent * _Nullable(DDRUMErrorEvent * _Nonnull RUMErrorEvent) { - return RUMErrorEvent; -}]; - -[configuration setResourceEventMapper:^DDRUMResourceEvent * _Nullable(DDRUMResourceEvent * _Nonnull RUMResourceEvent) { - return RUMResourceEvent; -}]; - -[configuration setActionEventMapper:^DDRUMActionEvent * _Nullable(DDRUMActionEvent * _Nonnull RUMActionEvent) { - return RUMActionEvent; -}]; - -[configuration setLongTaskEventMapper:^DDRUMLongTaskEvent * _Nullable(DDRUMLongTaskEvent * _Nonnull RUMLongTaskEvent) { - return RUMLongTaskEvent; -}]; -``` -{{% /tab %}} -{{< /tabs >}} - -Chaque mapper est une fermeture Swift avec une signature de `(T) -> T?`, où `T` est un type d'événement RUM concret. Cela permet de modifier des parties de l'événement avant qu'il ne soit envoyé. - -Par exemple, pour masquer des informations sensibles dans un `url` de ressource RUM, implémentez une fonction `redacted(_:) -> String` personnalisée et utilisez-la dans `resourceEventMapper` : - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -let configuration = RUM.Configuration( - applicationID: "", - resourceEventMapper: { RUMResourceEvent in - var RUMResourceEvent = RUMResourceEvent - RUMResourceEvent.resource.url = redacted(RUMResourceEvent.resource.url) - return RUMResourceEvent - } -) -``` -{{% /tab %}} -{{% tab "Objective-C" %}} - -```objective-c -DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""]; - -[configuration setResourceEventMapper:^DDRUMResourceEvent * _Nullable(DDRUMResourceEvent * _Nonnull RUMResourceEvent) { - return RUMResourceEvent; -}]; -``` -{{% /tab %}} -{{< /tabs >}} - -Retourner `nil` depuis le mapper d'erreur, de ressource ou d'action supprime entièrement l'événement ; l'événement n'est pas envoyé à Datadog. La valeur retournée par le mapper d'événements de vue ne doit pas être `nil` (pour supprimer des vues, personnalisez votre implémentation de `UIKitRUMViewsPredicate` ; lisez-en plus dans [suivi automatique des vues](#automatically-track-views)). - -Selon le type d'événement, seules certaines propriétés spécifiques peuvent être modifiées : - -| Type d'événement | Clé d'attribut | Description | -| ---------------- | ------------------------------------ | ------------------------------------------------ | -| RUMActionEvent | `RUMActionEvent.action.target?.name` | Nom de l'action. | -| | `RUMActionEvent.view.url` | URL de la vue liée à cette action. | -| RUMErrorEvent | `RUMErrorEvent.error.message` | Message d'erreur. | -| | `RUMErrorEvent.error.stack` | Trace de la pile de l'erreur. | -| | `RUMErrorEvent.error.resource?.url` | URL de la ressource à laquelle l'erreur se réfère. | -| | `RUMErrorEvent.view.url` | URL de la vue liée à cette erreur. | -| RUMResourceEvent | `RUMResourceEvent.resource.url` | URL de la ressource. | -| | `RUMResourceEvent.view.url` | URL de la vue liée à cette ressource. | -| Événement RUMView | `RUMViewEvent.view.name` | Nom de la vue. | -| | `RUMViewEvent.view.url` | URL de la vue. | -| | `RUMViewEvent.view.referrer` | URL qui a conduit à la vue initiale de la page. | - -## Récupérer l'ID de session RUM - -La récupération de l'ID de session RUM peut être utile pour le dépannage. Par exemple, vous pouvez joindre l'ID de session aux demandes de support, aux e-mails ou aux rapports de bogues afin que votre équipe de support puisse retrouver ultérieurement la session utilisateur dans Datadog. - -Vous pouvez accéder à l'ID de session RUM à l'exécution sans attendre l'événement `sessionStarted` : - -```swift -RumMonitor.shared().currentSessionID(completion: { sessionId in - currentSessionId = sessionId -}) -``` - -## Définir le consentement au suivi (conformité au RGPD) - -Pour être conforme à la réglementation RGPD, le SDK RUM iOS nécessite la valeur de consentement au suivi lors de l'initialisation. - -Le paramètre `trackingConsent` peut être l'une des valeurs suivantes : - -1. `.pending` : Le SDK RUM iOS commence à collecter et à regrouper les données mais ne les envoie pas à Datadog. Le SDK RUM iOS attend la nouvelle valeur de consentement au suivi pour décider quoi faire avec les données regroupées. -2. `.granted` : Le SDK RUM iOS commence à collecter les données et les envoie à Datadog. -Le SDK RUM iOS ne collecte aucune donnée. Aucun journal, trace ou événement RUM n'est envoyé à Datadog. - -Pour changer la valeur de consentement au suivi après l'initialisation du SDK RUM iOS, utilisez l'appel API `Datadog.set(trackingConsent:)`. Le SDK RUM iOS change son comportement en fonction de la nouvelle valeur. - -Par exemple, si le consentement de suivi actuel est `.pending` : - -- Si vous changez la valeur en `.granted`, le SDK RUM iOS envoie toutes les données actuelles et futures à Datadog; -- Si vous changez la valeur en `.notGranted`, le SDK RUM iOS efface toutes les données actuelles et ne collecte pas les données futures. - -## Ajouter des propriétés utilisateur - -Vous pouvez utiliser l'API `Datadog.addUserExtraInfo(_:)` pour ajouter des propriétés utilisateur supplémentaires aux propriétés déjà définies. - -```swift -import DatadogCore - -Datadog.addUserExtraInfo(["company": "Foo"]) -``` - -## Gestion des données - -Le SDK iOS stocke d'abord les événements localement et ne téléverse les événements que lorsque les conditions des [spécifications d'admission][9] sont remplies. - -### Effacer toutes les données - -Vous avez la possibilité de supprimer toutes les données non envoyées stockées par le SDK avec l'API `Datadog.clearAllData()`. - -```swift -import DatadogCore - -Datadog.clearAllData() -``` - -### Arrêter la collecte de données - -Vous pouvez utiliser `Datadog.stopInstance()` l'API pour arrêter une instance de SDK nommée (ou l'instance par défaut si le nom est `nil`) de collecter et de téléverser des données par la suite. - -```swift -import DatadogCore - -Datadog.stopInstance() -``` - -Appeler cette méthode désactive le SDK et toutes les fonctionnalités actives, telles que RUM. Pour reprendre la collecte de données, vous devez réinitialiser le SDK. Vous pouvez utiliser cette API si vous souhaitez modifier les configurations dynamiquement - -## Lectures complémentaires - -{{< partial name="whats-next/whats-next.html" >}} - -[1]: https://app.datadoghq.com/rum/application/create -[2]: /fr/real_user_monitoring/application_monitoring/ios -[3]: /fr/real_user_monitoring/application_monitoring/ios/data_collected/ -[4]: https://github.com/DataDog/dd-sdk-ios/blob/master/DatadogRUM/Sources/RUMMonitorProtocol.swift -[5]: /fr/real_user_monitoring/application_monitoring/ios/data_collected/?tab=error#error-attributes -[6]: /fr/real_user_monitoring/application_monitoring/ios/data_collected/?tab=session#default-attributes -[7]: https://www.ntppool.org/en/ -[8]: /fr/real_user_monitoring/error_tracking/mobile/ios/#add-app-hang-reporting -[9]: /fr/real_user_monitoring/application_monitoring/ios/setup \ No newline at end of file diff --git a/content/ja/profiler/enabling/_index.md b/content/ja/profiler/enabling/_index.md deleted file mode 100644 index 1f758b9da83..00000000000 --- a/content/ja/profiler/enabling/_index.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -aliases: -- /ja/tracing/faq/profiling_migration/ -- /ja/tracing/profiler/enabling/ -further_reading: -- link: getting_started/profiler - tag: ドキュメント - text: プロファイラーの概要 -- link: profiler/profile_visualizations - tag: ドキュメント - text: 使用可能なプロファイルの視覚化の詳細 -- link: profiler/profiler_troubleshooting - tag: ドキュメント - text: プロファイラの使用中に発生する問題を修正 -title: プロファイラーの有効化 -type: multi-code-lang ---- - -プロファイラーは、Datadog トレースライブラリ内で送信されます。アプリケーションですでに [APM を使用してトレースを収集][1]している場合は、ライブラリのインストールをスキップして、プロファイラーの有効化に直接進むことができます。 - -アプリケーションでプロファイラーを有効にする方法については、以下で言語を選択してください。 - - -{{< partial name="profiling/profiling-languages.html" >}} - - -## その他の参考資料 - -{{< partial name="whats-next/whats-next.html" >}} - - - -[1]: /ja/tracing/trace_collection/ \ No newline at end of file diff --git a/content/ja/real_user_monitoring/application_monitoring/ios/advanced_configuration.md b/content/ja/real_user_monitoring/application_monitoring/ios/advanced_configuration.md deleted file mode 100644 index 4d539b793fb..00000000000 --- a/content/ja/real_user_monitoring/application_monitoring/ios/advanced_configuration.md +++ /dev/null @@ -1,1137 +0,0 @@ ---- -aliases: -- /ja/real_user_monitoring/ios/advanced_configuration -- /ja/real_user_monitoring/mobile_and_tv_monitoring/advanced_configuration/ios -- /ja/real_user_monitoring/mobile_and_tv_monitoring/ios/advanced_configuration -description: ユーザーセッションの拡張、カスタムイベントの追跡、より良いインサイトの取得を目的としたデータ収集の制御のために iOS RUM SDK の高度な設定を構成します。 -further_reading: -- link: https://github.com/DataDog/dd-sdk-ios - tag: Source Code - text: ddsdkios のソースコード -- link: /real_user_monitoring - tag: Documentation - text: RUM およびセッションリプレイ -- link: /real_user_monitoring/application_monitoring/ios/supported_versions/ - tag: Documentation - text: RUM iOS および tvOS モニタリングサポート対象バージョン -- link: https://github.com/DataDog/dd-sdk-ios-apollo-interceptor - tag: Source Code - text: Apollo iOS 用の Datadog インテグレーション -title: iOS の高度な構成 ---- -まだ RUM iOS SDK のセットアップを完了していない場合は、[アプリ内セットアップ手順][1] に従うか、[RUM iOS セットアップドキュメント][2] を参照してください。 - -##ユーザーセッションの拡張 - -iOS RUM は、ユーザーの活動、画面、エラー、ネットワークリクエストなどの属性を自動的に追跡します。RUM イベントとデフォルト属性については、[RUM データ収集ドキュメント][3] を参照してください。ユーザーセッション情報をさらに拡張し、カスタムイベントを追跡することで、収集される属性をより細かく制御できます。 - -###カスタムビュー - -[ビューを自動追跡する](#automaticallytrackviews) ほか、`viewControllers` などの特定のビューが表示され、操作可能になった際に追跡することもできます。ビューが表示されなくなったときに追跡を停止するには、`RUMMonitor.shared()` 内の以下のメソッドを使用します。 - - `.startView(viewController:)` - `.stopView(viewController:)` - -たとえば、以下のとおりです。 - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogRUM - -// in your `UIViewController`: -let rum = RUMMonitor.shared() - -override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - rum.startView(viewController: self) -} - -override func viewDidDisappear(_ animated: Bool) { - super.viewDidDisappear(animated) - rum.stopView(viewController: self) -} -``` - -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -@import DatadogRUM; -// in your `UIViewController`: - -DDRUMMonitor *rum = [DDRUMMonitor shared]; - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - - [rum startViewWithViewController:self name:nil attributes:nil]; -} - -- (void)viewDidDisappear:(BOOL)animated { - [super viewDidDisappear:animated]; - - [rum stopViewWithViewController:self attributes:nil]; -} -``` -{{% /tab %}} -{{< /tabs >}} - -詳細および利用可能なオプションについては、[GitHub の `RUMMonitorProtocol` を参照してください][4]。 - -###カスタムアクション - -[アクションを自動追跡する] (#automaticallytrackuseractions) ほか、`addAction(type:name:)` API を使用して、特定のカスタムユーザーアクション (タップ、クリック、スクロール) も追跡することができます。 - -`RUMMonitor.shared()` 上での `.tap` などの瞬間的な RUM アクションを手動で登録するには、`.addAction(type:name:)` を使用します。`.scroll` のような継続的な RUM アクションには、`.startAction(type:name:)` または `.stopAction(type:)` を使用します。 - -たとえば、以下のとおりです。 - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogRUM - -// in your `UIViewController`: - -let rum = RUMMonitor.shared() - -@IBAction func didTapDownloadResourceButton(_ sender: UIButton) { - rum.addAction( - type: .tap, - name: sender.currentTitle ?? "" - ) -} -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -- (IBAction)didTapDownloadResourceButton:(UIButton *)sender { - NSString *name = sender.currentTitle ? sender.currentTitle : @""; - [[DDRUMMonitor shared] addActionWithType:DDRUMActionTypeTap name:name attributes:@{}]; -} -``` -{{% /tab %}} -{{< /tabs >}} - -**注意**: `.startAction(type:name:)` と `.stopAction(type:)` を使用する際には、アクションの `type` は同じでなければなりません。これは、RUM iOS SDK がアクションの開始とその完了を一致させるために必要です。 - -詳細および利用可能なオプションについては、[GitHub の `RUMMonitorProtocol` を参照してください][4]。 - -###カスタムリソース - -[リソースを自動的に追跡する](#automaticallytracknetworkrequests) ほか、ネットワークリクエストやサードパーティプロバイダー API などの特定のカスタムリソースを追跡することもできます。`RUMMonitor.shared()` で次のメソッドを使用して、RUM リソースを手動で収集します。 - - `.startResource(resourceKey:request:)` - `.stopResource(resourceKey:response:)` - `.stopResourceWithError(resourceKey:error:)` - `.stopResourceWithError(resourceKey:message:)` - -たとえば、以下のとおりです。 - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogRUM - -// in your network client: - -let rum = RUMMonitor.shared() - -rum.startResource( - resourceKey: "resource-key", - request: request -) - -rum.stopResource( - resourceKey: "resource-key", - response: response -) -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -// in your network client: - -[[DDRUMMonitor shared] startResourceWithResourceKey:@"resource-key" - request:request - attributes:@{}]; - -[[DDRUMMonitor shared] stopResourceWithResourceKey:@"resource-key" - response:response - attributes:@{}]; -``` -{{% /tab %}} -{{< /tabs >}} - -**注意**: 両方の呼び出しにおいて `resourceKey` に使用される `String` は、呼び出しているリソースに対して一意である必要があります。これは、RUM iOS SDK がリソースの開始と完了を一致させるために必要です。 - -詳細および利用可能なオプションについては、[GitHub の `RUMMonitorProtocol` を参照してください][4]。 - -###カスタムエラー - -特定のエラーを追跡するには、エラーが発生したときに `RUMMonitor.shared()` に通知するために、次のメソッドのいずれかを使用します。 - - `.addError(message:)` - `.addError(error:)` - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -let rum = RUMMonitor.shared() -rum.addError(message: "error message.") -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -[[DDRUMMonitor shared] addErrorWithMessage:@"error message." stack:nil source:DDRUMErrorSourceCustom attributes:@{}]; -``` -{{% /tab %}} -{{< /tabs >}} - -詳細および利用可能なオプションについては、[GitHub の `RUMMonitorProtocol`][4] および [エラー属性のドキュメント][5] を参照してください。 - -##カスタムグローバル属性の追跡 - -RUM iOS SDK が自動的に取得する [デフォルトの RUM 属性][6] に加えて、RUM イベントにカスタム属性などのコンテキスト情報を追加して、Datadog 内の観測可能性を高めることができます。 - -カスタム属性を使用すると、観察されたユーザーの行動に関する情報 (カート値、マーチャント層、広告キャンペーンなど) をコードレベルの情報 (バックエンドサービス、セッションタイムライン、エラーログ、ネットワークヘルスなど) でフィルタリングおよびグループ化することができます。 - -
カスタム属性は、ターゲットを絞った小規模の情報 (例: ID、フラグ、短いラベル) を目的としています。完全な HTTP レスポンスペイロードなどの大きなオブジェクトを添付することは避けてください。添付すると、イベントサイズが大幅に増加し、パフォーマンスに影響を与える可能性があります。
- -###カスタムグローバル属性の設定 - -カスタムグローバル属性を設定するには、`RUMMonitor.shared().addAttribute(forKey:value:)` を使用します。 - -* 属性を追加するには、`RUMMonitor.shared().addAttribute(forKey: "", value: "")` を使用します。 -* 値を更新するには、`RUMMonitor.shared().addAttribute(forKey: "", value: "")` を使用します。 -*キーを削除するには、`RUMMonitor.shared().removeAttribute(forKey: "")` を使用します。 - -一括操作 (複数の属性を一度に変更する) でのパフォーマンスを向上させるには、`.addAttributes(_:)` と `.removeAttributes(forKeys:)` を使用してください。 - -**注意**: キー名にスペースや特殊文字を使用すると、カスタム属性にファセットを作成することはできません。たとえば、`forKey: "Store ID"` の代わりに `forKey: "store_id"` を使用してください。 - -###ユーザーセッションの追跡 - -RUM セッションにユーザー情報を追加すると、次のことが簡単になります。 - -*特定のユーザーのジャーニーをたどる -*エラーの影響を最も受けているユーザーを把握する -*最も重要なユーザーのパフォーマンスを監視する - -{{< img src="real_user_monitoring/browser/advanced_configuration/user-api.png" alt="RUM UI 内のユーザー API" >}} - -| 属性 | タイプ | 説明 | -| | | | -`usr.id` | 文字列 | (必須) 一意のユーザー識別子。 | -`usr.name` | 文字列 | (オプション) RUM UI にデフォルトで表示されるユーザーフレンドリーな名前。 | -`usr.email` | 文字列 | (オプション) ユーザー名が存在しない場合に RUM UI に表示されるユーザーのメール。| - -ユーザーセッションを識別するには、`Datadog.setUserInfo(id:name:email:)` API を使用します。 - -たとえば、以下のとおりです。 - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogCore - -Datadog.setUserInfo(id: "1234", name: "John Doe", email: "john@doe.com") -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -[DDDatadog setUserInfoWithId:@"1234" name:@"John Doe" email:@"john@doe.com" extraInfo:@{}]; -``` -{{% /tab %}} -{{< /tabs >}} - -##バックグラウンドイベントの追跡 - -

バックグラウンドイベントの追跡は、追加のセッションを引き起こす可能性があり、課金に影響を与えることがあります。質問がある場合は、Datadog サポートにお問い合わせください。

-
- -アプリケーションがバックグラウンドにあるとき (たとえば、アクティブなビューがないとき)、クラッシュやネットワークリクエストなどのイベントを追跡することができます。 - -バックグラウンドイベントを追跡するには、Datadog の構成で、初期化時に以下のスニペットを追加します。 - -```swift -import DatadogRUM - -RUM.enable( - with: RUM.Configuration( - ... - trackBackgroundEvents: true - ) -) -``` - -##初期化パラメーター - -ライブラリを初期化するために Datadog の構成を作成する際、`Datadog.Configuration` で以下のプロパティを使用できます。 - -`backgroundTasksEnabled` -: このフラグは、`UIApplication` メソッド `beginBackgroundTask(expirationHandler:)` と `endBackgroundTask:` がバックグラウンドアップロードを実行するために使用されるかどうかを決定します。このフラグを有効にすると、アプリがバックグラウンドで動作する時間が 30 秒増加することがあります。タスクは、アップロードするものがない場合や、インターネット接続がない、またはバッテリー残量が少ないなど、アップロードを妨げる要因に直面した場合に通常停止します。デフォルトでは、このフラグは `false` に設定されています。 - -`batchProcessingLevel` -: バッチ処理レベルは、1 回の読み取り/アップロードサイクル内で遅延なしに順次処理される最大バッチ数を定義します。デフォルト値は `.medium` です。 - -`batchSize` -: Datadog にアップロードされるバッチデータの好ましいサイズを設定します。この値は、RUM iOS SDK によって実行されるリクエストのサイズと数に影響します (バッチサイズが小さいほどリクエスト数は増えますが、各リクエストのサイズは小さくなります)。利用可能な値には、`.small`、`.medium`、`.large` が含まれます。 - -`bundle` -: 現在の実行可能ファイルを含むバンドルオブジェクトです。 - -`clientToken` -: RUM クライアントトークン (RUM、ログ、APM をサポート) または通常のクライアントトークン (ログと APM をサポート) のいずれかです。 - -`encryption` -: `DataEncryption` プロトコルに準拠したオブジェクトを提供することによって、ディスク上のデータ永続性に使用するデータ暗号化を行います。 - -`enabled` -: Datadog に送信される環境名です。`staging` や `production` など、異なる環境によってイベントをフィルタリングするために使用できます。 - -`proxyConfiguration` -: トラッキングデータを Datadog のインテークにアップロードするためのカスタムプロキシを有効にするために使用できるプロキシ構成属性です。 - -`serverDateProvider` -: カスタム NTP 同期インターフェイスです。デフォルトでは、Datadog SDK は [NTP Pool Project][7] が提供する専用 NTP プールと同期します。異なるプールを使用するか、何も操作を行わない `ServerDateProvider` の実装を設定すると、SDK インスタンスと Datadog サーバー間が同期されなくなる場合があります。これにより、RUM セッションや分散トレースにおいて、大幅な時間ずれが発生する可能性があります。 - -`service` -: Datadog に送信されるデータに関連付けられたサービス名です。デフォルト値はアプリケーションバンドル識別子です。 - -`site` -: データが送信される Datadog サーバーエンドポイントです。デフォルト値は `.us1` です。 - -`uploadFrequency` -: Datadog へのデータアップロードの好ましい頻度です。利用可能な値には、`.frequent`、`.average`、`.rare` が含まれます。 - -###RUM 構成 - -RUM を有効にする際は、`RUM.Configuration` で以下のプロパティを使用することができます。 - -`actionEventMapper` -: アクションのデータスクラビングコールバックを設定します。これを使用して、アクションイベントを Datadog に送信する前に修正または削除することができます。詳細については、[RUM イベントの修正または削除](#modifyordroprumevents) を参照してください。 - -`appHangThreshold` -: アプリがハングしたときに報告するための閾値を設定します。このオプションの最小許容値は `0.1` 秒です。報告を無効にするには、この値を `nil` に設定します。詳細については、[アプリハング報告の追加][8] を参照してください。 - -`applicationID` -: RUM アプリケーション識別子です。 - -`customEndpoint` -: RUM データを送信するためのカスタムサーバー URL です。 - -`errorEventMapper` -: エラーのデータスクラビングコールバックです。これを使用して、エラーイベントを Datadog に送信する前に修正または削除することができます。詳細については、[RUM イベントの修正または削除](#modifyordroprumevents) を参照してください。 - -`longTaskEventMapper` -: 長いタスクのデータスクラビングコールバックです。これは、長いタスクイベントを Datadog に送信する前に修正または削除するために使用できます。詳細については、[RUM イベントの修正または削除](#modifyordroprumevents) を参照してください。 - -`longTaskThreshold` -: RUM の長いタスク追跡の閾値 (秒単位) です。デフォルトでは、`0.1` 秒に設定されます。 - -`networkSettledResourcePredicate` -: TimetoNetworkSettled (TNS) ビューのタイミング計算のために「初期」リソースを分類するために使用される述語です。 - -`nextViewActionPredicate` -: InteractiontoNextView (INV) タイミング計算のために「最後」のアクションを分類するために使用される述語です。 - -`onSessionStart` -: (オプション) RUM がセッションを開始するときに呼び出されるメソッドです。 - -`resourceEventMapper` -: リソースのデータスクラビングコールバックです。リソースイベントを Datadog に送信する前の修正または削除に使用できます。詳細については、[RUM イベントの修正または削除](#modifyordroprumevents) を参照してください。 - -`sessionSampleRate` -: RUM セッションのサンプリングレートです。`sessionSampleRate` の値は、`0.0` と `100.0` の間でなければなりません。`0.0` に設定されているとセッションが送信されません。`100.0` に設定されているとすべてのセッションが Datadog に送信されます。デフォルト値は `100.0` です。 - -`telemetrySampleRate` -: Datadog によって利用される SDK 内部のテレメトリのサンプリングレートです。このレートは、トレースシステムに報告されるリクエストの数を制御します。これは `0` と `100` の間の値でなければなりません。デフォルトでは、`20` に設定されています。 - -`trackAnonymousUser` -: 有効にすると、SDK はアプリ起動間で保持される、一意かつ個人情報を含まない匿名ユーザー ID を生成します。この ID は各 RUM セッションに添付されるため、個人データを収集せずに同じユーザー/デバイスから発生するセッションをリンクできるようになります。デフォルトでは、`true` に設定されています。 - -`trackBackgroundEvents` -: アクティブなビューがないときに RUM イベントが追跡されるかどうかを決定します。デフォルトでは、`false` に設定されています。 - -`trackFrustrations` -ユーザーのフラストレーションの自動追跡が有効かどうかを決定します。デフォルトでは、`true` に設定されています。 - -`trackMemoryWarnings` -: メモリ警告の自動追跡が有効かどうかを決定します。デフォルトでは、`true` に設定されています。 - -`trackWatchdogTerminations` -: SDK が Watchdog によって実行されるアプリケーションの終了を追跡するかどうかを決定します。デフォルト設定は `false` です。 - -`uiKitActionsPredicate` -ユーザーのインタラクション (タップ) を RUM アクションとして追跡することを有効にします。`DefaultUIKitRUMActionsPredicate` を設定することで `predicate` のデフォルト実装を使用するか、アプリにカスタマイズされた [独自の`UIKitRUMActionsPredicate`](#automaticallytrackuseractions) を実装することができます。 - -`uiKitViewsPredicate` -`UIViewControllers` を RUM ビューとして追跡することを有効にします。`DefaultUIKitRUMViewsPredicate` を設定することで `predicate` のデフォルト実装を使用するか、アプリにカスタマイズされた[独自の`UIKitRUMViewsPredicate`](#automaticallytrackviews)を実装することができます。 - -`urlSessionTracking` -: `URLSession` タスク (ネットワークリクエスト) を RUM リソースとして追跡することを有効にします。`firstPartyHostsTracing` パラメーターは、`firstparty` リソースとして分類されるホスト (RUM が有効な場合)、およびトレーシング情報が注入されるホスト (トレーシング機能が有効な場合) を定義します。`resourceAttributesProvider` パラメーターは、RUM iOS SDK によって収集された各リソースに対して呼び出されるインターセプトされたリソースのカスタム属性を提供するクロージャを定義します。このクロージャはタスク情報と共に呼び出され、カスタムリソース属性を返すか、属性を添付しない場合は `nil` を返すことができます。 - -`viewEventMapper` -: ビューのデータスクラビングコールバックです。ビューイベントを Datadog に送信する前に修正するために使用できます。詳細については、[RUM イベントの修正または削除](#modifyordroprumevents) を参照してください。 - -`vitalsUpdateFrequency` -: モバイルバイタルを収集するための好ましい頻度です。利用可能な値には、`.frequent` (100ms ごと)、`.average` (500ms ごと)、`.rare` (1 秒ごと)、および `.never` (バイタルモニタリングを無効) が含まれます。 - -###ビューの自動追跡 - -UIKit と SwiftUI を使用してビューを自動的に追跡できます。 - -{{% collapse-content title="UIKit" level="h4" expanded=true id="auto-track-views-uikit" %}} - -ビューを自動的に追跡するには (`UIViewControllers`)、RUM を有効にする際に `uiKitViewsPredicate` オプションを使用します。デフォルトでは、ビューはビューコントローラーのクラス名で命名されます。これをカスタマイズするには、`predicate` を実装し、`UIKitRUMViewsPredicate` プロトコルに準拠させてください。 - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -public protocol UIKitRUMViewsPredicate { - func rumView(for viewController: UIViewController) -> RUMView? -} -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```swift -@objc -public protocol DDUIKitRUMViewsPredicate: AnyObject { - func rumView(for viewController: UIViewController) -> DDRUMView? -} -``` -{{% /tab %}} -{{< /tabs >}} - -`rumView(for:)` の実装内で、アプリは特定の `UIViewController` インスタンスが RUM ビューを開始する (値を返す) か開始しない (`nil` を返す) を決定する必要があります。返される `RUMView` 値は、`name` を指定し、作成された RUM ビューの追加の `attributes` を提供することができます。 - -たとえば、述語を構成して、アプリの各ビューコントローラーに明示的なタイプチェックを使用できます。 - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -class YourCustomPredicate: UIKitRUMViewsPredicate { - - func rumView(for viewController: UIViewController) -> RUMView? { - switch viewController { - case is HomeViewController: return .init(name: "Home") - case is DetailsViewController: return .init(name: "Details") - default: return nil - } - } -} -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -@interface YourCustomPredicate : NSObject - -@end - -@implementation YourCustomPredicate - -- (DDRUMView * _Nullable)rumViewFor:(UIViewController * _Nonnull)viewController { - if ([viewController isKindOfClass:[HomeViewController class]]) { - return [[DDRUMView alloc] initWithName:@"Home" attributes:@{}]; - } - - if ([viewController isKindOfClass:[DetailsViewController class]]) { - return [[DDRUMView alloc] initWithName:@"Details" attributes:@{}]; - } - - return nil; -} - -@end -``` -{{% /tab %}} -{{< /tabs >}} - -アプリのアーキテクチャに基づき、さらに動的なソリューションを使用することも可能です。 - -たとえば、ビューコントローラーが `accessibilityLabel` を一貫して使用する場合、アクセシビリティラベルの値に基づいてビューに名前を付けることができます。 - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -class YourCustomPredicate: UIKitRUMViewsPredicate { - - func rumView(for viewController: UIViewController) -> RUMView? { - guard let accessibilityLabel = viewController.accessibilityLabel else { - return nil - } - - return RUMView(name: accessibilityLabel) - } -} -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -@interface YourCustomPredicate : NSObject - -@end - -@implementation YourCustomPredicate - -- (DDRUMView * _Nullable)rumViewFor:(UIViewController * _Nonnull)viewController { - if (viewController.accessibilityLabel) { - return [[DDRUMView alloc] initWithName:viewController.accessibilityLabel attributes:@{}]; - } - - return nil; -} - -@end -``` -{{% /tab %}} -{{< /tabs >}} - -**注**: RUM iOS SDK は、アプリが実行中の間に `rumView(for:)` を何度も呼び出します。Datadog は、その実装を迅速かつシングルスレッドに保つことを推奨しています。 -{{% /collapse-content %}} - -{{% collapse-content title="SwiftUI" level="h4" expanded=true id="auto-track-views-swiftui" %}} - -SwiftUI でビューを自動的に追跡するには、RUM を有効にする際に `swiftUIViewsPredicate` オプションを使用します。 - -SwiftUI ビュー名を抽出するメカニズムは、リフレクションに依存しています。そのため、ビュー名が常に意味のあるものになるとは限りません。意味のある名前を抽出できない場合、`AutoTracked_HostingController_Fallback` や `AutoTracked_NavigationStackController_Fallback` のような一般的な名前が使用されます。 - -デフォルトの述語 (`DefaultSwiftUIRUMViewsPredicate`) を使用するか、`SwiftUIRUMViewsPredicate` プロトコルの独自の実装を提供して、ビュー名をカスタマイズまたはフィルタリングできます。 - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -public protocol SwiftUIRUMViewsPredicate { - func rumView(for extractedViewName: String) -> RUMView? -} - -// Example: Custom predicate to ignore fallback names and rename views -class CustomSwiftUIPredicate: SwiftUIRUMViewsPredicate { - func rumView(for extractedViewName: String) -> RUMView? { - if extractedViewName == "AutoTracked_HostingController_Fallback" || - extractedViewName == "AutoTracked_NavigationStackController_Fallback" { - return nil // Ignore fallback names - } - if extractedViewName == "MySpecialView" { - return RUMView(name: "Special") - } - return RUMView(name: extractedViewName) - } -} -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -@protocol DDSwiftUIRUMViewsPredicate -- (DDRUMView * _Nullable)rumViewFor:(NSString * _Nonnull)extractedViewName; -@end - -@interface CustomSwiftUIPredicate : NSObject -@end - -@implementation CustomSwiftUIPredicate -- (DDRUMView * _Nullable)rumViewFor:(NSString * _Nonnull)extractedViewName { - if ([extractedViewName isEqualToString:@"AutoTracked_HostingController_Fallback"] || - [extractedViewName isEqualToString:@"AutoTracked_NavigationStackController_Fallback"]) { - return nil; // Ignore fallback names - } - if ([extractedViewName isEqualToString:@"MySpecialView"]) { - return [[DDRUMView alloc] initWithName:@"Special" attributes:@{}]; - } - return [[DDRUMView alloc] initWithName:extractedViewName attributes:@{}]; -} -@end -``` -{{% /tab %}} -{{< /tabs >}} - -**注:** - Datadog は、アプリが完全に SwiftUI で構築されている場合でも、UIKit ビューの追跡を有効にすることを推奨しています。 -タブバーは自動的に追跡されません。各タブビューに対して [手動追跡](#customviews) を使用して、確実に追跡されるようにしてください。 -自動追跡と手動追跡の両方を使用すると、イベントが重複して表示されることがあります。これを避けるためには、単一のインスツルメンテーション方法を使用するか、重複を除外するためのカスタム述語を使用してください。 -{{% /collapse-content %}} - -###ユーザーアクションの自動追跡 - -#### UIKit - -UIKit を使用してユーザーのタップ操作を自動的に追跡するには、RUM を有効にする際に `uiKitActionsPredicate` オプションを設定してください。 - -#### SwiftUI - -SwiftUI でユーザーのタップ操作を自動的に追跡するには、RUMを有効にする際に `swiftUIActionsPredicate` オプションを有効にしてください。 - -**注:** - Datadogは、純粋な SwiftUI アプリでも UIKit アクショントラッキングを有効にすることを推奨しています。多くのインタラクティブコンポーネントは、内部的に UIKit で実装されています。 -tvOS では、リモコンの押下インタラクションのみが追跡されます。これには UIKit の述語のみが必要です。純粋な SwiftUI アプリを持っていても、tvOS でリモコンの押下を追跡したい場合は、UIKit のインスツルメンテーションも有効にする必要があります。 -実装は iOS 18 以上と iOS 17 以下で異なります。 - **iOS 18以上:** ほとんどのインタラクションは、正しいコンポーネント名 (例: `SwiftUI_Button`、`SwiftUI_NavigationLink`) で確実に追跡されます。 - **iOS 17以下:** SDK はインタラクティブコンポーネントと非インタラクティブコンポーネントを区別できません (たとえば、Button と Label)。そのため、アクションは `SwiftUI_Unidentified_Element` として報告されます。 -自動追跡と手動追跡の両方を使用すると、イベントが重複して表示されることがあります。これは既知の制限です。これを避けるためには、自動または手動のいずれか 1 つのインスツルメンテーションタイプのみを使用してください。 -デフォルトの述語 `DefaultSwiftUIRUMActionsPredicate` を使用するか、アクションをフィルタリングまたは名前変更するために独自のものを提供できます。iOS 18 以上の信頼できるトラッキングのみを希望する場合は、レガシー検出 (iOS 17 以下) を無効にすることもできます。 - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -// Use the default predicate by disabling iOS 17 and below detection -let predicate = DefaultSwiftUIRUMActionsPredicate(isLegacyDetectionEnabled: false) - -// Use your own predicate -class CustomSwiftUIActionsPredicate: SwiftUIRUMActionsPredicate { - func rumAction(for componentName: String) -> RUMAction? { - // Custom logic to filter or rename actions - return RUMAction(name: componentName) - } -} -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -// Use the default predicate by disabling iOS 17 and below detection -DDDefaultSwiftUIRUMActionsPredicate *swiftUIActionsPredicate = [[DDDefaultSwiftUIRUMActionsPredicate alloc] initWithIsLegacyDetectionEnabled:NO]; - -// Use your own predicate -@protocol DDSwiftUIRUMActionsPredicate -- (DDRUMAction * _Nullable)rumActionFor:(NSString * _Nonnull)componentName; -@end - -@interface CustomSwiftUIActionsPredicate : NSObject -@end - -@implementation CustomSwiftUIActionsPredicate -- (DDRUMAction * _Nullable)rumActionFor:(NSString * _Nonnull)componentName { - // Custom logic to filter or rename actions - return [[DDRUMAction alloc] initWithName:componentName attributes:@{}]; -} -@end -``` -{{% /tab %}} -{{< /tabs >}} - -####iOS バージョンによるアクションレポート - -以下の表は、iOS 17 と iOS 18 におけるユーザーインタラクションの報告の違いを示しています。 - -| **コンポーネント** | **iOS 18 で報告される名前** | **iOS 17 で報告される名前** | -|||| -| Button | SwiftUI_Button | SwiftUI_Unidentified_Element | -| NavigationLink | NavigationLink | SwiftUI_Unidentified_Element | -| Menu | SwiftUI_Menu (およびそのアイテムは _UIContextMenuCell として) | SwiftUI_Menu (およびそのアイテムは _UIContextMenuCell として) | -| Link | SwiftUI_Button | SwiftUI_Unidentified_Element | - -###ネットワークリクエストの自動追跡 - -ネットワークリクエストは、`urlSessionTracking` 構成で RUM を有効にした後、自動的に追跡されます。 - -####(オプション) 詳細なタイミングの内訳の有効化 - -詳細なタイミングの内訳 (DNS 解決、SSL ハンドシェイク、最初のバイトまでの時間、接続時間、ダウンロード時間) を取得するには、デリゲートタイプに対して `URLSessionInstrumentation` を有効にします。 - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -URLSessionInstrumentation.enableDurationBreakdown( - with: .init( - delegateClass: .self - ) -) - -let session = URLSession( - configuration: .default, - delegate: (), - delegateQueue: nil -) -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -DDURLSessionInstrumentationConfiguration *config = [[DDURLSessionInstrumentationConfiguration alloc] initWithDelegateClass:[ class]]; -[DDURLSessionInstrumentation enableWithConfiguration:config]; - -NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] - delegate:[[ alloc] init] - delegateQueue:nil]; -``` -{{% /tab %}} -{{< /tabs >}} - -**注**: - `URLSessionInstrumentation` がない場合でも、ネットワークリクエストは追跡されます。これを有効にすると、パフォーマンス分析のための詳細なタイミングの内訳が提供されます。 -レスポンスデータは、`resourceAttributesProvider` コールバック (`RUM.Configuration.URLSessionTracking` で設定) で利用可能で、自動モードの完了ハンドラーを持つタスクと、`URLSessionInstrumentation` を有効にした後のすべてのタスクに対して利用できます。 -特定のリクエストを追跡から除外するには、`resourceEventMapper` を `RUM.Configuration` で使用します ([RUMイベントの変更または削除](#modifyordroprumevents) を参照)。 - -
デリゲートの保持に注意してください。 -Datadog のインスツルメンテーションは直接的にメモリリークを引き起こすことはありませんが、URLSession デリゲートに依存しています。 Apple のドキュメントによると -「セッションオブジェクトは、アプリが終了するか、セッションを明示的に無効にするまで、デリゲートへの強い参照を保持します。invalidateAndCancel() または finishTasksAndInvalidate() メソッドを呼び出してセッションを無効にしない限り、アプリは終了するまでメモリリークが発生します」。 -メモリリークを避けるために、もはや必要のない URLSession インスタンスを無効にすることを確認してください。 -
- - -アプリ内に計測したいデリゲートタイプが複数ある場合は、各デリゲートタイプに対して `URLSessionInstrumentation.enable(with:)` を呼び出すことができます。 - -また、`urlSessionTracking` を使用してファーストパーティホストを構成することができます。このクラスは、指定されたドメインに一致するリソースを RUM の「ファーストパーティ」として分類し、トレース情報をバックエンドに伝播します (トレースを有効にしている場合)。ネットワークトレースは、調整可能なサンプリングレートでサンプリングされます。デフォルトでは、20% のサンプリングが適用されます。 - -たとえば、`example.com` をファーストパーティホストとして構成し、RUM およびトレース機能の両方を有効にすることができます。 - -[10]: https://developer.apple.com/documentation/foundation/urlsession/init(configuration:delegate:delegatequeue:)#parameters -{{< tabs >}} -{{% tab "Swift" %}} - -```swift - -import DatadogRUM - -RUM.enable( - with: RUM.Configuration( - applicationID: "", - uiKitViewsPredicate: DefaultUIKitRUMViewsPredicate(), - uiKitActionsPredicate: DefaultUIKitRUMActionsPredicate(), - urlSessionTracking: RUM.Configuration.URLSessionTracking( - firstPartyHostsTracing: .trace(hosts: ["example.com"], sampleRate: 20) - ) - ) -) - -URLSessionInstrumentation.enable( - with: .init( - delegateClass: .self - ) -) - -let session = URLSession( - configuration: .default, - delegate: (), - delegateQueue: nil -) -``` - -これにより、インスツルメンテーション済みの `session` とともに送信されたすべてのリクエストが追跡されます。`example.com` ドメインに一致するリクエストは「ファーストパーティ」とマークされ、トレース情報がバックエンドに送信されて [RUM リソースがそのトレースに接続されます][1]。 - - -[1]: https://docs.datadoghq.com/ja/real_user_monitoring/correlate_with_other_telemetry/apm?tab=browserrum -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -@import DatadogRUM; - -DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""]; -DDRUMURLSessionTracking *urlSessionTracking = [DDRUMURLSessionTracking new]; -[urlSessionTracking setFirstPartyHostsTracing:[DDRUMFirstPartyHostsTracing alloc] initWithHosts:@[@"example.com"] sampleRate:20]; -[configuration setURLSessionTracking:urlSessionTracking]; - -[DDRUM enableWith:configuration]; -``` -{{% /tab %}} -{{< /tabs >}} - -リソースにカスタム属性を追加するには、RUM を有効にする際に `URLSessionTracking.resourceAttributesProvider` オプションを使用してください。属性プロバイダークロージャを設定することで、追跡されたリソースに添付される追加の属性を返すことができます。 - -たとえば、HTTP リクエストと応答ヘッダーを RUM リソースに追加できます。 - -```swift -RUM.enable( - with: RUM.Configuration( - ... - urlSessionTracking: RUM.Configuration.URLSessionTracking( - resourceAttributesProvider: { request, response, data, error in - return [ - "request.headers" : redactedHeaders(from: request), - "response.headers" : redactedHeaders(from: response) - ] - } - ) - ) -) -``` - -リクエストを追跡したくない場合は、デリゲートタイプの URLSessionInstrumentation を無効にすることができます。 - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -URLSessionInstrumentation.disable(delegateClass: .self) -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -[DDURLSessionInstrumentation disableWithDelegateClass:[ class]]; -``` -{{% /tab %}} -{{< /tabs >}} - -####Apollo のインスツルメンテーション -iOS アプリケーションで Apollo のインスツルメンテーションを有効にすると、RUM により GraphQL のエラーやパフォーマンスが可視化されます。GraphQL リクエストはすべて単一のエンドポイントに送信され、エラーが発生しても「200 OK」を返すことが多いため、デフォルトの HTTP インスツルメンテーションはコンテキストが不足しています。有効化により、RUM は操作名、操作タイプ、および変数 (オプションでペイロード) をキャプチャできます。これにより、各ネットワークリクエストの詳細なコンテキストが提供されます。 - -このインテグレーションは、Apollo iOS 1.0 以降 および Apollo iOS 2.0 以降の両方をサポートしています。以下の Apollo iOS バージョンの指示に従ってください。 - -1. [設定][2] Datadog iOS RUM で RUM モニタリングを行います。 - -2. 次の内容をご使用のアプリケーションの `Package.swift` ファイルに追加します。 - - ```swift - dependencies: [ - // For Apollo iOS 1.0+ - .package(url: "https://github.com/DataDog/dd-sdk-ios-apollo-interceptor", .upToNextMajor(from: "1.0.0")) - - // For Apollo iOS 2.0+ - .package(url: "https://github.com/DataDog/dd-sdk-ios-apollo-interceptor", .upToNextMajor(from: "2.0.0")) - ] - ``` - - または、Xcode を使用して追加することもできます。 - 1. **ファイル** → **パッケージ依存関係の追加** に移動します。 - 2. リポジトリの URL `https://github.com/DataDog/ddsdkiosapollointerceptor` を入力します。 - 3. ご使用の Apollo メジャーバージョンに一致するパッケージバージョンを選択してください (Apollo iOS 1.0 以降の場合は `1.x.x` を、Apollo iOS 2.0 以降の場合は `2.x.x` を選択します)。 - -3. ご使用の Apollo iOS バージョンに基づいてネットワークインスツルメンテーションを設定します。 - - {{< tabs >}} - {{% tab "Apollo iOS 1.0+" %}} - - Apollo の組み込み URLSessionClient のためにネットワークインスツルメンテーションを設定します。 - - ```swift - import Apollo - - URLSessionInstrumentation.enable(with: .init(delegateClass: URLSessionClient.self)) - ``` - - Apollo Client 設定に Datadog インターセプターを追加します。 - - ```swift - import Apollo - import DatadogApollo - - class CustomInterceptorProvider: DefaultInterceptorProvider { - override func interceptors(for operation: Operation) -> [ApolloInterceptor] { - var interceptors = super.interceptors(for: operation) - interceptors.insert(DatadogApolloInterceptor(), at: 0) - return interceptors - } - } - ``` - - {{% /tab %}} - {{% tab "Apollo iOS 2.0+" %}} - - 提供された `DatadogApolloDelegate` と `DatadogApolloURLSession` を使用してネットワークインスツルメンテーションを構成します。 - - ```swift - import Apollo - import DatadogApollo - import DatadogCore - - // Create the Datadog delegate - let delegate = DatadogApolloDelegate() - - // Create the custom URLSession wrapper - let customSession = DatadogApolloURLSession( - configuration: .default, - delegate: delegate - ) - - // Enable Datadog instrumentation for the delegate - URLSessionInstrumentation.enable( - with: .init(delegateClass: DatadogApolloDelegate.self) - ) - - // Configure Apollo Client with the custom session - let networkTransport = RequestChainNetworkTransport( - urlSession: customSession, - interceptorProvider: NetworkInterceptorProvider(), - store: store, - endpointURL: url - ) - ``` - - Datadog インターセプターを使用してインターセプタープロバイダーを作成します。 - - ```swift - import Apollo - import DatadogApollo - - struct NetworkInterceptorProvider: InterceptorProvider { - func graphQLInterceptors(for operation: Operation) -> [any GraphQLInterceptor] where Operation : GraphQLOperation { - return [DatadogApolloInterceptor()] + DefaultInterceptorProvider.shared.graphQLInterceptors(for: operation) - } - } - ``` - - {{% /tab %}} - {{< /tabs >}} - - これにより、Datadog RUM はリクエストからオペレーションの種類、名前、変数、および (オプションで) ペイロードを自動的に抽出し、GraphQL リクエストの RUM リソースを拡張させます。 - -
-
    -
  • このインテグレーションは、Apollo iOS バージョン 1.0 以降および 2.0 以降をサポートしています。
  • -
  • この querymutation タイプの操作は追跡されますが、subscription 操作は追跡されません。
  • -
  • GraphQL ペイロードの送信はデフォルトで無効になっています。これを有効にするには、sendGraphQLPayloads フラグを DatadogApolloInterceptor コンストラクタに次のように設定します。
  • -
- -

-   let datadogInterceptor = DatadogApolloInterceptor(sendGraphQLPayloads: true)
-     
-
- -###エラーの自動追跡 - -`Logger` と送信されたすべての "error" および "critical" ログは自動的に RUM エラーとして報告され、現在の RUM ビューにリンクされます。 - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogLogs - -let logger = Logger.create() - -logger.error("message") -logger.critical("message") -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -@import DatadogLogs; - -DDLogger *logger = [DDLogger create]; -[logger error:@"message"]; -[logger critical:@"message"]; -``` -{{% /tab %}} -{{< /tabs >}} - -同様に、エラーとしてマークされたすべての終了スパンは、RUM エラーとして報告されます。 - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogTrace - -let span = Tracer.shared().startSpan(operationName: "operation") -// ... capture the `error` -span.setError(error) -span.finish() -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -// ... capture the `error` -id span = [[DDTracer shared] startSpan:@"operation"]; -[span setError:error]; -[span finish]; -``` -{{% /tab %}} -{{< /tabs >}} - -##RUM イベントの変更または削除 - -Datadog に送信される前に RUM イベントの属性を変更したり、イベントを完全に削除したりするには、RUM iOS SDK を構成するときに Event Mappers API を使用します。 - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -let configuration = RUM.Configuration( - applicationID: "", - viewEventMapper: { RUMViewEvent in - return RUMViewEvent - } - resourceEventMapper: { RUMResourceEvent in - return RUMResourceEvent - } - actionEventMapper: { RUMActionEvent in - return RUMActionEvent - } - errorEventMapper: { RUMErrorEvent in - return RUMErrorEvent - } - longTaskEventMapper: { RUMLongTaskEvent in - return RUMLongTaskEvent - } -) -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""]; - -[configuration setViewEventMapper:^DDRUMViewEvent * _Nonnull(DDRUMViewEvent * _Nonnull RUMViewEvent) { - return RUMViewEvent; -}]; - -[configuration setErrorEventMapper:^DDRUMErrorEvent * _Nullable(DDRUMErrorEvent * _Nonnull RUMErrorEvent) { - return RUMErrorEvent; -}]; - -[configuration setResourceEventMapper:^DDRUMResourceEvent * _Nullable(DDRUMResourceEvent * _Nonnull RUMResourceEvent) { - return RUMResourceEvent; -}]; - -[configuration setActionEventMapper:^DDRUMActionEvent * _Nullable(DDRUMActionEvent * _Nonnull RUMActionEvent) { - return RUMActionEvent; -}]; - -[configuration setLongTaskEventMapper:^DDRUMLongTaskEvent * _Nullable(DDRUMLongTaskEvent * _Nonnull RUMLongTaskEvent) { - return RUMLongTaskEvent; -}]; -``` -{{% /tab %}} -{{< /tabs >}} - -各マッパーは、`(T) > T?` のシグネチャを持つ Swift クロージャです。ここで、`T` は具体的な RUM イベントタイプです。これにより、イベントが送信される前にその一部を変更することができます。 - -たとえば、RUM Resource の `url` に含まれる機密情報をマスクするには、カスタム `redacted(_:) > String` 関数を実装し、それを `resourceEventMapper` で使用します: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -let configuration = RUM.Configuration( - applicationID: "", - resourceEventMapper: { RUMResourceEvent in - var RUMResourceEvent = RUMResourceEvent - RUMResourceEvent.resource.url = redacted(RUMResourceEvent.resource.url) - return RUMResourceEvent - } -) -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""]; - -[configuration setResourceEventMapper:^DDRUMResourceEvent * _Nullable(DDRUMResourceEvent * _Nonnull RUMResourceEvent) { - return RUMResourceEvent; -}]; -``` -{{% /tab %}} -{{< /tabs >}} - -エラー、リソース、アクションのマッパーから `nil` を返すと、イベントは破棄され、Datadog に送信されません。ビューイベントマッパーから返される値は `nil` であってはなりません (ビューを除外するには、`UIKitRUMViewsPredicate` の実装をカスタマイズしてください。詳細は [ビューの自動追跡について](#automaticallytrackviews) をご覧ください)。 - -イベントのタイプに応じて、一部の特定のプロパティのみを変更できます。 - -| イベントタイプ | 属性キー | 説明 | -| | | | -| RUMActionEvent | `RUMActionEvent.action.target?.name` | アクションの名前。 | -| | `RUMActionEvent.view.url` | このアクションにリンクされたビューの URL。 | -| RUMErrorEvent | `RUMErrorEvent.error.message` | エラーメッセージ。 | -| | `RUMErrorEvent.error.stack` | エラーのスタックトレース。 | -| | `RUMErrorEvent.error.resource?.url` | エラーが参照するリソースの URL。 | -| | `RUMErrorEvent.view.url` | このエラーにリンクされたビューの URL。 | -| RUMResourceEvent | `RUMResourceEvent.resource.url` | リソースの URL。 | -| | `RUMResourceEvent.view.url` | このリソースにリンクされたビューの URL。 | -| RUMViewEvent | `RUMViewEvent.view.name` | ビューの名前。 | -| | `RUMViewEvent.view.url` | ビューの URL。 | -| | `RUMViewEvent.view.referrer` | ページの初期ビューへのリンク URL。| - -##RUM セッション ID の取得 - -RUM セッション ID を取得すると、トラブルシューティングの際に役立ちます。たとえば、セッション ID をサポートリクエスト、メール、またはバグレポートに添付することで、サポートチームが後で Datadog でユーザーセッションを見つけることができます。 - -ランタイム中に `sessionStarted` イベントを待たずに RUM セッション ID にアクセスできます。 - -```swift -RumMonitor.shared().currentSessionID(completion: { sessionId in - currentSessionId = sessionId -}) -``` - -##トラッキングの同意を設定 (GDPR の遵守) - -GDPR 規制を遵守するため、RUM iOS SDK は初期化時に追跡に関する同意を求めます。 - -`trackingConsent` 設定は以下のいずれかの値で示されます。 - -1. `.pending`: RUM iOS SDK はデータの収集とバッチ処理を開始しますが、Datadog には送信しません。RUM iOS SDK は、バッチ処理が完了したデータをどうするかについての新たな同意値が得られるまで待機します。 -2. `.granted`: RUM iOS SDK はデータの収集を開始し、Datadog へ送信します。 -3. `.notGranted`: RUM iOS SDK はデータを収集しません。ログ、トレース、または RUM イベントは Datadog に送信されません。 - -RUM iOS SDK の初期化後にトラッキング同意値を変更するには、`Datadog.set(trackingConsent:)` API 呼び出しを使用します。RUM iOS SDK は新しい値に応じて動作を変更します。 - -たとえば、現在のトラッキング同意が `.pending` の場合は以下のようになります。 - - 値を `.granted` に変更すると、RUM iOS SDK は現在および今後のすべてのデータを Datadog に送信します。 - 値を `.notGranted` に変更すると、RUM iOS SDK は現在のすべてのデータを消去し、今後のデータを収集しません。 - -##ユーザー属性の追加 - -`Datadog.addUserExtraInfo(_:)` API を使用して、以前に設定したプロパティに追加のユーザー属性を追加できます。 - -```swift -import DatadogCore - -Datadog.addUserExtraInfo(["company": "Foo"]) -``` - -##データ管理 - -iOS SDK は最初にイベントをローカルに保存し、[取り込み仕様][9] の条件が満たされたときにのみイベントをアップロードします。 - -###すべてのデータのクリア - -SDK によって保存されたすべての未送信データを `Datadog.clearAllData()` API を使用して削除するオプションがあります。 - -```swift -import DatadogCore - -Datadog.clearAllData() -``` - -###データ収集の停止 - -`Datadog.stopInstance()` API を使用すると、名前付き SDK インスタンス (名前が `nil` の場合はデフォルトインスタンス) のデータ収集およびアップロードを停止できます。 - -```swift -import DatadogCore - -Datadog.stopInstance() -``` - -このメソッドを呼び出すと、SDK や RUM などのすべてのアクティブな機能が無効になります。データ収集を再開するには、SDK を再初期化する必要があります。動的に設定を変更したい場合にこの API を使用できます。 - -##参考資料 - -{{< partial name="whats-next/whats-next.html" >}} - -[1]: https://app.datadoghq.com/rum/application/create -[2]: /ja/real_user_monitoring/application_monitoring/ios -[3]: /ja/real_user_monitoring/application_monitoring/ios/data_collected/ -[4]: https://github.com/DataDog/ddsdkios/blob/master/DatadogRUM/Sources/RUMMonitorProtocol.swift -[5]: /ja/real_user_monitoring/application_monitoring/ios/data_collected/?tab=error#errorattributes -[6]: /ja/real_user_monitoring/application_monitoring/ios/data_collected/?tab=session#defaultattributes -[7]: https://www.ntppool.org/en/ -[8]: /ja/real_user_monitoring/error_tracking/mobile/ios/#addapphangreporting -[9]: /ja/real_user_monitoring/application_monitoring/ios/setup \ No newline at end of file diff --git a/content/ja/real_user_monitoring/application_monitoring/unity/troubleshooting.md b/content/ja/real_user_monitoring/application_monitoring/unity/troubleshooting.md deleted file mode 100644 index b11e97d74c4..00000000000 --- a/content/ja/real_user_monitoring/application_monitoring/unity/troubleshooting.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -aliases: -- /ja/real_user_monitoring/mobile_and_tv_monitoring/troubleshooting/unity -- /ja/real_user_monitoring/mobile_and_tv_monitoring/unity/troubleshooting -description: Unity Monitoring の問題をトラブル シューティングする方法を学びます。 -further_reading: -- link: https://github.com/DataDog/dd-sdk-unity - tag: ソース コード - text: dd-sdk-unity のソースコード -- link: https://github.com/DataDog/unity-package - tag: ソース コード - text: Unity SDK のパッケージ URL -- link: real_user_monitoring/unity/ - tag: ドキュメント - text: Unity Monitoring について学ぶ -title: Unity SDK の問題のトラブル シューティング ---- - -## 概要 - -Datadog RUM で予期しない動作が発生した場合は、このガイドを使用して問題を解決してください。引き続き問題がある場合は、追加のサポートについて [Datadog サポート][1] にお問い合わせください。 - -## デバッグを容易にするために sdkVerbosity を設定する - -アプリを実行できているにもかかわらず、Datadog サイトで期待どおりのデータが表示されない場合は、初期化の一部として次のコードを追加してみてください: - -{{< code-block lang="cs" >}} -DatadogSdk.Instance.SetSdkVerbosity(CoreLoggerLevel.Debug); -{{< /code-block >}} - -これにより、SDK が何をしているか、どのようなエラーに遭遇しているかについての追加情報が出力され、お客様と Datadog サポートが問題を絞り込むのに役立つ場合があります。 - -## SDK がデータを送信しない - -
Datadog は Unity Editor からのデータ送信をサポートしていません。iOS および Android のシミュレーター、エミュレーター、実機からのみ送信をサポートします。
- -Datadog にデータがまったく表示されない場合: - -1. Unity Editor からではなく、iOS または Android のシミュレーター、エミュレーター、または実機でアプリを実行していることを確認してください。 -2. 初期化の一部として `TrackingConsent` を設定していることを確認してください。初期化中は追跡の同意が `TrackingConsent.Pending` に設定され、 -Datadog が情報を送信する前に `TrackingConsent.Granted` に設定する必要があります。 - - {{< code-block lang="cs" >}} -DatadogSdk.Instance.SetTrackingConsent(TrackingConsent.Granted); -{{< /code-block >}} - -## 参考資料 - -{{< partial name="whats-next/whats-next.html" >}} - -[1]: /ja/help \ No newline at end of file diff --git a/content/ko/profiler/enabling/_index.md b/content/ko/profiler/enabling/_index.md deleted file mode 100644 index b05e4131933..00000000000 --- a/content/ko/profiler/enabling/_index.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -aliases: -- /ko/tracing/faq/profiling_migration/ -- /ko/tracing/profiler/enabling/ -further_reading: -- link: getting_started/profiler - tag: 설명서 - text: 프로파일러 시작하기 -- link: profiler/profile_visualizations - tag: 설명서 - text: 사용 가능한 프로파일 시각화에 대해 자세히 알아보기 -- link: profiler/profiler_troubleshooting - tag: 설명서 - text: 프로파일러를 사용하는 동안 발생한 문제 해결 -title: 프로파일러 활성화 -type: multi-code-lang ---- - -프로파일러는 Datadog 추적 라이브러리 내에 전송됩니다. 이미 애플리케이션에서 [APM을 사용해 트레이스를 수집][1]하고 있는 경우 라이브러리 설치를 건너뛰고 프로파일러 활성화 단계로 바로 넘아갈 수 있습니다. - -아래에서 원하는 언어를 선택하여 애플리케이션에서 프로파일러를 활성화하는 방법을 알아보세요. - - -{{< partial name="profiling/profiling-languages.html" >}} - - -## 참고 자료 - -{{< partial name="whats-next/whats-next.html" >}} - - - -[1]: /ko/tracing/trace_collection/ \ No newline at end of file diff --git a/content/ko/real_user_monitoring/application_monitoring/ios/advanced_configuration.md b/content/ko/real_user_monitoring/application_monitoring/ios/advanced_configuration.md deleted file mode 100644 index 270a21dcbb0..00000000000 --- a/content/ko/real_user_monitoring/application_monitoring/ios/advanced_configuration.md +++ /dev/null @@ -1,1138 +0,0 @@ ---- -aliases: -- /ko/real_user_monitoring/ios/advanced_configuration -- /ko/real_user_monitoring/mobile_and_tv_monitoring/advanced_configuration/ios -- /ko/real_user_monitoring/mobile_and_tv_monitoring/ios/advanced_configuration -description: iOS RUM SDK 고급 설정을 구성하여 사용자 세션을 강화하고 커스텀 이벤트를 추적하며 데이터 수집을 제어하여 더 나은 - 인사이트를 얻으세요. -further_reading: -- link: https://github.com/DataDog/dd-sdk-ios - tag: Source Code - text: ddsdkios의 소스 코드 -- link: /real_user_monitoring - tag: Documentation - text: RUM 및 세션 리플레이 -- link: /real_user_monitoring/application_monitoring/ios/supported_versions/ - tag: Documentation - text: RUM iOS 및 tvOS 모니터링 지원 버전 -- link: https://github.com/DataDog/dd-sdk-ios-apollo-interceptor - tag: Source Code - text: Apollo iOS용 Datadog 통합 -title: iOS 고급 구성 ---- -RUM iOS SDK를 아직 설정하지 않은 경우 [인앱 설정 지침][1]을 따르거나 [RUM iOS 설정 설명서][2]를 참조하세요. - -## 사용자 세션 강화 - -iOS RUM은 사용자 활동, 화면, 오류 및 네트워크 요청과 같은 속성을 자동으로 추적합니다. RUM 이벤트 및 기본 속성에 대해 알아보려면 [RUM 데이터 수집 설명서][3]를 참조하세요. 커스텀 이벤트를 추적하여 사용자 세션 정보를 강화하고 수집한 속성을 세밀하게 제어할 수 있습니다. - -### 커스텀 조회 - -[조회 자동 추적](#automaticallytrackviews) 외에도, 특정 고유 조회(예: `viewControllers`)가 표시되고 상호작용 가능해질 때 추적할 수 있습니다. 조회가 더 이상 표시되지 않을 때 추적을 중지하려면 `RUMMonitor.shared()`에서 다음 메서드를 사용하세요. - - `.startView(viewController:)` - `.stopView(viewController:)` - -예: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogRUM - -// in your `UIViewController`: -let rum = RUMMonitor.shared() - -override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - rum.startView(viewController: self) -} - -override func viewDidDisappear(_ animated: Bool) { - super.viewDidDisappear(animated) - rum.stopView(viewController: self) -} -``` - -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -@import DatadogRUM; -// in your `UIViewController`: - -DDRUMMonitor *rum = [DDRUMMonitor shared]; - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - - [rum startViewWithViewController:self name:nil attributes:nil]; -} - -- (void)viewDidDisappear:(BOOL)animated { - [super viewDidDisappear:animated]; - - [rum stopViewWithViewController:self attributes:nil]; -} -``` -{{% /tab %}} -{{< /tabs >}} - -자세한 내용 및 사용 가능한 옵션은 GitHub의 [`RUMMonitorProtocol`][4]을 참조하세요. - -### 커스텀 액션 - -[액션 자동 추적](#automaticallytrackuseractions) 외에도, `addAction(type:name:)` API를 사용하여 특정 커스텀 액션(탭, 클릭, 스크롤)을 추적할 수 있습니다. - -`.tap`과 같은 순간적인 RUM 액션을 수동으로 등록하려면 `RUMMonitor.shared()`에서 `.addAction(type:name:)`을 사용하세요. `.scroll`과 같은 지속적인 RUM 액션은 `.startAction(type:name:)` 또는 `.stopAction(type:)`을 사용하세요. - -예: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogRUM - -// in your `UIViewController`: - -let rum = RUMMonitor.shared() - -@IBAction func didTapDownloadResourceButton(_ sender: UIButton) { - rum.addAction( - type: .tap, - name: sender.currentTitle ?? "" - ) -} -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -- (IBAction)didTapDownloadResourceButton:(UIButton *)sender { - NSString *name = sender.currentTitle ? sender.currentTitle : @""; - [[DDRUMMonitor shared] addActionWithType:DDRUMActionTypeTap name:name attributes:@{}]; -} -``` -{{% /tab %}} -{{< /tabs >}} - -**참고**: `.startAction(type:name:)` 및 `.stopAction(type:)`를 사용할 때 액션의 `type`은 동일해야 합니다. 이는 RUM iOS SDK가 액션 시작과 완료를 일치시키기 위해 필요합니다. - -자세한 내용 및 사용 가능한 옵션은 GitHub의 [`RUMMonitorProtocol`][4]을 참조하세요. - -### 커스텀 리소스 - -[리소스 자동 추적](#automaticallytracknetworkrequests) 외에도, 네트워크 요청이나 서드파티 제공자 API와 같은 특정 커스텀 리소스를 추적할 수 있습니다. RUM 리소스를 수동으로 수집하려면 `RUMMonitor.shared()`에서 다음 메서드를 사용하세요. - - `.startResource(resourceKey:request:)` - `.stopResource(resourceKey:response:)` - `.stopResourceWithError(resourceKey:error:)` - `.stopResourceWithError(resourceKey:message:)` - -예: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogRUM - -// in your network client: - -let rum = RUMMonitor.shared() - -rum.startResource( - resourceKey: "resource-key", - request: request -) - -rum.stopResource( - resourceKey: "resource-key", - response: response -) -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -// in your network client: - -[[DDRUMMonitor shared] startResourceWithResourceKey:@"resource-key" - request:request - attributes:@{}]; - -[[DDRUMMonitor shared] stopResourceWithResourceKey:@"resource-key" - response:response - attributes:@{}]; -``` -{{% /tab %}} -{{< /tabs >}} - -**참고**: 두 호출에서 `resourceKey`에 사용되는 `String`은 호출하는 리소스마다 고유해야 합니다. 이는 RUM iOS SDK가 리소스의 시작과 완료를 일치시키기 위해 필요합니다. - -자세한 내용 및 사용 가능한 옵션은 GitHub의 [`RUMMonitorProtocol`][4]을 참조하세요. - -### 커스텀 오류 - -특정 오류를 추적하려면 오류가 발생했을 때 `RUMMonitor.shared()`에 다음 메서드 중 하나를 사용하여 알리세요. - - `.addError(message:)` - `.addError(error:)` - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -let rum = RUMMonitor.shared() -rum.addError(message: "error message.") -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -[[DDRUMMonitor shared] addErrorWithMessage:@"error message." stack:nil source:DDRUMErrorSourceCustom attributes:@{}]; -``` -{{% /tab %}} -{{< /tabs >}} - -자세한 내용과 사용 가능한 옵션은 GitHub의 [`RUMMonitorProtocol`][4] 및 [오류 속성 설명서][5]를 참조하세요. - -## 커스텀 전역 속성 추적 - -RUM iOS SDK가 자동으로 캡처하는 [기본 RUM 속성][6] 외에도, RUM 이벤트에 추가적인 컨텍스트 정보*(커스텀 속성 등)를 추가하여 Datadog 내에서 관찰 가능성을 강화할 수 있습니다. - -커스텀 속성을 사용하면 관찰된 사용자 행동(예: 카트 값, 머천트 티어 또는 광고 캠페인)과 코드 수준 정보(예: 백엔드 서비스, 세션 타임라인, 오류 로그, 네트워크 상태)를 함께 필터링하고 그룹화할 수 있습니다. - -
커스텀 속성은 작은 범위의 특정 정보(예: ID, 플래그 또는 짧은 라벨)에 적합합니다. 전체 HTTP 응답 페이로드와 같은 큰 객체를 첨부하지 마세요. 이로 인해 이벤트 크기가 크게 증가하고 성능에 영향을 줄 수 있습니다.
- -### 커스텀 전역 속성 설정 - -커스텀 전역 속성을 설정하려면 `RUMMonitor.shared().addAttribute(forKey:value:)`를 사용하세요. - -* 속성을 추가하려면 `RUMMonitor.shared().addAttribute(forKey: "", value: "")`를 사용하세요. -* 값을 업데이트하려면 `RUMMonitor.shared().addAttribute(forKey: "", value: "")`를 사용하세요. -* 키를 삭제하려면 `RUMMonitor.shared().removeAttribute(forKey: "")`를 사용하세요. - -대량 작업(여러 속성을 한 번에 수정) 시 성능을 높이려면 `.addAttributes(_:)` 및 `.removeAttributes(forKeys:)`을 사용하세요. - -**참고**: 키 이름에 공백 또는 특수 문자를 사용하면 커스텀 속성에서 패킷을 생성할 수 없습니다. 예를 들어, `forKey: "store_id"` 대신 `forKey: "Store ID"`를 사용하세요. - -### 사용자 세션 추적 - -RUM 세션에 사용자 정보를 추가하면 다음 작업을 쉽게 수행할 수 있습니다. - -* 지정된 사용자의 여정을 따라갑니다. -* 오류의 영향을 가장 많이 받는 사용자를 파악합니다. -* 가장 중요한 사용자의 성능을 모니터링합니다. - -{{< img src="real_user_monitoring/browser/advanced_configuration/user-api.png" alt="RUM UI의 사용자 API" >}} - -| 속성 | 유형 | 설명 | -| | | | -| `usr.id` | 문자열 |(필수) 고유 사용자 식별자입니다. | -| `usr.name` | 문자열 |(선택 사항) RUM UI에 기본적으로 표시되는 사용자 친화적인 이름입니다. | -| `usr.email` | 문자열 |(선택 사항) 사용자 이름이 없는 경우 RUM UI에 표시되는 사용자 이메일입니다. | - -사용자 세션을 식별하려면 `Datadog.setUserInfo(id:name:email:)` API를 사용하세요. - -예: - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogCore - -Datadog.setUserInfo(id: "1234", name: "John Doe", email: "john@doe.com") -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -[DDDatadog setUserInfoWithId:@"1234" name:@"John Doe" email:@"john@doe.com" extraInfo:@{}]; -``` -{{% /tab %}} -{{< /tabs >}} - -## 백그라운드 이벤트 추적 - -

백그라운드 이벤트를 추적하면 추가 세션이 발생할 수 있으며, 이는 청구에 영향을 줄 수 있습니다. 질문이 있는 경우, Datadog 지원팀에 문의하세요.

-
- -애플리케이션이 백그라운드에서 동작할 때(예: 활성 조회를 사용할 수 없음) 크래시 및 네트워크 요청과 같은 이벤트를 추적할 수 있습니다. - -백그라운드 이벤트를 추적하려면 초기화 중에 Datadog 구성에 다음 스니펫을 추가합니다. - -```swift -import DatadogRUM - -RUM.enable( - with: RUM.Configuration( - ... - trackBackgroundEvents: true - ) -) -``` - -## 초기화 파라미터 - -Datadog 구성을 생성할 때 `Datadog.Configuration`에서 다음 속성을 사용하여 라이브러리를 초기화할 수 있습니다: - -`backgroundTasksEnabled` -: 이 플래그는 백그라운드 업로드를 수행하기 위해 `UIApplication`의 `beginBackgroundTask(expirationHandler:)` 및 `endBackgroundTask:` 메서드를 사용할지 여부를 결정합니다. 이 플래그를 활성화하면 앱이 백그라운드에서 작동하는 시간이 30초 증가할 수 있습니다. 업로드할 내용이 없거나 인터넷 연결 불가, 배터리 부족 등 업로드를 방해하는 상황이 발생하면 일반적으로 작업이 중단됩니다. 기본적으로 이 플래그는 `false`로 설정됩니다. - -`batchProcessingLevel` -: 배치 처리 수준은 하나의 읽기/업로드 주기 내에서 지연 없이 순차적으로 처리되는 최대 배치 수를 정의합니다. 기본값은 `.medium`입니다. - -`batchSize` -: Datadog에 업로드되는 배치 데이터의 선호 크기를 설정합니다. 이 값은 RUM iOS SDK가 수행하는 요청 수와 크기에 영향을 줍니다(배치가 작으면 요청 수는 많아지지만 각 요청의 크기는 작아집니다). 사용 가능한 값은 `.small`, `.medium` 및 `.large`입니다. - -`bundle` -: 현재 실행 파일이 포함된 번들 객체입니다. - -`clientToken` -: RUM, 로깅, APM을 지원하는 RUM 클라이언트 토큰 또는 로깅과 APM만 지원하는 일반 클라이언트 토큰입니다. - -`encryption` -: `DataEncryption` 프로토콜을 준수하는 객체를 제공하여 온디스크 데이터 지속성에 사용하는 데이터 암호화입니다. - -`env` -: Datadog에 전송되는 환경 이름입니다. 이를 통해 `staging` 또는 `production`과 같은 다양한 환경에 따라 이벤트를 필터링할 수 있습니다. - -`proxyConfiguration` -: 추적한 데이터를 Datadog 수집 서버로 업로드할 때 커스텀 프록시를 사용할 수 있는 프록시 구성 속성입니다. - -`serverDateProvider` -: 커스텀 NTP 동기화 인터페이스입니다. 기본적으로 Datadog SDK는 [NTP Pool Project][7]에서 제공하는 전용 NTP 풀과 동기화합니다. 다른 풀을 사용하거나 동작 없는 `ServerDateProvider` 구현을 설정하면 SDK 인스턴스와 Datadog 서버 간에 시간 동기화가 깨집니다. 이로 인해 RUM 세션이나 분산 트레이스에서 상당한 시간 차이가 발생할 수 있습니다. - -`service` -: Datadog에 전송되는 데이터와 관련된 서비스 이름입니다. 기본값은 애플리케이션 번들 식별자입니다. - -`site` -데이터가 전송되는 Datadog 서버 엔드포인트입니다. 기본값은 `.us1`입니다. - -`uploadFrequency` -: Datadog에 데이터를 업로드하는 선호 빈도입니다. 사용 가능한 값은 `.frequent`, `.average` 및 `.rare`입니다. - -### RUM 구성 - -RUM을 활성화할 때 `RUM.Configuration`에서 다음 속성을 사용할 수 있습니다: - -`actionEventMapper` -: 액션 이벤트의 데이터 스크러빙 콜백을 설정합니다. 이를 사용하여 액션 이벤트가 Datadog으로 전송되기 전에 수정하거나 삭제할 수 있습니다. 자세한 내용은 [RUM 이벤트 수정 또는 삭제](#modifyordroprumevents)를 참조하세요. - -`appHangThreshold` -: 앱이 멈춤 상태일 때 보고할 임계값을 설정합니다. 이 옵션의 최소 허용 값은 `0.1`초입니다. 보고를 비활성화하려면 이 값을 `nil`로 설정하세요. 자세한 내용은 [앱 멈춤 보고 추가][8]를 참조하세요. - -`applicationID` -: RUM 애플리케이션 식별자입니다. - -`customEndpoint` -: RUM 데이터를 전송할 커스텀 서버 URL입니다. - -`errorEventMapper` -: 오류 이벤트의 데이터 스크러빙 콜백입니다. 이를 사용하여 오류 이벤트가 Datadog으로 전송되기 전에 수정하거나 삭제할 수 있습니다. 자세한 내용은 [RUM 이벤트 수정 또는 삭제](#modifyordroprumevents)를 참조하세요. - -`longTaskEventMapper` -: 긴 작업 이벤트의 데이터 스크러빙 콜백입니다. 이를 사용하여 긴 작업 이벤트가 Datadog으로 전송되기 전에 수정하거나 삭제할 수 있습니다. 자세한 내용은 [RUM 이벤트 수정 또는 삭제](#modifyordroprumevents)를 참조하세요. - -`longTaskThreshold` -: RUM 긴 작업 추적의 임계값(초 단위)입니다. 기본값은 `0.1`초입니다. - -`networkSettledResourcePredicate` -: TimetoNetworkSettled(TNS) 조회 타이밍 계산에서 "초기" 리소스를 분류하는 데 사용되는 조건자입니다. - -`nextViewActionPredicate` -: InteractiontoNextView(INV) 타이밍 계산에서 "마지막" 액션을 분류하는 데 사용되는 조건자입니다. - -`onSessionStart` -: (선택 사항) RUM 세션이 시작될 때 호출되는 메서드입니다. - -`resourceEventMapper` -: 리소스 이벤트의 데이터 스크러빙 콜백입니다. 이를 사용하여 리소스 이벤트가 Datadog으로 전송되기 전에 수정하거나 삭제할 수 있습니다. 자세한 내용은 [RUM 이벤트 수정 또는 삭제](#modifyordroprumevents)를 참조하세요. - -`sessionSampleRate` -: RUM 세션의 샘플링 비율입니다. `sessionSampleRate` 값은 `0.0`에서 `100.0` 사이여야 합니다. `0.0`은 세션이 전송되지 않음을 의미하며, `100.0`은 모든 세션이 Datadog으로 전송됨을 의미합니다. 기본값은 `100.0`입니다. - -`telemetrySampleRate` -: Datadog에서 사용하는 SDK 내부 텔레메트리의 샘플링 비율입니다. 이 비율은 추적 시스템에 보고되는 요청 수를 제어합니다. 값은 `0`에서 `100` 사이여야 합니다. 기본값은 `20`입니다. - -`trackAnonymousUser` -: 활성화하면 SDK는 앱 실행 간에 유지되는 고유하고 비개인적인 익명 사용자 ID를 생성합니다. 이 ID는 각 RUM 세션에 첨부되어, 개인 데이터를 수집하지 않고 동일 사용자/장치에서 발생한 세션을 연결할 수 있습니다. 기본값은 `true`입니다. - -`trackBackgroundEvents` -: 활성 조회가 없을 때 RUM 이벤트를 추적할지 여부를 결정합니다. 기본값은 `false`입니다. - -`trackFrustrations` -: 사용자 불만의 자동 추적을 활성화할지 여부를 결정합니다. 기본값은 `true`입니다. - -`trackMemoryWarnings` -: 메모리 경고 자동 추적을 활성화할지 여부를 결정합니다. 기본값은 `true`입니다. - -`trackWatchdogTerminations` -: Watchdog이 실행한 애플리케이션 종료를 SDK가 추적할지 여부를 결정합니다. 기본값은 `false`입니다. - -`uiKitActionsPredicate` -: 사용자 상호작용(탭)을 RUM 액션으로 추적하도록 활성화합니다. 기본 `predicate` 구현을 사용하려면 `DefaultUIKitRUMActionsPredicate`를 설정하거나 앱에 맞게 [커스텀한 `UIKitRUMActionsPredicate`](#automaticallytrackuseractions)를 구현할 수 있습니다. - -`uiKitViewsPredicate` -: `UIViewControllers`를 RUM 조회로 추적하도록 활성화합니다. 기본 `predicate` 구현을 사용하려면 `DefaultUIKitRUMViewsPredicate`를 설정하거나 앱에 맞게 [커스텀한 `UIKitRUMViewsPredicate`](#automaticallytrackviews)를 구현할 수 있습니다. - -`urlSessionTracking` -: `URLSession` 작업(네트워크 요청)을 RUM 리소스로 추적하도록 활성화합니다. `firstPartyHostsTracing` 파라미터는 호스트를 `firstparty` 리소스로 분류하고(만약 RUM이 활성화된 경우) 추적 정보를 주입(추적 기능이 활성화된 경우)하는 데 사용됩니다. `resourceAttributesProvider` 파라미터는 RUM iOS SDK가 수집하는 각 리소스에 대해 호출되는 인터셉트된 리소스에 대한 커스텀 속성을 제공하는 클로저를 정의합니다. 이 클로저는 작업 정보와 함께 호출되며, 첨부할 속성이 없으면 커스텀 리소스 속성 또는 `nil`을 반환할 수 있습니다. - -`viewEventMapper` -: 조회 이벤트의 데이터 스크러빙 콜백입니다. 이를 사용하여 조회 이벤트가 Datadog으로 전송되기 전에 조회 이벤트를 수정할 수 있습니다. 자세한 내용은 [RUM 이벤트 수정 또는 삭제](#modifyordroprumevents)를 참조하세요. - -`vitalsUpdateFrequency` -: 모바일 바이탈 데이터를 수집하는 선호 빈도입니다. 사용 가능한 값은 `.frequent`(100ms마다), `.average`(500ms마다), `.rare`(1초마다), `.never`(바이탈 모니터링을 비활성화)입니다. - -### 조회 자동 추적 - -UIKit 및 SwiftUI로 조회를 자동으로 추적할 수 있습니다. - -{{% collapse-content title="UIKit" level="h4" expanded=true id="auto-track-views-uikit" %}} - -조회(`UIViewControllers`)를 자동 추적하려면 RUM 활성화 시 `uiKitViewsPredicate` 옵션을 사용하세요. 기본적으로 조회 이름은 조회 컨트롤러의 클래스 이름으로 지정됩니다. 이를 사용자 지정하려면 `predicate`를 구현하고 `UIKitRUMViewsPredicate` 프로토콜을 준수하도록 제공하세요. - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -public protocol UIKitRUMViewsPredicate { - func rumView(for viewController: UIViewController) -> RUMView? -} -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```swift -@objc -public protocol DDUIKitRUMViewsPredicate: AnyObject { - func rumView(for viewController: UIViewController) -> DDRUMView? -} -``` -{{% /tab %}} -{{< /tabs >}} - -`rumView(for:)` 구현 내에서 앱은 지정된 `UIViewController` 인스턴스가 RUM 조회를 시작해야 하는지(값 반환) 또는 시작하지 않아야 하는지(`nil` 반환) 결정해야 합니다. 반환되는 `RUMView` 값은 `name`을 지정해야 하며, 생성된 RUM 조회에 추가 `attributes`를 제공할 수 있습니다. - -예를 들어, 앱의 각 조회 컨트롤러에 대해 명시적인 형식 검사를 사용하도록 조건자를 구성할 수 있습니다. - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -class YourCustomPredicate: UIKitRUMViewsPredicate { - - func rumView(for viewController: UIViewController) -> RUMView? { - switch viewController { - case is HomeViewController: return .init(name: "Home") - case is DetailsViewController: return .init(name: "Details") - default: return nil - } - } -} -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -@interface YourCustomPredicate : NSObject - -@end - -@implementation YourCustomPredicate - -- (DDRUMView * _Nullable)rumViewFor:(UIViewController * _Nonnull)viewController { - if ([viewController isKindOfClass:[HomeViewController class]]) { - return [[DDRUMView alloc] initWithName:@"Home" attributes:@{}]; - } - - if ([viewController isKindOfClass:[DetailsViewController class]]) { - return [[DDRUMView alloc] initWithName:@"Details" attributes:@{}]; - } - - return nil; -} - -@end -``` -{{% /tab %}} -{{< /tabs >}} - -앱의 아키텍처에 따라 보다 동적인 솔루션을 고안할 수도 있습니다. - -예를 들어 조회 컨트롤러가 `accessibilityLabel`을 일관되게 사용하면 접근성 레이블 값을 사용하여 조회 이름을 지정할 수 있습니다. - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -class YourCustomPredicate: UIKitRUMViewsPredicate { - - func rumView(for viewController: UIViewController) -> RUMView? { - guard let accessibilityLabel = viewController.accessibilityLabel else { - return nil - } - - return RUMView(name: accessibilityLabel) - } -} -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -@interface YourCustomPredicate : NSObject - -@end - -@implementation YourCustomPredicate - -- (DDRUMView * _Nullable)rumViewFor:(UIViewController * _Nonnull)viewController { - if (viewController.accessibilityLabel) { - return [[DDRUMView alloc] initWithName:viewController.accessibilityLabel attributes:@{}]; - } - - return nil; -} - -@end -``` -{{% /tab %}} -{{< /tabs >}} - -**참고**: RUM iOS SDK는 앱 실행 중 `rumView(for:)`를 여러 번 호출합니다. Datadog은 구현을 빠르고 단일 스레드로 유지할 것을 권장합니다. -{{% /collapse-content %}} - -{{% collapse-content title="SwiftUI" level="h4" expanded=true id="auto-track-views-swiftui" %}} - -SwiftUI로 조회를 자동 추적하려면 RUM 활성화 시 `swiftUIViewsPredicate` 옵션을 사용하세요. - -SwiftUI 조회 이름 추출 메커니즘은 리플렉션을 사용합니다. 따라서 조회 이름이 항상 의미 있는 것은 아닙니다. 의미 있는 이름을 추출할 수 없는 경우, `AutoTracked_HostingController_Fallback` 또는 `AutoTracked_NavigationStackController_Fallback`과 같은 일반 이름이 사용됩니다. - -기본 조건자(`DefaultSwiftUIRUMViewsPredicate`)를 사용하거나 `SwiftUIRUMViewsPredicate` 프로토콜을 구현하여 조회 이름을 사용자 지정하거나 필터링할 수 있습니다. - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -public protocol SwiftUIRUMViewsPredicate { - func rumView(for extractedViewName: String) -> RUMView? -} - -// Example: Custom predicate to ignore fallback names and rename views -class CustomSwiftUIPredicate: SwiftUIRUMViewsPredicate { - func rumView(for extractedViewName: String) -> RUMView? { - if extractedViewName == "AutoTracked_HostingController_Fallback" || - extractedViewName == "AutoTracked_NavigationStackController_Fallback" { - return nil // Ignore fallback names - } - if extractedViewName == "MySpecialView" { - return RUMView(name: "Special") - } - return RUMView(name: extractedViewName) - } -} -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -@protocol DDSwiftUIRUMViewsPredicate -- (DDRUMView * _Nullable)rumViewFor:(NSString * _Nonnull)extractedViewName; -@end - -@interface CustomSwiftUIPredicate : NSObject -@end - -@implementation CustomSwiftUIPredicate -- (DDRUMView * _Nullable)rumViewFor:(NSString * _Nonnull)extractedViewName { - if ([extractedViewName isEqualToString:@"AutoTracked_HostingController_Fallback"] || - [extractedViewName isEqualToString:@"AutoTracked_NavigationStackController_Fallback"]) { - return nil; // Ignore fallback names - } - if ([extractedViewName isEqualToString:@"MySpecialView"]) { - return [[DDRUMView alloc] initWithName:@"Special" attributes:@{}]; - } - return [[DDRUMView alloc] initWithName:extractedViewName attributes:@{}]; -} -@end -``` -{{% /tab %}} -{{< /tabs >}} - -**참고:** - 앱이 완전히 SwiftUI로 빌드된 경우에도 Datadog은 UIKit 조회 추적 활성화를 권장합니다. - 탭 바는 자동으로 추적되지 않습니다. 각 탭 조회를 추적하려면 [수동 추적](#customviews)을 사용하세요. - 자동 추적 및 수동 추적을 모두 사용하는 경우 중복 이벤트가 발생할 수 있습니다. 이를 방지하려면 단일 계측 방식만 사용하거나 중복을 필터링하는 사용자 지정 조건자를 사용하세요. -{{% /collapse-content %}} - -### 사용자 액션 자동 추적 - -#### UIKit - -UIKit에서 사용자 탭 동작을 자동으로 추적하려면 RUM 활성화 시 `uiKitActionsPredicate` 옵션을 설정하세요. - -#### SwiftUI - -SwiftUI에서 사용자 탭 동작을 자동으로 추적하려면 RUM 활성화 시 `swiftUIActionsPredicate` 옵션을 활성화하세요. - -**참고:** - Datadog은 순수 SwiftUI 앱의 경우에도 UIKit 액션 추적을 활성화할 것을 권장합니다. 많은 인터랙티브 구성 요소가 내부적으로 UIKit으로 구현되어 있기 때문입니다. - tvOS에서는 리모컨의 버튼 누름 상호작용만 추적됩니다. 이를 위해서는 UIKit 조건자만 필요합니다. 순수 SwiftUI 앱이지만 tvOS에서 리모컨 버튼 누름을 추적하려면 UIKit 계측도 활성화해야 합니다. - iOS 18 이상과 iOS 17 이하에서 구현 방식이 다릅니다. - **iOS 18 이상:** 대부분의 상호작용은 구성 요소 이름과 함께 안정적으로 추적됩니다(예: `SwiftUI_Button`, `SwiftUI_NavigationLink`). - **iOS 17 이하:** SDK는 상호작용 가능한 구성 요소와 비상호작용 구성 요소를 구분할 수 없습니다(예: Button vs. Label). 이로 인해 액션은 `SwiftUI_Unidentified_Element`로 보고됩니다. - 자동 추적 및 수동 추적을 모두 사용하는 경우 중복 이벤트가 발생할 수 있습니다. 이는 알려진 제한 사항입니다. 이를 방지하려면 자동 또는 수동 중 한 가지 계측 방법만 사용하세요. - 기본 조건자인 `DefaultSwiftUIRUMActionsPredicate`를 사용하거나 커스텀 조건자를 제공하여 액션을 필터링하거나 이름을 변경할 수 있습니다. 신뢰할 수 있는 iOS 18+ 추적만 원하면 iOS 17 이하의 레거시 감지를 비활성화할 수도 있습니다. - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -// Use the default predicate by disabling iOS 17 and below detection -let predicate = DefaultSwiftUIRUMActionsPredicate(isLegacyDetectionEnabled: false) - -// Use your own predicate -class CustomSwiftUIActionsPredicate: SwiftUIRUMActionsPredicate { - func rumAction(for componentName: String) -> RUMAction? { - // Custom logic to filter or rename actions - return RUMAction(name: componentName) - } -} -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -// Use the default predicate by disabling iOS 17 and below detection -DDDefaultSwiftUIRUMActionsPredicate *swiftUIActionsPredicate = [[DDDefaultSwiftUIRUMActionsPredicate alloc] initWithIsLegacyDetectionEnabled:NO]; - -// Use your own predicate -@protocol DDSwiftUIRUMActionsPredicate -- (DDRUMAction * _Nullable)rumActionFor:(NSString * _Nonnull)componentName; -@end - -@interface CustomSwiftUIActionsPredicate : NSObject -@end - -@implementation CustomSwiftUIActionsPredicate -- (DDRUMAction * _Nullable)rumActionFor:(NSString * _Nonnull)componentName { - // Custom logic to filter or rename actions - return [[DDRUMAction alloc] initWithName:componentName attributes:@{}]; -} -@end -``` -{{% /tab %}} -{{< /tabs >}} - -#### iOS 버전별 액션 보고 - -아래 표는 iOS 17과 iOS 18에서 사용자 상호작용이 어떻게 보고되는지 보여줍니다. - -| **구성 요소** | **iOS 18 보고 이름** | **iOS 17 보고 이름** | -|||| -| Button | SwiftUI_Button | SwiftUI_Unidentified_Element | -| NavigationLink | NavigationLink | SwiftUI_Unidentified_Element | -| Menu | SwiftUI_Menu(및 항목은 _UIContextMenuCell로)| SwiftUI_Menu(및 항목은 _UIContextMenuCell로) | -| Link | SwiftUI_Button | SwiftUI_Unidentified_Element | - -### 네트워크 요청 자동 추적 - -RUM 활성화 시 `urlSessionTracking` 구성을 통해 네트워크 요청이 자동으로 추적됩니다. - -#### (선택 사항) 상세 타이밍 분석 활성화 - -DNS 해석, SSL 핸드셰이크, 첫 바이트 시간, 연결 시간, 다운로드 기간 등의 상세 타이밍 분석을 위해 delegate 유형에 대해 `URLSessionInstrumentation`을 활성화하세요. - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -URLSessionInstrumentation.enableDurationBreakdown( - with: .init( - delegateClass: .self - ) -) - -let session = URLSession( - configuration: .default, - delegate: (), - delegateQueue: nil -) -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -DDURLSessionInstrumentationConfiguration *config = [[DDURLSessionInstrumentationConfiguration alloc] initWithDelegateClass:[ class]]; -[DDURLSessionInstrumentation enableWithConfiguration:config]; - -NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] - delegate:[[ alloc] init] - delegateQueue:nil]; -``` -{{% /tab %}} -{{< /tabs >}} - -**참고**: -`URLSessionInstrumentation`을 사용하지 않아도 네트워크 요청은 추적됩니다. 활성화하면 성능 분석을 위한 상세 타이밍 분석이 제공됩니다. - 응답 데이터는 `resourceAttributesProvider` 콜백(`RUM.Configuration.URLSessionTracking`에서 설정)에서 확인할 수 있으며, 자동 모드에서 완료 핸들러가 있는 작업 및 `URLSessionInstrumentation` 활성화 후 모든 작업에 대해 호출됩니다. - 특정 요청을 추적에서 제외하려면 `resourceEventMapper`를 `RUM.Configuration`에서 사용하세요(자세한 내용은 [RUM 이벤트 수정 또는 제거](#modifyordroprumevents) 참조). - -
메모리 누수에 주의하세요. -Datadog 계측은 직접적으로 메모리 누수를 일으키지 않지만, URLSession delegate에 의존합니다. Apple 문서에 따르면, -"세션 객체는 앱이 종료되거나 명시적으로 세션을 무효화할 때까지 delegate에 대한 강한 참조를 유지합니다. invalidateAndCancel() 또는 finishTasksAndInvalidate() 메서드를 호출하여 세션을 무효화하지 않으면, 앱 종료 전까지 메모리가 누수됩니다." -메모리 누수를 방지하려면 더 이상 필요하지 않은 URLSession 인스턴스를 반드시 무효화하세요. -
- - -앱에서 계측하려는 delegate 유형이 여러 개 있는 경우, 각 delegate 유형마다 `URLSessionInstrumentation.enable(with:)`를 호출할 수 있습니다. - -또한 `urlSessionTracking`을 사용하여 퍼스트파티 호스트를 구성할 수 있습니다. 이렇게 하면 지정된 도메인과 일치하는 리소스를 RUM에서 "퍼스트파티"로 분류하고, Tracing 기능이 활성화된 경우 백엔드로 추적 정보를 전파합니다. 네트워크 트레이스는 조정 가능한 샘플링 비율로 수집됩니다. 기본적으로 20% 샘플링이 적용됩니다. - -예를 들어, `example.com`을 퍼스트파티 호스트로 구성하고 RUM과 Tracing 기능을 모두 활성화할 수 있습니다: - -[10]: https://developer.apple.com/documentation/foundation/urlsession/init(configuration:delegate:delegatequeue:)#parameters -{{< tabs >}} -{{% tab "Swift" %}} - -```swift - -import DatadogRUM - -RUM.enable( - with: RUM.Configuration( - applicationID: "", - uiKitViewsPredicate: DefaultUIKitRUMViewsPredicate(), - uiKitActionsPredicate: DefaultUIKitRUMActionsPredicate(), - urlSessionTracking: RUM.Configuration.URLSessionTracking( - firstPartyHostsTracing: .trace(hosts: ["example.com"], sampleRate: 20) - ) - ) -) - -URLSessionInstrumentation.enable( - with: .init( - delegateClass: .self - ) -) - -let session = URLSession( - configuration: .default, - delegate: (), - delegateQueue: nil -) -``` - -이렇게 하면 계측된 `session`을 통해 전송되는 모든 요청이 추적됩니다. `example.com` 도메인과 일치하는 요청은 "퍼스트파티"로 표시되며, 추적 정보가 백엔드로 전송되어 [RUM 리소스와 트레이스를 연결][1]합니다. - - -[1]: https://docs.datadoghq.com/ko/real_user_monitoring/correlate_with_other_telemetry/apm?tab=browserrum -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -@import DatadogRUM; - -DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""]; -DDRUMURLSessionTracking *urlSessionTracking = [DDRUMURLSessionTracking new]; -[urlSessionTracking setFirstPartyHostsTracing:[DDRUMFirstPartyHostsTracing alloc] initWithHosts:@[@"example.com"] sampleRate:20]; -[configuration setURLSessionTracking:urlSessionTracking]; - -[DDRUM enableWith:configuration]; -``` -{{% /tab %}} -{{< /tabs >}} - -리소스에 커스텀 속성을 추가하려면 RUM 활성화 시 `URLSessionTracking.resourceAttributesProvider` 옵션을 사용하세요. 속성 제공 클로저를 설정하면 추적된 리소스에 추가 속성을 반환할 수 있습니다. - -예를 들어, RUM 리소스에 HTTP 요청 및 응답 헤더를 추가할 수 있습니다. - -```swift -RUM.enable( - with: RUM.Configuration( - ... - urlSessionTracking: RUM.Configuration.URLSessionTracking( - resourceAttributesProvider: { request, response, data, error in - return [ - "request.headers" : redactedHeaders(from: request), - "response.headers" : redactedHeaders(from: response) - ] - } - ) - ) -) -``` - -요청을 추적하지 않으려면 위임 유형에 대해 URLSessionInstrumentation을 비활성화합니다. - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -URLSessionInstrumentation.disable(delegateClass: .self) -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -[DDURLSessionInstrumentation disableWithDelegateClass:[ class]]; -``` -{{% /tab %}} -{{< /tabs >}} - -#### Apollo 계측 -iOS 앱에서 Apollo를 계측하면 GraphQL 오류와 성능에 대한 RUM 가시성을 확보할 수 있습니다. GraphQL 요청은 모두 단일 엔드포인트로 전송되며, 오류가 발생해도 200 OK를 반환하는 경우가 많아 기본 HTTP 계측만으로는 컨텍스트가 부족합니다. 이 계측을 통해 RUM이 Operation 이름, Operation 유형, 변수(및 선택적으로 페이로드)를 캡처할 수 있습니다. 이를 통해 각 네트워크 요청에 대한 보다 상세한 컨텍스트를 제공합니다. - -이 통합은 Apollo iOS 1.0+와 Apollo iOS 2.0+를 모두 지원합니다. 사용 중인 Apollo iOS 버전에 맞춰 아래 지침을 따르세요. - -1. [Datadog iOS RUM로 RUM 모니터링 설정][2] - -2. 애플리케이션의 `Package.swift` 파일에 다음을 추가합니다. - - ```swift - dependencies: [ - // For Apollo iOS 1.0+ - .package(url: "https://github.com/DataDog/dd-sdk-ios-apollo-interceptor", .upToNextMajor(from: "1.0.0")) - - // For Apollo iOS 2.0+ - .package(url: "https://github.com/DataDog/dd-sdk-ios-apollo-interceptor", .upToNextMajor(from: "2.0.0")) - ] - ``` - - 또는 Xcode를 사용하여 추가할 수도 있습니다. - 1. **File** → **Add Package Dependencies**로 이동합니다. - 2. 리포지터리 URL(`https://github.com/DataDog/ddsdkiosapollointerceptor`)을 입력합니다. - 3. Apollo 주 버전에 맞는 패키지 버전을 선택합니다(`1.x.x`는 Apollo iOS 1.0+, `2.x.x`는 Apollo iOS 2.0+). - -3. Apollo iOS 버전에 따라 네트워크 계측을 설정합니다. - - {{< tabs >}} - {{% tab "Apollo iOS 1.0+" %}} - - Apollo의 내장 URLSessionClient를 위한 네트워크 계측을 설정합니다. - - ```swift - import Apollo - - URLSessionInstrumentation.enable(with: .init(delegateClass: URLSessionClient.self)) - ``` - - Datadog 인터셉터를 Apollo Client 설정에 추가합니다. - - ```swift - import Apollo - import DatadogApollo - - class CustomInterceptorProvider: DefaultInterceptorProvider { - override func interceptors(for operation: Operation) -> [ApolloInterceptor] { - var interceptors = super.interceptors(for: operation) - interceptors.insert(DatadogApolloInterceptor(), at: 0) - return interceptors - } - } - ``` - - {{% /tab %}} - {{% tab "Apollo iOS 2.0+" %}} - - 제공된 `DatadogApolloDelegate`와 `DatadogApolloURLSession`을 사용하여 네트워크 계측을 구성합니다. - - ```swift - import Apollo - import DatadogApollo - import DatadogCore - - // Create the Datadog delegate - let delegate = DatadogApolloDelegate() - - // Create the custom URLSession wrapper - let customSession = DatadogApolloURLSession( - configuration: .default, - delegate: delegate - ) - - // Enable Datadog instrumentation for the delegate - URLSessionInstrumentation.enable( - with: .init(delegateClass: DatadogApolloDelegate.self) - ) - - // Configure Apollo Client with the custom session - let networkTransport = RequestChainNetworkTransport( - urlSession: customSession, - interceptorProvider: NetworkInterceptorProvider(), - store: store, - endpointURL: url - ) - ``` - - Datadog 인터셉터로 인터셉터 제공자를 생성합니다. - - ```swift - import Apollo - import DatadogApollo - - struct NetworkInterceptorProvider: InterceptorProvider { - func graphQLInterceptors(for operation: Operation) -> [any GraphQLInterceptor] where Operation : GraphQLOperation { - return [DatadogApolloInterceptor()] + DefaultInterceptorProvider.shared.graphQLInterceptors(for: operation) - } - } - ``` - - {{% /tab %}} - {{< /tabs >}} - - 이렇게 하면 Datadog RUM이 요청에서 Operation 유형, 이름, 변수, 페이로드(선택 사항)를 자동으로 추출하여 GraphQL 요청 RUM 리소스를 강화할 수 있습니다. - -
-
    -
  • 이 통합은 Apollo iOS 버전 1.0+2.0+를 지원합니다.
  • -
  • querymutation 유형의 Operation은 추적되며, subscription Operation은 추적되지 않습니다.
  • -
  • GraphQL 페이로드 전송은 기본적으로 비활성화되어 있습니다. 활성화하려면 DatadogApolloInterceptor 생성자의 sendGraphQLPayloads 플래그를 다음과 같이 설정하세요.
  • -
- -

-   let datadogInterceptor = DatadogApolloInterceptor(sendGraphQLPayloads: true)
-     
-
- -### 오류 자동 추적 - -`Logger`로 전송된 모든 "error" 및 "critical" 로그는 자동으로 RUM 오류로 보고되며 현재 RUM 조회와 연결됩니다. - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogLogs - -let logger = Logger.create() - -logger.error("message") -logger.critical("message") -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -@import DatadogLogs; - -DDLogger *logger = [DDLogger create]; -[logger error:@"message"]; -[logger critical:@"message"]; -``` -{{% /tab %}} -{{< /tabs >}} - -이와 유사하게, 오류로 표시된 모든 완료된 스팬은 RUM 오류로 보고됩니다. - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -import DatadogTrace - -let span = Tracer.shared().startSpan(operationName: "operation") -// ... capture the `error` -span.setError(error) -span.finish() -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -// ... capture the `error` -id span = [[DDTracer shared] startSpan:@"operation"]; -[span setError:error]; -[span finish]; -``` -{{% /tab %}} -{{< /tabs >}} - -## RUM 이벤트 수정 또는 삭제 - -RUM 이벤트가 Datadog으로 전송되기 전에 해당 속성을 수정하거나 이벤트를 완전히 삭제하려면 iOS RUM SDK를 설정할 때 Event Mappers API를 사용하세요. - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -let configuration = RUM.Configuration( - applicationID: "", - viewEventMapper: { RUMViewEvent in - return RUMViewEvent - } - resourceEventMapper: { RUMResourceEvent in - return RUMResourceEvent - } - actionEventMapper: { RUMActionEvent in - return RUMActionEvent - } - errorEventMapper: { RUMErrorEvent in - return RUMErrorEvent - } - longTaskEventMapper: { RUMLongTaskEvent in - return RUMLongTaskEvent - } -) -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""]; - -[configuration setViewEventMapper:^DDRUMViewEvent * _Nonnull(DDRUMViewEvent * _Nonnull RUMViewEvent) { - return RUMViewEvent; -}]; - -[configuration setErrorEventMapper:^DDRUMErrorEvent * _Nullable(DDRUMErrorEvent * _Nonnull RUMErrorEvent) { - return RUMErrorEvent; -}]; - -[configuration setResourceEventMapper:^DDRUMResourceEvent * _Nullable(DDRUMResourceEvent * _Nonnull RUMResourceEvent) { - return RUMResourceEvent; -}]; - -[configuration setActionEventMapper:^DDRUMActionEvent * _Nullable(DDRUMActionEvent * _Nonnull RUMActionEvent) { - return RUMActionEvent; -}]; - -[configuration setLongTaskEventMapper:^DDRUMLongTaskEvent * _Nullable(DDRUMLongTaskEvent * _Nonnull RUMLongTaskEvent) { - return RUMLongTaskEvent; -}]; -``` -{{% /tab %}} -{{< /tabs >}} - -각 맵퍼는 `(T) -> T?` 서명을 가진 Swift 클로저이며, 여기서 `T`는 구체적인 RUM 이벤트 유형입니다. 이를 통해 이벤트가 전송되기 전에 일부 내용을 변경할 수 있습니다. - -예를 들어, RUM 리소스의 `url`에서 민감한 정보를 가리려면, 커스텀 `redacted(_:) -> String` 함수를 구현하고 `resourceEventMapper`에서 사용하면 됩니다. - -{{< tabs >}} -{{% tab "Swift" %}} - -```swift -let configuration = RUM.Configuration( - applicationID: "", - resourceEventMapper: { RUMResourceEvent in - var RUMResourceEvent = RUMResourceEvent - RUMResourceEvent.resource.url = redacted(RUMResourceEvent.resource.url) - return RUMResourceEvent - } -) -``` -{{% /tab %}} -{{% tab "ObjectiveC" %}} - -```objective-c -DDRUMConfiguration *configuration = [[DDRUMConfiguration alloc] initWithApplicationID:@""]; - -[configuration setResourceEventMapper:^DDRUMResourceEvent * _Nullable(DDRUMResourceEvent * _Nonnull RUMResourceEvent) { - return RUMResourceEvent; -}]; -``` -{{% /tab %}} -{{< /tabs >}} - -오류, 리소스 또는 액션 맵퍼에서 `nil`을 반환하면 이벤트가 완전히 삭제됩니다; 이벤트는 Datadog으로 전송되지 않습니다. 조회 이벤트 맵퍼에서 반환하는 값은 `nil`이 될 수 없습니다(조회를 삭제하려면 `UIKitRUMViewsPredicate` 구현을 사용자 지정해야 합니다. 자세한 내용은 [자동으로 조회 추적하기](#automaticallytrackviews) 참조). - -이벤트 유형에 따라 일부 특정 속성만 수정할 수 있습니다: - -| 이벤트 유형 | 속성 키 | 설명 | -| | | | -| RUMActionEvent | `RUMActionEvent.action.target?.name` | 액션의 이름입니다. | -| | `RUMActionEvent.view.url` | 이 액션과 연결된 조회의 URL입니다. | -| RUMErrorEvent | `RUMErrorEvent.error.message` | 오류 메시지입니다. | -| | `RUMErrorEvent.error.stack` | 오류의 스택 트레이스입니다. | -| | `RUMErrorEvent.error.resource?.url` | 오류가 참조하는 리소스의 URL입니다. | -| | `RUMErrorEvent.view.url` | 이 오류와 연결된 조회의 URL입니다. | -| RUMResourceEvent | `RUMResourceEvent.resource.url` | 리소스의 URL입니다. | -| | `RUMResourceEvent.view.url` | 이 리소스와 연결된 조회의 URL입니다. | -| RUMViewEvent | `RUMViewEvent.view.name` | 조회의 이름입니다. | -| | `RUMViewEvent.view.url` | 조회의 URL입니다. | -| | `RUMViewEvent.view.referrer` | 페이지의 초기 조회에 연결된 URL입니다. | - -## RUM 세션 ID 검색 - -RUM 세션 ID를 검색하면 문제 해결에 도움이 될 수 있습니다. 예를 들어, 지원 요청, 이메일 또는 버그 보고서에 세션 ID를 첨부하면, 지원팀이 나중에 Datadog에서 사용자 세션을 찾을 수 있습니다. - -`sessionStarted` 이벤트를 기다리지 않고 런타임 중에 RUM 세션 ID에 액세스할 수 있습니다. - -```swift -RumMonitor.shared().currentSessionID(completion: { sessionId in - currentSessionId = sessionId -}) -``` - -## 추적 동의 설정(GDPR 준수) - -GDPR 규정을 준수하려면, RUM iOS 소프트웨어 개발 키트(SDK)는 초기화 시 추적 동의 값이 필요합니다. - -`trackingConsent` 설정은 다음 값 중 하나가 될 수 있습니다. - -1. `.pending`: RUM iOS SDK에서 데이터를 수집 및 일괄 처리하나 Datadog으로 전송하지는 않습니다. RUM iOS SDK는 새로운 추적 동의 값을 기다렸다가 일괄 처리된 데이터를 어떻게 처리할지 결정합니다. -2. `.granted`: RUM iOS SDK가 데이터 수집을 시작하고 Datadog으로 해당 데이터를 전송합니다. -3. `.notGranted`: RUM iOS SDK는 데이터를 수집하지 않습니다. 로그, 트레이스 또는 RUM 이벤트가 Datadog으로 전송되지 않습니다. - -RUM iOS SDK 초기화후 추적 동의 값을 변경하려면 `Datadog.set(trackingConsent:)` API 호출을 사용합니다. RUM iOS SDK는 새 값에 따라 동작을 변경합니다. - -예를 들어 현재 추적 동의가 `.pending`인 경우는 다음과 같습니다. - - 값을 `.granted`로 변경하면 RUM iOS SDK는 현재 및 향후 모든 데이터를 Datadog으로 전송합니다. - 값을 `.notGranted`로 변경하면 RUM iOS SDK는 현재 데이터를 모두 삭제하고 향후 데이터를 수집하지 않습니다. - -## 사용자 속성 추가 - -`Datadog.addUserExtraInfo(_:)` API로 이전에 설정한 속성에 추가 사용자 속성을 추가할 수 있습니다. - -```swift -import DatadogCore - -Datadog.addUserExtraInfo(["company": "Foo"]) -``` - -## 데이터 관리 - -iOS SDK는 먼저 이벤트를 로컬에 저장하고 [인테이크 사양][9]이 충족될 때만 이벤트를 업로드합니다. - -### 모든 데이터 삭제 - -`Datadog.clearAllData()` API로 SDK에 저장된 모든 미전송 데이터를 삭제할 수 있습니다. - -```swift -import DatadogCore - -Datadog.clearAllData() -``` - -### 데이터 수집 중지 - -`Datadog.stopInstance()` API로 SDK 인스턴스(또는 이름이 `nil`인 경우 기본 인스턴스)가 더 이상 데이터를 수집하고 업로드하지 않도록 중지할 수 있습니다. - -```swift -import DatadogCore - -Datadog.stopInstance() -``` - -이 메서드를 호출하면 SDK와 모든 활성 기능(예: RUM)이 비활성화됩니다. 데이터 수집을 재개하려면 SDK를 다시 초기화해야 합니다. 이 API는 구성 변경을 동적으로 적용하고자 할 때 사용할 수 있습니다. - -## 참고 자료 - -{{< partial name="whats-next/whats-next.html" >}} - -[1]: https://app.datadoghq.com/rum/application/create -[2]: /ko/real_user_monitoring/application_monitoring/ios -[3]: /ko/real_user_monitoring/application_monitoring/ios/data_collected/ -[4]: https://github.com/DataDog/ddsdkios/blob/master/DatadogRUM/Sources/RUMMonitorProtocol.swift -[5]: /ko/real_user_monitoring/application_monitoring/ios/data_collected/?tab=error#errorattributes -[6]: /ko/real_user_monitoring/application_monitoring/ios/data_collected/?tab=session#defaultattributes -[7]: https://www.ntppool.org/en/ -[8]: /ko/real_user_monitoring/error_tracking/mobile/ios/#addapphangreporting -[9]: /ko/real_user_monitoring/application_monitoring/ios/setup \ No newline at end of file