From 5d69f1c14213fad56a79d93ae8a72f4c07cf889e Mon Sep 17 00:00:00 2001 From: adutta-newrelic Date: Fri, 20 Dec 2024 22:47:58 +0530 Subject: [PATCH 01/67] Divided the session replay page to sub sections, and added manage-session-replay-modify-capabilities --- .../user-permissions.mdx | 2 +- .../browser-pro-features/session-replay.mdx | 434 ------------------ .../customize-privacy-settings.mdx | 85 ++++ .../configuration/setup-session-replay.mdx | 33 ++ .../update-javascript-for-session-replay.mdx | 23 + .../session-replay/get-started.mdx | 195 ++++++++ ...age-session-replay-modify-capabilities.mdx | 97 ++++ .../troubleshooting-session-replay.mdx | 75 +++ .../session-replay/view-session-replays.mdx | 59 +++ .../browser-pro-features/browser-features.mdx | 2 +- src/nav/browser.yml | 18 + static/images/browser-role-id.webp | Bin 0 -> 75506 bytes 12 files changed, 587 insertions(+), 436 deletions(-) delete mode 100644 src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx create mode 100644 src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/customize-privacy-settings.mdx create mode 100644 src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx create mode 100644 src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/update-javascript-for-session-replay.mdx create mode 100644 src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx create mode 100644 src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx create mode 100644 src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx create mode 100644 src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/view-session-replays.mdx create mode 100644 static/images/browser-role-id.webp diff --git a/src/content/docs/accounts/accounts-billing/new-relic-one-user-management/user-permissions.mdx b/src/content/docs/accounts/accounts-billing/new-relic-one-user-management/user-permissions.mdx index 808c65be3eb..2002b41c2bd 100644 --- a/src/content/docs/accounts/accounts-billing/new-relic-one-user-management/user-permissions.mdx +++ b/src/content/docs/accounts/accounts-billing/new-relic-one-user-management/user-permissions.mdx @@ -125,7 +125,7 @@ To learn more about specific permissions, select a category below, or try search * **Application settings**: relates to browser application settings. * **Domain conditions**: relates to [browser domain conditions](/docs/browser/new-relic-browser/configuration/monitor-or-block-specific-domains-subdomains). * **Segment allow lists**: relates to segmenting [allow lists](/docs/browser/new-relic-browser/configuration/group-browser-metrics-urls). - * **View session replays**: relates to [viewing replays.](/docs/browser/browser-monitoring/browser-pro-features/session-replay). + * **View session replays**: relates to [viewing replays.](/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started). - -## How session replay works [#how-it-works] - -When a user loads your web page, session replay takes a snapshot of the Document Object Model (DOM), which represents the page's structure and visual elements. To ensure accurate styling information, the browser agent accesses your CSS files. The agent then integrates these styles directly into the replay recording, eliminating the need to reference external CSS files during playback. As the user interacts with the page, a library within the browser agent captures any changes made to the DOM. This captured data is then stored securely in New Relic's database. - -Replays store up to: - -* 4 hours of a user session -* 30 minutes of inactivity - -By default, browser event data is stored 8 days, but actual data retention depends on your account. - -For more details on session replay, see the following sections: - -* [Data consumption](#data-consumption): View or project data consumption. -* [User privacy and security concerns](#data-security): Learn how we protect your user data and meet privacy requirements. -* [Session replay and your app's performance](#app-performance): Learn how session replay minimizes impact on your app's performance. - -## Get started [#get-started] - - - - ### Enable session replay [#enable-configure-settings] - - 1. Go to **[one.newrelic.com](https://one.newrelic.com/all-capabilities) > All Capabilities > Browser**. - 2. Select your browser app. - 3. In the left-hand menu, click **Application settings**. - 4. On the Application settings page, make sure **Pro** or **Pro + SPA** browser agent is selected. Session replay is not available for the Lite browser agent. - 5. Toggle ON **Session tracking** and **Session replay** settings. - - - - ### Configure sampling rates [#configure-sampling-rates] - - Set a sampling rate (0%-100%) for the following samples: - - * **User sessions** records a random sample of all user sessions. - - * **Errored session** records a random sample of all errored sessions. The agent buffers a sliding window of data for up to 30 seconds on the client-side, and if errors occur, the buffered data will be harvested and the remainder of the session will be recorded. If an error does not occur, the replay is never harvested. - - For example, if you set the session sampling rate to 50% and the error sampling rate to 100%, it means that: - - * Half of all user sessions will be recorded. - - * All errored sessions will be recorded, even if they're not part of the 50% sample. - - - - ### (Optional) Configure privacy settings [#configure-privacy-settings] - - By default, all text and inputs are replaced with asterisks. Here's an example of how a replay looks with default privacy: - - Example of default privacy settings - - If this setting is appropriate, move onto the next step. - - If you need to customize what content or user input is captured, you have options to mask, block, or ignore specific classes and attributes of content or user input. Make sure to check with your privacy team before changing the privacy settings. - - ### Mask sensitive text [#mask-text] - - You can mask sensitive text, which means the text will be replaced with asterisks (\*). For example, you can mask a user's account ID that shows in a URL. - - To specify which input should be masked, you have a few options: - - * On the **Application settings** page, add your own CSS selectors or check the masking boxes. Note that using mask selectors will **not** mask user input, so if you need to hide user input, we recommend using block selectors. - - Screenshot of mask settings in the ui - * Add our CSS class `nr-mask` or attribute `data-nr-mask` to your webpage HTML. - For example, to mask an account ID from showing in the URL, add `nr-mask` to the `
` containing the account ID: - - ````html -
Account ID: 99881123
- ``` - ```` - - These options use an asterisk (\*) to mask all text in that element, hiding the actual text but revealing the number of characters entered. However, asterisks are not valid numbers, so masking number type-specific fields such as telephone or credit card numbers will result in a blank field in a replay. - - ### Block site content [#block-content] - - You can block entire sections of content on your site, which means the section will appear as an empty placeholder in session replay. For example, if you have an image on your About Us webpage and don’t need it captured, you could block the class containing the image. - - To block specific classes or attributes, you have a few options: - - * On the Application settings page, add your CSS selectors in the \*_Block selectors_ field. - - Screenshot of session replay settings - * Manually add our CSS class `nr-block` or attribute `data-nr-block` to your webpage HTML. For example, if you wanted to block irrelevant text and images from session replay, add `nr-block` to `
`: - - ```html - - - Sample image and text - - -
- Image description -
- - - ``` - - ### Ignore user input [#ignore-input] - - You can ignore changes to a user input field, which means the input field will still be displayed in the replay, but you won't display changes to the value. For example, you could ignore the class containing the email address or credit card fields. Password input fields are always masked.  - - To ignore input, add the CSS class `nr-ignore` to the input field’s class name. For example, if you want to ignore sensitive information on a billing page, add `class="nr-ignore"` to ``: - - ```html -
-

Sensitive Information

-

Credit card number:

-

Expiration date:

-

CVV code:

-
- ``` - - - - ### (For copy/paste deployed agents) Manually update the JavaScript snippet [#update-snippet] - - If you deployed the browser agent using the copy/paste method, you'll need to copy/paste from the UI again. This is because when you enable session replay, the JavaScript snippet updates to include the new config updates. - - To update your agent code: - - 1. Go to the **Application Settings** page and copy the JavaScript snippet. - - Screenshot of the application settings page. - - 2. Paste it in your code where the old snippet was. - - 3. Deploy your app. - - - - ### View session replays in New Relic [#view-data] - - You can find session replays in two places: - - * On the **Session replay** page: - - 1. Go to **[one.newrelic.com > All Capabilities](https://one.newrelic.com/all-capabilities) > Browser**. - 2. Select your browser app. - 3. In the left-hand menu, scroll down and click **Session replay**. - 4. Click into each replay to view session details. - - screenshot of the session replay page in browser - - * On the **Errors inbox** page: - - 1. In the left-hand browser menu, click **Errors**. - 2. Click on the **Triage** and **Group errors** pages to see replays attached to errors. - - Screenshot of replays in errors inbox - - - -## Troubleshooting [#troubleshoot] - - - - ### Problem - - Session replay feature is enabled, but you're not seeing any replays. - - ### Solution - - Here are some possible fixes: - - * Check your sampling rates. There is sampling for both replays and errors. - * Make sure you have permission to view replays. - * Make sure you're using the Pro or Pro+SPA version of the browser agent. Session replay does not work with the Lite browser agent. - * Make sure your browser agent meets these requirements: - * Agent version v1.260.0 or greater. We recommend [upgrading to the latest agent version](/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes) as we continue making improvements. - * Agent type: Pro or Pro+SPA. Session replay does not work with the Lite browser agent. - * [Session tracing](/docs/browser/browser-monitoring/browser-pro-features/session-traces-explore-webpages-life-cycle/#requirements) is enabled. - * Your end-user's browser supports the browser-level APIs needed to record a session replay (verify compatibility at [MutationObserver](https://caniuse.com/mutationobserver)). - * In [Errors inbox](/docs/errors-inbox/errors-inbox/), filter your views so that you always see a replay. By default, browser event data is stored 8 days, but actual data retention depends on your account. - * If you're using the copy/paste deployment method, make sure you [updated your agent code](#update-snippet). - * If you’re using the APM deployment method, you may need to wait a while for session replay to be automatically enabled. If you’re still not seeing data, try restarting the agent. - * If you're [dropping](https://docs.newrelic.com/docs/data-apis/manage-data/drop-data-using-nerdgraph/) PageView event data, Session Replays may not display in the UI. - - - - ### Problem - - You're seeing replays, but they're not displaying correctly. - - This may be because your CSS files are hosted on a separate domain and Cross-Origin Resource Sharing (CORS) security measures are preventing our agent from accessing the CSS files. This can result in incomplete or inaccurate replays, as essential styling information may be missing. - - Here's what's happening behind the scenes: - - * Session replay works by rebuilding the user's DOM, which includes your website's structure and visual elements. To achieve this, our agent needs to access your CSS files to accurately capture styling information. We then inline these styles directly into the replay recording, eliminating the need to reference the original CSS files during playback. - - * If your CSS files are hosted on a separate domain, CORS may prevent our agent from accessing them. - - ### Solution - - To ensure your CSS files are accessible, add the `crossorigin="anonymous"` attribute to your `` elements within your HTML code. This attribute instructs the browser to allow cross-origin access for those specific CSS files, allowing our browser agent to record and integrate the styling information. - - Here's an example of adding the `crossorigin="anonymous"` attribute: - - ``` - - ``` - - - ### Problem - - Session replay feature is enabled, but you're not seeing replay data for iframe content. - - ### Solution - - The behavior of session replay in iframe scenarios depends on the origin of the iframe and the placement of the browser agent. - - Assuming a web page consists of a top-level window with a child iframe, here are some possible fixes: - * **Same-origin iframes**: - * If you place the browser agent in the top-level window, session replay captures both the window and the iframe. - * If you place the browser agent in the iframe, session replay only captures what's in the iframe. - * If you place the browser agent in both the top-level window and iframe, session replay captures what's happening independently in both the window and iframe, resulting in two separate sessions. - * **Cross-origin iframes**: - * If you place the browser agent in the top-level window, session replay only captures what's in the window. The iframe will appear blank in session replay. - * If you place the browser agent in the top-level iframe, session replay only captures what's in the iframe. - - Session replay is **not** compatible with `` elements. - - - - -## Manually record session replays [#manual-replays] - -If needed, you can programmatically `force` a session replay to start or stop recording using API methods. Here are some use cases: - -* Allow users to opt in for interaction recording. For example, if you have a pop-up asking "Allow this session to be recorded for performance analysis?" and a user consents: - 1. Call `newrelic.recordReplay()` to initiate recording. - 2. Once the session is complete or consent is withdrawn, use `newrelic.pauseReplay()` to stop capturing data. -* Record sessions based on specific criteria, such as: - * Start recording only for sessions on specific URLs such as a product checkout flow. - * Stop recording for sensitive pages such as `/billing` or `/health-records`. - -See the API documentation for instructions: - -* [`newrelic.recordReplay`](/docs/browser/new-relic-browser/browser-apis/recordReplay/) -* [`newrelic.pauseReplay`](/docs/browser/new-relic-browser/browser-apis/pauseReplay/) - -## Disable automatic session replay tracking [#auto-replays] - -You can prevent session replays from automatically starting, even when sampled, by setting the API configuration option `autoStart` to `false`. This is useful in scenarios where you need to prioritize specific actions over automatic sampling. For example, you might not want session replays to automatically run on sensitive pages, like HIPAA-compliant ones. In such cases, you can use the `.start()` API to manually trigger the replay feature after user consent is obtained (and your app calls `.start()`) - -Setting `autoStart: false` instructs the agent to defer its initialization until explicitly called using `.start()`. This ensures that session replays will not be created at all, even if the backend samples your application for recording. - - - Calling `.start()` does not guarantee that a session replay will be recorded. It simply delays the module import and evaluation of sampling results until this point. If you need to force a recording, see [Manually record session replays](#manual-replays). - - -To start using this API, see [`newrelic.start`](/docs/browser/new-relic-browser/browser-apis/start/). - -## Use Nerdgraph to configure replay settings [#nerdgraph-mutation] - -You can configure session replay settings using our [NerdGraph API](/docs/apis/nerdgraph/get-started/introduction-new-relic-nerdgraph/) instead of using the UI. This method is helpful if you need to make bulk changes, such as applying sampling rates to multiple browser entities. - -Here's an example mutation and variables to create a new browser application with default settings: - - - - - - - - - - - - - - - - - -
- Mutation - - Variables -
- ```graphql - mutation SessionReplayConfigUpdate($guid: EntityGuid!, $settings: AgentApplicationSettingsUpdateInput!) { - agentApplicationSettingsUpdate(guid: $guid, settings: $settings) { - browserSettings { - sessionReplay { - blockSelector - errorSamplingRate - maskTextSelector - enabled - collectFonts - inlineImages - inlineStylesheet - samplingRate - maskAllInputs - maskInputOptions { - color - date - datetimeLocal - email - month - number - range - search - select - tel - text - textArea - time - url - week - } - } - } - errors { - field - errorClass - description - } - } - } - ``` - - ```json - { - "sessionReplay": { - "enabled": true, - "collectFonts": true, - "blockSelector": ".private-fields", - "maskTextSelector": "*", - "inlineStylesheet": false, - "maskAllInputs": true, - "maskInputOptions": { - "color": true, - "date": true, - "textArea": true - }, - "samplingRate": 9.99, - "errorSamplingRate": 1.11 - } - } - ``` -
- -## Data consumption [#data-consumption] - -Session replay follows the same consumption pricing as your other browser bytes. The amount of bytes produced depends on the count, length, and user-activity levels of sessions, as well as the complexity of your site's DOM. - -The most accurate way to project your cost per replay is to enable the feature for a short test period and measure your actual consumption. Alternatively, you can use an average of 5.3 MB per replay as a rough approximation, though keep in mind that your actual cost may vary significantly. A simple formula to project your approximate costs is: `sessions` x `sampling_rate` x `gb_per_replay` x `cost_per_gb`. Here's an example: - -``` -1 million (sessions) x 5% (sampling_rate) x 0.0053 (gb_per_replay) x $0.35 (cost_per_gb) = $92.75 for 50,000 replays -``` - -To control your consumption, [adjust your sampling rates](#configure-sampling-rates). - -## User privacy and security concerns [#data-security] - -We prioritize data privacy and built session replay with strong default settings to minimize the potential exposure of sensitive customer information. You can further [customize privacy settings](#configure-privacy-settings) to meet your specific needs. - -Session replay does not capture screenshots or videos. Instead, it records only the essential DOM state changes needed to reconstruct user interactions. This significantly reduces the amount of data stored. - -### Compliance with data privacy laws - -New Relic acts as a data processor under GDPR and a service provider under CCPA. This means we process data according to your instructions. Ultimately, compliance with these laws depends on how you implement session replay within your application. - -By default, all text and user inputs, including personal data, are masked within the recordings. You can selectively unmask specific elements if needed, but the default ensures that no personally identifiable information is readily visible. This approach provides a strong foundation for data privacy while offering flexibility for your specific needs. - -## Session replay and your app's performance [#app-performance] - -Session replay minimizes impact on your app's performance with: - -* **Minimal initial impact**: Session replay loads asynchronously after full page load, ensuring no interference with early page load performance metrics. -* **DOM mutation tracking**: Once loaded, session replay monitors DOM changes and reports them as compressed payloads. The size of these payloads correlates with the complexity of the DOM tree. -* **Performance optimization techniques**: Payload size can also increase if the DOM is large. However, session replay uses a number of techniques to reduce payload size, such as: - * GZIP compression - * Duplication reduction - * Strategic payload harvesting: It only sends a large (compressed) payload when the full DOM is captured, which typically only happens when the replay feature is first imported. After that, it will only send small payloads that relate to the user's actions. The browser agent will harvest on whatever happens first of the following: - * The payload reaches more than 64 KB compressed - * 60 seconds elapses - * The visibility of the page changes (tab change, focus, navigation, etc) - * The session ends diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/customize-privacy-settings.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/customize-privacy-settings.mdx new file mode 100644 index 00000000000..09e645eb7a4 --- /dev/null +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/customize-privacy-settings.mdx @@ -0,0 +1,85 @@ +--- +title: "(Optional) Configure privacy settings" +metaDescription: "Customizing Privacy Settings for user interactions to debug faster and improve page performance." +freshnessValidatedDate: 2024-12-19 +--- + +User privacy is a critical consideration when recording session replays. Although default settings are designed to protect sensitive information, you may need to adjust privacy configurations to meet specific needs. This section explains how to mask, block, or ignore certain data to comply with privacy standards while maintaining the functionality of session replays. + +By default, all text and inputs are replaced with asterisks. Here's an example of how a replay looks with default privacy: + + Example of default privacy settings + + If this setting is appropriate, move onto the next step. + + If you need to customize what content or user input is captured, you have options to mask, block, or ignore specific classes and attributes of content or user input. Make sure to check with your privacy team before changing the privacy settings. + +## Mask sensitive text [#mask-text] + + You can mask sensitive text, which means the text will be replaced with asterisks (\*). For example, you can mask a user's account ID that shows in a URL. + + To specify which input should be masked, you have a few options: + + * On the **Application settings** page, add your own CSS selectors or check the masking boxes. Note that using mask selectors will **not** mask user input, so if you need to hide user input, we recommend using block selectors. + + Screenshot of mask settings in the ui + * Add our CSS class `nr-mask` or attribute `data-nr-mask` to your webpage HTML. + For example, to mask an account ID from showing in the URL, add `nr-mask` to the `
` containing the account ID: + + ````html +
Account ID: 99881123
+ ``` + ```` + + These options use an asterisk (\*) to mask all text in that element, hiding the actual text but revealing the number of characters entered. However, asterisks are not valid numbers, so masking number type-specific fields such as telephone or credit card numbers will result in a blank field in a replay. + +## Block site content [#block-content] + + You can block entire sections of content on your site, which means the section will appear as an empty placeholder in session replay. For example, if you have an image on your About Us webpage and don’t need it captured, you could block the class containing the image. + + To block specific classes or attributes, you have a few options: + + * On the Application settings page, add your CSS selectors in the \*_Block selectors_ field. + + Screenshot of session replay settings + * Manually add our CSS class `nr-block` or attribute `data-nr-block` to your webpage HTML. For example, if you wanted to block irrelevant text and images from session replay, add `nr-block` to `
`: + + ```html + + + Sample image and text + + +
+ Image description +
+ + + ``` + +## Ignore user input [#ignore-input] + + You can ignore changes to a user input field, which means the input field will still be displayed in the replay, but you won't display changes to the value. For example, you could ignore the class containing the email address or credit card fields. Password input fields are always masked.  + + To ignore input, add the CSS class `nr-ignore` to the input field’s class name. For example, if you want to ignore sensitive information on a billing page, add `class="nr-ignore"` to ``: + + ```html +
+

Sensitive Information

+

Credit card number:

+

Expiration date:

+

CVV code:

+
+ ``` \ No newline at end of file diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx new file mode 100644 index 00000000000..9931aea38c5 --- /dev/null +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx @@ -0,0 +1,33 @@ +--- +title: "Setup session replay" +metaDescription: "Enable session replay to play back user interactions and improve page performance." +freshnessValidatedDate: 2024-12-19 +--- + +Fully utilize session replay in New Relic, start by enabling this feature in your browser application settings. This step is essential for capturing user interactions on your web app, providing insights into user journeys, and troubleshooting issues effectively. Follow the steps below to enable session replay and ensure your browser agent is configured correctly. + +## Enable session replay [#enable-session-replay] + + 1. Go to **[one.newrelic.com](https://one.newrelic.com/all-capabilities) > All Capabilities > Browser**. + + 2. Select your browser app. + + 3. In the left-hand menu, click **Application settings**. + + 4. On the **Application settings** page, make sure **Pro** or **Pro + SPA** browser agent is selected. Session replay is not available for the Lite browser agent. + + 5. Toggle ON **Session tracking** and **Session replay** settings. + +## Configure sampling rates [#configure-sampling-rates] + +Set a sampling rate (0%-100%) for the following samples: + + * **User sessions** records a random sample of all user sessions. + + * **Errored session** records a random sample of all errored sessions. The agent buffers a sliding window of data for up to 30 seconds on the client-side, and if errors occur, the buffered data will be harvested and the remainder of the session will be recorded. If an error does not occur, the replay is never harvested. + + For example, if you set the session sampling rate to 50% and the error sampling rate to 100%, it means that: + + * Half of all user sessions will be recorded. + + * All errored sessions will be recorded, even if they're not part of the 50% sample. \ No newline at end of file diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/update-javascript-for-session-replay.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/update-javascript-for-session-replay.mdx new file mode 100644 index 00000000000..24752565d68 --- /dev/null +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/update-javascript-for-session-replay.mdx @@ -0,0 +1,23 @@ +--- +title: "Update JavaScript for session replay" +metaDescription: "Updating JavaScript for session replay to play back user interactions and improve page performance." +freshnessValidatedDate: 2024-12-19 +--- + +## (For copy/paste deployed agents) Manually update the JavaScript snippet [#update-snippet] + +If you use the copy/paste method to deploy your browser agent, you may need to manually update the JavaScript snippet to include session replay capabilities. This update ensures your application is correctly configured to capture and store replay data. + +To update your agent code: + + 1. Go to the **Application Settings** page and copy the JavaScript snippet. + + Screenshot of the application settings page. + + 2. Paste it in your code where the old snippet was. + + 3. Deploy your app. \ No newline at end of file diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx new file mode 100644 index 00000000000..20d00168329 --- /dev/null +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx @@ -0,0 +1,195 @@ +--- +title: "Session replay" +metaDescription: "Play back user interactions to debug faster and improve page performance." +freshnessValidatedDate: 2024-12-19 +--- + +## Introduction to session replay + +Session replay captures interactions on your web app and maps other telemetry data to help you understand your user's journeys. Session replay can be used for troubleshooting and improving the end-user experience, such as: + +* **Troubleshooting JavaScript errors**: Troubleshoot the cause of an error by seeing what the user was doing when the error occurred. For example, if an end user receives an error while trying to complete an ecommerce transaction, you can use session replay to see which steps they took and what data they entered before the error occurred. This can help you quickly identify and fix the root cause of the problem. +* **Improving the user experience**: Discover areas of your web app that are causing users frustration. For example, you might see that users are getting lost in your navigation or clicking on buttons that don't do anything. +* **Identifying issues in key user journeys**: Identify areas of your web app that are causing performance problems. For example, if session replay reveals the `/cart/checkout` page is experiencing excessive page load time, you'd prioritize fixing this critical user journey. + +Screenshot of session replay details + +## How session replay works [#how-it-works] + +When a user loads your web page, session replay takes a snapshot of the Document Object Model (DOM), which represents the page's structure and visual elements. To ensure accurate styling information, the browser agent accesses your CSS files. The agent then integrates these styles directly into the replay recording, eliminating the need to reference external CSS files during playback. As the user interacts with the page, a library within the browser agent captures any changes made to the DOM. This captured data is then stored securely in New Relic's database. + +Replays store up to: + +* 4 hours of a user session +* 30 minutes of inactivity + +By default, browser event data is stored 8 days, but actual data retention depends on your account. + +For more details on session replay, see the following sections: + +* [Data consumption](#data-consumption): View or project data consumption. +* [User privacy and security concerns](#data-security): Learn how we protect your user data and meet privacy requirements. +* [Session replay and your app's performance](#app-performance): Learn how session replay minimizes impact on your app's performance. + + + +## Manually record session replays [#manual-replays] + +If needed, you can programmatically `force` a session replay to start or stop recording using API methods. Here are some use cases: + +* Allow users to opt in for interaction recording. For example, if you have a pop-up asking "Allow this session to be recorded for performance analysis?" and a user consents: + 1. Call `newrelic.recordReplay()` to initiate recording. + 2. Once the session is complete or consent is withdrawn, use `newrelic.pauseReplay()` to stop capturing data. +* Record sessions based on specific criteria, such as: + * Start recording only for sessions on specific URLs such as a product checkout flow. + * Stop recording for sensitive pages such as `/billing` or `/health-records`. + +See the API documentation for instructions: + +* [`newrelic.recordReplay`](/docs/browser/new-relic-browser/browser-apis/recordReplay/) +* [`newrelic.pauseReplay`](/docs/browser/new-relic-browser/browser-apis/pauseReplay/) + +## Disable automatic session replay tracking [#auto-replays] + +You can prevent session replays from automatically starting, even when sampled, by setting the API configuration option `autoStart` to `false`. This is useful in scenarios where you need to prioritize specific actions over automatic sampling. For example, you might not want session replays to automatically run on sensitive pages, like HIPAA-compliant ones. In such cases, you can use the `.start()` API to manually trigger the replay feature after user consent is obtained (and your app calls `.start()`) + +Setting `autoStart: false` instructs the agent to defer its initialization until explicitly called using `.start()`. This ensures that session replays will not be created at all, even if the backend samples your application for recording. + + + Calling `.start()` does not guarantee that a session replay will be recorded. It simply delays the module import and evaluation of sampling results until this point. If you need to force a recording, see [Manually record session replays](#manual-replays). + + +To start using this API, see [`newrelic.start`](/docs/browser/new-relic-browser/browser-apis/start/). + +## Use Nerdgraph to configure replay settings [#nerdgraph-mutation] + +You can configure session replay settings using our [NerdGraph API](/docs/apis/nerdgraph/get-started/introduction-new-relic-nerdgraph/) instead of using the UI. This method is helpful if you need to make bulk changes, such as applying sampling rates to multiple browser entities. + +Here's an example mutation and variables to create a new browser application with default settings: + + + + + + + + + + + + + + + + + +
+ Mutation + + Variables +
+ ```graphql + mutation SessionReplayConfigUpdate($guid: EntityGuid!, $settings: AgentApplicationSettingsUpdateInput!) { + agentApplicationSettingsUpdate(guid: $guid, settings: $settings) { + browserSettings { + sessionReplay { + blockSelector + errorSamplingRate + maskTextSelector + enabled + collectFonts + inlineImages + inlineStylesheet + samplingRate + maskAllInputs + maskInputOptions { + color + date + datetimeLocal + email + month + number + range + search + select + tel + text + textArea + time + url + week + } + } + } + errors { + field + errorClass + description + } + } + } + ``` + + ```json + { + "sessionReplay": { + "enabled": true, + "collectFonts": true, + "blockSelector": ".private-fields", + "maskTextSelector": "*", + "inlineStylesheet": false, + "maskAllInputs": true, + "maskInputOptions": { + "color": true, + "date": true, + "textArea": true + }, + "samplingRate": 9.99, + "errorSamplingRate": 1.11 + } + } + ``` +
+ +## Data consumption [#data-consumption] + +Session replay follows the same consumption pricing as your other browser bytes. The amount of bytes produced depends on the count, length, and user-activity levels of sessions, as well as the complexity of your site's DOM. + +The most accurate way to project your cost per replay is to enable the feature for a short test period and measure your actual consumption. Alternatively, you can use an average of 5.3 MB per replay as a rough approximation, though keep in mind that your actual cost may vary significantly. A simple formula to project your approximate costs is: `sessions` x `sampling_rate` x `gb_per_replay` x `cost_per_gb`. Here's an example: + +``` +1 million (sessions) x 5% (sampling_rate) x 0.0053 (gb_per_replay) x $0.35 (cost_per_gb) = $92.75 for 50,000 replays +``` + +To control your consumption, [adjust your sampling rates](#configure-sampling-rates). + +## User privacy and security concerns [#data-security] + +We prioritize data privacy and built session replay with strong default settings to minimize the potential exposure of sensitive customer information. You can further [customize privacy settings](#configure-privacy-settings) to meet your specific needs. + +Session replay does not capture screenshots or videos. Instead, it records only the essential DOM state changes needed to reconstruct user interactions. This significantly reduces the amount of data stored. + +### Compliance with data privacy laws + +New Relic acts as a data processor under GDPR and a service provider under CCPA. This means we process data according to your instructions. Ultimately, compliance with these laws depends on how you implement session replay within your application. + +By default, all text and user inputs, including personal data, are masked within the recordings. You can selectively unmask specific elements if needed, but the default ensures that no personally identifiable information is readily visible. This approach provides a strong foundation for data privacy while offering flexibility for your specific needs. + +## Session replay and your app's performance [#app-performance] + +Session replay minimizes impact on your app's performance with: + +* **Minimal initial impact**: Session replay loads asynchronously after full page load, ensuring no interference with early page load performance metrics. +* **DOM mutation tracking**: Once loaded, session replay monitors DOM changes and reports them as compressed payloads. The size of these payloads correlates with the complexity of the DOM tree. +* **Performance optimization techniques**: Payload size can also increase if the DOM is large. However, session replay uses a number of techniques to reduce payload size, such as: + * GZIP compression + * Duplication reduction + * Strategic payload harvesting: It only sends a large (compressed) payload when the full DOM is captured, which typically only happens when the replay feature is first imported. After that, it will only send small payloads that relate to the user's actions. The browser agent will harvest on whatever happens first of the following: + * The payload reaches more than 64 KB compressed + * 60 seconds elapses + * The visibility of the page changes (tab change, focus, navigation, etc) + * The session ends diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx new file mode 100644 index 00000000000..55fbedbf577 --- /dev/null +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx @@ -0,0 +1,97 @@ +--- +title: "Manage session replay & modify capabilities" +metaDescription: "Manage session replay & modify capabilities depending on the role" +freshnessValidatedDate: 2024-12-19 +--- + +Manage session replay & modify capabilities provides instructions on utilizing the new user management access functionality, enabling Admins to control who can modify Session replay settings by customizing user roles and access. + +## Delete all product admin role [#modify-all-admin-role] + + + + + Navigate to **Administration > Access Management > Groups**. + + + + Click the ellipsis (...) icon and select **Manage Group Access**. + + + + Expand the **Members** section, select the required user(s). + + + + Click **Remove users from group**. + + + + Expand the **Account access** section, click the ellipsis (...) icon. + + + + Select **Delete role**. + + + + +## Create a custom role for session replay read access [#create-custom-role] + + + + + Navigate to **Administration > Access Management > Roles**. + + + + Click **Add New Custom Roles** and enter a custom role name. + + + + In the **Browser** role id, select the **View** checkbox for **Session replays**. Ensure the **Modify** checkbox is not selected. + + A screenshot of Browser Role ID + + + + Click **Save**. + + + + Select the **Groups** tab and click **Create new group**. + + + + Enter a **Group name** and click **Create group**. + + + + Expand the **Members** section, select the user(s) from the **Select a user** drop-down list, and click **Add user to group**. + + + + Expand the **Account acess** section and in the **Add account roles to this group** select the following: + + * **Select a role** + * **Select an account** + + + + Click **Add role**. + + + + +## Granting session replay modify capability [#grant-sr-modify-capability] +Navigate to Administration > Access Management > Roles. +Choose the custom role with SR read access. +Click on “Manage role” from the 3 dots and select ‘Edit’. +Go to the “Browser” section. +Select the checkbox for SR “Modify”. +Click Save. +Note: Upgraded settings may take 5-10 minutes to reflect in the UI for the accounts and users. \ No newline at end of file diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx new file mode 100644 index 00000000000..3229020032f --- /dev/null +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx @@ -0,0 +1,75 @@ +--- +title: "Troubleshooting session replay" +metaDescription: "Troubleshoot common issues with session replay in New Relic Browser." +freshnessValidatedDate: 2024-12-19 +--- + +Address common issues that may occur during the setup and operation of session replay. From missing replays to display problems, we offer solutions and best practices to ensure your session replay functionality operates smoothly and efficiently. + +## Not seeing replays in the UI [#not-seeing-replay] + +### Problem + + Session replay feature is enabled, but you're not seeing any replays. + +### Solution + + Here are some possible fixes: + + * Check your sampling rates. There is sampling for both replays and errors. + * Ensure you have permission to view replays. + * Make sure you're using the Pro or Pro+SPA version of the browser agent. Session replay does not work with the Lite browser agent. + * Make sure your browser agent meets these requirements: + * Agent version v1.260.0 or greater. We recommend [upgrading to the latest agent version](/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes) as we continue making improvements. + * Agent type: Pro or Pro+SPA. Session replay does not work with the Lite browser agent. + * [Session tracing](/docs/browser/browser-monitoring/browser-pro-features/session-traces-explore-webpages-life-cycle/#requirements) is enabled. + * Your end-user's browser supports the browser-level APIs needed to record a session replay (verify compatibility at [MutationObserver](https://caniuse.com/mutationobserver)). + * In [Errors inbox](/docs/errors-inbox/errors-inbox/), filter your views so that you always see a replay. By default, browser event data is stored 8 days, but actual data retention depends on your account. + * If you're using the copy/paste deployment method, make sure you [updated your agent code](#update-snippet). + * If you’re using the APM deployment method, you may need to wait a while for session replay to be automatically enabled. If you’re still not seeing data, try restarting the agent. + * If you're [dropping](https://docs.newrelic.com/docs/data-apis/manage-data/drop-data-using-nerdgraph/) PageView event data, Session Replays may not display in the UI. + +## Replays not displaying correctly [#replays-not-displaying] + +### Problem + + You're seeing replays, but they're not displaying correctly. + + This may be because your CSS files are hosted on a separate domain and Cross-Origin Resource Sharing (CORS) security measures are preventing our agent from accessing the CSS files. This can result in incomplete or inaccurate replays, as essential styling information may be missing. + + Here's what's happening behind the scenes: + + * Session replay works by rebuilding the user's DOM, which includes your website's structure and visual elements. To achieve this, our agent needs to access your CSS files to accurately capture styling information. We then inline these styles directly into the replay recording, eliminating the need to reference the original CSS files during playback. + + * If your CSS files are hosted on a separate domain, CORS may prevent our agent from accessing them. + +### Solution + + To ensure your CSS files are accessible, add the `crossorigin="anonymous"` attribute to your `` elements within your HTML code. This attribute instructs the browser to allow cross-origin access for those specific CSS files, allowing our browser agent to record and integrate the styling information. + + Here's an example of adding the `crossorigin="anonymous"` attribute: + +```HTML + +``` + +## Not seeing replays in your iframes [#no-replays-in-iframes] + +### Problem + + Session replay feature is enabled, but you're not seeing replay data for iframe content. + +### Solution + + The behavior of session replay in iframe scenarios depends on the origin of the iframe and the placement of the browser agent. + + Assuming a web page consists of a top-level window with a child iframe, here are some possible fixes: + * **Same-origin iframes**: + * If you place the browser agent in the top-level window, session replay captures both the window and the iframe. + * If you place the browser agent in the iframe, session replay only captures what's in the iframe. + * If you place the browser agent in both the top-level window and iframe, session replay captures what's happening independently in both the window and iframe, resulting in two separate sessions. + * **Cross-origin iframes**: + * If you place the browser agent in the top-level window, session replay only captures what's in the window. The iframe will appear blank in session replay. + * If you place the browser agent in the top-level iframe, session replay only captures what's in the iframe. + + Session replay is **not** compatible with `` elements. \ No newline at end of file diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/view-session-replays.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/view-session-replays.mdx new file mode 100644 index 00000000000..8ad7e011ee5 --- /dev/null +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/view-session-replays.mdx @@ -0,0 +1,59 @@ +--- +title: "View Session Replays in New Relic" +metaDescription: "Updating JavaScript for session replay to play back user interactions and improve page performance." +freshnessValidatedDate: 2024-12-19 +--- + +Start analyzing the captured data in New Relic. This section provides instructions on accessing and navigating session replays, helping you explore user interactions and identify areas for improvement. Learn how to leverage session replay data to enhance user experience and troubleshoot issues effectively. + +## View session replays in New Relic [#view-data] + + You can find session replays in two places: + + * On the **Session replay** page: + + + + + Go to **[one.newrelic.com > All Capabilities](https://one.newrelic.com/all-capabilities) > Browser**. + + + + Select your browser app. + + + + In the left-hand menu, scroll down and click **Session replay**. + + + + Click into each replay to view session details. + + screenshot of the session replay page in browser + + + + + * On the **Errors inbox** page: + + + + + In the left-hand browser menu, click **Errors**. + + + + Click on the **Triage** and **Group errors** pages to see replays attached to errors. + + Screenshot of replays in errors inbox + + + \ No newline at end of file diff --git a/src/content/docs/browser/new-relic-browser/browser-pro-features/browser-features.mdx b/src/content/docs/browser/new-relic-browser/browser-pro-features/browser-features.mdx index 39b6531d0c7..a2e7802be76 100644 --- a/src/content/docs/browser/new-relic-browser/browser-pro-features/browser-features.mdx +++ b/src/content/docs/browser/new-relic-browser/browser-pro-features/browser-features.mdx @@ -11,7 +11,7 @@ Check out our key features: * [Summary](/docs/browser/browser-monitoring/getting-started/browser-summary-page/): View a summary of your browser's performance * [Web vitals](/docs/journey-performance/guide-to-monitoring-core-web-vitals): Learn what contributes to core web vitals -* [Session replay](/docs/browser/browser-monitoring/browser-pro-features/session-replay): View a live playback of a user session to troubleshoot JavaScript errors and improve your UI design +* [Session replay](/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started): View a live playback of a user session to troubleshoot JavaScript errors and improve your UI design * [Page views](/docs/browser/new-relic-browser/browser-pro-features/page-views-examine-page-performance/): Examine page performance * [AJAX](/docs/browser/browser-monitoring/browser-pro-features/ajax-page-identify-time-consuming-calls/): Identify time-consuming calls * [JavaScript errors](/docs/browser/new-relic-browser/browser-pro-features/javascript-errors-page-detect-analyze-errors/): Detect and analyze errors diff --git a/src/nav/browser.yml b/src/nav/browser.yml index 3e2aa8b932b..6eb4865eb9b 100644 --- a/src/nav/browser.yml +++ b/src/nav/browser.yml @@ -60,6 +60,24 @@ pages: path: /docs/browser/browser-monitoring/getting-started/browser-summary-page - title: Session replay path: /docs/browser/browser-monitoring/browser-pro-features/session-replay + pages: + - title: Get started with session replay + path: /docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started + - title: Configuration + path: /docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration + pages: + - title: Setup session replay + path: /docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay + - title: Configure privacy settings + path: /docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/customize-privacy-settings + - title: Update JavaScript for session replay + path: /docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/update-javascript-for-session-replay + - title: View session replays in New Relic + path: /docs/browser/browser-monitoring/browser-pro-features/session-replay/view-session-replays + - title: Manage session replay & modify capabilities + path: /docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities + - title: Troubleshooting session replay + path: /docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay - title: Core web vitals path: /docs/browser/new-relic-browser/guides/guide-to-monitoring-core-web-vitals - title: Page views page diff --git a/static/images/browser-role-id.webp b/static/images/browser-role-id.webp new file mode 100644 index 0000000000000000000000000000000000000000..45ac62e726f10db22e35e3bf0df251c9bdace44c GIT binary patch literal 75506 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

G(Uo5e=UC&#==)%z!U|3BWg=K*u;GaKSTQ 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 Ud&V(u1v&Vwb#`;Q#EmH+?% literal 0 HcmV?d00001 From 4dba0d001ffc18aad6e09602ae09960cce6f0dc6 Mon Sep 17 00:00:00 2001 From: adutta-newrelic Date: Sat, 21 Dec 2024 00:45:16 +0530 Subject: [PATCH 02/67] updates --- .../session-replay/additional-information.mdx | 44 +++++ .../session-replay/advanced-features.mdx | 123 +++++++++++++ .../session-replay/get-started.mdx | 165 +----------------- ...age-session-replay-modify-capabilities.mdx | 47 +++-- .../troubleshooting-session-replay.mdx | 4 +- src/nav/browser.yml | 4 + 6 files changed, 211 insertions(+), 176 deletions(-) create mode 100644 src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx create mode 100644 src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/advanced-features.mdx diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx new file mode 100644 index 00000000000..595c25371c1 --- /dev/null +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx @@ -0,0 +1,44 @@ +--- +title: "Additional information" +metaDescription: "Data consumption, User privacy and security concerns." +freshnessValidatedDate: 2024-12-19 +--- + +## Data consumption [#data-consumption] + +Session replay follows the same consumption pricing as your other browser bytes. The amount of bytes produced depends on the count, length, and user-activity levels of sessions, as well as the complexity of your site's DOM. + +The most accurate way to project your cost per replay is to enable the feature for a short test period and measure your actual consumption. Alternatively, you can use an average of 5.3 MB per replay as a rough approximation, though keep in mind that your actual cost may vary significantly. A simple formula to project your approximate costs is: `sessions` x `sampling_rate` x `gb_per_replay` x `cost_per_gb`. Here's an example: + +``` +1 million (sessions) x 5% (sampling_rate) x 0.0053 (gb_per_replay) x $0.35 (cost_per_gb) = $92.75 for 50,000 replays +``` + +To control your consumption, [adjust your sampling rates](/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay/#configure-sampling-rates). + +## User privacy and security concerns [#data-security] + +We prioritize data privacy and built session replay with strong default settings to minimize the potential exposure of sensitive customer information. You can further [customize privacy settings](/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/customize-privacy-settings) to meet your specific needs. + +Session replay does not capture screenshots or videos. Instead, it records only the essential DOM state changes needed to reconstruct user interactions. This significantly reduces the amount of data stored. + +### Compliance with data privacy laws + +New Relic acts as a data processor under GDPR and a service provider under CCPA. This means we process data according to your instructions. Ultimately, compliance with these laws depends on how you implement session replay within your application. + +By default, all text and user inputs, including personal data, are masked within the recordings. You can selectively unmask specific elements if needed, but the default ensures that no personally identifiable information is readily visible. This approach provides a strong foundation for data privacy while offering flexibility for your specific needs. + +## Session replay and your app's performance [#app-performance] + +Session replay minimizes impact on your app's performance with: + +* **Minimal initial impact**: Session replay loads asynchronously after full page load, ensuring no interference with early page load performance metrics. +* **DOM mutation tracking**: Once loaded, session replay monitors DOM changes and reports them as compressed payloads. The size of these payloads correlates with the complexity of the DOM tree. +* **Performance optimization techniques**: Payload size can also increase if the DOM is large. However, session replay uses a number of techniques to reduce payload size, such as: + * GZIP compression + * Duplication reduction + * Strategic payload harvesting: It only sends a large (compressed) payload when the full DOM is captured, which typically only happens when the replay feature is first imported. After that, it will only send small payloads that relate to the user's actions. The browser agent will harvest on whatever happens first of the following: + * The payload reaches more than 64 KB compressed + * 60 seconds elapses + * The visibility of the page changes (tab change, focus, navigation, etc) + * The session ends diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/advanced-features.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/advanced-features.mdx new file mode 100644 index 00000000000..da31f8b6fe2 --- /dev/null +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/advanced-features.mdx @@ -0,0 +1,123 @@ +--- +title: "Advanced features" +metaDescription: "Manually record session replays, disable automatic session replay tracking and use nerd graph to configure replay settings." +freshnessValidatedDate: 2024-12-19 +--- + +## Manually record session replays [#manual-replays] + +If needed, you can programmatically `force` a session replay to start or stop recording using API methods. Here are some use cases: + +* Allow users to opt in for interaction recording. For example, if you have a pop-up asking "Allow this session to be recorded for performance analysis?" and a user consents: + 1. Call `newrelic.recordReplay()` to initiate recording. + 2. Once the session is complete or consent is withdrawn, use `newrelic.pauseReplay()` to stop capturing data. +* Record sessions based on specific criteria, such as: + * Start recording only for sessions on specific URLs such as a product checkout flow. + * Stop recording for sensitive pages such as `/billing` or `/health-records`. + +See the API documentation for instructions: + +* [`newrelic.recordReplay`](/docs/browser/new-relic-browser/browser-apis/recordReplay/) +* [`newrelic.pauseReplay`](/docs/browser/new-relic-browser/browser-apis/pauseReplay/) + +## Disable automatic session replay tracking [#auto-replays] + +You can prevent session replays from automatically starting, even when sampled, by setting the API configuration option `autoStart` to `false`. This is useful in scenarios where you need to prioritize specific actions over automatic sampling. For example, you might not want session replays to automatically run on sensitive pages, like HIPAA-compliant ones. In such cases, you can use the `.start()` API to manually trigger the replay feature after user consent is obtained (and your app calls `.start()`) + +Setting `autoStart: false` instructs the agent to defer its initialization until explicitly called using `.start()`. This ensures that session replays will not be created at all, even if the backend samples your application for recording. + + + Calling `.start()` does not guarantee that a session replay will be recorded. It simply delays the module import and evaluation of sampling results until this point. If you need to force a recording, see [Manually record session replays](#manual-replays). + + +To start using this API, see [`newrelic.start`](/docs/browser/new-relic-browser/browser-apis/start/). + +## Use Nerdgraph to configure replay settings [#nerdgraph-mutation] + +You can configure session replay settings using our [NerdGraph API](/docs/apis/nerdgraph/get-started/introduction-new-relic-nerdgraph/) instead of using the UI. This method is helpful if you need to make bulk changes, such as applying sampling rates to multiple browser entities. + +Here's an example mutation and variables to create a new browser application with default settings: + + + + + + + + + + + + + + + + + +
+ Mutation + + Variables +
+ ```graphql + mutation SessionReplayConfigUpdate($guid: EntityGuid!, $settings: AgentApplicationSettingsUpdateInput!) { + agentApplicationSettingsUpdate(guid: $guid, settings: $settings) { + browserSettings { + sessionReplay { + blockSelector + errorSamplingRate + maskTextSelector + enabled + collectFonts + inlineImages + inlineStylesheet + samplingRate + maskAllInputs + maskInputOptions { + color + date + datetimeLocal + email + month + number + range + search + select + tel + text + textArea + time + url + week + } + } + } + errors { + field + errorClass + description + } + } + } + ``` + + ```json + { + "sessionReplay": { + "enabled": true, + "collectFonts": true, + "blockSelector": ".private-fields", + "maskTextSelector": "*", + "inlineStylesheet": false, + "maskAllInputs": true, + "maskInputOptions": { + "color": true, + "date": true, + "textArea": true + }, + "samplingRate": 9.99, + "errorSamplingRate": 1.11 + } + } + ``` +
\ No newline at end of file diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx index 20d00168329..d52ceead407 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx @@ -31,165 +31,6 @@ By default, browser event data is stored 8 days, but actual data retention depen For more details on session replay, see the following sections: -* [Data consumption](#data-consumption): View or project data consumption. -* [User privacy and security concerns](#data-security): Learn how we protect your user data and meet privacy requirements. -* [Session replay and your app's performance](#app-performance): Learn how session replay minimizes impact on your app's performance. - - - -## Manually record session replays [#manual-replays] - -If needed, you can programmatically `force` a session replay to start or stop recording using API methods. Here are some use cases: - -* Allow users to opt in for interaction recording. For example, if you have a pop-up asking "Allow this session to be recorded for performance analysis?" and a user consents: - 1. Call `newrelic.recordReplay()` to initiate recording. - 2. Once the session is complete or consent is withdrawn, use `newrelic.pauseReplay()` to stop capturing data. -* Record sessions based on specific criteria, such as: - * Start recording only for sessions on specific URLs such as a product checkout flow. - * Stop recording for sensitive pages such as `/billing` or `/health-records`. - -See the API documentation for instructions: - -* [`newrelic.recordReplay`](/docs/browser/new-relic-browser/browser-apis/recordReplay/) -* [`newrelic.pauseReplay`](/docs/browser/new-relic-browser/browser-apis/pauseReplay/) - -## Disable automatic session replay tracking [#auto-replays] - -You can prevent session replays from automatically starting, even when sampled, by setting the API configuration option `autoStart` to `false`. This is useful in scenarios where you need to prioritize specific actions over automatic sampling. For example, you might not want session replays to automatically run on sensitive pages, like HIPAA-compliant ones. In such cases, you can use the `.start()` API to manually trigger the replay feature after user consent is obtained (and your app calls `.start()`) - -Setting `autoStart: false` instructs the agent to defer its initialization until explicitly called using `.start()`. This ensures that session replays will not be created at all, even if the backend samples your application for recording. - - - Calling `.start()` does not guarantee that a session replay will be recorded. It simply delays the module import and evaluation of sampling results until this point. If you need to force a recording, see [Manually record session replays](#manual-replays). - - -To start using this API, see [`newrelic.start`](/docs/browser/new-relic-browser/browser-apis/start/). - -## Use Nerdgraph to configure replay settings [#nerdgraph-mutation] - -You can configure session replay settings using our [NerdGraph API](/docs/apis/nerdgraph/get-started/introduction-new-relic-nerdgraph/) instead of using the UI. This method is helpful if you need to make bulk changes, such as applying sampling rates to multiple browser entities. - -Here's an example mutation and variables to create a new browser application with default settings: - - - - - - - - - - - - - - - - - -
- Mutation - - Variables -
- ```graphql - mutation SessionReplayConfigUpdate($guid: EntityGuid!, $settings: AgentApplicationSettingsUpdateInput!) { - agentApplicationSettingsUpdate(guid: $guid, settings: $settings) { - browserSettings { - sessionReplay { - blockSelector - errorSamplingRate - maskTextSelector - enabled - collectFonts - inlineImages - inlineStylesheet - samplingRate - maskAllInputs - maskInputOptions { - color - date - datetimeLocal - email - month - number - range - search - select - tel - text - textArea - time - url - week - } - } - } - errors { - field - errorClass - description - } - } - } - ``` - - ```json - { - "sessionReplay": { - "enabled": true, - "collectFonts": true, - "blockSelector": ".private-fields", - "maskTextSelector": "*", - "inlineStylesheet": false, - "maskAllInputs": true, - "maskInputOptions": { - "color": true, - "date": true, - "textArea": true - }, - "samplingRate": 9.99, - "errorSamplingRate": 1.11 - } - } - ``` -
- -## Data consumption [#data-consumption] - -Session replay follows the same consumption pricing as your other browser bytes. The amount of bytes produced depends on the count, length, and user-activity levels of sessions, as well as the complexity of your site's DOM. - -The most accurate way to project your cost per replay is to enable the feature for a short test period and measure your actual consumption. Alternatively, you can use an average of 5.3 MB per replay as a rough approximation, though keep in mind that your actual cost may vary significantly. A simple formula to project your approximate costs is: `sessions` x `sampling_rate` x `gb_per_replay` x `cost_per_gb`. Here's an example: - -``` -1 million (sessions) x 5% (sampling_rate) x 0.0053 (gb_per_replay) x $0.35 (cost_per_gb) = $92.75 for 50,000 replays -``` - -To control your consumption, [adjust your sampling rates](#configure-sampling-rates). - -## User privacy and security concerns [#data-security] - -We prioritize data privacy and built session replay with strong default settings to minimize the potential exposure of sensitive customer information. You can further [customize privacy settings](#configure-privacy-settings) to meet your specific needs. - -Session replay does not capture screenshots or videos. Instead, it records only the essential DOM state changes needed to reconstruct user interactions. This significantly reduces the amount of data stored. - -### Compliance with data privacy laws - -New Relic acts as a data processor under GDPR and a service provider under CCPA. This means we process data according to your instructions. Ultimately, compliance with these laws depends on how you implement session replay within your application. - -By default, all text and user inputs, including personal data, are masked within the recordings. You can selectively unmask specific elements if needed, but the default ensures that no personally identifiable information is readily visible. This approach provides a strong foundation for data privacy while offering flexibility for your specific needs. - -## Session replay and your app's performance [#app-performance] - -Session replay minimizes impact on your app's performance with: - -* **Minimal initial impact**: Session replay loads asynchronously after full page load, ensuring no interference with early page load performance metrics. -* **DOM mutation tracking**: Once loaded, session replay monitors DOM changes and reports them as compressed payloads. The size of these payloads correlates with the complexity of the DOM tree. -* **Performance optimization techniques**: Payload size can also increase if the DOM is large. However, session replay uses a number of techniques to reduce payload size, such as: - * GZIP compression - * Duplication reduction - * Strategic payload harvesting: It only sends a large (compressed) payload when the full DOM is captured, which typically only happens when the replay feature is first imported. After that, it will only send small payloads that relate to the user's actions. The browser agent will harvest on whatever happens first of the following: - * The payload reaches more than 64 KB compressed - * 60 seconds elapses - * The visibility of the page changes (tab change, focus, navigation, etc) - * The session ends +* [Data consumption](/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information/#data-consumption): View or project data consumption. +* [User privacy and security concerns](/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information/#data-security): Learn how we protect your user data and meet privacy requirements. +* [Session replay and your app's performance](/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information/#app-performance): Learn how session replay minimizes impact on your app's performance. \ No newline at end of file diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx index 55fbedbf577..758f9438c2b 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx @@ -11,11 +11,11 @@ Manage session replay & modify capabilities provides instructions on utilizing t - Navigate to **Administration > Access Management > Groups**. + Go to **Administration > Access Management > Groups**. - Click the ellipsis (...) icon and select **Manage Group Access**. + Click the ellipsis **(...)** icon and select **Manage Group Access**. @@ -27,7 +27,7 @@ Manage session replay & modify capabilities provides instructions on utilizing t - Expand the **Account access** section, click the ellipsis (...) icon. + Expand the **Account access** section, click the ellipsis **(...)** icon. @@ -41,7 +41,7 @@ Manage session replay & modify capabilities provides instructions on utilizing t - Navigate to **Administration > Access Management > Roles**. + Go to **Administration > Access Management > Roles**. @@ -49,7 +49,7 @@ Manage session replay & modify capabilities provides instructions on utilizing t - In the **Browser** role id, select the **View** checkbox for **Session replays**. Ensure the **Modify** checkbox is not selected. + In the **Browser** section, select the **View** checkbox for **Session replays**. Ensure the **Modify** checkbox is not selected. -## Granting session replay modify capability [#grant-sr-modify-capability] -Navigate to Administration > Access Management > Roles. -Choose the custom role with SR read access. -Click on “Manage role” from the 3 dots and select ‘Edit’. -Go to the “Browser” section. -Select the checkbox for SR “Modify”. -Click Save. -Note: Upgraded settings may take 5-10 minutes to reflect in the UI for the accounts and users. \ No newline at end of file +## Grant session replay modify capability [#grant-sr-modify-capability] + + + + + Go to **Administration > Access Management > Roles**. + + + + In the **Custom role** section, click the ellipsis **(...)** icon and select **Manage role**. + + + + Click the **Edit** icon and go to the **Browser** section . + + + + Select the **Modify** checkbox for **Session replays**. + + + + Click **Save**. + + + + + + It may take 5-10 minutes for the upgraded settings to appear in the UI for the accounts and users. + \ No newline at end of file diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx index 3229020032f..db7cbbb5f25 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx @@ -4,7 +4,9 @@ metaDescription: "Troubleshoot common issues with session replay in New Relic Br freshnessValidatedDate: 2024-12-19 --- -Address common issues that may occur during the setup and operation of session replay. From missing replays to display problems, we offer solutions and best practices to ensure your session replay functionality operates smoothly and efficiently. +This is the first step in diagnosing your New Relic Session replays problem yourself, use this guide to resolve issues quickly. + +If you don't find your problem listed here, you can always reach out to [New Relic Support](https://support.newrelic.com). ## Not seeing replays in the UI [#not-seeing-replay] diff --git a/src/nav/browser.yml b/src/nav/browser.yml index 6eb4865eb9b..1436bd31a21 100644 --- a/src/nav/browser.yml +++ b/src/nav/browser.yml @@ -78,6 +78,10 @@ pages: path: /docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities - title: Troubleshooting session replay path: /docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay + - title: Advanced features + path: /docs/browser/browser-monitoring/browser-pro-features/session-replay/advanced-features + - title: Additional information + path: /docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information - title: Core web vitals path: /docs/browser/new-relic-browser/guides/guide-to-monitoring-core-web-vitals - title: Page views page From 74509b702505520640dc4eec8f2e6eeb9d9411b1 Mon Sep 17 00:00:00 2001 From: adutta-newrelic Date: Mon, 23 Dec 2024 19:42:49 +0530 Subject: [PATCH 03/67] Updated the changes by Vinay --- .../session-replay/additional-information.mdx | 22 ++++++++++------- .../session-replay/advanced-features.mdx | 10 ++++---- .../customize-privacy-settings.mdx | 8 +++---- .../configuration/setup-session-replay.mdx | 6 ++--- .../session-replay/get-started.mdx | 6 ++--- ...age-session-replay-modify-capabilities.mdx | 6 ++--- .../troubleshooting-session-replay.mdx | 24 +++++++++---------- .../session-replay/view-session-replays.mdx | 2 +- 8 files changed, 44 insertions(+), 40 deletions(-) diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx index 595c25371c1..f41eeb40f86 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx @@ -8,11 +8,11 @@ freshnessValidatedDate: 2024-12-19 Session replay follows the same consumption pricing as your other browser bytes. The amount of bytes produced depends on the count, length, and user-activity levels of sessions, as well as the complexity of your site's DOM. -The most accurate way to project your cost per replay is to enable the feature for a short test period and measure your actual consumption. Alternatively, you can use an average of 5.3 MB per replay as a rough approximation, though keep in mind that your actual cost may vary significantly. A simple formula to project your approximate costs is: `sessions` x `sampling_rate` x `gb_per_replay` x `cost_per_gb`. Here's an example: +The most accurate way to project your cost per replay is to enable the feature for a short test period and measure your actual consumption. Alternatively, you can use an average of 5.3 MB per replay as a rough approximation, though keep in mind that your actual cost may vary significantly. A simple formula to project your approximate costs is: `sessions` x `sampling_rate` x `gb_per_replay` x `cost_per_gb`. + +Here's an example: -``` 1 million (sessions) x 5% (sampling_rate) x 0.0053 (gb_per_replay) x $0.35 (cost_per_gb) = $92.75 for 50,000 replays -``` To control your consumption, [adjust your sampling rates](/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay/#configure-sampling-rates). @@ -37,8 +37,14 @@ Session replay minimizes impact on your app's performance with: * **Performance optimization techniques**: Payload size can also increase if the DOM is large. However, session replay uses a number of techniques to reduce payload size, such as: * GZIP compression * Duplication reduction - * Strategic payload harvesting: It only sends a large (compressed) payload when the full DOM is captured, which typically only happens when the replay feature is first imported. After that, it will only send small payloads that relate to the user's actions. The browser agent will harvest on whatever happens first of the following: - * The payload reaches more than 64 KB compressed - * 60 seconds elapses - * The visibility of the page changes (tab change, focus, navigation, etc) - * The session ends + * Strategic payload harvesting: A large (compressed) payload is sent only when the full DOM is captured, which typically occurs when the replay feature is first imported. Subsequently, only small payloads related to the user's actions are sent. The browser agent will harvest data based on the first occurrence of the following conditions: + * The payload reaches more than 64 KB compressed. + * 60 seconds elapses. + * The visibility of the page changes (e.g., tab change, focus, navigation). + * The session ends. + +### Key Changes: + +- **Clarity:** Improved sentence structure for better readability. +- **Conciseness:** Removed redundant words and phrases. +- **Consistency:** Used parallel structure in the list for uniformity. \ No newline at end of file diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/advanced-features.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/advanced-features.mdx index da31f8b6fe2..6884cbd6869 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/advanced-features.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/advanced-features.mdx @@ -9,13 +9,13 @@ freshnessValidatedDate: 2024-12-19 If needed, you can programmatically `force` a session replay to start or stop recording using API methods. Here are some use cases: * Allow users to opt in for interaction recording. For example, if you have a pop-up asking "Allow this session to be recorded for performance analysis?" and a user consents: - 1. Call `newrelic.recordReplay()` to initiate recording. - 2. Once the session is complete or consent is withdrawn, use `newrelic.pauseReplay()` to stop capturing data. + 1. Call `newrelic.recordReplay()`, to initiate recording. + 2. After the session is complete or consent is withdrawn, use `newrelic.pauseReplay()` to stop capturing data. * Record sessions based on specific criteria, such as: * Start recording only for sessions on specific URLs such as a product checkout flow. * Stop recording for sensitive pages such as `/billing` or `/health-records`. -See the API documentation for instructions: +Refer the API documentation for instructions: * [`newrelic.recordReplay`](/docs/browser/new-relic-browser/browser-apis/recordReplay/) * [`newrelic.pauseReplay`](/docs/browser/new-relic-browser/browser-apis/pauseReplay/) @@ -27,10 +27,10 @@ You can prevent session replays from automatically starting, even when sampled, Setting `autoStart: false` instructs the agent to defer its initialization until explicitly called using `.start()`. This ensures that session replays will not be created at all, even if the backend samples your application for recording. - Calling `.start()` does not guarantee that a session replay will be recorded. It simply delays the module import and evaluation of sampling results until this point. If you need to force a recording, see [Manually record session replays](#manual-replays). + Calling `.start()` does not guarantee that a session replay will be recorded. It simply delays the module import and evaluation of sampling results until this point. If you need to force a recording, refer [Manually record session replays](#manual-replays). -To start using this API, see [`newrelic.start`](/docs/browser/new-relic-browser/browser-apis/start/). +To start using this API, refer [`newrelic.start`](/docs/browser/new-relic-browser/browser-apis/start/). ## Use Nerdgraph to configure replay settings [#nerdgraph-mutation] diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/customize-privacy-settings.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/customize-privacy-settings.mdx index 09e645eb7a4..c1a2a0f691f 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/customize-privacy-settings.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/customize-privacy-settings.mdx @@ -14,7 +14,7 @@ By default, all text and inputs are replaced with asterisks. Here's an example o src="/images/browser_screenshot-full_text-masking-example.webp" /> - If this setting is appropriate, move onto the next step. + If this setting is appropriate, move on to the next step. If you need to customize what content or user input is captured, you have options to mask, block, or ignore specific classes and attributes of content or user input. Make sure to check with your privacy team before changing the privacy settings. @@ -32,12 +32,10 @@ By default, all text and inputs are replaced with asterisks. Here's an example o src="/images/browser_screenshot-full_mask-settings.webp" /> * Add our CSS class `nr-mask` or attribute `data-nr-mask` to your webpage HTML. + For example, to mask an account ID from showing in the URL, add `nr-mask` to the `

` containing the account ID: - ````html -
Account ID: 99881123
- ``` - ```` + `
Account ID: 99881123
` These options use an asterisk (\*) to mask all text in that element, hiding the actual text but revealing the number of characters entered. However, asterisks are not valid numbers, so masking number type-specific fields such as telephone or credit card numbers will result in a blank field in a replay. diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx index 9931aea38c5..c58f09cc3be 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx @@ -4,7 +4,7 @@ metaDescription: "Enable session replay to play back user interactions and impro freshnessValidatedDate: 2024-12-19 --- -Fully utilize session replay in New Relic, start by enabling this feature in your browser application settings. This step is essential for capturing user interactions on your web app, providing insights into user journeys, and troubleshooting issues effectively. Follow the steps below to enable session replay and ensure your browser agent is configured correctly. +Utilize session replay in New Relic, start by enabling this feature in your browser application settings. This step is essential for capturing user interactions on your web app, providing insights into user journeys, and troubleshooting issues effectively. Follow the steps below to enable session replay and ensure your browser agent is configured correctly. ## Enable session replay [#enable-session-replay] @@ -16,9 +16,9 @@ Fully utilize session replay in New Relic, start by enabling this feature in you 4. On the **Application settings** page, make sure **Pro** or **Pro + SPA** browser agent is selected. Session replay is not available for the Lite browser agent. - 5. Toggle ON **Session tracking** and **Session replay** settings. + 5. Toggle **Session tracking** ON and **Session replay** settings. -## Configure sampling rates [#configure-sampling-rates] +## Setting sampling rates [#configure-sampling-rates] Set a sampling rate (0%-100%) for the following samples: diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx index d52ceead407..dd8a9b7e993 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx @@ -8,8 +8,8 @@ freshnessValidatedDate: 2024-12-19 Session replay captures interactions on your web app and maps other telemetry data to help you understand your user's journeys. Session replay can be used for troubleshooting and improving the end-user experience, such as: -* **Troubleshooting JavaScript errors**: Troubleshoot the cause of an error by seeing what the user was doing when the error occurred. For example, if an end user receives an error while trying to complete an ecommerce transaction, you can use session replay to see which steps they took and what data they entered before the error occurred. This can help you quickly identify and fix the root cause of the problem. -* **Improving the user experience**: Discover areas of your web app that are causing users frustration. For example, you might see that users are getting lost in your navigation or clicking on buttons that don't do anything. +* **Troubleshooting JavaScript errors**: Troubleshoot the cause of an error by viewing what the user was doing when the error occurred. For example, if an end user receives an error while trying to complete an ecommerce transaction, you can use session replay to view which steps they took and what data they entered before the error occurred. This can help you quickly identify and fix the root cause of the problem. +* **Improving the user experience**: Discover areas of your web app that are causing users frustration. For example, users might get lost in your navigation or click on buttons that don't function. * **Identifying issues in key user journeys**: Identify areas of your web app that are causing performance problems. For example, if session replay reveals the `/cart/checkout` page is experiencing excessive page load time, you'd prioritize fixing this critical user journey. - Expand the **Account acess** section and in the **Add account roles to this group** select the following: + Expand the **Account acess** section, and in the **Add account roles to this group** field, select the following: * **Select a role** * **Select an account** @@ -104,7 +104,7 @@ Manage session replay & modify capabilities provides instructions on utilizing t - Select the **Modify** checkbox for **Session replays**. + In the **Session replays** section select the **Modify** checkbox. diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx index db7cbbb5f25..c72e5576272 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx @@ -4,15 +4,15 @@ metaDescription: "Troubleshoot common issues with session replay in New Relic Br freshnessValidatedDate: 2024-12-19 --- -This is the first step in diagnosing your New Relic Session replays problem yourself, use this guide to resolve issues quickly. +This is the first step in diagnosing your New Relic Session replays problem yourself. If you don't find your problem listed here, you can always reach out to [New Relic Support](https://support.newrelic.com). -## Not seeing replays in the UI [#not-seeing-replay] +## Replays not visible in the UI [#not-seeing-replay] ### Problem - Session replay feature is enabled, but you're not seeing any replays. + Session replay feature is enabled, but you're not able to view any replays. ### Solution @@ -22,26 +22,26 @@ If you don't find your problem listed here, you can always reach out to [New Rel * Ensure you have permission to view replays. * Make sure you're using the Pro or Pro+SPA version of the browser agent. Session replay does not work with the Lite browser agent. * Make sure your browser agent meets these requirements: - * Agent version v1.260.0 or greater. We recommend [upgrading to the latest agent version](/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes) as we continue making improvements. + * Agent version v1.260.0 or later. We recommend [upgrading to the latest agent version](/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes) as we continue making improvements. * Agent type: Pro or Pro+SPA. Session replay does not work with the Lite browser agent. * [Session tracing](/docs/browser/browser-monitoring/browser-pro-features/session-traces-explore-webpages-life-cycle/#requirements) is enabled. * Your end-user's browser supports the browser-level APIs needed to record a session replay (verify compatibility at [MutationObserver](https://caniuse.com/mutationobserver)). - * In [Errors inbox](/docs/errors-inbox/errors-inbox/), filter your views so that you always see a replay. By default, browser event data is stored 8 days, but actual data retention depends on your account. + * In [Errors inbox](/docs/errors-inbox/errors-inbox/), filter your views so that you always a replay. By default, browser event data is stored 8 days, but actual data retention depends on your account. * If you're using the copy/paste deployment method, make sure you [updated your agent code](#update-snippet). - * If you’re using the APM deployment method, you may need to wait a while for session replay to be automatically enabled. If you’re still not seeing data, try restarting the agent. - * If you're [dropping](https://docs.newrelic.com/docs/data-apis/manage-data/drop-data-using-nerdgraph/) PageView event data, Session Replays may not display in the UI. + * If you use the APM deployment method, you may need to wait for session replay to enable automatically. If data is still not visible, try restarting the agent. + * If you're [dropping](https://docs.newrelic.com/docs/data-apis/manage-data/drop-data-using-nerdgraph/) PageView event data, Session Replays may not appear in the UI. -## Replays not displaying correctly [#replays-not-displaying] +## Replays not appearing correctly [#replays-not-appearing] ### Problem - You're seeing replays, but they're not displaying correctly. + You can view replays, but they are not appearing correctly. This may be because your CSS files are hosted on a separate domain and Cross-Origin Resource Sharing (CORS) security measures are preventing our agent from accessing the CSS files. This can result in incomplete or inaccurate replays, as essential styling information may be missing. Here's what's happening behind the scenes: - * Session replay works by rebuilding the user's DOM, which includes your website's structure and visual elements. To achieve this, our agent needs to access your CSS files to accurately capture styling information. We then inline these styles directly into the replay recording, eliminating the need to reference the original CSS files during playback. + * Session replay rebuilds the user's DOM, capturing your website's structure and visual elements. To achieve this, our agent accesses your CSS files to accurately capture styling information. These styles are then embedded directly into the replay recording, removing the need to reference the original CSS files during playback. * If your CSS files are hosted on a separate domain, CORS may prevent our agent from accessing them. @@ -55,11 +55,11 @@ If you don't find your problem listed here, you can always reach out to [New Rel ``` -## Not seeing replays in your iframes [#no-replays-in-iframes] +## Replays not visible in your iframes [#no-replays-in-iframes] ### Problem - Session replay feature is enabled, but you're not seeing replay data for iframe content. + Session replay feature is enabled, but you're not able to view replay data for iframe content. ### Solution diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/view-session-replays.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/view-session-replays.mdx index 8ad7e011ee5..dbfcd2f84c0 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/view-session-replays.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/view-session-replays.mdx @@ -47,7 +47,7 @@ Start analyzing the captured data in New Relic. This section provides instructio - Click on the **Triage** and **Group errors** pages to see replays attached to errors. + Click **Triage** and **Group errors** pages to see replays attached to errors. Date: Mon, 23 Dec 2024 20:11:45 +0530 Subject: [PATCH 04/67] Updates --- ...age-session-replay-modify-capabilities.mdx | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx index ee9c5b961bd..572d92dcdbc 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx @@ -6,7 +6,7 @@ freshnessValidatedDate: 2024-12-19 Manage session replay and modification capabilities using the user management access functionality. This feature enables customization of user roles and access permissions to define who can modify session replay settings. -## Delete all product admin role [#modify-all-admin-role] +## Revoke SR Access Remove Users/Roles from Admin Group [#modify-all-admin-role] @@ -19,19 +19,19 @@ Manage session replay and modification capabilities using the user management ac - Expand the **Members** section, select the required user(s). + Expand the **Members** section, select the required user(s). - Click **Remove users from group**. + Click **Remove users from group**. - Expand the **Account access** section, click the ellipsis **(...)** icon. + Expand the **Account access** section, click the ellipsis **(...)** icon. - Select **Delete role**. + Select **Delete role**. @@ -49,7 +49,12 @@ Manage session replay and modification capabilities using the user management ac - In the **Browser** section, select the **View** checkbox for **Session replays**. Ensure the **Modify** checkbox is not selected. + In the **Browser** section, you may: + + - To grant read-only access to **Session replays**, select the **View** checkbox and ensure the **Modify** checkbox is not selected. + - To grant modify access to **Session replays, select both the **View** and **Modify** checkboxes. + +To grant modify access to Session replays, select both the View and Modify checkboxes. - Expand the **Account acess** section, and in the **Add account roles to this group** field, select the following: + Expand the **Account acess** section, and in the **Add account roles to this group** field, select the following: - * **Select a role** - * **Select an account** + * **Select a role** + * **Select an account** - Click **Add role**. + Click **Add role**. @@ -100,7 +105,7 @@ Manage session replay and modification capabilities using the user management ac - Click the **Edit** icon and go to the **Browser** section . + Click the **Edit** icon and go to the **Browser** section. From c4ae7a1c00d0a2825b72d0c88ed91e60bd83980b Mon Sep 17 00:00:00 2001 From: adutta-newrelic Date: Tue, 24 Dec 2024 09:43:26 +0530 Subject: [PATCH 05/67] Updates --- .../session-replay/configuration/setup-session-replay.mdx | 6 +++++- .../manage-session-replay-modify-capabilities.mdx | 8 +++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx index c58f09cc3be..db6553c0897 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx @@ -16,7 +16,11 @@ Utilize session replay in New Relic, start by enabling this feature in your brow 4. On the **Application settings** page, make sure **Pro** or **Pro + SPA** browser agent is selected. Session replay is not available for the Lite browser agent. - 5. Toggle **Session tracking** ON and **Session replay** settings. + 5. Toggle **Session traces** and **Session replay** ON. + + + If you are unable to view **Session traces** and **Session replay** settings. Contact your admin for further assistance. + ## Setting sampling rates [#configure-sampling-rates] diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx index 572d92dcdbc..2d44a84712f 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx @@ -6,7 +6,7 @@ freshnessValidatedDate: 2024-12-19 Manage session replay and modification capabilities using the user management access functionality. This feature enables customization of user roles and access permissions to define who can modify session replay settings. -## Revoke SR Access Remove Users/Roles from Admin Group [#modify-all-admin-role] +## Revoke SR modify access for members/accounts from Admin Group [#modify-all-admin-role] @@ -51,10 +51,8 @@ Manage session replay and modification capabilities using the user management ac In the **Browser** section, you may: - - To grant read-only access to **Session replays**, select the **View** checkbox and ensure the **Modify** checkbox is not selected. - - To grant modify access to **Session replays, select both the **View** and **Modify** checkboxes. - -To grant modify access to Session replays, select both the View and Modify checkboxes. + - Grant read-only access to **Session replays**, select the **View** checkbox and ensure the **Modify** checkbox is not selected. + - Grant modify access to **Session replays, select both the **View** and **Modify** checkboxes. Date: Tue, 24 Dec 2024 10:09:03 +0530 Subject: [PATCH 06/67] Updates --- .../session-replay/additional-information.mdx | 4 ++-- .../browser-pro-features/session-replay/advanced-features.mdx | 4 ++-- .../configuration/customize-privacy-settings.mdx | 4 ++-- .../session-replay/configuration/setup-session-replay.mdx | 2 +- .../manage-session-replay-modify-capabilities.mdx | 2 +- .../session-replay/troubleshooting-session-replay.mdx | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx index f41eeb40f86..8821e11f25b 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx @@ -20,7 +20,7 @@ To control your consumption, [adjust your sampling rates](/docs/browser/browser- We prioritize data privacy and built session replay with strong default settings to minimize the potential exposure of sensitive customer information. You can further [customize privacy settings](/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/customize-privacy-settings) to meet your specific needs. -Session replay does not capture screenshots or videos. Instead, it records only the essential DOM state changes needed to reconstruct user interactions. This significantly reduces the amount of data stored. +Session replay doesn't capture screenshots or videos. Instead, it records only the essential DOM state changes needed to reconstruct user interactions. This significantly reduces the amount of data stored. ### Compliance with data privacy laws @@ -40,7 +40,7 @@ Session replay minimizes impact on your app's performance with: * Strategic payload harvesting: A large (compressed) payload is sent only when the full DOM is captured, which typically occurs when the replay feature is first imported. Subsequently, only small payloads related to the user's actions are sent. The browser agent will harvest data based on the first occurrence of the following conditions: * The payload reaches more than 64 KB compressed. * 60 seconds elapses. - * The visibility of the page changes (e.g., tab change, focus, navigation). + * The visibility of the page changes (example, tab change, focus, navigation). * The session ends. ### Key Changes: diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/advanced-features.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/advanced-features.mdx index 6884cbd6869..fc0d711fca8 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/advanced-features.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/advanced-features.mdx @@ -24,10 +24,10 @@ Refer the API documentation for instructions: You can prevent session replays from automatically starting, even when sampled, by setting the API configuration option `autoStart` to `false`. This is useful in scenarios where you need to prioritize specific actions over automatic sampling. For example, you might not want session replays to automatically run on sensitive pages, like HIPAA-compliant ones. In such cases, you can use the `.start()` API to manually trigger the replay feature after user consent is obtained (and your app calls `.start()`) -Setting `autoStart: false` instructs the agent to defer its initialization until explicitly called using `.start()`. This ensures that session replays will not be created at all, even if the backend samples your application for recording. +Setting `autoStart: false` instructs the agent to defer its initialization until explicitly called using `.start()`. This ensures that session replays won't be created at all, even if the backend samples your application for recording. - Calling `.start()` does not guarantee that a session replay will be recorded. It simply delays the module import and evaluation of sampling results until this point. If you need to force a recording, refer [Manually record session replays](#manual-replays). + Calling `.start()` doesn't guarantee that a session replay will be recorded. It simply delays the module import and evaluation of sampling results until this point. If you need to force a recording, refer [Manually record session replays](#manual-replays). To start using this API, refer [`newrelic.start`](/docs/browser/new-relic-browser/browser-apis/start/). diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/customize-privacy-settings.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/customize-privacy-settings.mdx index c1a2a0f691f..9eae8c44f44 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/customize-privacy-settings.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/customize-privacy-settings.mdx @@ -24,7 +24,7 @@ By default, all text and inputs are replaced with asterisks. Here's an example o To specify which input should be masked, you have a few options: - * On the **Application settings** page, add your own CSS selectors or check the masking boxes. Note that using mask selectors will **not** mask user input, so if you need to hide user input, we recommend using block selectors. + * On the **Application settings** page, add your own CSS selectors or check the masking boxes. Note that using mask selectors won't mask user input, so if you need to hide user input, we recommend using block selectors. Account ID: 99881123
` - These options use an asterisk (\*) to mask all text in that element, hiding the actual text but revealing the number of characters entered. However, asterisks are not valid numbers, so masking number type-specific fields such as telephone or credit card numbers will result in a blank field in a replay. + These options use an asterisk (\*) to mask all text in that element, hiding the actual text but revealing the number of characters entered. However, asterisks aren't valid numbers, so masking number type-specific fields such as telephone or credit card numbers will result in a blank field in a replay. ## Block site content [#block-content] diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx index db6553c0897..6c7ee1c3f18 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx @@ -28,7 +28,7 @@ Set a sampling rate (0%-100%) for the following samples: * **User sessions** records a random sample of all user sessions. - * **Errored session** records a random sample of all errored sessions. The agent buffers a sliding window of data for up to 30 seconds on the client-side, and if errors occur, the buffered data will be harvested and the remainder of the session will be recorded. If an error does not occur, the replay is never harvested. + * **Errored session** records a random sample of all errored sessions. The agent buffers a sliding window of data for up to 30 seconds on the client-side, and if errors occur, the buffered data will be harvested and the remainder of the session will be recorded. If an error doesn't occur, the replay is never harvested. For example, if you set the session sampling rate to 50% and the error sampling rate to 100%, it means that: diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx index 2d44a84712f..2d0df043e45 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx @@ -19,7 +19,7 @@ Manage session replay and modification capabilities using the user management ac - Expand the **Members** section, select the required user(s). + Expand the **Members** section, select the required user. diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx index c72e5576272..9a2c5394004 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/troubleshooting-session-replay.mdx @@ -35,7 +35,7 @@ If you don't find your problem listed here, you can always reach out to [New Rel ### Problem - You can view replays, but they are not appearing correctly. + You can view replays, but they're not appearing correctly. This may be because your CSS files are hosted on a separate domain and Cross-Origin Resource Sharing (CORS) security measures are preventing our agent from accessing the CSS files. This can result in incomplete or inaccurate replays, as essential styling information may be missing. @@ -74,4 +74,4 @@ If you don't find your problem listed here, you can always reach out to [New Rel * If you place the browser agent in the top-level window, session replay only captures what's in the window. The iframe will appear blank in session replay. * If you place the browser agent in the top-level iframe, session replay only captures what's in the iframe. - Session replay is **not** compatible with `` elements. \ No newline at end of file + Session replay is not compatible with `` elements. \ No newline at end of file From b208c62cd26a18c6b69239d9a72a31bd3320c1f2 Mon Sep 17 00:00:00 2001 From: adutta-newrelic Date: Tue, 24 Dec 2024 10:35:11 +0530 Subject: [PATCH 07/67] Updates --- .../session-replay/get-started.mdx | 2 +- .../browser-pro-features/session-replay.mdx | 425 ------------------ .../browser-pro-features/session-replay.mdx | 425 ------------------ .../browser-pro-features/session-replay.mdx | 425 ------------------ .../browser-pro-features/session-replay.mdx | 425 ------------------ 5 files changed, 1 insertion(+), 1701 deletions(-) delete mode 100644 src/i18n/content/es/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx delete mode 100644 src/i18n/content/jp/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx delete mode 100644 src/i18n/content/kr/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx delete mode 100644 src/i18n/content/pt/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx index dd8a9b7e993..34f3c3f5213 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/get-started.mdx @@ -20,7 +20,7 @@ Session replay captures interactions on your web app and maps other telemetry da ## How session replay works [#how-it-works] -When a user loads your web page, session replay takes a snapshot of the Document Object Model (DOM), which represents the page's structure and visual elements. To ensure accurate styling information, the browser agent accesses your CSS files. The agent then integrates these styles directly into the replay recording, eliminating the need to reference external CSS files during playback. As the user interacts with the page, a library within the browser agent captures any changes made to the DOM. This captured data is then stored securely in New Relic's database. +When user loads your web page, session replay takes a snapshot of the Document Object Model (DOM), which represents the page's structure and visual elements. To ensure accurate styling information, the browser agent accesses your CSS files. The agent then integrates these styles directly into the replay recording, eliminating the need to reference external CSS files during playback. As the user interacts with the page, a library within the browser agent captures any changes made to the DOM. This captured data is then stored securely in New Relic's database. Replays store up to: diff --git a/src/i18n/content/es/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx b/src/i18n/content/es/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx deleted file mode 100644 index 1680ab0195e..00000000000 --- a/src/i18n/content/es/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx +++ /dev/null @@ -1,425 +0,0 @@ ---- -title: Session Replay -metaDescription: Play back user interactions to debug faster and improve page performance. -freshnessValidatedDate: '2024-11-11T00:00:00.000Z' -translationType: machine ---- - -Session Replay captura la interacción en su aplicación sitio web y mapea otros telemetry data para ayudarlo a comprender las rutas de sus usuarios. Session Replay se puede emplear para la resolución de problemas y mejorar la experiencia del usuario final, tales como: - -* **Resolución de problemas Errores de JavaScript**: soluciona la causa de un error viendo qué estaba haciendo el usuario cuando ocurrió el error. Por ejemplo, si un usuario final recibe un error al intentar completar una transacción de comercio electrónico, puede usar Session Replay para ver qué pasos tomó y qué datos ingresó antes de que ocurriera el error. Esto puede ayudarle a identificar y solucionar rápidamente la causa raíz del problema. -* **Mejorar la experiencia del usuario**: descubra áreas de su aplicación web que están causando frustración en el usuario. Por ejemplo, es posible que vea que el usuario se pierde en su navegación o hace clic en botones que no hacen nada. -* **Identificación de problemas en los recorridos de los usuarios clave**: identifique áreas de su aplicación web que están causando problemas de rendimiento. Por ejemplo, si Session Replay revela que la página `/cart/checkout` está experimentando un tiempo de carga de la página excesivo, priorizaría corregir este recorrido crítico del usuario. - -Screenshot of session replay details - -## Cómo funciona Session Replay [#how-it-works] - -Cuando un usuario carga su página web, Session Replay toma una instantánea del modelo de objetos de documento (DOM), que representa la estructura y los elementos visuales de la página. Para garantizar información de estilo precisa, el agente del browser accede a sus archivos CSS. Luego, el agente integra estos estilos directamente en la grabación de repetición, eliminando la necesidad de hacer referencia a archivos CSS externos durante la reproducción. A medida que el usuario interactúa con la página, una biblioteca dentro del agente del browser captura cualquier cambio realizado en el DOM. Estos datos capturados se almacenan de forma segura en la base de datos de New Relic. - -Las repeticiones se almacenan hasta: - -* 4 horas de sesión de usuario -* 30 minutos de inactividad - -De forma predeterminada, los datos de eventos browser se almacenan durante 8 días, pero la retención real de datos depende de su cuenta. - -Para obtener más detalles sobre Session Replay, consulte las siguientes secciones: - -* [Consumo de datos](#data-consumption): Ver o proyectar el consumo de datos. -* [Preocupaciones de privacidad y seguridad del usuario](#data-security): conozca cómo protegemos sus datos de usuario y cumplimos con los requisitos de privacidad. -* [Session Replay y el rendimiento de su aplicación](#app-performance): aprenda cómo Session Replay minimiza el impacto en el rendimiento de su aplicación. - -## Empezar [#get-started] - - - - ### Habilitar Session Replay [#enable-configure-settings] - - 1. Vaya a **[one.newrelic.com](https://one.newrelic.com/all-capabilities) &gt; All Capabilities &gt; Browser**. - 2. Seleccione la aplicación de su browser . - 3. En el menú de la izquierda, haga clic en **Application settings**. - 4. En la página de configuración de la aplicación, asegúrese de que esté seleccionado **Pro** o **Pro + SPA** agente del navegador. Session Replay no está disponible para el agente Lite del navegador. - 5. Active las configuraciones **Session tracking** y **Session replay** . - - - - ### Configurar tasas de muestreo [#configure-sampling-rates] - - Establezca una frecuencia de muestreo (0%-100%) para las siguientes muestras: - - * **User sessions** registra una muestra aleatoria de todas las sesiones de usuario. - - * **Errored session** registra una muestra aleatoria de todas las sesiones con errores. El agente almacena en el búfer una ventana deslizante de datos durante hasta 30 segundos en el lado del cliente y, si se producen errores, los datos almacenados en el búfer se recopilarán y se registrará el resto de la sesión. Si no se produce un error, la repetición nunca se recopila. - - Por ejemplo, si establece la tasa de muestreo de la sesión en 50% y la tasa de muestreo de error en 100%, significa que: - - * Se grabará la mitad de todas las sesiones de usuario. - - * Todas las sesiones con errores serán grabadas, incluso si no forman parte de la muestra del 50%. - - - - ### (Opcional) Configurar ajustes de privacidad [#configure-privacy-settings] - - De forma predeterminada, todo el texto y las entradas se reemplazan con asteriscos. A continuación se muestra un ejemplo de cómo se ve una repetición con privacidad predeterminada: - - Example of default privacy settings - - Si esta configuración es apropiada, continúe con el siguiente paso. - - Si necesita personalizar qué contenido o entrada del usuario se captura, tiene opciones para enmascarar, bloquear o ignorar clases y atributos específicos de contenido o entrada del usuario. Asegúrese de consultar con su equipo de privacidad antes de cambiar la configuración de privacidad. - - ### Enmascarar texto sensible [#mask-text] - - Puede enmascarar texto confidencial, lo que significa que el texto se reemplazará con asteriscos (\*). Por ejemplo, puede enmascarar el ID de cuenta de un usuario que se muestra en una URL. - - Para especificar qué entrada debe enmascararse, tiene algunas opciones: - - * En la página **Application settings** , agregue sus propios selectores de CSS o marque las casillas de enmascaramiento. Tenga en cuenta que el uso de selectores de enmascarar **no** enmascarará la entrada del usuario, por lo que si necesita ocultar la entrada del usuario, le recomendamos utilizar selectores de bloque. - - Screenshot of mask settings in the ui - - * Agregue nuestra clase CSS `nr-mask` o atributo `data-nr-mask` al HTML de su página web. Por ejemplo, para enmascarar el ID de una cuenta para que no se muestre en la URL, agregue `nr-mask` al `
` que contiene el ID de la cuenta: - - ````html -
Account ID: 99881123
- ``` - ```` - - Estas opciones utilizan un asterisco (\*) para enmascarar todo el texto de ese elemento, ocultando el texto real pero revelando la cantidad de caracteres ingresados. Sin embargo, los asteriscos no son números válidos, por lo que enmascarar campos específicos del tipo de número, como números de teléfono o de tarjeta de crédito, dará como resultado un campo en blanco en una repetición. - - ### Bloquear contenido del sitio [#block-content] - - Puedes bloquear secciones enteras de contenido en tu sitio, lo que significa que la sección aparecerá como un marcador de posición vacío en Session Replay. Por ejemplo, si tiene una imagen en su página web Acerca de nosotros y no necesita capturarla, puede bloquear la clase que contiene la imagen. - - Para bloquear clases o atributos específicos, tienes algunas opciones: - - * En la página de configuración de la aplicación, agregue sus selectores CSS en el campo \**Bloquear selectores* . - - Screenshot of session replay settings - - * Agregue manualmente nuestra clase CSS `nr-block` o atributo `data-nr-block` al HTML de su página web. Por ejemplo, si desea bloquear texto e imágenes irrelevantes de Session Replay, agregue `nr-block` a `
`: - - ```html - - - Sample image and text - - -
- Image description -
- - - ``` - - ### Ignorar la entrada del usuario [#ignore-input] - - Puede ignorar los cambios en un campo de entrada del usuario, lo que significa que el campo de entrada seguirá mostrar en la repetición, pero no mostrará los cambios en el valor. Por ejemplo, puede ignorar la clase que contiene los campos de dirección de email o tarjeta de crédito. Los campos de entrada de contraseña siempre están enmascarados.  - - Para ignorar la entrada, agregue la clase CSS `nr-ignore` al nombre de clase del campo de entrada. Por ejemplo, si desea ignorar información confidencial en una página de facturación, agregue `class="nr-ignore"` a ``: - - ```html -
-

Sensitive Information

-

Credit card number:

-

Expiration date:

-

CVV code:

-
- ``` - - - - ### (Para copiar/pegar desplegar agente) Actualizar manualmente el fragmento de JavaScript [#update-snippet] - - Si implementa el agente del navegador usando el método copiar/pegar, deberá copiar/pegar desde la UI nuevamente. Esto se debe a que cuando habilita Session Replay, el fragmento de JavaScript se actualiza para incluir las nuevas actualizaciones de configuración. - - Para actualizar su código de agente: - - 1. Vaya a la página **Application Settings** y copie el fragmento de JavaScript. - - Screenshot of the application settings page. - - 2. Pégalo en tu código donde estaba el fragmento anterior. - - 3. Desplegar tu aplicación. - - - - ### Ver la repetición de la sesión en New Relic [#view-data] - - Puede encontrar Session Replay en dos lugares: - - * En la página **Session replay** : - - 1. Vaya a **[one.newrelic.com > All Capabilities](https://one.newrelic.com/all-capabilities) &gt; Browser**. - - 2. Seleccione la aplicación de su browser . - - 3. En el menú de la izquierda, desplácese hacia abajo y haga clic en **Session replay**. - - 4. Haga clic en cada repetición para ver los detalles de la sesión. - - screenshot of the session replay page in browser - - * En la página **Errors inbox** : - - 1. En el menú browser de la izquierda, haga clic en **Errors**. - - 2. Haga clic en las páginas **Triage** y **Group errors** para ver las repeticiones adjuntas a los errores. - - Screenshot of replays in errors inbox - - - -## Resolución de problemas [#troubleshoot] - - - - ### Problema - - La característica Session Replay está habilitada, pero no ves ninguna repetición. - - ### Solución - - Aquí hay algunas posibles soluciones: - - * Verifique sus tasas de muestreo. Hay muestreo tanto para repeticiones como para errores. - - * Asegúrate de tener permiso para ver repeticiones. - - * Asegúrate de estar utilizando la versión Pro o Pro+SPA del agente del navegador. Session Replay no funciona con el agente Lite del navegador. - - * Asegúrese de que su agente del navegador cumpla con estos requisitos: - - * Versión del agente v1.260.0 o superior. Recomendamos [actualizar a la última versión del agente](/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes) a medida que continuamos realizando mejoras. - * Tipo de agente: Pro o Pro+SPA. Session Replay no funciona con el agente Lite del navegador. - * [El seguimiento de sesiones](/docs/browser/browser-monitoring/browser-pro-features/session-traces-explore-webpages-life-cycle/#requirements) está habilitado. - - * El de su final browser admite la de usuario a browsernivel de API necesaria para grabar una Session Replay (verifique la compatibilidad en [MutationObserver](https://caniuse.com/mutationobserver)). - - * En [Errors Inbox](/docs/errors-inbox/errors-inbox/), filtra tus vistas para que siempre veas una repetición. De forma predeterminada, los datos de eventos browser se almacenan durante 8 días, pero la retención real de datos depende de su cuenta. - - * Si está utilizando el método de copiar y pegar desplegable, asegúrese de [actualizar su código de agente](#update-snippet). - - * Si está utilizando el método de implementación APM, es posible que deba esperar un momento para que Session Replay se habilite automáticamente. Si aún no ve datos, intente reiniciar el agente. - - * Si [elimina](https://docs.newrelic.com/docs/data-apis/manage-data/drop-data-using-nerdgraph/) datos de eventos de PageView, es posible que la repetición de sesión no se muestre en la UI. - - - - ### Problema - - Estás viendo repeticiones, pero no se muestran correctamente. - - Esto puede deberse a que sus archivos CSS están alojados en un dominio separado y las medidas de seguridad de intercambio de recursos entre orígenes (CORS) impiden que nuestro agente acceda a los archivos CSS. Esto puede dar como resultado repeticiones incompletas o inexactas, ya que es posible que falte información de estilo esencial. - - Esto es lo que sucede detrás de escena: - - * Session Replay funciona reconstruyendo el DOM del usuario, que incluye la estructura y los elementos visuales de su sitio web. Para lograr esto, nuestro agente necesita acceder a sus archivos CSS para capturar con precisión información de estilo. Luego incorporamos estos estilos directamente en la grabación de repetición, eliminando la necesidad de hacer referencia a los archivos CSS originales durante la reproducción. - - * Si sus archivos CSS están alojados en un dominio separado, CORS puede impedir que nuestro agente acceda a ellos. - - ### Solución - - Para asegurarse de que sus archivos CSS sean accesibles, agregue el atributo `crossorigin="anonymous"` a sus elementos `` dentro de su código HTML. Este atributo indica al browser que permita el acceso entre orígenes para esos archivos CSS específicos, lo que permite a nuestro agente del navegador registrar e integrar la información de estilo. - - A continuación se muestra un ejemplo de cómo agregar el atributo `crossorigin="anonymous"` : - - ``` - - ``` - - - - ### Problema - - La función de reproducción de sesión está habilitada, pero no ves datos de reproducción para el contenido iframe. - - ### Solución - - El comportamiento de Session Replay en escenarios iframe depende del origen del iframe y de la ubicación del agente del browser. - - Suponiendo que un sitio web consta de una ventana de nivel superior con un iframe secundario, aquí hay algunas posibles soluciones: - - * **Iframes del mismo origen**: - - * Si coloca el agente del browser en la ventana de nivel superior, Session Replay captura tanto la ventana como el iframe. - * Si coloca el agente del browser en el iframe, Session Replay solo captura lo que está en el iframe. - * Si coloca el agente del browser tanto en la ventana de nivel superior como en el iframe, Session Replay captura lo que sucede independientemente tanto en la ventana como en el iframe, lo que da como resultado dos sesiones separadas. - - * **Iframes de origen cruzado**: - - * Si coloca el agente del browser en la ventana de nivel superior, Session Replay solo captura lo que hay en la ventana. El iframe aparecerá en blanco en la repetición de la sesión. - * Si coloca el agente del browser en el iframe de nivel superior, Session Replay solo captura lo que está en el iframe. - - La repetición de sesión **no** es compatible con `` elementos. - - - -## Grabar manualmente la repetición de la sesión [#manual-replays] - -Si es necesario, puede `force` mediante programación una Session Replay para iniciar o detener la grabación empleando métodos API . A continuación se muestran algunos casos de uso: - -* Permitir que el usuario opte por la grabación de interacciones. Por ejemplo, si aparece una ventana emergente que pregunta "¿Permitir que se grabe esta sesión para analizar el rendimiento?" y un usuario consiente: - - 1. Llame a `newrelic.recordReplay()` para iniciar la grabación. - 2. Una vez que se complete la sesión o se retire el consentimiento, use `newrelic.pauseReplay()` para dejar de capturar datos. - -* Grabe sesiones según criterios específicos, como: - - * Comience a grabar solo sesiones en URL específicas, como el flujo de pago de un producto. - * Detenga la grabación de páginas confidenciales como `/billing` o `/health-records`. - -Consulte la documentación de la API para obtener instrucciones: - -* [`newrelic.recordReplay`](/docs/browser/new-relic-browser/browser-apis/recordReplay/) -* [`newrelic.pauseReplay`](/docs/browser/new-relic-browser/browser-apis/pauseReplay/) - -## Deshabilitar el seguimiento automático Session Replay [#auto-replays] - -Puede evitar que la reproducción de sesión se inicie automáticamente, incluso cuando se muestrea, estableciendo la opción de configuración API `autoStart` en `false`. Esto resulta útil en escenarios en los que es necesario priorizar acciones específicas sobre la ejemplificación automática. Por ejemplo, es posible que no desee que Session Replay se ejecute automáticamente en páginas confidenciales, como las que cumplen con HIPAA. En tales casos, puede emplear la API `.start()` para activar manualmente la característica de reproducción luego de obtener el consentimiento del usuario (y su aplicación llama a `.start()`). - -La configuración `autoStart: false` indica al agente que posponga su inicialización hasta que se llame explícitamente mediante `.start()`. Esto garantiza que la reproducción de sesión no se creará en absoluto, incluso si el backend toma muestras de su aplicación para grabar. - - - Llamar a `.start()` no garantiza que se grabará una Session Replay . Simplemente retrasa la importación del módulo y la evaluación de los resultados de la ejemplificación hasta este punto. Si necesita forzar una grabación, consulte [Grabar manualmente la reproducción de la sesión](#manual-replays). - - -Para comenzar a emplear esta API, consulte [`newrelic.start`](/docs/browser/new-relic-browser/browser-apis/start/). - -## Utilice Nerdgraph para configurar los ajustes de reproducción [#nerdgraph-mutation] - -Puede configurar los ajustes Session Replay usando nuestra [API NerdGraph](/docs/apis/nerdgraph/get-started/introduction-new-relic-nerdgraph/) en lugar de usar la UI. Este método es útil si necesita realizar cambios masivos, como aplicar frecuencias de muestreo a múltiples entidades browser . - -Aquí hay un ejemplo de mutación y variables para crear una nueva aplicación browser con la configuración predeterminada: - - - - - - - - - - - - - - - - - -
- Mutación - - Variables -
- ```graphql - mutation SessionReplayConfigUpdate($guid: EntityGuid!, $settings: AgentApplicationSettingsUpdateInput!) { - agentApplicationSettingsUpdate(guid: $guid, settings: $settings) { - browserSettings { - sessionReplay { - blockSelector - errorSamplingRate - maskTextSelector - enabled - collectFonts - inlineImages - inlineStylesheet - samplingRate - maskAllInputs - maskInputOptions { - color - date - datetimeLocal - email - month - number - range - search - select - tel - text - textArea - time - url - week - } - } - } - errors { - field - errorClass - description - } - } - } - ``` - - ```json - { - "sessionReplay": { - "enabled": true, - "collectFonts": true, - "blockSelector": ".private-fields", - "maskTextSelector": "*", - "inlineStylesheet": false, - "maskAllInputs": true, - "maskInputOptions": { - "color": true, - "date": true, - "textArea": true - }, - "samplingRate": 9.99, - "errorSamplingRate": 1.11 - } - } - ``` -
- -## Consumo de datos [#data-consumption] - -Session Replay sigue el mismo precio de consumo que los otros bytes de su browser . La cantidad de bytes producidos depende del recuento, la duración y los niveles de actividad del usuario de las sesiones, así como de la complejidad del DOM de su sitio. - -La forma más precisa de proyectar su costo por repetición es habilitar la característica durante un periodo de prueba corto y medir su consumo real. Alternativamente, puedes usar un promedio de 5,3 MB por repetición como una aproximación aproximada, aunque ten en cuenta que el costo real puede variar significativamente. Una fórmula sencilla para proyectar sus costos aproximados es: `sessions` x `sampling_rate` x `gb_per_replay` x `cost_per_gb`. He aquí un ejemplo: - -``` -1 million (sessions) x 5% (sampling_rate) x 0.0053 (gb_per_replay) x $0.35 (cost_per_gb) = $92.75 for 50,000 replays -``` - -Para controlar su consumo, [ajuste sus tasas de muestreo](#configure-sampling-rates). - -## Preocupaciones de seguridad y privacidad del usuario [#data-security] - -Priorizamos la privacidad de los datos y creamos Session Replay con configuraciones predeterminadas estables para minimizar la exposición potencial de información confidencial de los clientes. Puede [personalizar aún más la configuración de privacidad](#configure-privacy-settings) para satisfacer sus necesidades específicas. - -Session Replay no captura capturas de pantalla ni videos. En cambio, registra solo los cambios de estado DOM esenciales necesarios para reconstruir la interacción del usuario. Esto reduce significativamente la cantidad de datos almacenados. - -### Cumplimiento de las leyes de privacidad de datos - -New Relic actúa como procesador de datos según GDPR y proveedor de servicios según CCPA. Esto significa que procesamos datos de acuerdo con sus instrucciones. En última instancia, el cumplimiento de estas leyes depende de cómo implemente Session Replay dentro de su aplicación. - -De forma predeterminada, todo el texto y las entradas del usuario, incluidos los datos personales, están enmascarados dentro de las grabaciones. Puede desenmascarar selectivamente elementos específicos si es necesario, pero la configuración predeterminada garantiza que ninguna información de identificación personal sea fácilmente visible. Este enfoque proporciona una base estable para la privacidad de los datos y al mismo tiempo ofrece flexibilidad para sus necesidades específicas. - -## Session Replay y el rendimiento de tu app [#app-performance] - -Session Replay minimiza el impacto en el rendimiento de su aplicación con: - -* **Impacto inicial mínimo**: Session Replay se carga de forma asincrónica después de cargar la página completa, lo que garantiza que no interfiera con el rendimiento métrico de la carga temprana de la página. - -* **Seguimiento de mutaciones DOM **: una vez cargado, Session Replay monitorea los cambios DOM y los informa como carga comprimida. El tamaño de estas cargas se correlaciona con la complejidad del árbol DOM . - -* **Técnicas de optimización del rendimiento**: el tamaño de la carga útil también puede aumentar si el DOM es grande. Sin embargo, Session Replay utiliza una serie de técnicas para reducir el tamaño de la carga, como por ejemplo: - - * Compresión GZIP - - * Reducción de duplicación - - * Recolección estratégica de carga: solo envía una carga grande (comprimida) cuando se captura el DOM completo, lo que generalmente solo ocurre cuando se importa por primera vez la característica de reproducción. Después de eso, solo enviará pequeñas cargas relacionadas con las acciones del usuario. El agente del browser recogerá lo que ocurra primero de lo siguiente: - - * La carga útil alcanza más de 64 KB comprimidos - * Pasan 60 segundos - * La visibilidad de la página cambia (cambio de pestaña, enfoque, navegación, etc.) - * La sesión termina \ No newline at end of file diff --git a/src/i18n/content/jp/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx b/src/i18n/content/jp/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx deleted file mode 100644 index 1957bbfeee4..00000000000 --- a/src/i18n/content/jp/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx +++ /dev/null @@ -1,425 +0,0 @@ ---- -title: セッションのリプレイ -metaDescription: Play back user interactions to debug faster and improve page performance. -freshnessValidatedDate: '2024-11-11T00:00:00.000Z' -translationType: machine ---- - -セッションリプレイは、Web アプリ上のインタラクションをキャプチャし、他のテレメトリーデータをマッピングして、ユーザーの旅を理解するのに役立ちます。 セッションリプレイは、次のようなトラブルシューティングやエンドユーザー体験の改善に使用できます。 - -* **JavaScript エラーのトラブルシューティング**: エラーが発生したときにユーザーが何をしていたかを確認して、エラーの原因をトラブルシューティングします。 たとえば、エンド ユーザーが e コマース トランザクションを完了しようとしてエラーを受け取った場合、セッション リプレイを使用して、エラーが発生する前にエンド ユーザーが実行した手順と入力したデータを確認できます。 これは、問題の根本原因を迅速に特定して修正するのに役立ちます。 -* **ユーザー エクスペリエンスの向上**: ユーザーのフラストレーションを引き起こしている Web アプリの領域を発見します。 たとえば、ユーザーがナビゲーションで迷ったり、何も行わないボタンをクリックしたりしていることがわかります。 -* **主要なユーザー ジャーニーの問題を特定する**: パフォーマンスの問題を引き起こしている Web アプリの領域を特定します。 たとえば、セッション リプレイにより、 `/cart/checkout`ページでページ読み込み時間が長すぎることが判明した場合は、この重要なユーザー ジャーニーを修正することを優先します。 - -Screenshot of session replay details - -## セッションリプレイの仕組み [#how-it-works] - -ユーザーが Web ページを読み込むと、セッションリプレイはページの構造と視覚要素を表すドキュメント オブジェクト モデル ( DOM ) のスナップショットを取得します。 正確なスタイル情報を確保するために、Browseragent はCSSファイルにアクセスします。 エージェントはこれらのスタイルをリプレイ記録に直接統合し、再生中に外部 CSS ファイルを参照する必要がなくなります。 ユーザーがページを操作すると、Browseragent 内のライブラリがDOMに加えられた変更をキャプチャします。 キャプチャされたデータは New Relic のデータベースに安全に保存されます。 - -リプレイは最大で次の期間保存されます: - -* 4時間のユーザーセッション -* 30分間の非活動 - -デフォルトでは、 browserイベント データは 8 日間保存されますが、実際のデータ保存期間はアカウントによって異なります。 - -セッションリプレイの詳細については、次のセクションを参照してください。 - -* [データ消費量](#data-consumption): データ消費量を表示または予測します。 -* [ユーザーのプライバシーとセキュリティに関する懸念](#data-security): 当社がユーザーのデータを保護し、プライバシー要件を満たす方法を学びます。 -* [セッションリプレイとアプリのパフォーマンス](#app-performance): セッションリプレイがアプリのパフォーマンスへの影響を最小限に抑える方法について説明します。 - -## 始めましょう [#get-started] - - - - ### セッションリプレイを有効にする [#enable-configure-settings] - - 1. **[one.newrelic.com](https://one.newrelic.com/all-capabilities) &gt; All Capabilities &gt; Browser**に移動します。 - 2. ブラウザ アプリを選択します。 - 3. 左側のメニューで、 **Application settings**をクリックします。 - 4. アプリケーション設定ページで、 **Pro**または**Pro + SPA** Browser Agent が選択されていることを確認します。 セッションリプレイはLite Browserエージェントではご利用いただけません。 - 5. **Session tracking****Session replay**設定をオンに切り替えます。 - - - - ### サンプリングレートを構成する [#configure-sampling-rates] - - 次のサンプルのサンプリング レート (0% ~ 100%) を設定します。 - - * **User sessions** すべてのユーザー セッションのランダム サンプルを記録します。 - - * **Errored session** すべてのエラーセッションのランダムサンプルを記録します。 エージェントはクライアント側で最大 30 秒間、データのスライディング ウィンドウをバッファリングします。エラーが発生した場合、バッファリングされたデータが収集され、セッションの残りの部分が記録されます。 エラーが発生しない場合、リプレイは収集されません。 - - たとえば、セッション サンプリング レートを 50% に設定し、エラー サンプリング レートを 100% に設定すると、次のことが意味されます。 - - * すべてのユーザー セッションの半分が記録されます。 - - * 50% サンプルに含まれていない場合でも、エラーが発生したすべてのセッションが記録されます。 - - - - ### (オプション)プライバシー設定を構成する [#configure-privacy-settings] - - デフォルトでは、すべてのテキストと入力はアスタリスクに置き換えられます。 デフォルトのプライバシーでリプレイがどのように表示されるかの例を次に示します。 - - Example of default privacy settings - - この設定が適切であれば、次の手順に進みます。 - - キャプチャするコンテンツまたはユーザー入力をカスタマイズする必要がある場合は、コンテンツまたはユーザー入力の特定のクラスと属性をマスク、ブロック、または無視するオプションがあります。 プライバシー設定を変更する前に、必ずプライバシー チームに確認してください。 - - ### 機密テキストをマスクする [#mask-text] - - 機密テキストをマスクすることができます。つまり、テキストはアスタリスク(\*)に置き換えられます。 たとえば、URL に表示されるユーザーのアカウント ID をマスクできます。 - - どの入力をマスクするかを指定するには、いくつかのオプションがあります。 - - * **Application settings**ページで、独自の CSS セレクターを追加するか、マスキング ボックスをオンにします。 マスク セレクターを使用してもユーザー入力はマスクされ**ない**ことに注意してください。ユーザー入力を非表示にする必要がある場合は、ブロック セレクターを使用することをお勧めします。 - - Screenshot of mask settings in the ui - - * CSS クラス`nr-mask`または属性`data-nr-mask`を Web ページの HTML に追加します。 たとえば、アカウント ID が URL に表示されないようにするには、アカウント ID を含む`
`に`nr-mask`を追加します。 - - ````html -
Account ID: 99881123
- ``` - ```` - - これらのオプションでは、アスタリスク (\*) を使用してその要素内のすべてのテキストをマスクし、実際のテキストを隠しますが、入力された文字数は表示します。 ただし、アスタリスクは有効な数値ではないため、電話番号やクレジット カード番号などの番号タイプ固有のフィールドをマスキングすると、再生では空白のフィールドが生成されます。 - - ### サイトのコンテンツをブロックする [#block-content] - - サイト上のコンテンツのセクション全体をブロックすることができます。この場合、そのセクションはセッションリプレイでは空のプレースホルダーとして表示されます。 たとえば、「会社概要」Web ページに画像があり、それをキャプチャする必要がない場合は、画像を含むクラスをブロックできます。 - - 特定のクラスまたは属性をブロックするには、いくつかのオプションがあります。 - - * \[アプリケーション設定] ページで、\[\**ブロック セレクター]*フィールドに CSS セレクターを追加します。 - - Screenshot of session replay settings - - * CSS クラス`nr-block`または属性`data-nr-block`をウェブページの HTML に手動で追加します。 たとえば、セッションのリプレイから無関係なテキストや画像をブロックしたい場合は、 `nr-block`を`
`に追加します。 - - ```html - - - Sample image and text - - -
- Image description -
- - - ``` - - ### ユーザー入力を無視する [#ignore-input] - - ユーザー入力フィールドへの変更を無視することができます。つまり、入力フィールドはリプレイに引き続き表示されますが、値の変更は表示されません。 たとえば、電子メール アドレスやクレジットカード フィールドを含むクラスを無視できます。 パスワード入力フィールドは常にマスクされます。 - - 入力を無視するには、入力フィールドのクラス名に CSS クラス`nr-ignore`を追加します。 たとえば、請求ページの機密情報を無視したい場合は、 `class="nr-ignore"`を``に追加します。 - - ```html -
-

Sensitive Information

-

Credit card number:

-

Expiration date:

-

CVV code:

-
- ``` - - - - ### (コピー/ペーストしてデプロイされたエージェントの場合) JavaScript スニペットを手動で更新します [#update-snippet] - - コピー/貼り付け方式を使用して Browseragent をデプロイする場合は、 UIから再度コピー/貼り付けを行う必要があります。 これは、セッションリプレイを有効にすると、JavaScript スニペットが更新され、新しい構成の更新が組み込まれるためです。 - - エージェント コードを更新するには: - - 1. **Application Settings**ページに移動して、JavaScript スニペットをコピーします。 - - Screenshot of the application settings page. - - 2. コード内の古いスニペットがあった場所に貼り付けます。 - - 3. アプリをデプロイします。 - - - - ### New Relic でセッションのリプレイを表示する [#view-data] - - セッションリプレイは次の 2 つの場所で見つかります。 - - * **Session replay**ページ: - - 1. **[one.newrelic.com > All Capabilities](https://one.newrelic.com/all-capabilities) &gt; Browser**に移動します。 - - 2. ブラウザ アプリを選択します。 - - 3. 左側のメニューで下にスクロールし、 **Session replay**をクリックします。 - - 4. 各リプレイをクリックしてセッションの詳細を表示します。 - - screenshot of the session replay page in browser - - * **Errors inbox**ページ: - - 1. 左側のbrowserメニューで、**Errors** をクリックします。 - - 2. エラーに添付されたリプレイを表示するには、 **Triage**ページと**Group errors**ページをクリックします。 - - Screenshot of replays in errors inbox - - - -## トラブルシューティング [#troubleshoot] - - - - ### 問題 - - セッション リプレイ機能が有効になっていますが、リプレイが表示されません。 - - ### 解決 - - 以下に考えられる修正をいくつか示します。 - - * サンプリングレートを確認してください。 リプレイとエラーの両方にサンプリングがあります。 - - * リプレイを表示する権限があることを確認してください。 - - * ブラウザ エージェントの Pro または Pro+SPA バージョンを使用していることを確認してください。 セッション リプレイは、Lite ブラウザ エージェントでは機能しません。 - - * ブラウザ エージェントが次の要件を満たしていることを確認してください。 - - * エージェント バージョン v1.260.0 以上。 改善を継続的に行っていますので、[最新のエージェント バージョンにアップグレードすること](/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes)をお勧めします。 - * エージェントのタイプ: Pro または Pro+SPA。 セッション リプレイは、Lite ブラウザ エージェントでは機能しません。 - * [セッション トレース](/docs/browser/browser-monitoring/browser-pro-features/session-traces-explore-webpages-life-cycle/#requirements)が有効になっています。 - - * エンドユーザーのbrowserセッションリプレイを記録するために必要なbrowserレベルのAPIをサポートしています ( [MutationObserver](https://caniuse.com/mutationobserver)で互換性を確認してください)。 - - * [Errors Inbox](/docs/errors-inbox/errors-inbox/)で、常にリプレイが表示されるようにビューをフィルターします。 デフォルトでは、 browserイベント データは 8 日間保存されますが、実際のデータ保存期間はアカウントによって異なります。 - - * コピー/ペーストの展開方法を使用している場合は、[エージェント コードを更新している](#update-snippet)ことを確認してください。 - - * APM デプロイメント方法を使用している場合は、セッション再生が自動的に有効になるまでしばらく待つ必要がある場合があります。 それでもデータが表示されない場合は、エージェントを再起動してみてください。 - - * PageView イベント データを[削除して](https://docs.newrelic.com/docs/data-apis/manage-data/drop-data-using-nerdgraph/)いる場合、セッション リプレイがUIに表示されない場合があります。 - - - - ### 問題 - - リプレイが表示されますが、正しく表示されません。 - - これは、CSS ファイルが別のドメインでホストされており、Cross-Origin Resource Sharing (CORS) セキュリティ対策によってエージェントが CSS ファイルにアクセスできないことが考えられます。 これにより、重要なスタイル情報が欠落している可能性があるため、リプレイが不完全または不正確になる可能性があります。 - - 舞台裏で何が起こっているかは次のとおりです。 - - * セッションリプレイは、Web サイトの構造と視覚要素を含むユーザーの DOM を再構築することによって機能します。 これを実現するには、エージェントが CSS ファイルにアクセスしてスタイル情報を正確に取得する必要があります。 次に、これらのスタイルを再生記録に直接インライン化することで、再生中に元の CSS ファイルを参照する必要がなくなります。 - - * CSS ファイルが別のドメインでホストされている場合、CORS によりエージェントがそれらにアクセスできなくなる可能性があります。 - - ### 解決 - - CSS ファイルにアクセスできるようにするには、HTML コード内の``要素に`crossorigin="anonymous"`属性を追加します。 この属性は、ブラウザーに特定の CSS ファイルへのクロスオリジン アクセスを許可するよう指示し、ブラウザー エージェントがスタイル情報を記録および統合できるようにします。 - - `crossorigin="anonymous"`属性を追加する例を次に示します。 - - ``` - - ``` - - - - ### 問題 - - セッションリプレイ機能は有効ですが、iframe コンテンツのリプレイ データが表示されません。 - - ### 解決 - - iframe シナリオでのセッション リプレイの動作は、iframe の起源とブラウザ エージェントの配置によって異なります。 - - Web ページが子 iframe を持つトップレベル ウィンドウで構成されていると仮定すると、次のような修正方法が考えられます。 - - * **同じオリジンの iframe** : - - * ブラウザエージェントをトップレベルウィンドウに配置すると、セッションリプレイはウィンドウと iframe の両方をキャプチャします。 - * ブラウザエージェントを iframe 内に配置すると、セッションリプレイは iframe 内の内容のみをキャプチャします。 - * ブラウザエージェントをトップレベルのウィンドウと iframe の両方に配置すると、セッションリプレイはウィンドウと iframe の両方で独立して何が起こっているかをキャプチャし、結果として 2 つの別々のセッションが作成されます。 - - * **クロスオリジン iframe** : - - * ブラウザエージェントをトップレベルウィンドウに配置すると、セッションリプレイはウィンドウ内の内容のみをキャプチャします。 セッションリプレイでは iframe が空白で表示されます。 - * ブラウザエージェントを最上位の iframe に配置すると、セッションリプレイは iframe 内の内容のみをキャプチャします。 - - セッションリプレイは``要素と互換性が**ありません**。 - - - -## セッションリプレイを手動で記録する [#manual-replays] - -必要に応じて、 APIメソッドを使用してセッションリプレイをプログラム的に `force` して、記録を開始または停止することができます。 以下に使用例をいくつか示します。 - -* ユーザーがインタラクション記録をオプトインできるようにします。 たとえば、「パフォーマンス分析のためにこのセッションを記録することを許可しますか?」というポップアップが表示された場合、 ユーザーは以下に同意します: - - 1. 録音を開始するには、 `newrelic.recordReplay()`呼び出します。 - 2. セッションが完了するか同意が取り消されたら、 `newrelic.pauseReplay()`を使用してデータのキャプチャを停止します。 - -* 次のような特定の基準に基づいてセッションを記録します。 - - * 製品のチェックアウトフローなど、特定の URL 上のセッションのみの記録を開始します。 - * `/billing`や`/health-records`などの機密ページの記録を停止します。 - -手順については API ドキュメントを参照してください。 - -* [`newrelic.recordReplay`](/docs/browser/new-relic-browser/browser-apis/recordReplay/) -* [`newrelic.pauseReplay`](/docs/browser/new-relic-browser/browser-apis/pauseReplay/) - -## セッションリプレイの自動追跡を無効にする [#auto-replays] - -API設定オプション`autoStart`を`false`に設定すると、サンプリングされた場合でもセッションリプレイが自動的に開始されないようにすることができます。 これは、自動サンプリングよりも特定のアクションを優先する必要があるシナリオで役立ちます。 たとえば、HIPAA 準拠のページなど、機密性の高いページではセッションリプレイを自動的に実行したくない場合があります。 このような場合、ユーザーの同意を得た後(アプリが`.start()`を呼び出す後)、 `.start()` API を使用してリプレイ機能を手動でトリガーできます。 - -`autoStart: false`を設定すると、エージェントは`.start()`を使用して明示的に呼び出されるまで初期化を延期するように指示されます。 これにより、バックグラウンドがアプリケーションを録音用にサンプリングした場合でも、セッションリプレイがまったく作成されなくなります。 - - - `.start()`を呼び出しても、セッションリプレイが記録されることは保証されません。 モジュールのインポートとサンプリング結果の評価をこの時点まで遅らせるだけです。 強制的に録画する必要がある場合は、 [「セッションリプレイを手動で録画する」](#manual-replays)を参照してください。 - - -この API の使用を開始するには、 [`newrelic.start`](/docs/browser/new-relic-browser/browser-apis/start/)を参照してください。 - -## Nerdgraphを使用してリプレイ設定を構成する [#nerdgraph-mutation] - -を使用する代わりに、[ NerdGraphAPI](/docs/apis/nerdgraph/get-started/introduction-new-relic-nerdgraph/) を使用してセッションリプレイ設定を構成できます。UIこの方法は、複数のbrowserにサンプリング レートを適用するなど、一括変更が必要な場合に役立ちます。 - -デフォルト設定で新しいbrowserアプリケーションを作成するためのミューテーションと変数の例を次に示します。 - - - - - - - - - - - - - - - - - -
- 突然変異 - - 変数 -
- ```graphql - mutation SessionReplayConfigUpdate($guid: EntityGuid!, $settings: AgentApplicationSettingsUpdateInput!) { - agentApplicationSettingsUpdate(guid: $guid, settings: $settings) { - browserSettings { - sessionReplay { - blockSelector - errorSamplingRate - maskTextSelector - enabled - collectFonts - inlineImages - inlineStylesheet - samplingRate - maskAllInputs - maskInputOptions { - color - date - datetimeLocal - email - month - number - range - search - select - tel - text - textArea - time - url - week - } - } - } - errors { - field - errorClass - description - } - } - } - ``` - - ```json - { - "sessionReplay": { - "enabled": true, - "collectFonts": true, - "blockSelector": ".private-fields", - "maskTextSelector": "*", - "inlineStylesheet": false, - "maskAllInputs": true, - "maskInputOptions": { - "color": true, - "date": true, - "textArea": true - }, - "samplingRate": 9.99, - "errorSamplingRate": 1.11 - } - } - ``` -
- -## データ消費 [#data-consumption] - -セッションリプレイは、他のbrowserバイトと同じ消費価格設定に従います。 生成されるバイトの量は、セッションの数、長さ、ユーザー アクティビティ レベル、およびサイトの DOM の複雑さによって異なります。 - -リプレイあたりのコストを予測する最も正確な方法は、短いテスト期間で機能を有効にして、実際の消費量を測定することです。 あるいは、リプレイ 1 回あたりの平均 5.3 MB を大まかな概算として使用することもできますが、実際のコストは大幅に異なる可能性があることに留意してください。 おおよそのコストを予測する簡単な式は、 `sessions` x `sampling_rate` x `gb_per_replay` x `cost_per_gb`です。 次に例を示します。 - -``` -1 million (sessions) x 5% (sampling_rate) x 0.0053 (gb_per_replay) x $0.35 (cost_per_gb) = $92.75 for 50,000 replays -``` - -消費量を制御するには、[サンプリング レートを調整します](#configure-sampling-rates)。 - -## ユーザーのプライバシーとセキュリティに関する懸念 [#data-security] - -当社はデータのプライバシーを最優先し、強力なデフォルト設定でセッションリプレイを構築して、顧客の機密情報の漏洩の可能性を最小限に抑えます。 特定のニーズに合わせて[プライバシー設定をさらにカスタマイズ](#configure-privacy-settings)できます。 - -セッションリプレイではスクリーンショットやビデオはキャプチャされません。 代わりに、ユーザー インタラクションの再構築に必要な重要なDOM状態の変更のみを記録します。 これにより、保存されるデータの量が大幅に削減されます。 - -### データプライバシー法の遵守 - -New Relic GDPRの下ではデータ プロセッサとして、CCPA の下ではサービス プロバイダーとして機能します。 つまり、お客様の指示に従ってデータを処理することになります。 最終的に、これらの法律に準拠できるかどうかは、アプリケーション内でセッションリプレイをどのように実装するかによって決まります。 - -デフォルトでは、個人データを含むすべてのテキストとユーザー入力は録画内でマスクされます。 必要に応じて特定の要素を選択的にマスク解除できますが、デフォルトでは個人を特定できる情報がすぐに表示されないようになっています。 このアプローチは、データ プライバシーの強力な基盤を提供し、同時に特定のニーズに柔軟に対応します。 - -## セッションリプレイとアプリのパフォーマンス [#app-performance] - -セッションリプレイは、以下によりアプリのパフォーマンスへの影響を最小限に抑えます。 - -* **初期影響を最小限に抑える**: セッションリプレイはページ全体の読み込み後に非同期で読み込まれるため、初期のページ読み込みパフォーマンス メトリクスに干渉しません。 - -* **DOM 変更追跡**: ロードされると、セッションリプレイ モニター DOM の変更が圧縮ペイロードとして報告されます。 これらのペイロードのサイズは、DOM ツリーの複雑さと相関します。 - -* **パフォーマンスの最適化手法**: DOM が大きい場合、ペイロード サイズも増加する可能性があります。 ただし、セッションリプレイはペイロード サイズを削減するために次のようなさまざまな手法を使用します。 - - * GZIP圧縮 - - * 重複の削減 - - * 戦略的なペイロード収集: 完全な DOM がキャプチャされた場合にのみ大きな (圧縮された) ペイロードを送信します。これは通常、再生機能が最初にインポートされたときにのみ発生します。 その後は、ユーザーのアクションに関連する小さなペイロードのみが送信されます。 Browser Agent は、次のいずれかが発生した時点で収集を行います。 - - * ペイロードは圧縮すると64KBを超える - * 60秒経過 - * ページの可視性の変更(タブの変更、フォーカス、ナビゲーションなど) - * セッション終了 \ No newline at end of file diff --git a/src/i18n/content/kr/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx b/src/i18n/content/kr/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx deleted file mode 100644 index 183cb049cb4..00000000000 --- a/src/i18n/content/kr/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx +++ /dev/null @@ -1,425 +0,0 @@ ---- -title: 세션 재생 -metaDescription: Play back user interactions to debug faster and improve page performance. -freshnessValidatedDate: '2024-11-11T00:00:00.000Z' -translationType: machine ---- - -세션 리플레이는 귀하의 웹 앱에서 블록 커넥터를 캡처하고 다른 텔리메트리 데이터를 매핑하여 사용자의 여정을 이해하는 데 도움을 줍니다. 세션 리플레이는 다음과 같은 문제 해결 및 최종 사용자 환경 개선에 사용될 수 있습니다. - -* **JavaScript 오류 해결**: 오류가 발생했을 때 사용자가 무엇을 하고 있었는지 확인하여 오류 원인을 해결합니다. 예를 들어, 최종 사용자가 전자상거래를 완료하려고 시도하는 동안 오류가 발생하는 경우 세션 재생을 사용하여 오류가 발생하기 전에 수행한 단계와 입력한 데이터를 확인할 수 있습니다. 이를 통해 문제의 근본 원인을 신속하게 파악하고 해결하는 데 도움이 됩니다. -* **사용자 경험 개선**: 사용자에게 불만을 야기하는 웹 앱 영역을 발견합니다. 예를 들어 사용자가 탐색 중에 길을 잃거나 아무 작업도 수행하지 않는 버튼을 클릭하는 것을 볼 수 있습니다. -* **주요 사용자 여정의 문제 식별**: 성능 문제를 일으키는 웹 앱 영역을 식별합니다. 예를 들어 세션 재생을 통해 `/cart/checkout` 페이지에서 과도한 페이지 로드 시간이 발생하고 있는 것으로 나타나면 이 중요한 사용자 경험을 해결하는 데 우선순위를 두어야 합니다. - -Screenshot of session replay details - -## 세션 재생 작동 방식 [#how-it-works] - -사용자가 웹페이지를 로드하면 세션 리플레이는 페이지의 구조와 시각적 요소를 나타내는 DOM(문서 객체 모델)의 스냅샷을 찍습니다. 정확한 스타일 정보를 보장하기 위해 브라우저 에이전트는 CSS 파일에 액세스합니다. 그런 다음 에이전트는 이러한 스타일을 재생 녹음에 직접 통합하므로 재생 중에 외부 CSS 파일을 참조할 필요가 없습니다. 사용자가 페이지와 상호 작용할 때 브라우저 에이전트 내의 라이브러리는 DOM에 대한 모든 변경 사항을 캡처합니다. 이렇게 캡처된 데이터는 뉴렐릭의 데이터베이스에 안전하게 저장됩니다. - -리플레이는 최대 다음까지 저장됩니다. - -* 사용자 세션 4시간 -* 30분 동안 활동 없음 - -기본적으로 브라우저 이벤트 데이터는 8일 동안 저장되지만 실제 데이터 보존 기간은 계정에 따라 다릅니다. - -세션 리플레이에 대한 자세한 내용은 다음 섹션을 참조하세요. - -* [데이터 소비](#data-consumption): 데이터 소비를 보거나 계획합니다. -* [사용자 개인 정보 보호 및 보안 문제](#data-security): 당사가 사용자 데이터를 보호하고 개인 정보 보호 요구 사항을 충족하는 방법을 알아보세요. -* [세션 리플레이 및 앱 성능](#app-performance): 세션 리플레이가 앱 성능에 미치는 영향을 최소화하는 방법을 알아보세요. - -## 시작하다 [#get-started] - - - - ### 세션 리플레이 활성화 [#enable-configure-settings] - - 1. **[one.newrelic.com](https://one.newrelic.com/all-capabilities) &gt; All Capabilities &gt; Browser** 으)로 이동합니다. - 2. 브라우저 앱을 선택하세요. - 3. 왼쪽 메뉴에서 **Application settings** 클릭합니다. - 4. 애플리케이션 설정 페이지에서 **Pro** 또는 **Pro + SPA** 브라우저 에이전트가 선택되어 있는지 확인하세요. 세션 리플레이는 Lite 브라우저 에이전트에 사용할 수 없습니다. - 5. **Session tracking****Session replay** 설정을 켜기로 전환합니다. - - - - ### 샘플링 속도 구성 [#configure-sampling-rates] - - 다음 샘플에 대해 샘플링 속도(0%-100%)를 설정합니다. - - * **User sessions** 모든 사용자 세션의 무작위 샘플을 기록합니다. - - * **Errored session** 오류가 발생한 모든 세션의 무작위 샘플을 기록합니다. 에이전트는 클라이언트 측에서 최대 30초 동안 데이터 슬라이딩 창을 버퍼링하며, 오류가 발생하면 버퍼링된 데이터가 수집되고 세션의 나머지 부분이 기록됩니다. 오류가 발생하지 않으면 재생이 수집되지 않습니다. - - 예를 들어 세션 샘플링 비율을 50%로 설정하고 오류 샘플링 비율을 100%로 설정하면 다음을 의미합니다. - - * 전체 사용자 세션의 절반이 녹화됩니다. - - * 오류가 발생한 모든 세션은 50% 샘플에 속하지 않더라도 기록됩니다. - - - - ### (선택사항) 개인정보 보호 설정 구성 [#configure-privacy-settings] - - 기본적으로 모든 텍스트와 입력은 별표로 대체됩니다. 다음은 기본 개인 정보 보호를 사용하여 재생이 어떻게 보이는지에 대한 예입니다. - - Example of default privacy settings - - 이 설정이 적절하다면 다음 단계로 이동하세요. - - 캡처되는 콘텐츠 또는 사용자 입력을 사용자 정의해야 하는 경우 특정 클래스 및 콘텐츠 또는 사용자 입력의 속성을 마스크, 차단 또는 무시할 수 있는 옵션이 있습니다. 개인정보 보호 설정을 변경하기 전에 반드시 개인정보 보호팀에 문의하세요. - - ### 민감한 텍스트 마스크 [#mask-text] - - 민감한 텍스트를 마스크할 수 있습니다. 즉, 텍스트가 별표(\*)로 대체됩니다. 예를 들어 URL에 표시되는 사용자의 계정 ID를 마스크할 수 있습니다. - - 어떤 입력을 마스킹할지 지정하려면 다음과 같은 몇 가지 옵션이 있습니다. - - * **Application settings** 페이지에서 자체 CSS 선택기를 추가하거나 마스킹 상자를 선택하세요. 마스크 선택기를 사용하면 마스크 사용자 입력이 되지 **않으므로** , 사용자 입력을 숨겨야 하는 경우에는 블록 선택기를 사용하는 것이 좋습니다. - - Screenshot of mask settings in the ui - - * 웹페이지 HTML에 CSS 클래스 `nr-mask` 또는 속성 `data-nr-mask` 을 추가하세요. 예를 들어, 계정 ID를 URL에 표시하지 않으려면 계정 ID가 포함된 `
` 에 `nr-mask` 추가하세요. - - ````html -
Account ID: 99881123
- ``` - ```` - - 이러한 옵션은 별표(\*)를 사용하여 해당 요소의 모든 텍스트를 마스크하여 실제 텍스트를 숨기지만 입력한 문자 수는 표시합니다. 그러나 별표는 유효한 숫자가 아니므로 전화번호 또는 신용카드 번호와 같은 번호 유형별 필드를 마스킹하면 재생 시 빈 필드가 표시됩니다. - - ### 사이트 콘텐츠 차단 [#block-content] - - 사이트 콘텐츠의 전체 섹션을 차단할 수 있습니다. 즉, 해당 섹션은 세션 리플레이에서 빈 플레이스홀더로 표시됩니다. 예를 들어 회사 소개 웹페이지에 이미지가 있고 이를 캡처할 필요가 없는 경우 해당 이미지가 포함된 클래스를 차단할 수 있습니다. - - 특정 클래스나 속성을 차단하려면 다음과 같은 몇 가지 옵션이 있습니다. - - * 애플리케이션 설정 페이지에서 \**블록 선택기* 필드에 CSS 선택기를 추가합니다. - - Screenshot of session replay settings - - * 웹페이지 HTML에 CSS 클래스 `nr-block` 또는 속성 `data-nr-block` 을 수동으로 추가하세요. 예를 들어 세션 재생에서 관련 없는 텍스트와 이미지를 차단하려면 `
` 에 `nr-block` 추가하세요. - - ```html - - - Sample image and text - - -
- Image description -
- - - ``` - - ### 사용자 입력 무시 [#ignore-input] - - 사용자 입력 필드에 대한 변경 사항을 무시할 수 있습니다. 즉, 입력 필드가 재생에 계속 표시되지만 값에 대한 변경 사항은 표시되지 않습니다. 예를 들어 이메일 주소나 신용 카드 필드가 포함된 클래스를 무시할 수 있습니다. 비밀번호 입력 필드는 항상 마스크되어 있습니다.  - - 입력을 무시하려면 CSS 클래스 `nr-ignore` 입력 필드의 클래스 이름에 추가하세요. 예를 들어, 결제 페이지의 민감한 정보를 무시하려면 `` 에 `class="nr-ignore"` 추가하세요. - - ```html -
-

Sensitive Information

-

Credit card number:

-

Expiration date:

-

CVV code:

-
- ``` - - - - ### (복사/붙여넣기 배포된 에이전트의 경우) JavaScript 코드 조각을 수동으로 업데이트합니다. [#update-snippet] - - 복사/붙여넣기 방법을 사용하여 브라우저 에이전트를 구현하는 경우 UI 에서 다시 복사/붙여넣기해야 합니다. 세션 리플레이를 활성화하면 JavaScript 스니펫이 새로운 구성 업데이트를 포함하도록 업데이트되기 때문입니다. - - 에이전트 코드를 업데이트하려면: - - 1. **Application Settings** 페이지로 이동하여 자바스크립트 스니펫을 복사하세요. - - Screenshot of the application settings page. - - 2. 이전 코드 조각이 있던 코드에 붙여넣으세요. - - 3. 앱을 배포합니다. - - - - ### New Relic에서 세션 재생 보기 [#view-data] - - 세션 리플레이는 두 곳에서 찾을 수 있습니다: - - * **Session replay** 페이지에서: - - 1. **[one.newrelic.com > All Capabilities](https://one.newrelic.com/all-capabilities) &gt; Browser** 으)로 이동합니다. - - 2. 브라우저 앱을 선택하세요. - - 3. 왼쪽 메뉴에서 아래로 스크롤하여 **Session replay** 클릭합니다. - - 4. 각 재생을 클릭하면 세션 세부정보를 볼 수 있습니다. - - screenshot of the session replay page in browser - - * **Errors inbox** 페이지에서: - - 1. 왼쪽 브라우저 메뉴에서 **Errors** 클릭합니다. - - 2. 오류에 첨부된 재생을 보려면 **Triage****Group errors** 페이지를 클릭하세요. - - Screenshot of replays in errors inbox - - - -## 문제점 해결 [#troubleshoot] - - - - ### 문제 - - 세션 재생 기능이 활성화되었지만 재생이 표시되지 않습니다. - - ### 해결책 - - 가능한 몇 가지 수정 사항은 다음과 같습니다. - - * 샘플링 속도를 확인하세요. 재생과 오류 모두에 대한 샘플링이 있습니다. - - * 리플레이를 볼 수 있는 권한이 있는지 확인하세요. - - * Pro 또는 Pro+SPA 버전의 브라우저 에이전트를 사용하고 있는지 확인하세요. 세션 재생은 Lite 브라우저 에이전트에서 작동하지 않습니다. - - * 브라우저 에이전트가 다음 요구 사항을 충족하는지 확인하세요. - - * 에이전트 버전 v1.260.0 이상. 지속적인 개선을 위해 [최신 에이전트 버전으로 업그레이드하는](/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes) 것이 좋습니다. - * 에이전트 유형: Pro 또는 Pro+SPA. 세션 재생은 Lite 브라우저 에이전트에서 작동하지 않습니다. - * [세션 추적이](/docs/browser/browser-monitoring/browser-pro-features/session-traces-explore-webpages-life-cycle/#requirements) 활성화되었습니다. - - * 최종 사용자의 브라우저는 세션 리플레이를 기록하는 데 필요한 브라우저 수준 API 지원합니다( [MutationObserver](https://caniuse.com/mutationobserver) 에서 호환성 확인). - - * 는 [경우 인박스(errors inbox)](/docs/errors-inbox/errors-inbox/) 에서 항상 다시보기를 볼 수 있도록 보기를 필터링하세요. 기본적으로 브라우저 이벤트 데이터는 8일 동안 저장되지만 실제 데이터 보존 기간은 계정에 따라 다릅니다. - - * 복사/붙여넣기 배포 방법을 사용하는 경우 [에이전트 코드를 업데이트했는지](#update-snippet) 확인하세요. - - * APM 배포 방법을 사용하는 경우 세션 재생이 자동으로 활성화될 때까지 잠시 기다려야 할 수도 있습니다. 여전히 데이터가 표시되지 않으면 에이전트를 다시 시작해 보세요. - - * PageView 이벤트 데이터를 [삭제](https://docs.newrelic.com/docs/data-apis/manage-data/drop-data-using-nerdgraph/) 하는 경우 세션 리플레이가 UI 에 표시되지 않을 수 있습니다. - - - - ### 문제 - - 리플레이가 표시되지만 올바르게 표시되지 않습니다. - - 이는 CSS 파일이 별도의 도메인에서 호스팅되고 CORS(Cross-Origin Resource Sharing) 보안 조치로 인해 에이전트가 CSS 파일에 액세스하지 못하기 때문일 수 있습니다. 필수 스타일 정보가 누락될 수 있으므로 재생이 불완전하거나 부정확할 수 있습니다. - - 뒤에서 일어나는 일은 다음과 같습니다. - - * 세션 리플레이는 웹사이트의 구조와 시각적 요소를 포함하는 사용자의 DOM을 재구축하는 방식으로 작동합니다. 이를 달성하려면 에이전트가 CSS 파일에 액세스하여 스타일 정보를 정확하게 캡처해야 합니다. 그런 다음 이러한 스타일을 재생 녹음에 직접 인라인하여 재생 중에 원본 CSS 파일을 참조할 필요가 없습니다. - - * 귀하의 CSS 파일이 별도의 도메인에서 호스팅되는 경우 CORS는 당사 에이전트가 해당 파일에 액세스하는 것을 차단할 수 있습니다. - - ### 해결책 - - CSS 파일에 액세스할 수 있도록 하려면 HTML 코드 내의 `` 요소에 `crossorigin="anonymous"` 속성을 추가하세요. 이 속성은 브라우저에 특정 CSS 파일에 대한 교차 원본 액세스를 허용하도록 지시하여 브라우저 에이전트가 스타일 정보를 기록하고 통합할 수 있도록 합니다. - - 다음은 `crossorigin="anonymous"` 속성을 추가하는 예입니다. - - ``` - - ``` - - - - ### 문제 - - 세션 리플레이 기능이 활성화되었지만 iframe 콘텐츠에 대한 재생 데이터가 표시되지 않습니다. - - ### 해결책 - - iframe 시나리오에서 세션 리플레이의 동작은 iframe의 출처와 브라우저 에이전트의 배치에 따라 달라집니다. - - 웹 페이지가 자식 iframe이 있는 최상위 창으로 구성되어 있다고 가정할 때 다음과 같은 수정이 가능합니다. - - * **동일 출처 iframe**: - - * 브라우저 에이전트를 최상위 창에 배치하면 세션 리플레이가 창과 iframe을 모두 캡처합니다. - * iframe에 에이전트 에이전트를 배치하면 세션 리플레이는 iframe에 있는 내용만 캡처합니다. - * 브라우저 에이전트를 최상위 창과 iframe 모두에 배치하면 세션 리플레이는 창과 iframe 모두에서 독립적으로 일어나는 일을 캡처하여 두 개의 별도 세션을 생성합니다. - - * **교차 출처 iframe**: - - * 브라우저 에이전트를 최상위 창에 배치하면 세션 리플레이는 창에 있는 내용만 캡처합니다. 세션 리플레이에서는 iframe이 공백으로 표시됩니다. - * 브라우저 에이전트를 최상위 iframe에 배치하면 세션 리플레이는 iframe에 있는 내용만 캡처합니다. - - 세션 리플레이는 `` 요소와 호환되지 **않습니다** . - - - -## 세션 수동 녹화 리플레이 [#manual-replays] - -필요한 경우 프로그래밍 방식으로 세션 리플레이를 `force` 하여 API 메서드를 사용하여 녹화를 시작하거나 중지할 수 있습니다. 다음은 몇 가지 사용 사례입니다. - -* 사용자가 상호작용 녹음을 선택하도록 허용합니다. 예를 들어 "성능 분석을 위해 이 세션을 기록하도록 허용하시겠습니까?"라는 팝업이 표시된다면, 사용자는 다음에 동의합니다. - - 1. 녹음을 시작하려면 `newrelic.recordReplay()` 호출하세요. - 2. 세션이 완료되거나 동의가 철회되면 `newrelic.pauseReplay()` 사용하여 데이터 캡처를 중지합니다. - -* 다음과 같은 특정 기준에 따라 세션을 녹화합니다. - - * 제품 결제 흐름과 같은 특정 URL의 세션에 대해서만 녹화를 시작합니다. - * `/billing` 또는 `/health-records` 과 같은 민감한 페이지에 대한 기록을 중지합니다. - -지침은 API 문서를 참조하세요. - -* [`newrelic.recordReplay`](/docs/browser/new-relic-browser/browser-apis/recordReplay/) -* [`newrelic.pauseReplay`](/docs/browser/new-relic-browser/browser-apis/pauseReplay/) - -## 자동 세션 리플레이 추적 비활성화 [#auto-replays] - -API 설정 옵션 `autoStart` 을 `false`로 설정하면 샘플링된 경우에도 세션 리플레이가 자동으로 시작되지 않도록 할 수 있습니다. 이는 자동 샘플링보다 특정 작업의 우선 순위를 지정해야 하는 시나리오에 유용합니다. 예를 들어 세션 리플레이가 HIPAA 준수 페이지와 같은 민감한 페이지에서 자동으로 실행되는 것을 원하지 않을 수 있습니다. 이러한 경우에는 사용자 동의를 얻은 후(및 앱에서 `.start()` 호출) `.start()` API를 사용하여 재생 기능을 수동으로 트리거할 수 있습니다. - -`autoStart: false` 설정하면 `.start()` 사용하여 명시적으로 호출될 때까지 초기화를 연기하도록 에이전트에 지시합니다. 이렇게 하면 백앤드가 녹음을 위해 샘플을 샘플링하더라도 세션 리플레이가 전혀 생성되지 않습니다. - - - `.start()` 호출한다고 해서 세션 리플레이가 녹화된다는 보장은 없습니다. 이 시점까지는 모듈 가져오기 및 샘플링 결과 평가가 지연됩니다. 강제로 녹화해야 하는 경우 [세션 수동 녹화 리플레이를](#manual-replays) 참조하세요. - - -이 API 사용을 시작하려면 [`newrelic.start`](/docs/browser/new-relic-browser/browser-apis/start/) 참조하세요. - -## Nerdgraph를 사용하여 재생 설정 구성 [#nerdgraph-mutation] - -를 사용하는 대신 [NerdGraph API](/docs/apis/nerdgraph/get-started/introduction-new-relic-nerdgraph/) 사용하여 세션 리플레이 설정을 구성할 수 UI 있습니다. 이 방법은 여러 브라우저 모임에 샘플링 비율을 적용하는 등 대량 변경이 필요한 경우에 유용합니다. - -다음은 기본 설정으로 새 브라우저 애플리케이션을 생성하기 위한 변형 및 변수의 예입니다. - - - - - - - - - - - - - - - - - -
- 돌연변이 - - 변수 -
- ```graphql - mutation SessionReplayConfigUpdate($guid: EntityGuid!, $settings: AgentApplicationSettingsUpdateInput!) { - agentApplicationSettingsUpdate(guid: $guid, settings: $settings) { - browserSettings { - sessionReplay { - blockSelector - errorSamplingRate - maskTextSelector - enabled - collectFonts - inlineImages - inlineStylesheet - samplingRate - maskAllInputs - maskInputOptions { - color - date - datetimeLocal - email - month - number - range - search - select - tel - text - textArea - time - url - week - } - } - } - errors { - field - errorClass - description - } - } - } - ``` - - ```json - { - "sessionReplay": { - "enabled": true, - "collectFonts": true, - "blockSelector": ".private-fields", - "maskTextSelector": "*", - "inlineStylesheet": false, - "maskAllInputs": true, - "maskInputOptions": { - "color": true, - "date": true, - "textArea": true - }, - "samplingRate": 9.99, - "errorSamplingRate": 1.11 - } - } - ``` -
- -## 데이터 소비 [#data-consumption] - -세션 리플레이는 다른 브라우저 바이트와 동일한 소비 가격을 따릅니다. 생성되는 바이트 양은 세션 수, 길이, 사용자 활동 수준은 물론 사이트 DOM의 복잡성에 따라 달라집니다. - -재생당 비용을 예측하는 가장 정확한 방법은 짧은 테스트 기간 동안 기능을 활성화하고 실제 소비량을 측정하는 것입니다. 또는 대략적인 근사치로 재생당 평균 5.3MB를 사용할 수 있지만 실제 비용은 상당히 다를 수 있다는 점을 염두에 두십시오. 대략적인 비용을 예측하는 간단한 공식은 `sessions` x `sampling_rate` x `gb_per_replay` x `cost_per_gb` 입니다. 예는 다음과 같습니다. - -``` -1 million (sessions) x 5% (sampling_rate) x 0.0053 (gb_per_replay) x $0.35 (cost_per_gb) = $92.75 for 50,000 replays -``` - -소비를 제어하려면 [샘플링 속도를 조정하세요](#configure-sampling-rates). - -## 사용자 개인 정보 보호 및 보안 문제 [#data-security] - -우리는 데이터 개인 정보 보호를 최우선으로 생각하며 민감한 고객 정보의 노출 가능성을 최소화하기 위해 강력한 기본 설정으로 세션 리플레이를 구축했습니다. 특정 요구 사항에 맞게 [개인 정보 보호 설정을 추가로 사용자 정의](#configure-privacy-settings) 할 수 있습니다. - -세션 리플레이는 스크린샷이나 영상을 캡쳐하지 않습니다. 대신, 사용자 복합체를 재구성하는 데 필요한 필수 DOM 상태 변경 사항만 기록합니다. 이렇게 하면 저장되는 데이터의 양이 크게 줄어듭니다. - -### 데이터 개인 정보 보호법 준수 - -뉴렐릭은 GDPR 하에서는 프로세서 데이터 역할을 하고 CCPA 하에서는 서비스 공급업체 역할을 합니다. 이는 당사가 귀하의 지시에 따라 데이터를 처리한다는 것을 의미합니다. 궁극적으로 이러한 법률을 준수하는 것은 제작 내에서 세션 리플레이를 어떻게 구현하는지에 달려 있습니다. - -기본적으로 개인 데이터를 포함한 모든 텍스트와 사용자 입력은 녹음 내에서 마스킹됩니다. 필요한 경우 특정 요소를 선택적으로 마스크 해제할 수 있지만 기본값을 사용하면 개인 식별 정보가 쉽게 표시되지 않습니다. 이 접근 방식은 데이터 개인 정보 보호를 위한 강력한 기반을 제공하는 동시에 특정 요구 사항에 대한 유연성을 제공합니다. - -## 세션 리플레이와 앱의 성능 [#app-performance] - -세션 리플레이는 다음을 통해 앱 성능에 미치는 영향을 최소화합니다. - -* **초기 영향 최소화**: 세션 리플레이는 전체 페이지 로드 후 비동기식으로 로드되므로 초기 페이지 로드 성능 지표에 간섭이 발생하지 않습니다. - -* **DOM 돌연변이 추적**: 세션이 로드되면 세션 리플레이는 DOM 변경 사항을 모니터링하고 이를 압축된 페이로드로 보고합니다. 이러한 페이로드의 크기는 DOM 트리의 복잡성과 관련이 있습니다. - -* **성능 최적화 기술**: DOM이 큰 경우 페이로드 크기도 증가할 수 있습니다. 그러나 세션 리플레이는 페이로드 크기를 줄이기 위해 다음과 같은 다양한 기술을 사용합니다. - - * GZIP 압축 - - * 중복 감소 - - * 전략적 페이로드 수집: 전체 DOM이 캡처될 때만 대규모(압축) 페이로드를 보냅니다. 이는 일반적으로 재생 기능을 처음 가져올 때만 발생합니다. 그 후에는 사용자 작업과 관련된 작은 페이로드만 보냅니다. 브라우저 에이전트는 다음 중 먼저 발생하는 모든 항목을 수집합니다. - - * 페이로드가 압축된 64KB를 초과합니다. - * 60초 경과 - * 페이지 가시성 변경(탭 변경, 포커스, 탐색 등) - * 세션이 종료됩니다 \ No newline at end of file diff --git a/src/i18n/content/pt/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx b/src/i18n/content/pt/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx deleted file mode 100644 index b769228e92a..00000000000 --- a/src/i18n/content/pt/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx +++ /dev/null @@ -1,425 +0,0 @@ ---- -title: Session Replay -metaDescription: Play back user interactions to debug faster and improve page performance. -freshnessValidatedDate: '2024-11-11T00:00:00.000Z' -translationType: machine ---- - -O Session Replay captura a interação no seu aplicativo da web e mapeia outros dados de telemetria para ajudar você a entender as jornadas do seu usuário. O Session Replay pode ser utilizado para resolução de problemas e melhoria da experiência do usuário final, como: - -* **Resolução de problemas Erros de JavaScript**: Solucione a causa de um erro vendo o que o usuário estava fazendo quando o erro ocorreu. Por exemplo, se um usuário final receber um erro ao tentar concluir uma transação de comércio eletrônico, você poderá usar Session Replay para ver quais etapas ele realizou e quais dados ele inseriu antes do erro ocorrer. Isso pode ajudá-lo a identificar e corrigir rapidamente a causa raiz do problema. -* **Melhorando a experiência do usuário**: Descubra áreas do seu aplicativo web que estão causando frustração ao usuário. Por exemplo, você pode ver que o usuário está se perdendo na navegação ou clicando em botões que não fazem nada. -* **Identificando problemas nas principais jornadas do usuário**: identifique áreas do seu aplicativo Web que estão causando problemas de desempenho. Por exemplo, se Session Replay revelar que a página `/cart/checkout` está apresentando um ritmo de carregamento excessivo da página, você priorizará a correção dessa jornada crítica do usuário. - -Screenshot of session replay details - -## Como funciona Session Replay [#how-it-works] - -Quando um usuário carrega sua página da web, Session Replay tira um instantâneo do Document Object Model (DOM), que representa a estrutura e os elementos visuais da página. Para garantir informações de estilo precisas, o agente do browser acessa seus arquivos CSS. O agente então integra esses estilos diretamente na gravação de repetição, eliminando a necessidade de fazer referência a arquivos CSS externos durante a reprodução. À medida que o usuário interage com a página, uma biblioteca dentro do agente do browser captura todas as alterações feitas no DOM. Esses dados capturados são armazenados com segurança no banco de dados da New Relic. - -Os replays armazenam até: - -* 4 horas de uma sessão de usuário -* 30 minutos de inatividade - -Por padrão, os dados de eventos do browser são armazenados por 8 dias, mas a retenção real de dados depende da sua conta. - -Para obter mais detalhes sobre Session Replay, consulte as seções a seguir: - -* [Consumo de dados](#data-consumption): visualize ou projete o consumo de dados. -* [Preocupações com privacidade e segurança do usuário](#data-security): Saiba como protegemos os dados do seu usuário e atendemos aos requisitos de privacidade. -* [Session Replay e o desempenho do seu aplicativo](#app-performance): Saiba como Session Replay minimiza o impacto no desempenho do seu aplicativo. - -## Iniciar [#get-started] - - - - ### Habilitar Session Replay [#enable-configure-settings] - - 1. Vá para **[one.newrelic.com](https://one.newrelic.com/all-capabilities) &gt; All Capabilities &gt; Browser**. - 2. Selecione seu aplicativo de browser. - 3. No menu à esquerda, clique em **Application settings**. - 4. Na página Configurações do aplicativo, certifique-se de **Pro** ou **Pro + SPA** agente browser esteja selecionado. Session Replay não está disponível para o agente browser Lite. - 5. Ative as configurações **Session tracking** e **Session replay** . - - - - ### Configurar taxas de amostragem [#configure-sampling-rates] - - Defina uma taxa de amostragem (0%-100%) para as seguintes amostras: - - * **User sessions** registra uma amostra aleatória de todas as sessões do usuário. - - * **Errored session** registra uma amostra aleatória de todas as sessões com erros. O agente armazena em buffer uma janela deslizante de dados por até 30 segundos no lado do cliente e, se ocorrerem erros, os dados armazenados em buffer serão coletados e o restante da sessão será gravado. Se não ocorrer um erro, a reprodução nunca será coletada. - - Por exemplo, se você definir a taxa de amostragem da sessão como 50% e a taxa de amostragem de erro como 100%, isso significa que: - - * Metade de todas as sessões do usuário serão gravadas. - - * Todas as sessões com erro serão registradas, mesmo que não façam parte da amostra de 50%. - - - - ### (Opcional) Definir configurações de privacidade [#configure-privacy-settings] - - Por padrão, todos os textos e entradas são substituídos por asteriscos. Aqui está um exemplo da aparência de um replay com privacidade padrão: - - Example of default privacy settings - - Se esta configuração for apropriada, passe para a próxima etapa. - - Se precisar personalizar qual conteúdo ou entrada do usuário é capturado, você terá opções para mascarar, bloquear ou ignorar classes específicas e atributos de conteúdo ou entrada do usuário. Certifique-se de verificar com sua equipe de privacidade antes de alterar as configurações de privacidade. - - ### Mascarar texto sensível [#mask-text] - - Você pode mascarar texto confidencial, o que significa que o texto será substituído por asteriscos (\*). Por exemplo, você pode mascarar o ID da conta de um usuário exibido em um URL. - - Para especificar qual entrada deve ser mascarada, você tem algumas opções: - - * Na página **Application settings** , adicione seus próprios seletores CSS ou marque as caixas de mascaramento. Observe que o uso de seletores de mascarar **não** irá mascarar a entrada do usuário, portanto, se você precisar ocultar a entrada do usuário, recomendamos o uso de seletores de bloco. - - Screenshot of mask settings in the ui - - * Adicione nossa classe CSS `nr-mask` ou atributo `data-nr-mask` ao HTML da sua página da web. Por exemplo, para impedir que um ID de conta seja exibido no URL, adicione `nr-mask` ao `
` que contém o ID da conta: - - ````html -
Account ID: 99881123
- ``` - ```` - - Essas opções usam um asterisco (\*) para mascarar todo o texto desse elemento, ocultando o texto real, mas revelando o número de caracteres inseridos. No entanto, os asteriscos não são números válidos, portanto, mascarar campos específicos do tipo de número, como números de telefone ou de cartão de crédito, resultará em um campo em branco em uma repetição. - - ### Bloquear conteúdo do site [#block-content] - - Você pode bloquear seções inteiras de conteúdo do seu site, o que significa que a seção aparecerá como um espaço vazio reservado no Session Replay. Por exemplo, se você tiver uma imagem em sua página Sobre nós e não precisar capturá-la, poderá bloquear a classe que contém a imagem. - - Para bloquear aulas ou atributos específicos, você tem algumas opções: - - * Na página Configurações do aplicativo, adicione seus seletores CSS no campo \**Seletores de bloco* . - - Screenshot of session replay settings - - * Adicione manualmente nossa classe CSS `nr-block` ou atributo `data-nr-block` ao HTML da sua página da web. Por exemplo, se você quiser bloquear textos e imagens irrelevantes do Session Replay, adicione `nr-block` a `
`: - - ```html - - - Sample image and text - - -
- Image description -
- - - ``` - - ### Ignorar a entrada do usuário [#ignore-input] - - Você pode ignorar as alterações em um campo de entrada do usuário, o que significa que o campo de entrada ainda será exibido na reprodução, mas você não exibirá as alterações no valor. Por exemplo, você pode ignorar a classe que contém o endereço de e-mail ou os campos do cartão de crédito. Os campos de entrada de senha são sempre mascarados.  - - Para ignorar a entrada, adicione a classe CSS `nr-ignore` ao nome da classe do campo de entrada. Por exemplo, se quiser ignorar informações confidenciais em uma página de faturamento, adicione `class="nr-ignore"` a ``: - - ```html -
-

Sensitive Information

-

Credit card number:

-

Expiration date:

-

CVV code:

-
- ``` - - - - ### (Para copiar/colar agente de implantação) Atualize manualmente o trecho JavaScript [#update-snippet] - - Se você implantar o navegador do agente usando o método copiar/colar, será necessário copiar/colar da interface novamente. Isso ocorre porque quando você ativa Session Replay, o trecho JavaScript é atualizado para incluir as novas atualizações de configuração. - - Para atualizar seu código de agente: - - 1. Vá para a página **Application Settings** e copie o trecho JavaScript. - - Screenshot of the application settings page. - - 2. Cole-o no seu código onde estava o trecho antigo. - - 3. Implantar seu aplicativo. - - - - ### Veja o replay da sessão no New Relic [#view-data] - - Você pode encontrar o Session Replay em dois lugares: - - * Na página **Session replay** : - - 1. Vá para **[one.newrelic.com > All Capabilities](https://one.newrelic.com/all-capabilities) &gt; Browser**. - - 2. Selecione seu aplicativo de browser. - - 3. No menu à esquerda, role para baixo e clique em **Session replay**. - - 4. Clique em cada replay para ver os detalhes da sessão. - - screenshot of the session replay page in browser - - * Na página **Errors inbox** : - - 1. No menu esquerdo do browser, clique em **Errors**. - - 2. Clique nas páginas **Triage** e **Group errors** para ver replays anexados aos erros. - - Screenshot of replays in errors inbox - - - -## Resolução de problemas [#troubleshoot] - - - - ### Problema - - O recurso Session Replay está ativado, mas você não vê nenhum replay. - - ### Solução - - Aqui estão algumas soluções possíveis: - - * Verifique suas taxas de amostragem. Há amostragem para replays e erros. - - * Certifique-se de ter permissão para ver replays. - - * Certifique-se de estar usando a versão Pro ou Pro+SPA do agente browser. Session Replay não funciona com o agente browser Lite. - - * Certifique-se de que seu browser agente atenda a estes requisitos: - - * Versão do agente v1.260.0 ou superior. Recomendamos [atualizar para a versão mais recente do agente](/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes) à medida que continuamos fazendo melhorias. - * Tipo de agente: Pro ou Pro+SPA. Session Replay não funciona com o agente browser Lite. - * [O rastreamento de sessão](/docs/browser/browser-monitoring/browser-pro-features/session-traces-explore-webpages-life-cycle/#requirements) está habilitado. - - * O navegador do seu usuário final suporta a API de nível de navegador necessária para gravar um Session Replay (verifique a compatibilidade em [MutationObserver](https://caniuse.com/mutationobserver)). - - * Em [Errors Inbox](/docs/errors-inbox/errors-inbox/), filtre suas visualizações para sempre ver uma repetição. Por padrão, os dados de eventos do browser são armazenados por 8 dias, mas a retenção real de dados depende da sua conta. - - * Se você estiver usando o método de implantação copiar/colar, [atualize o código do agente](#update-snippet). - - * Se você estiver usando o método de implantação APM, talvez seja necessário aguardar um pouco para que Session Replay seja ativado automaticamente. Se ainda não estiver vendo os dados, tente reiniciar o agente. - - * Se você estiver [descartando](https://docs.newrelic.com/docs/data-apis/manage-data/drop-data-using-nerdgraph/) dados de eventos do PageView, o Session Replay pode não ser exibido na interface. - - - - ### Problema - - Você está vendo replays, mas eles não estão sendo exibidos corretamente. - - Isso pode ocorrer porque seus arquivos CSS estão hospedados em um domínio separado e as medidas de segurança do Cross-Origin Resource Sharing (CORS) estão impedindo nosso agente de acessar os arquivos CSS. Isso pode resultar em replays incompletos ou imprecisos, pois podem faltar informações essenciais de estilo. - - Aqui está o que está acontecendo nos bastidores: - - * Session Replay funciona reconstruindo o DOM do usuário, que inclui a estrutura e os elementos visuais do seu site. Para conseguir isso, nosso agente precisa acessar seus arquivos CSS para capturar informações de estilo com precisão. Em seguida, incorporamos esses estilos diretamente na gravação do replay, eliminando a necessidade de fazer referência aos arquivos CSS originais durante a reprodução. - - * Se seus arquivos CSS estiverem hospedados em um domínio separado, o CORS poderá impedir que nosso agente os acesse. - - ### Solução - - Para garantir que seus arquivos CSS estejam acessíveis, adicione o atributo `crossorigin="anonymous"` aos elementos `` no código HTML. Este atributo instrui o browser a permitir acesso de origem cruzada para esses arquivos CSS específicos, permitindo que nosso browser agente registre e integre as informações de estilo. - - Aqui está um exemplo de adição do atributo `crossorigin="anonymous"` : - - ``` - - ``` - - - - ### Problema - - O recurso de repetição de sessão está habilitado, mas você não está vendo dados de repetição para conteúdo iframe. - - ### Solução - - O comportamento do Session Replay em cenários de iframe depende da origem do iframe e do posicionamento do navegador do agente. - - Supondo que uma página da web consiste em uma janela de nível superior com um iframe filho, aqui estão algumas correções possíveis: - - * **Iframes de mesma origem**: - - * Se você colocar o navegador do agente na janela de nível superior, o Session Replay capturará a janela e o iframe. - * Se você colocar o navegador do agente no iframe, o Session Replay capturará apenas o que estiver no iframe. - * Se você colocar o navegador do agente na janela de nível superior e no iframe, o Session Replay captura o que está acontecendo independentemente na janela e no iframe, resultando em duas sessões separadas. - - * **Iframes de origem cruzada**: - - * Se você colocar o navegador do agente na janela de nível superior, o Session Replay capturará apenas o que estiver na janela. O iframe aparecerá em branco no Session Replay. - * Se você colocar o navegador do agente no iframe de nível superior, o Session Replay capturará apenas o que estiver no iframe. - - O Session Replay **não** é compatível com elementos `` . - - - -## Gravar manualmente a repetição da sessão [#manual-replays] - -Se necessário, você pode `force` programaticamente uma Session Replay para iniciar ou interromper a gravação usando métodos API . Aqui estão alguns casos de uso: - -* Permitir que o usuário opte pela gravação de interação. Por exemplo, se você tiver um pop-up perguntando “Permitir que esta sessão seja gravada para análise de desempenho?” e um usuário consente: - - 1. Chame `newrelic.recordReplay()` para iniciar a gravação. - 2. Assim que a sessão for concluída ou o consentimento for retirado, use `newrelic.pauseReplay()` para interromper a captura de dados. - -* Grave sessões com base em critérios específicos, como: - - * Comece a gravar apenas sessões em URLs específicos, como um fluxo de checkout de produto. - * Interrompa a gravação de páginas confidenciais, como `/billing` ou `/health-records`. - -Consulte a documentação da API para obter instruções: - -* [`newrelic.recordReplay`](/docs/browser/new-relic-browser/browser-apis/recordReplay/) -* [`newrelic.pauseReplay`](/docs/browser/new-relic-browser/browser-apis/pauseReplay/) - -## Desativar rastreamento automático Session Replay [#auto-replays] - -Você pode impedir que a repetição da sessão seja iniciada automaticamente, mesmo quando amostrada, definindo a opção de configuração API `autoStart` como `false`. Isto é útil em cenários onde você precisa priorizar ações específicas em vez de amostragem automática. Por exemplo, você pode não querer que o Session Replay seja executado automaticamente em páginas confidenciais, como as compatíveis com HIPAA. Nesses casos, você pode usar a API `.start()` para acionar manualmente o recurso de reprodução depois que o consentimento do usuário for obtido (e seu aplicativo chamar `.start()`) - -A configuração `autoStart: false` instrui o agente a adiar sua inicialização até ser chamado explicitamente usando `.start()`. Isso garante que o Session Replay não será criado, mesmo que o backend faça uma amostra do seu aplicativo para gravação. - - - Chamar `.start()` não garante que uma Session Replay será gravada. Simplesmente atrasa a importação do módulo e a avaliação dos resultados da amostragem até este ponto. Se você precisar forçar uma gravação, consulte [Gravar manualmente a repetição da sessão](#manual-replays). - - -Para começar a usar esta API, consulte [`newrelic.start`](/docs/browser/new-relic-browser/browser-apis/start/). - -## Use o Nerdgraph para definir as configurações de reprodução [#nerdgraph-mutation] - -Você pode definir as configurações Session Replay usando nossa [API NerdGraph](/docs/apis/nerdgraph/get-started/introduction-new-relic-nerdgraph/) em vez de usar a interface. Este método é útil se você precisar fazer alterações em massa, como aplicar taxas de amostragem a múltiplas entidades do browser. - -Aqui está um exemplo de mutação e variáveis para criar um novo aplicativo de browser com configurações padrão: - - - - - - - - - - - - - - - - - -
- Mutação - - Variáveis -
- ```graphql - mutation SessionReplayConfigUpdate($guid: EntityGuid!, $settings: AgentApplicationSettingsUpdateInput!) { - agentApplicationSettingsUpdate(guid: $guid, settings: $settings) { - browserSettings { - sessionReplay { - blockSelector - errorSamplingRate - maskTextSelector - enabled - collectFonts - inlineImages - inlineStylesheet - samplingRate - maskAllInputs - maskInputOptions { - color - date - datetimeLocal - email - month - number - range - search - select - tel - text - textArea - time - url - week - } - } - } - errors { - field - errorClass - description - } - } - } - ``` - - ```json - { - "sessionReplay": { - "enabled": true, - "collectFonts": true, - "blockSelector": ".private-fields", - "maskTextSelector": "*", - "inlineStylesheet": false, - "maskAllInputs": true, - "maskInputOptions": { - "color": true, - "date": true, - "textArea": true - }, - "samplingRate": 9.99, - "errorSamplingRate": 1.11 - } - } - ``` -
- -## Consumo de dados [#data-consumption] - -Session Replay segue o mesmo preço de consumo dos demais bytes do navegador. A quantidade de bytes produzidos depende da contagem, duração e níveis de atividade do usuário nas sessões, bem como da complexidade do DOM do seu site. - -A maneira mais precisa de projetar seu custo por repetição é ativar o recurso por um curto período de teste e medir seu consumo real. Como alternativa, você pode usar uma média de 5,3 MB por replay como uma aproximação aproximada, mas lembre-se de que seu custo real pode variar significativamente. Uma fórmula simples para projetar seus custos aproximados é: `sessions` x `sampling_rate` x `gb_per_replay` x `cost_per_gb`. Aqui está um exemplo: - -``` -1 million (sessions) x 5% (sampling_rate) x 0.0053 (gb_per_replay) x $0.35 (cost_per_gb) = $92.75 for 50,000 replays -``` - -Para controlar seu consumo, [ajuste suas taxas de amostragem](#configure-sampling-rates). - -## Preocupações com privacidade e segurança do usuário [#data-security] - -Priorizamos a privacidade dos dados e construímos Session Replay com configurações padrão fortes para minimizar a exposição potencial de informações confidenciais dos clientes. Você pode [personalizar ainda mais as configurações de privacidade](#configure-privacy-settings) para atender às suas necessidades específicas. - -Session Replay não captura captura de tela ou vídeos. Em vez disso, ele registra apenas as mudanças essenciais de estado DOM necessárias para reconstruir a interação do usuário. Isso reduz significativamente a quantidade de dados armazenados. - -### Conformidade com as leis de privacidade de dados - -New Relic atua como processadora de dados sob GDPR e provedora de serviço sob CCPA. Isto significa que processamos dados de acordo com as suas instruções. Em última análise, a conformidade com essas leis depende de como você implementa Session Replay em seu aplicativo. - -Por padrão, todos os textos e entradas do usuário, incluindo dados pessoais, são mascarados nas gravações. Você pode desmascarar seletivamente elementos específicos, se necessário, mas o padrão garante que nenhuma informação de identificação pessoal esteja prontamente visível. Essa abordagem fornece uma base sólida para a privacidade de dados, ao mesmo tempo que oferece flexibilidade para suas necessidades específicas. - -## Session Replay e o desempenho do seu aplicativo [#app-performance] - -Session Replay minimiza o impacto no desempenho do seu aplicativo com: - -* **Impacto inicial mínimo**: Session Replay carrega de forma assíncrona após o carregamento completo da página, garantindo nenhuma interferência na métrica de desempenho de carregamento inicial da página. - -* **Rastreamento de mutação DOM **: uma vez carregado, Session Replay monitora as alterações DOM e as relata como carga compactada. O tamanho dessa carga está correlacionado com a complexidade da árvore DOM . - -* **Técnicas de otimização de desempenho**: O tamanho da carga útil também pode aumentar se o DOM for grande. No entanto, Session Replay utiliza diversas técnicas para reduzir o tamanho da carga, como: - - * Compressão GZIP - - * Redução de duplicação - - * Coleta estratégica de carga útil: ela só envia uma carga útil grande (compactada) quando o DOM completo é capturado, o que normalmente só acontece quando o recurso de reprodução é importado pela primeira vez. Depois disso, enviará apenas pequenas cargas relacionadas às ações do usuário. O agente do browser coletará o que acontecer primeiro entre os seguintes: - - * A carga atinge mais de 64 KB compactados - * 60 segundos se passam - * A visibilidade das mudanças da página (mudança de guia, foco, navegação, etc) - * A sessão termina \ No newline at end of file From 4722505b73284786e1ffebf8fd4af3095dc88e5e Mon Sep 17 00:00:00 2001 From: adutta-newrelic Date: Tue, 24 Dec 2024 11:57:35 +0530 Subject: [PATCH 08/67] Updates --- .../session-replay/configuration/setup-session-replay.mdx | 2 +- .../manage-session-replay-modify-capabilities.mdx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx index 6c7ee1c3f18..db254966c37 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/configuration/setup-session-replay.mdx @@ -19,7 +19,7 @@ Utilize session replay in New Relic, start by enabling this feature in your brow 5. Toggle **Session traces** and **Session replay** ON. - If you are unable to view **Session traces** and **Session replay** settings. Contact your admin for further assistance. + If you are unable to view **Session replay** settings. Contact your admin for further assistance. ## Setting sampling rates [#configure-sampling-rates] diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx index 2d0df043e45..c1f330f54d7 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/manage-session-replay-modify-capabilities.mdx @@ -51,8 +51,8 @@ Manage session replay and modification capabilities using the user management ac In the **Browser** section, you may: - - Grant read-only access to **Session replays**, select the **View** checkbox and ensure the **Modify** checkbox is not selected. - - Grant modify access to **Session replays, select both the **View** and **Modify** checkboxes. + - Select the **View** checkbox and ensure the **Modify** checkbox is not selected to grant read-only access to **Session replays**. + - Select both **View** and **Modify** checkboxes to grant modify access to **Session replays**,. Date: Thu, 16 Jan 2025 16:25:27 -0500 Subject: [PATCH 09/67] add sqs docs for java apm --- .../instrument-aws-sqs-message-queues.mdx | 145 ++++++++++++++++++ src/nav/apm.yml | 2 + 2 files changed, 147 insertions(+) create mode 100644 src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx diff --git a/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx b/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx new file mode 100644 index 00000000000..be7b45723f7 --- /dev/null +++ b/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx @@ -0,0 +1,145 @@ +--- +title: Use AWS SQS for message queues +tags: + - Agents + - Java agent + - Instrumentation +metaDescription: "How to improve instrumentation of the Amazon SQS SDK for Java applications using New Relic's APM" +redirects: + - /docs/agents/java-agent/instrumentation//instrument-aws-sqs-message-queues +freshnessValidatedDate: never +--- + +The Java Agent suports instrumentation for AWS SQS message queues. Our SQS instrumentation creates message broker traces but customers +may want additional information about the usage of the SQS SDK. This document provides examples on how to accomplish it. + +To see all supported SQS libraries, check the [Java compatibility and requirements page](/docs/agents/java-agent/getting-started/compatibility-requirements-java-agent). + +## View SQS Distributed Tracing + +Out of the box, our AWS SQS SDK instrumentation adds distributed trace headers as message attributes to SQS messages. +However for message recieven operations, we do not provide an out of the box way to accept these headers. +Instead we recommend cxustomers to use custom instrumentation to read the distributed trace headers. + +Here is an example of how to read the distributed trace headers from an SQS message using the V2 SDK: + + +```java + public void v2Retrieve(SqsClient sqsClient, String queueUrl) { + List msgs = receiveMessages(queueUrl); + for (Message msg : msgs) { + handleMessage(msg); + } + } + + // Since calling the SDK to recieve messages is a batch call, it is not recommended to accept distributed trace headers + // in the same transaction as the SDK call. Distributed traces can only have one parent span. + @Trace(dispatcher = true, metricName = "v2/receiveMessages") + public List receiveMessages(SqsClient sqsClient, String queueUrl) { + ReceiveMessageRequest request = ReceiveMessageRequest.builder() + .queueUrl(queueUrl) + .maxNumberOfMessages(10) + .build(); + + List messages = sqsClient.receiveMessage(request).messages(); + if (messages.isEmpty()) { + logger.info("[v2 API] No messages received"); + } + return messages; + } + + // Here we accept distributed trace headers in a seperate transaction from the SDK call. + @Trace(dispatcher = true, metricName = "v2/handleMessage") + public void handleMessage(Message msg, SqsClient sqsClient, String queueUrl) { + // We use a wrapper class that helps extract the distributed trace headers + SQSReceivedMessageHeaders headers = new SQSReceivedMessageHeaders(msg); + // Here we accept the distributed trace headers + NewRelic.getAgent().getTransaction().acceptDistributedTraceHeaders(TransportType.Other, headers); + + + // Process your message here + + DeleteMessageRequest deleteMessageRequest = DeleteMessageRequest.builder() + .queueUrl(queueUrl) + .receiptHandle(msg.receiptHandle()) + .build(); + sqsClient.deleteMessage(deleteMessageRequest); + } +``` + +Below is the wrapper class `SQSReceivedMessageHeaders` that extracts the distributed trace headers from the SQS message: + +```java +import com.newrelic.api.agent.HeaderType; +import com.newrelic.api.agent.Headers; +import software.amazon.awssdk.services.sqs.model.Message; +import software.amazon.awssdk.services.sqs.model.MessageAttributeValue; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class SQSReceivedMessageHeaders implements Headers { + + private Message message = null; + + public SQSReceivedMessageHeaders(Message msg) { + message = msg; + } + + @Override + public HeaderType getHeaderType() { + return HeaderType.MESSAGE; + } + + @Override + public String getHeader(String name) { + String value = null; + Map msgAttributes = message.messageAttributes(); + MessageAttributeValue msgAttributeValue = msgAttributes.get(name); + if(msgAttributeValue != null) { + if(msgAttributeValue.dataType().equalsIgnoreCase("string")) { + value = msgAttributeValue.stringValue(); + } + } + return value; + } + + @Override + public Collection getHeaders(String name) { + List list = new ArrayList(); + String value = getHeader(name); + if(value != null && !value.isEmpty()) { + list.add(value); + } + return list; + } + + @Override + public void setHeader(String name, String value) { + // Not supported + } + + @Override + public void addHeader(String name, String value) { + // Not supported + } + + @Override + public Collection getHeaderNames() { + if(message != null) { + Map attributes = message.messageAttributes(); + if(attributes != null) return attributes.keySet(); + } + return Collections.emptyList(); + } + + @Override + public boolean containsHeader(String name) { + return getHeaderNames().contains(name); + } + +} +``` \ No newline at end of file diff --git a/src/nav/apm.yml b/src/nav/apm.yml index b06a8c3dc18..39f9ae5072c 100644 --- a/src/nav/apm.yml +++ b/src/nav/apm.yml @@ -180,6 +180,8 @@ pages: path: /docs/new-relic-solutions/best-practices-guides/full-stack-observability/browser-monitoring-best-practices-java - title: Instrument Kafka message queues path: /docs/apm/agents/java-agent/instrumentation/java-agent-instrument-kafka-message-queues + - title: Instrument Amazon SQS + path: /docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues - title: Use RabbitMQ or JMS for message queues path: /docs/apm/agents/java-agent/instrumentation/use-rabbitmq-or-jms-message-queues - title: Instrumentation modules From 0c7f1e0ac35282342b6fb0b6582b811b78387357 Mon Sep 17 00:00:00 2001 From: Oren Ben-Meir Date: Thu, 16 Jan 2025 16:41:55 -0500 Subject: [PATCH 10/67] apply linter suggestions --- .../instrumentation/instrument-aws-sqs-message-queues.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx b/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx index be7b45723f7..6f472b84b38 100644 --- a/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx +++ b/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx @@ -11,14 +11,14 @@ freshnessValidatedDate: never --- The Java Agent suports instrumentation for AWS SQS message queues. Our SQS instrumentation creates message broker traces but customers -may want additional information about the usage of the SQS SDK. This document provides examples on how to accomplish it. +may want extra information about the usage of the SQS SDK. This document provides examples on how to do it. To see all supported SQS libraries, check the [Java compatibility and requirements page](/docs/agents/java-agent/getting-started/compatibility-requirements-java-agent). ## View SQS Distributed Tracing Out of the box, our AWS SQS SDK instrumentation adds distributed trace headers as message attributes to SQS messages. -However for message recieven operations, we do not provide an out of the box way to accept these headers. +However for message recieven operations, we don't offer an out of the box way to accept these headers. Instead we recommend cxustomers to use custom instrumentation to read the distributed trace headers. Here is an example of how to read the distributed trace headers from an SQS message using the V2 SDK: From 3c0cd40174f32e433df13682a134b111387cc044 Mon Sep 17 00:00:00 2001 From: Michele Locati Date: Wed, 22 Jan 2025 12:04:09 +0100 Subject: [PATCH 11/67] State that agent supports PHP 8.4 --- .../getting-started/php-agent-compatibility-requirements.mdx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/content/docs/apm/agents/php-agent/getting-started/php-agent-compatibility-requirements.mdx b/src/content/docs/apm/agents/php-agent/getting-started/php-agent-compatibility-requirements.mdx index 623d6b36d15..a7a5db16073 100644 --- a/src/content/docs/apm/agents/php-agent/getting-started/php-agent-compatibility-requirements.mdx +++ b/src/content/docs/apm/agents/php-agent/getting-started/php-agent-compatibility-requirements.mdx @@ -31,6 +31,11 @@ Before you [install the PHP agent](/docs/apm/agents/php-agent/installation), mak + + 8.4 + ≥ [11.5.0.18](/docs/release-notes/agent-release-notes/php-release-notes/php-agent-11-5-0-18/) + Yes + 8.3 ≥ [10.15.0.4](/docs/release-notes/agent-release-notes/php-release-notes/php-agent-10-15-0-4/) From 4caa9f0b6116bc460adc2ed37ff5aad380ba26dd Mon Sep 17 00:00:00 2001 From: newrelic707195 Date: Thu, 23 Jan 2025 07:09:13 +0530 Subject: [PATCH 12/67] PP Release TOC PP Release TOC --- .../agentic-ai/change-intelligence-tool.mdx | 53 +++++++++++++++ .../install-new-relic-github-copilot-app.mdx | 61 ++++++++++++++++++ .../agentic-ai/introduction-agentic-ai.mdx | 20 ++++++ src/nav/agentic-ai.yml | 9 +++ src/nav/root.yml | 2 + .../new-relic-co-pilot-extension-step-1.webp | Bin 0 -> 281954 bytes .../new-relic-co-pilot-extension-step-2.webp | Bin 0 -> 42046 bytes 7 files changed, 145 insertions(+) create mode 100644 src/content/docs/agentic-ai/change-intelligence-tool.mdx create mode 100644 src/content/docs/agentic-ai/install-new-relic-github-copilot-app.mdx create mode 100644 src/content/docs/agentic-ai/introduction-agentic-ai.mdx create mode 100644 src/nav/agentic-ai.yml create mode 100644 static/images/new-relic-co-pilot-extension-step-1.webp create mode 100644 static/images/new-relic-co-pilot-extension-step-2.webp diff --git a/src/content/docs/agentic-ai/change-intelligence-tool.mdx b/src/content/docs/agentic-ai/change-intelligence-tool.mdx new file mode 100644 index 00000000000..b625e5cb4ab --- /dev/null +++ b/src/content/docs/agentic-ai/change-intelligence-tool.mdx @@ -0,0 +1,53 @@ +--- +title: Change Intelligence Tool +--- +We are thrilled to introduce a new feature in New Relic that significantly enhances your ability to use GitHub Copilot chat to inquire about an application's performance post-deployment. This feature provides detailed insights into your application's performance and stability following each new deployment, enabling you to swiftly identify and address any issues that may arise, ensuring a smooth and reliable user experience. + +Your access to the New Relic observability platform grants you comprehensive visibility into all data related to your application. + +### Feature highlights + +- Tracking application performance post-deployment. +- **Aggregate report:** Provides a comprehensive summary of key performance metrics directly within your native GitHub Copilot experience, featuring: + - Security vulnerabilities: Identification of new security vulnerabilities detected since the last deployment. + - Log Issues: Detection of errors, warnings, or other log-related issues. + - Tracing Information: Detailed tracing data for in-depth analysis. + - Golden Signals: Alerts indicating anomalous values in latency, traffic, errors, or saturation. + - hreshold Alerts: Notifications for alerts that exceed predefined thresholds. + - Error Reporting: Comprehensive error tracking and reporting capabilities. +- **Direct Links:** Provides direct links to New Relic for further investigation of any surfaced issues, allowing for deeper insights and analysis. + +### Getting Started +To begin using the Change Intelligence tool for deployments, ensure that both [New Relic AI](/docs/new-relic-solutions/new-relic-one/core-concepts/new-relic-ai/#enable) and [Change Tracking](/docs/change-tracking/change-tracking-introduction/) are enabled. Detailed instructions for integrating the New Relic Change Tracking feature with GitHub Actions can be found [here](/docs/change-tracking/ci-cd/change-tracking-github-actions). + +### Steps +By adhering to these steps, you can efficiently generate a Change Intelligence Report to evaluate the impact of your deployments and make informed decisions. + +**Step 1: Enter the Initial Query**- + +- To generate a Change Intelligence Report, execute the following command in the GitHub Chat extension: + +- Prompt: Type `@newrelic how did my deployment for go?` + +- This command will produce an output prompting you to select an associated New Relic account. + +**Step 2: Select Account** + +- To analyze a specific account, enter the following command: + +- Prompt: Type `@newrelic select account ` or `use account ` + +**Step 3: Select Deployment** + +- To analyze a specific deployment, enter the following command: + +- Prompt: Type `@newrelic analyze deployment ` or just `` + +- This action will generate the Change Intelligence Report. + +**Information Outcomes** + +In GitHub Copilot chat, there are three possible outcome summaries: + 1. Deployment Successful: The deployment was successful, allowing the user to proceed with the operation. + 1. Deployment Unsuccessful: The deployment failed, necessitating a rollback by the user. Up to three reasons for the failure may be provided. + 1. Conditional Deployment: The deployment is expected to succeed, but the user must resolve one specific issue beforehand. diff --git a/src/content/docs/agentic-ai/install-new-relic-github-copilot-app.mdx b/src/content/docs/agentic-ai/install-new-relic-github-copilot-app.mdx new file mode 100644 index 00000000000..3de68145338 --- /dev/null +++ b/src/content/docs/agentic-ai/install-new-relic-github-copilot-app.mdx @@ -0,0 +1,61 @@ +--- +title: Install New Relic GitHub Copilot extension +--- +### Prerequisites + +Before getting started, review the following prerequisites to ensure a smooth setup process: + + 1. **VS Code:** Ensure you have Visual Studio Code installed on your machine. + 1. **GitHub Copilot Access:** Make sure you have access to [GitHub Copilot](https://github.com/features/copilot). + +**Step 1: Install GitHub Copilot Chat extension** + + 1. Launch Visual Studio Code. + 1. Navigate to the extensions view by selecting the extensions icon located in the activity bar on the side panel. + 1. In the search bar, type **GitHub Copilot Chat** and proceed to install the extension. + + New Relic Co-pilot Chat Extension + +**Step 2: Sign-in to GitHub** + + 1. Open the GitHub Copilot Chat extension by selecting its icon from the sidebar. + 1. Follow the on-screen prompts to sign in to GitHub. + + +Currently, the installation and authorization process applies to customers using **GitHub Enterprise Cloud**. If you are using **GitHub Enterprise Server** (on-premises), be aware that this functionality is not available. + + + New Relic Co-pilot Sign In + +**Step 3: Install New Relic Agent** + +1. Access to [New Relic Agent](https://github.com/marketplace/newrelic-copilot-extension) on GitHub MarketPlace. + +1. Click **Install it for free** to integrate the agent with your GitHub account. + +**Step 4: Use the New Relic Agent in GitHub Chat extension** + +Once the agent is installed, it can be used within the GitHub Chat extension in Visual Studio Code. The agent will assist with a variety of tasks and offer valuable insights. + + +**Step 5: Communicate with the New Relic Agent** + +To interact with the New Relic Agent, enter `@newrelic ` in the chat input box. This action will submit your message to the agent for processing. + +**Step 6: Initial sign-in prompt** + +Upon your initial attempt to use the agent, you will be prompted to sign in. Follow the provided instructions to complete the sign-in process. + +**Step 7: Agent functionality** + +After signing in, the New Relic Agent becomes fully operational and is ready to assist with various testing and monitoring tasks. + diff --git a/src/content/docs/agentic-ai/introduction-agentic-ai.mdx b/src/content/docs/agentic-ai/introduction-agentic-ai.mdx new file mode 100644 index 00000000000..368f0551d5b --- /dev/null +++ b/src/content/docs/agentic-ai/introduction-agentic-ai.mdx @@ -0,0 +1,20 @@ +--- +title: New Relic GitHub Copilot extension +--- + + + We're still working on this feature, but we'd love for you to try it out! New + Relic's proprietary and confidential information. For authorized users only. + Unauthorized uses and disclosures are prohibited. This feature is currently + provided as part of a preview pursuant to our [pre-release + policies](https://docs.newrelic.com/docs/licenses/license-information/referenced-policies/new-relic-pre-release-policy/). + + +We have successfully built a fleet of LLM-enabled agents that automate common research and troubleshooting tasks while facilitating cross-platform agentic orchestration. In this new reality, engineers and other software professionals can work seamlessly in any system of their choice. They can effortlessly prompt their genAI assistant to coordinate with other assistants to complete tasks on their behalf. This innovation is Codename: O11.ai. + +We have successfully leveraged an opportunity with MSFT/GH CoPilot to jumpstart this initiative. Together with MSFT/GH, we have co-developed a limited version of this product that integrates with GitHub CoPilot chat. We have continued to enhance and expand the initial integration, resulting in a more versatile offering that can be seamlessly integrated with a variety of tools across the SDLC/ITSM space. This solution is now capable of handling tasks across multiple domains in DevSecBizGitMLOps. + +Agentic AI: Integration and Setup Guide +Intro to Agentic AI +Partners, agents, and public API available +Setup guide to do the most of the new experience diff --git a/src/nav/agentic-ai.yml b/src/nav/agentic-ai.yml new file mode 100644 index 00000000000..2b463eb0db3 --- /dev/null +++ b/src/nav/agentic-ai.yml @@ -0,0 +1,9 @@ +title: Agentic AI +path: /docs/agentic-ai +pages: + - title: Introduction to Agentic AI + path: /docs/agentic-ai/introduction-agentic-ai + - title: Install Agentic AI + path: /docs/agentic-ai/install-new-relic-github-copilot-app + - title: Change Intelligence tool + path: /docs/agentic-ai/change-intelligence-tool diff --git a/src/nav/root.yml b/src/nav/root.yml index e6031683839..256c577e788 100644 --- a/src/nav/root.yml +++ b/src/nav/root.yml @@ -59,6 +59,8 @@ pages: path: iast - title: Vulnerability Management path: vuln-management + - title: Agentic AI + path: agentic-ai - title: Latest updates - title: Release notes path: release-notes diff --git a/static/images/new-relic-co-pilot-extension-step-1.webp b/static/images/new-relic-co-pilot-extension-step-1.webp new file mode 100644 index 0000000000000000000000000000000000000000..738a228119a898e8ec134374f79de56405734546 GIT binary patch literal 281954 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 L{@uzu*026QLaw&F literal 0 HcmV?d00001 From 4dd533cafb1f79024800de16788fc541730b32c4 Mon Sep 17 00:00:00 2001 From: Pavel Simsa Date: Thu, 23 Jan 2025 14:39:02 +0100 Subject: [PATCH 13/67] Fix convention for environment variables See https://opentelemetry.io/docs/collector/configuration/#environment-variables for details --- .../opentelemetry/lambda-opentelemetry-dotnet.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/serverless-function-monitoring/aws-lambda-monitoring/opentelemetry/lambda-opentelemetry-dotnet.mdx b/src/content/docs/serverless-function-monitoring/aws-lambda-monitoring/opentelemetry/lambda-opentelemetry-dotnet.mdx index 562546dc844..6e912205546 100644 --- a/src/content/docs/serverless-function-monitoring/aws-lambda-monitoring/opentelemetry/lambda-opentelemetry-dotnet.mdx +++ b/src/content/docs/serverless-function-monitoring/aws-lambda-monitoring/opentelemetry/lambda-opentelemetry-dotnet.mdx @@ -118,9 +118,9 @@ This guide assumes you have the following: exporters: otlp: - endpoint: ${NEW_RELIC_OPENTELEMETRY_ENDPOINT} + endpoint: ${env:NEW_RELIC_OPENTELEMETRY_ENDPOINT} headers: - api-key: ${NEW_RELIC_LICENSE_KEY} + api-key: ${env:NEW_RELIC_LICENSE_KEY} service: pipelines: From 3d6b58c8ba0e08ac09512abf5e9680ac6bb44acb Mon Sep 17 00:00:00 2001 From: Oren Ben-Meir Date: Fri, 24 Jan 2025 13:21:11 -0500 Subject: [PATCH 14/67] Improved sqs doc wording --- .../instrumentation/instrument-aws-sqs-message-queues.mdx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx b/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx index 6f472b84b38..b8f243fbbe2 100644 --- a/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx +++ b/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx @@ -1,5 +1,5 @@ --- -title: Use AWS SQS for message queues +title: Use Amazon SQS for message queues tags: - Agents - Java agent @@ -25,7 +25,8 @@ Here is an example of how to read the distributed trace headers from an SQS mess ```java - public void v2Retrieve(SqsClient sqsClient, String queueUrl) { + // This method will call the SDK to receive messages and then process them + public void readMessages(SqsClient sqsClient, String queueUrl) { List msgs = receiveMessages(queueUrl); for (Message msg : msgs) { handleMessage(msg); From 7693c9c5b4c8e1c1951c49ffa760437ed38b33b3 Mon Sep 17 00:00:00 2001 From: WriteMayur Date: Tue, 28 Jan 2025 15:06:50 +0530 Subject: [PATCH 15/67] updated the agentic AI --- .../agentic-ai/change-intelligence-tool.mdx | 83 ++++++++++++------- .../agentic-ai/github-copilot-integration.mdx | 52 ++++++++++++ .../install-new-relic-github-copilot-app.mdx | 61 -------------- .../agentic-ai/introduction-agentic-ai.mdx | 67 ++++++++++++--- src/nav/agentic-ai.yml | 8 +- src/nav/root.yml | 6 +- 6 files changed, 164 insertions(+), 113 deletions(-) create mode 100644 src/content/docs/agentic-ai/github-copilot-integration.mdx delete mode 100644 src/content/docs/agentic-ai/install-new-relic-github-copilot-app.mdx diff --git a/src/content/docs/agentic-ai/change-intelligence-tool.mdx b/src/content/docs/agentic-ai/change-intelligence-tool.mdx index b625e5cb4ab..639472e0a95 100644 --- a/src/content/docs/agentic-ai/change-intelligence-tool.mdx +++ b/src/content/docs/agentic-ai/change-intelligence-tool.mdx @@ -1,53 +1,72 @@ --- title: Change Intelligence Tool +metaDescription: "The Change Intelligence tool in New Relic provides detailed insights into your application's performance and stability following each new deployment, enabling you to swiftly identify and address any issues that may arise, ensuring a smooth and reliable user experience." +tags: + - GitHub Copilot Integration + - New Relic AI + - Agentic AI +freshnessValidatedDate: never --- -We are thrilled to introduce a new feature in New Relic that significantly enhances your ability to use GitHub Copilot chat to inquire about an application's performance post-deployment. This feature provides detailed insights into your application's performance and stability following each new deployment, enabling you to swiftly identify and address any issues that may arise, ensuring a smooth and reliable user experience. -Your access to the New Relic observability platform grants you comprehensive visibility into all data related to your application. -### Feature highlights +The Change Intelligence Tool within New Relic's Agentic Integration enhances your ability to assess application performance using GitHub Copilot chat. This tool allows users to inquire about performance metrics and system behavior following application deployment, providing real-time insights and facilitating efficient post-deployment analysis. This tool provides detailed insights into your application's performance and stability following each new deployment. This enables you to quickly identify and address any issues that may arise, ensuring a smooth and reliable user experience. + +Your access to the New Relic platform grants you comprehensive visibility into all data related to your application. -- Tracking application performance post-deployment. -- **Aggregate report:** Provides a comprehensive summary of key performance metrics directly within your native GitHub Copilot experience, featuring: - - Security vulnerabilities: Identification of new security vulnerabilities detected since the last deployment. - - Log Issues: Detection of errors, warnings, or other log-related issues. - - Tracing Information: Detailed tracing data for in-depth analysis. - - Golden Signals: Alerts indicating anomalous values in latency, traffic, errors, or saturation. - - hreshold Alerts: Notifications for alerts that exceed predefined thresholds. - - Error Reporting: Comprehensive error tracking and reporting capabilities. -- **Direct Links:** Provides direct links to New Relic for further investigation of any surfaced issues, allowing for deeper insights and analysis. -### Getting Started -To begin using the Change Intelligence tool for deployments, ensure that both [New Relic AI](/docs/new-relic-solutions/new-relic-one/core-concepts/new-relic-ai/#enable) and [Change Tracking](/docs/change-tracking/change-tracking-introduction/) are enabled. Detailed instructions for integrating the New Relic Change Tracking feature with GitHub Actions can be found [here](/docs/change-tracking/ci-cd/change-tracking-github-actions). +### Change Intelligence Features -### Steps -By adhering to these steps, you can efficiently generate a Change Intelligence Report to evaluate the impact of your deployments and make informed decisions. +The Change Intelligence tool offers a range of features to help you monitor and analyze your application's performance post-deployment: + +- Tracking application performance post-deployment. +- **Aggregate report**: Provides a comprehensive summary of key performance metrics directly within your native GitHub Copilot experience, such as: -**Step 1: Enter the Initial Query**- + - **Security vulnerabilities**: Identification of new security vulnerabilities detected since the last deployment. + - **Log Issues**: Detection of errors, warnings, or other log-related issues. + - **Tracing Information**: Detailed tracing data for in-depth analysis. + - **Golden Signals**: Alerts indicating anomalous values in latency, traffic, errors, or saturation. + - **Threshold Alerts**: Notifications for alerts that exceed predefined thresholds. + - **Error Reporting**: Comprehensive error tracking and reporting capabilities. -- To generate a Change Intelligence Report, execute the following command in the GitHub Chat extension: +- **Direct Links**: Provides direct links to New Relic for further investigation of any issues discovered, allowing for deeper insights and analysis. +- **Deployment Analysis**: Offers a detailed analysis of the deployment process, including the deployment number, status, and any issues encountered. -- Prompt: Type `@newrelic how did my deployment for go?` -- This command will produce an output prompting you to select an associated New Relic account. +### Use the Change Intelligence within GitHub Copilot -**Step 2: Select Account** -- To analyze a specific account, enter the following command: +**Prerequisites:** -- Prompt: Type `@newrelic select account ` or `use account ` +- Ensure that you have enabled both [New Relic AI](/docs/new-relic-solutions/new-relic-one/core-concepts/new-relic-ai/#enable) and [Change Tracking](/docs/change-tracking/change-tracking-introduction/). -**Step 3: Select Deployment** + -- To analyze a specific deployment, enter the following command: +For more information on integrating the New Relic Change Tracking feature with GitHub Actions, refer [Track changes with Github Actions](/docs/change-tracking/ci-cd/change-tracking-github-actions). -- Prompt: Type `@newrelic analyze deployment ` or just `` + -- This action will generate the Change Intelligence Report. -**Information Outcomes** +**To use change intelligence:** -In GitHub Copilot chat, there are three possible outcome summaries: - 1. Deployment Successful: The deployment was successful, allowing the user to proceed with the operation. - 1. Deployment Unsuccessful: The deployment failed, necessitating a rollback by the user. Up to three reasons for the failure may be provided. - 1. Conditional Deployment: The deployment is expected to succeed, but the user must resolve one specific issue beforehand. + + + + + + + + + + + + + + + + + + + + + +
ActionUse this prompt
To generate a Change Intelligence report`@newrelic how did my deployment for go?`
To analyze a specific account`@newrelic select account ` or `use account `
To analyze a specific deployment`@newrelic analyze deployment ` or ``
\ No newline at end of file diff --git a/src/content/docs/agentic-ai/github-copilot-integration.mdx b/src/content/docs/agentic-ai/github-copilot-integration.mdx new file mode 100644 index 00000000000..5f72f164a65 --- /dev/null +++ b/src/content/docs/agentic-ai/github-copilot-integration.mdx @@ -0,0 +1,52 @@ +--- +title: New Relic Agent for GitHub Copilot +metaDescription: "The New Relic agent for GitHub Copilot extension provides intelligent insights and guidance tailored to optimize application performance, monitor infrastructure, and manage deployments—all seamlessly integrated within GitHub Copilot." +tags: + - GitHub Copilot Integration + - New Relic AI + - Agentic AI +freshnessValidatedDate: never +--- + +The New Relic agent for GitHub Copilot extension provides intelligent insights and guidance tailored to optimize application performance, monitor infrastructure, and manage deployments—all seamlessly integrated within GitHub Copilot. + +This guide will walk you through the process of installing and using the New Relic agent within the GitHub Copilot extension. + +## Install the New Relic Agent in GitHub Copilot + +### Prerequisites + +Before getting started, review the following prerequisites to ensure a smooth setup process: + +- Visual Studio Code +- Access to [GitHub Copilot](https://github.com/features/copilot) +- [GitHub Copilot Chat](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat) extension in Visual Studio Code + + +**To install New Relic Agent in GitHub Copilot:** + +1. On GitHub MarketPlace, go to [New Relic Agent](https://github.com/marketplace/newrelic-copilot-extension). +2. Click **Add > Install it for free**. + + After the agent is installed, you can use it within the GitHub Chat extension in Visual Studio Code. For more information, refer [using the New Relic Agent in Copilot](#communicate-with-New-Relic-Agent-in-gitHub-copilot). + + +## Communicate with New Relic Agent in GitHub Copilot + +The New Relic agent within Github Copilot can assist with a variety of tasks and offer valuable insights. To interact with the New Relic Agent, in the Copilot chat input box, type `@newrelic`. + +### Sign-in to New Relic Agent + +When you initiate conversation for the first-time with New Relic Agent, you will be prompted to sign in. Follow the instructions to complete the sign-in process. + +### Chat message structure + +To interact with the New Relic Agent, enter your prompt as follows: + +``` @newrelic ``` + +Where: + +- `@newrelic`: Interaction with the New Relic Agent. +- ``: Action to submit to the agent for processing. + diff --git a/src/content/docs/agentic-ai/install-new-relic-github-copilot-app.mdx b/src/content/docs/agentic-ai/install-new-relic-github-copilot-app.mdx deleted file mode 100644 index 3de68145338..00000000000 --- a/src/content/docs/agentic-ai/install-new-relic-github-copilot-app.mdx +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Install New Relic GitHub Copilot extension ---- -### Prerequisites - -Before getting started, review the following prerequisites to ensure a smooth setup process: - - 1. **VS Code:** Ensure you have Visual Studio Code installed on your machine. - 1. **GitHub Copilot Access:** Make sure you have access to [GitHub Copilot](https://github.com/features/copilot). - -**Step 1: Install GitHub Copilot Chat extension** - - 1. Launch Visual Studio Code. - 1. Navigate to the extensions view by selecting the extensions icon located in the activity bar on the side panel. - 1. In the search bar, type **GitHub Copilot Chat** and proceed to install the extension. - - New Relic Co-pilot Chat Extension - -**Step 2: Sign-in to GitHub** - - 1. Open the GitHub Copilot Chat extension by selecting its icon from the sidebar. - 1. Follow the on-screen prompts to sign in to GitHub. - - -Currently, the installation and authorization process applies to customers using **GitHub Enterprise Cloud**. If you are using **GitHub Enterprise Server** (on-premises), be aware that this functionality is not available. - - - New Relic Co-pilot Sign In - -**Step 3: Install New Relic Agent** - -1. Access to [New Relic Agent](https://github.com/marketplace/newrelic-copilot-extension) on GitHub MarketPlace. - -1. Click **Install it for free** to integrate the agent with your GitHub account. - -**Step 4: Use the New Relic Agent in GitHub Chat extension** - -Once the agent is installed, it can be used within the GitHub Chat extension in Visual Studio Code. The agent will assist with a variety of tasks and offer valuable insights. - - -**Step 5: Communicate with the New Relic Agent** - -To interact with the New Relic Agent, enter `@newrelic ` in the chat input box. This action will submit your message to the agent for processing. - -**Step 6: Initial sign-in prompt** - -Upon your initial attempt to use the agent, you will be prompted to sign in. Follow the provided instructions to complete the sign-in process. - -**Step 7: Agent functionality** - -After signing in, the New Relic Agent becomes fully operational and is ready to assist with various testing and monitoring tasks. - diff --git a/src/content/docs/agentic-ai/introduction-agentic-ai.mdx b/src/content/docs/agentic-ai/introduction-agentic-ai.mdx index 368f0551d5b..270437dd6c0 100644 --- a/src/content/docs/agentic-ai/introduction-agentic-ai.mdx +++ b/src/content/docs/agentic-ai/introduction-agentic-ai.mdx @@ -1,20 +1,61 @@ --- -title: New Relic GitHub Copilot extension +title: Getting Started with New Relic Agentic Integration +metaDescription: "New Relic's Agentic Integration provides an AI-driven solution to automate and optimize observability workflows, enhancing system management and monitoring" +tags: + - GitHub Copilot Integration + - New Relic AI + - Agentic AI +freshnessValidatedDate: never --- - - We're still working on this feature, but we'd love for you to try it out! New - Relic's proprietary and confidential information. For authorized users only. - Unauthorized uses and disclosures are prohibited. This feature is currently - provided as part of a preview pursuant to our [pre-release - policies](https://docs.newrelic.com/docs/licenses/license-information/referenced-policies/new-relic-pre-release-policy/). + + We're still working on this feature, but we'd love for you to try it out! + + This feature is currently provided as part of a preview program pursuant to our [pre-release policies](/docs/licenses/license-information/referenced-policies/new-relic-pre-release-policy). -We have successfully built a fleet of LLM-enabled agents that automate common research and troubleshooting tasks while facilitating cross-platform agentic orchestration. In this new reality, engineers and other software professionals can work seamlessly in any system of their choice. They can effortlessly prompt their genAI assistant to coordinate with other assistants to complete tasks on their behalf. This innovation is Codename: O11.ai. +New Relic's Agentic Integration provides an AI-driven solution to automate and optimize observability workflows, enhancing system management and monitoring. This integration facilitates seamless operations by automating repetitive tasks through AI agents, reducing manual intervention. By integrating seamlessly with platforms such as, GitHub Copilot, Amazon Q, Gemini Code Assist, and ServiceNow, Agentic Integrations transform complex workflows into seamless operations. + + +## Key features + +- **Intelligent automation:** Leverage AI to automate and streamline complex workflows, reducing the need for manual tool-switching and enhancing productivity. +- **Enhanced observability:** Gain comprehensive insights into your systems, enabling faster detection, analysis, and resolution of incidents. +- **Seamless integration:** Connect with popular platforms such as GitHub Copilot to bring powerful analytics and insights directly into your existing workflows. + +## Current integrations + +### GitHub Copilot + +Integrate New Relic insights directly into your IDE with GitHub Copilot. You can use Agent AI to access logs, errors, and recommendations without leaving your coding environment. It provides real-time insights as they develop and deploy the application. + +This integration offers: + +- Automated deployment checks. +- Real-time alerts and error tracking. +- Probabilistic recommendations for deployment actions. + +For more information, refer [Getting Started with New Relic Agent for GitHub Copilot](/docs/agentic-ai/github-copilot-integration). + +## Tools + +Each agentic integration comes with various tools to use New Relic platform capabilities and provide observability insights, alerts, and predictions: + +- **Change intelligence:** The change intelligence tool assists you to understand and mitigate potential risks by providing comprehensive change analysis and forecasting. You can use this tool to gain instant insights into the impact of system changes. It helps you to assess the potential risks associated with deployments and configuration modifications. + +- **Alert Intelligence:** The Alert Intelligence tool offers advanced alert analysis to swiftly resolve incidents. It provides real-time notifications and immediate recommendations to prevent escalation. + + +## Pricing + +Agentic Integrations are available as part of the New Relic Advanced Compute SKU. Here's how the feature will be charged: + +- **Compute or Advanced Users:** If you are on a Compute or Advanced SKU, you will be charged for NRQLs (New Relic Query Language queries). +- **User-Based Pricing without Advanced SKU:** Customers on user-based pricing without the Advanced SKU will not be charged for NRQLs. + +For further details on pricing, please contact our sales team or refer to your specific contract terms. + -We have successfully leveraged an opportunity with MSFT/GH CoPilot to jumpstart this initiative. Together with MSFT/GH, we have co-developed a limited version of this product that integrates with GitHub CoPilot chat. We have continued to enhance and expand the initial integration, resulting in a more versatile offering that can be seamlessly integrated with a variety of tools across the SDLC/ITSM space. This solution is now capable of handling tasks across multiple domains in DevSecBizGitMLOps. +## Stay updated -Agentic AI: Integration and Setup Guide -Intro to Agentic AI -Partners, agents, and public API available -Setup guide to do the most of the new experience +This page will be continuously updated with new documentation and resources. We're committed to providing you with the leading edge in observability technology. Stay tuned for the latest developments and opportunities. diff --git a/src/nav/agentic-ai.yml b/src/nav/agentic-ai.yml index 2b463eb0db3..95baec9b44e 100644 --- a/src/nav/agentic-ai.yml +++ b/src/nav/agentic-ai.yml @@ -1,9 +1,9 @@ -title: Agentic AI +title: Agentic Integration path: /docs/agentic-ai pages: - - title: Introduction to Agentic AI + - title: Get started with agentic integration path: /docs/agentic-ai/introduction-agentic-ai - - title: Install Agentic AI - path: /docs/agentic-ai/install-new-relic-github-copilot-app + - title: Github Copilot integration + path: /docs/agentic-ai/github-copilot-integration - title: Change Intelligence tool path: /docs/agentic-ai/change-intelligence-tool diff --git a/src/nav/root.yml b/src/nav/root.yml index 256c577e788..1184cda0cf3 100644 --- a/src/nav/root.yml +++ b/src/nav/root.yml @@ -38,6 +38,8 @@ pages: - title: Website performance monitoring path: website-performance-monitoring - title: Data insights + - title: Agentic AI + path: agentic-ai - title: Alerts path: alerts - title: Change Tracking @@ -58,9 +60,7 @@ pages: - title: New Relic IAST path: iast - title: Vulnerability Management - path: vuln-management - - title: Agentic AI - path: agentic-ai + path: vuln-management - title: Latest updates - title: Release notes path: release-notes From 8b2ba79afb0e3bdb6ee391aea00705458e0f831f Mon Sep 17 00:00:00 2001 From: Browser Agent Team Date: Tue, 28 Jan 2025 15:22:04 +0000 Subject: [PATCH 16/67] chore: Add Browser agent v1.279.1 release notes --- .../browser-agent-v1.279.1.mdx | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/content/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes/browser-agent-v1.279.1.mdx diff --git a/src/content/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes/browser-agent-v1.279.1.mdx b/src/content/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes/browser-agent-v1.279.1.mdx new file mode 100644 index 00000000000..223839136d8 --- /dev/null +++ b/src/content/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes/browser-agent-v1.279.1.mdx @@ -0,0 +1,23 @@ +--- +subject: Browser agent +releaseDate: "2025-01-28" +version: 1.279.1 +features: [] +bugs: ["CLS timing node not being reported post new Harvester"] +security: [] +--- + +## v1.279.1 + +### Bug fixes + +#### CLS timing node not being reported post new Harvester +Re-introduce the `cumulativeLayoutShift` timing of `PageViewTiming` events into EoL harvests. After v1.278.0, this timing stopped being sent when the user leaves the page, resulting in a drop in CLS counts. The node contain attributes that aid in identifying the cause of bad scores. + +## Support statement + +New Relic recommends that you upgrade the agent regularly to ensure that you're getting the latest features and performance benefits. Older releases will no longer be supported when they reach [end-of-life](https://docs.newrelic.com/docs/browser/browser-monitoring/getting-started/browser-agent-eol-policy/). Release dates are reflective of the original publish date of the agent version. + +New browser agent releases are rolled out to customers in small stages over a period of time. Because of this, the date the release becomes accessible to your account may not match the original publish date. Please see this [status dashboard](https://newrelic.github.io/newrelic-browser-agent-release/) for more information. + +Consistent with our [browser support policy](https://docs.newrelic.com/docs/browser/new-relic-browser/getting-started/compatibility-requirements-browser-monitoring/#browser-types), v1.279.1 of the Browser agent was built for and tested against these browsers and version ranges: Chrome 122-132, Edge 122-132, Safari 17-17, and Firefox 124-134. For mobile devices, v1.279.1 was built and tested for Android OS 15 and iOS Safari 17-18.1. \ No newline at end of file From 2fa7b11c975caad366a220272ac14825b0107428 Mon Sep 17 00:00:00 2001 From: akashreddy Date: Wed, 29 Jan 2025 01:17:31 +0530 Subject: [PATCH 17/67] correct serialization to not skip new lines of mdx tables --- package.json | 4 +- scripts/actions/deserialize-html.mjs | 2 + scripts/actions/serialize-mdx.mjs | 2 + yarn.lock | 205 ++++++++++++++++++++++++++- 4 files changed, 208 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 717e00d3512..1d6d654b08c 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "rehype-format": "^5.0.0", "rehype-parse": "^7.0.1", "rehype-remark": "^8.0.0", + "remark-gfm": "^3.0.1", "remark-rehype": "^8.0.0", "rss": "^1.2.2", "sequelize": "^6.21.3", @@ -236,5 +237,6 @@ }, "bugs": { "url": "https://github.com/newrelic/docs-website/issues" - } + }, + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/scripts/actions/deserialize-html.mjs b/scripts/actions/deserialize-html.mjs index c3e2381d3bc..585e96941a6 100644 --- a/scripts/actions/deserialize-html.mjs +++ b/scripts/actions/deserialize-html.mjs @@ -14,6 +14,7 @@ import { encode as htmlEncode } from 'html-entities'; import handlers from './utils/handlers.mjs'; import { configuration } from './configuration.js'; +import remarkGfm from 'remark-gfm'; /** * Deserialize a node from the HTML AST into a node for the MDX AST. @@ -142,6 +143,7 @@ const processor = unified() // remark-mdx must come before remark-stringify, because it adds handlers // for MDX nodes like `mdxJsxTextElement` and otherwise, remark-stringfy // won't know how to stringify those nodes. + .use(remarkGfm) .use(remarkMdx) .use(stringify, { bullet: '*', diff --git a/scripts/actions/serialize-mdx.mjs b/scripts/actions/serialize-mdx.mjs index b1a9800b16b..d30f864916b 100644 --- a/scripts/actions/serialize-mdx.mjs +++ b/scripts/actions/serialize-mdx.mjs @@ -5,6 +5,7 @@ import toMDAST from 'remark-parse10'; import frontmatter from 'remark-frontmatter5'; import remarkMdx from 'remark-mdx2.3'; import remark2rehype from 'remark-rehype10'; +import remarkGfm from 'remark-gfm'; import addClasses from 'rehype-add-classes'; import rehypeStringify from 'rehype-stringify10'; import format from 'rehype-format'; @@ -42,6 +43,7 @@ const mdxSpanExpression = (h, node) => { const processor = unified() .use(toMDAST) .use(remarkMdx) + .use(remarkGfm) .use(frontmatter, ['yaml']) .use(fencedCodeBlock) .use(customHeadingIds) diff --git a/yarn.lock b/yarn.lock index 7b95a790ba2..50d3386bf89 100644 --- a/yarn.lock +++ b/yarn.lock @@ -15042,6 +15042,11 @@ markdown-table@^2.0.0: dependencies: repeat-string "^1.0.0" +markdown-table@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.4.tgz#fe44d6d410ff9d6f2ea1797a3f60aa4d2b631c2a" + integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== + marked@^12.0.1: version "12.0.2" resolved "https://registry.yarnpkg.com/marked/-/marked-12.0.2.tgz#b31578fe608b599944c69807b00f18edab84647e" @@ -15128,6 +15133,16 @@ mdast-util-find-and-replace@^1.1.0: unist-util-is "^4.0.0" unist-util-visit-parents "^3.0.0" +mdast-util-find-and-replace@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz#cc2b774f7f3630da4bd592f61966fecade8b99b1" + integrity sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw== + dependencies: + "@types/mdast" "^3.0.0" + escape-string-regexp "^5.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.0.0" + mdast-util-footnote@^0.1.0: version "0.1.7" resolved "https://registry.yarnpkg.com/mdast-util-footnote/-/mdast-util-footnote-0.1.7.tgz#4b226caeab4613a3362c144c94af0fdd6f7e0ef0" @@ -15204,6 +15219,25 @@ mdast-util-gfm-autolink-literal@^0.1.0: mdast-util-find-and-replace "^1.1.0" micromark "^2.11.3" +mdast-util-gfm-autolink-literal@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz#67a13abe813d7eba350453a5333ae1bc0ec05c06" + integrity sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA== + dependencies: + "@types/mdast" "^3.0.0" + ccount "^2.0.0" + mdast-util-find-and-replace "^2.0.0" + micromark-util-character "^1.0.0" + +mdast-util-gfm-footnote@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz#ce5e49b639c44de68d5bf5399877a14d5020424e" + integrity sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + micromark-util-normalize-identifier "^1.0.0" + mdast-util-gfm-strikethrough@^0.2.0: version "0.2.3" resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-0.2.3.tgz#45eea337b7fff0755a291844fbea79996c322890" @@ -15211,6 +15245,14 @@ mdast-util-gfm-strikethrough@^0.2.0: dependencies: mdast-util-to-markdown "^0.6.0" +mdast-util-gfm-strikethrough@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz#5470eb105b483f7746b8805b9b989342085795b7" + integrity sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + mdast-util-gfm-table@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-0.1.6.tgz#af05aeadc8e5ee004eeddfb324b2ad8c029b6ecf" @@ -15219,6 +15261,16 @@ mdast-util-gfm-table@^0.1.0: markdown-table "^2.0.0" mdast-util-to-markdown "~0.6.0" +mdast-util-gfm-table@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz#3552153a146379f0f9c4c1101b071d70bbed1a46" + integrity sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg== + dependencies: + "@types/mdast" "^3.0.0" + markdown-table "^3.0.0" + mdast-util-from-markdown "^1.0.0" + mdast-util-to-markdown "^1.3.0" + mdast-util-gfm-task-list-item@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-0.1.6.tgz#70c885e6b9f543ddd7e6b41f9703ee55b084af10" @@ -15226,6 +15278,14 @@ mdast-util-gfm-task-list-item@^0.1.0: dependencies: mdast-util-to-markdown "~0.6.0" +mdast-util-gfm-task-list-item@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz#b280fcf3b7be6fd0cc012bbe67a59831eb34097b" + integrity sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-to-markdown "^1.3.0" + mdast-util-gfm@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz#8ecddafe57d266540f6881f5c57ff19725bd351c" @@ -15237,6 +15297,19 @@ mdast-util-gfm@^0.1.0: mdast-util-gfm-task-list-item "^0.1.0" mdast-util-to-markdown "^0.6.1" +mdast-util-gfm@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz#e92f4d8717d74bdba6de57ed21cc8b9552e2d0b6" + integrity sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg== + dependencies: + mdast-util-from-markdown "^1.0.0" + mdast-util-gfm-autolink-literal "^1.0.0" + mdast-util-gfm-footnote "^1.0.0" + mdast-util-gfm-strikethrough "^1.0.0" + mdast-util-gfm-table "^1.0.0" + mdast-util-gfm-task-list-item "^1.0.0" + mdast-util-to-markdown "^1.0.0" + mdast-util-heading-range@^2.1.4: version "2.1.5" resolved "https://registry.yarnpkg.com/mdast-util-heading-range/-/mdast-util-heading-range-2.1.5.tgz#9a8e07bd46d07d40ad1596b0b6ab8535337725c3" @@ -15642,6 +15715,16 @@ micromark-extension-frontmatter@^2.0.0: micromark-util-symbol "^2.0.0" micromark-util-types "^2.0.0" +micromark-extension-gfm-autolink-literal@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz#5853f0e579bbd8ef9e39a7c0f0f27c5a063a66e7" + integrity sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + micromark-extension-gfm-autolink-literal@~0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204" @@ -15649,6 +15732,32 @@ micromark-extension-gfm-autolink-literal@~0.5.0: dependencies: micromark "~2.11.3" +micromark-extension-gfm-footnote@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz#05e13034d68f95ca53c99679040bc88a6f92fe2e" + integrity sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q== + dependencies: + micromark-core-commonmark "^1.0.0" + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-normalize-identifier "^1.0.0" + micromark-util-sanitize-uri "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + +micromark-extension-gfm-strikethrough@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz#c8212c9a616fa3bf47cb5c711da77f4fdc2f80af" + integrity sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw== + dependencies: + micromark-util-chunked "^1.0.0" + micromark-util-classify-character "^1.0.0" + micromark-util-resolve-all "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + micromark-extension-gfm-strikethrough@~0.6.5: version "0.6.5" resolved "https://registry.yarnpkg.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-0.6.5.tgz#96cb83356ff87bf31670eefb7ad7bba73e6514d1" @@ -15656,6 +15765,17 @@ micromark-extension-gfm-strikethrough@~0.6.5: dependencies: micromark "~2.11.0" +micromark-extension-gfm-table@^1.0.0: + version "1.0.7" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz#dcb46074b0c6254c3fc9cc1f6f5002c162968008" + integrity sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + micromark-extension-gfm-table@~0.4.0: version "0.4.3" resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-0.4.3.tgz#4d49f1ce0ca84996c853880b9446698947f1802b" @@ -15663,11 +15783,29 @@ micromark-extension-gfm-table@~0.4.0: dependencies: micromark "~2.11.0" +micromark-extension-gfm-tagfilter@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz#aa7c4dd92dabbcb80f313ebaaa8eb3dac05f13a7" + integrity sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g== + dependencies: + micromark-util-types "^1.0.0" + micromark-extension-gfm-tagfilter@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-0.3.0.tgz#d9f26a65adee984c9ccdd7e182220493562841ad" integrity sha512-9GU0xBatryXifL//FJH+tAZ6i240xQuFrSL7mYi8f4oZSbc+NvXjkrHemeYP0+L4ZUT+Ptz3b95zhUZnMtoi/Q== +micromark-extension-gfm-task-list-item@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz#b52ce498dc4c69b6a9975abafc18f275b9dde9f4" + integrity sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ== + dependencies: + micromark-factory-space "^1.0.0" + micromark-util-character "^1.0.0" + micromark-util-symbol "^1.0.0" + micromark-util-types "^1.0.0" + uvu "^0.5.0" + micromark-extension-gfm-task-list-item@~0.3.0: version "0.3.3" resolved "https://registry.yarnpkg.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-0.3.3.tgz#d90c755f2533ed55a718129cee11257f136283b8" @@ -15687,6 +15825,20 @@ micromark-extension-gfm@^0.3.0: micromark-extension-gfm-tagfilter "~0.3.0" micromark-extension-gfm-task-list-item "~0.3.0" +micromark-extension-gfm@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz#e517e8579949a5024a493e49204e884aa74f5acf" + integrity sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ== + dependencies: + micromark-extension-gfm-autolink-literal "^1.0.0" + micromark-extension-gfm-footnote "^1.0.0" + micromark-extension-gfm-strikethrough "^1.0.0" + micromark-extension-gfm-table "^1.0.0" + micromark-extension-gfm-tagfilter "^1.0.0" + micromark-extension-gfm-task-list-item "^1.0.0" + micromark-util-combine-extensions "^1.0.0" + micromark-util-types "^1.0.0" + micromark-extension-mdx-expression@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.4.tgz#33fe2c6ee214738255de175a084281c11894ddda" @@ -18864,6 +19016,16 @@ remark-gfm@^1.0.0: mdast-util-gfm "^0.1.0" micromark-extension-gfm "^0.3.0" +remark-gfm@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/remark-gfm/-/remark-gfm-3.0.1.tgz#0b180f095e3036545e9dddac0e8df3fa5cfee54f" + integrity sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig== + dependencies: + "@types/mdast" "^3.0.0" + mdast-util-gfm "^2.0.0" + micromark-extension-gfm "^2.0.0" + unified "^10.0.0" + remark-mdx-remove-exports@^1.6.22: version "1.6.22" resolved "https://registry.yarnpkg.com/remark-mdx-remove-exports/-/remark-mdx-remove-exports-1.6.22.tgz#9e34f3d02c9c54b02ca0a1fde946449338d06ecb" @@ -21232,7 +21394,7 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== -"unified10@npm:unified@^10.1.2", unified@^10.0.0: +"unified10@npm:unified@^10.1.2": version "10.1.2" resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== @@ -21245,7 +21407,7 @@ unicode-property-aliases-ecmascript@^2.0.0: trough "^2.0.0" vfile "^5.0.0" -"unified11@npm:unified@^11.0.4", unified@^11.0.0: +"unified11@npm:unified@^11.0.4": version "11.0.4" resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.4.tgz#f4be0ac0fe4c88cb873687c07c64c49ed5969015" integrity sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ== @@ -21270,6 +21432,32 @@ unified@9.0.0: trough "^1.0.0" vfile "^4.0.0" +unified@^10.0.0: + version "10.1.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-10.1.2.tgz#b1d64e55dafe1f0b98bb6c719881103ecf6c86df" + integrity sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q== + dependencies: + "@types/unist" "^2.0.0" + bail "^2.0.0" + extend "^3.0.0" + is-buffer "^2.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^5.0.0" + +unified@^11.0.0: + version "11.0.4" + resolved "https://registry.yarnpkg.com/unified/-/unified-11.0.4.tgz#f4be0ac0fe4c88cb873687c07c64c49ed5969015" + integrity sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ== + dependencies: + "@types/unist" "^3.0.0" + bail "^2.0.0" + devlop "^1.0.0" + extend "^3.0.0" + is-plain-obj "^4.0.0" + trough "^2.0.0" + vfile "^6.0.0" + unified@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/unified/-/unified-7.1.0.tgz#5032f1c1ee3364bd09da12e27fdd4a7553c7be13" @@ -21552,7 +21740,7 @@ unist-util-visit-parents@^3.0.0, unist-util-visit-parents@^3.1.0, unist-util-vis "@types/unist" "^2.0.0" unist-util-is "^4.0.0" -unist-util-visit-parents@^5.1.1: +unist-util-visit-parents@^5.0.0, unist-util-visit-parents@^5.1.1: version "5.1.3" resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz#b4520811b0ca34285633785045df7a8d6776cfeb" integrity sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg== @@ -21568,7 +21756,7 @@ unist-util-visit-parents@^6.0.0: "@types/unist" "^3.0.0" unist-util-is "^6.0.0" -"unist-util-visit4@npm:unist-util-visit@^4.1.2", unist-util-visit@^4.0.0: +"unist-util-visit4@npm:unist-util-visit@^4.1.2": version "4.1.2" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== @@ -21593,6 +21781,15 @@ unist-util-visit@^1.1.0, unist-util-visit@^1.4.1: dependencies: unist-util-visit-parents "^2.0.0" +unist-util-visit@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-4.1.2.tgz#125a42d1eb876283715a3cb5cceaa531828c72e2" + integrity sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg== + dependencies: + "@types/unist" "^2.0.0" + unist-util-is "^5.0.0" + unist-util-visit-parents "^5.1.1" + unist-util-visit@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" From 9999677cc1052230daffab1e26c4a1d1aca921fa Mon Sep 17 00:00:00 2001 From: NewRelic-K8s-Agents-Bot Date: Tue, 28 Jan 2025 22:10:52 +0000 Subject: [PATCH 18/67] feat: Add release notes for Kubernetes integration v3.33.1 --- .../kubernetes-integration-3-33-1.mdx | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/content/docs/release-notes/infrastructure-release-notes/kubernetes-integration-release-notes/kubernetes-integration-3-33-1.mdx diff --git a/src/content/docs/release-notes/infrastructure-release-notes/kubernetes-integration-release-notes/kubernetes-integration-3-33-1.mdx b/src/content/docs/release-notes/infrastructure-release-notes/kubernetes-integration-release-notes/kubernetes-integration-3-33-1.mdx new file mode 100644 index 00000000000..ff19b1b0b4b --- /dev/null +++ b/src/content/docs/release-notes/infrastructure-release-notes/kubernetes-integration-release-notes/kubernetes-integration-3-33-1.mdx @@ -0,0 +1,11 @@ +--- +subject: Kubernetes integration +releaseDate: '2025-01-28' +version: 3.33.1 +--- + +For a detailed description of changes, see the [release notes](https://github.com/newrelic/nri-kubernetes/releases/tag/v3.33.1). + +This integration is included in the following chart versions: +* [newrelic-infrastructure-3.38.1](https://github.com/newrelic/nri-kubernetes/releases/tag/newrelic-infrastructure-3.38.1) +* [nri-bundle-5.0.108](https://github.com/newrelic/helm-charts/releases/tag/nri-bundle-5.0.108) From 5c2ff3d4a1db38d02b3e275fd331cf327cefc96c Mon Sep 17 00:00:00 2001 From: akashreddy Date: Wed, 29 Jan 2025 12:27:20 +0530 Subject: [PATCH 19/67] correct serialization to not skip new lines of mdx tables --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 1d6d654b08c..9ee76c05620 100644 --- a/package.json +++ b/package.json @@ -238,5 +238,4 @@ "bugs": { "url": "https://github.com/newrelic/docs-website/issues" }, - "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } From bbd5169fdc2f9fc7abbd19893311194b83c0bfbb Mon Sep 17 00:00:00 2001 From: akashreddy Date: Wed, 29 Jan 2025 12:28:54 +0530 Subject: [PATCH 20/67] correct serialization to not skip new lines of mdx tables --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9ee76c05620..6575a16f588 100644 --- a/package.json +++ b/package.json @@ -237,5 +237,5 @@ }, "bugs": { "url": "https://github.com/newrelic/docs-website/issues" - }, + } } From a0eceef6d388f75ccbd5b8063f26c14fc4910f35 Mon Sep 17 00:00:00 2001 From: sujitnewrelic Date: Wed, 29 Jan 2025 13:28:18 +0530 Subject: [PATCH 21/67] chore: fixed syntax and link issues fixed syntax and link issues --- .../app-launch-times-ios-apps.mdx | 2 +- .../mobile-sdk/configure-settings.mdx | 35 ++++++++++--------- .../docs-release-notes/docs-5-31-2024.mdx | 2 +- .../app-launch-times-ios-apps.mdx | 2 +- .../app-launch-times-ios-apps.mdx | 2 +- .../app-launch-times-ios-apps.mdx | 2 +- .../app-launch-times-ios-apps.mdx | 2 +- 7 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/content/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx b/src/content/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx index cc0ac5d8672..8beac1cb7df 100644 --- a/src/content/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx +++ b/src/content/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx @@ -12,7 +12,7 @@ freshnessValidatedDate: 2024-06-11 This feature is supported in iOS agent version 7.4.0 and higher. App launch times are not reported when using simulators or during debugging. -With the iOS agent, you can report app launch time, also known as "cold time" and "hot time" (warm and prewarmed times are not reported). By default, app launch times are collected with the feature flag [`NRFeatureFlag_AppStartMetrics`](/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings/#applaunchtime). +With the iOS agent, you can report app launch time, also known as "cold time" and "hot time" (warm and prewarmed times are not reported). By default, app launch times are collected with the feature flag [`NRFeatureFlag_AppStartMetrics`](/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings/#ios-applaunchtime). ## View app launch time [#app-launch-time] diff --git a/src/content/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings.mdx b/src/content/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings.mdx index 05f78ae53ac..e61cd278a48 100644 --- a/src/content/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings.mdx +++ b/src/content/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings.mdx @@ -88,7 +88,7 @@ NewRelic.withApplicationToken(NEW_RELIC_TOKEN) .start(this.getApplication()); ``` - ## Analytics settings + ## Analytics settings [#android-analytics-settings] @@ -132,7 +132,7 @@ FeatureFlag.AnalyticsEvents(true)
- ## App launch time settings [#applaunchtime] + ## App launch time settings [#android-applaunchtime] @@ -165,7 +165,7 @@ FeatureFlag.AppStartMetrics(false)
- ## Application settings + ## Application settings [#android-application-settings] @@ -339,7 +339,8 @@ FeatureFlag.DistributedTracing(false) + Enable or disable event persistence. +
- Enable or disable event persistence. Event persistence is disabled by default. To enable it, add the following feature flag: @@ -665,7 +666,7 @@ NewRelic.disableFeatures(NRMAFeatureFlags.NRFeatureFlag_DefaultInteractions)
- ## Data endpoint settings [#logging] + ## Data endpoint settings [#ios-data-endpoint-settings] @@ -721,7 +722,7 @@ NewRelic.start(withApplicationToken:YOUR_APP_TOKEN
- ## Crash and error reporting feature flag [#crashes] + ## Crash and error reporting feature flag [#ios-crashes] If you modify any of crash and error reporting settings below, be sure to call the feature flag before the iOS agent start call. @@ -773,7 +774,7 @@ NewRelic.disableFeatures(NRMAFeatureFlags.NRFeatureFlag_HandledExceptionEvents) - ## Distributed tracing [#dt] + ## Distributed tracing [#ios-dt] @@ -805,7 +806,7 @@ NewRelic.disableFeatures(NRMAFeatureFlags.NRFeatureFlag_DistributedTracing)
- ## Interactions feature flags [#interactions] + ## Interactions feature flags [#ios-interactions] If you modify any of crash and error reporting settings below, be sure to call the feature flag just before the New Relic iOS agent start call. @@ -905,7 +906,7 @@ NewRelic.enableFeatures(NRMAFeatureFlags.NRFeatureFlag_GestureInstrumentation) - ## Networking feature flags [#networking] + ## Networking feature flags [#ios-networking] If you modify any of settings below, be sure to call the feature flag before the New Relic iOS agent start call. @@ -1013,7 +1014,7 @@ NewRelic.enableFeatures(NRMAFeatureFlags.NRFeatureFlag_SwiftAsyncURLSessionSuppo - ## App launch time settings [#applaunchtime] + ## App launch time settings [#ios-applaunchtime] @@ -1048,7 +1049,7 @@ NewRelic.enableFeatures(NRMAFeatureFlags.NRFeatureFlag_AppStartMetrics)
- ## FedRAMP endpoints settings [#fedramp] + ## FedRAMP endpoints settings [#ios-fedramp] @@ -1225,7 +1226,7 @@ let agentConfig : AgentConfiguration = { NewRelicCapacitorPlugin.start({appKey:appToken, agentConfiguration:agentConfig}) ``` - ## Available configurations [#configurations] + ## Available configurations [#capacitor-configurations]
@@ -1454,7 +1455,7 @@ cordova plugin add https://github.com/newrelic/newrelic-cordova-plugin.git --variable OFFLINE_STORAGE_ENABLED="false" ``` - ## Available configurations [#configurations] + ## Available configurations [#cordova-configurations]
@@ -1719,7 +1720,7 @@ private static void StartNewRelic() } ``` - ## Available configurations [#configurations] + ## Available configurations [#maui-configurations]
@@ -1946,7 +1947,7 @@ runZonedGuarded(() async { }); ``` - ## Available configurations [#configurations] + ## Available configurations [#flutter-configurations]
@@ -2210,7 +2211,7 @@ NewRelic.setJSAppVersion(appVersion.version); AppRegistry.registerComponent(appName, () => App); ``` - ## Available configurations [#configurations] + ## Available configurations [#react-native-configurations]
@@ -2500,7 +2501,7 @@ public App () } ``` - ## Available configurations [#configurations] + ## Available configurations [#xamarain-configurations]
diff --git a/src/content/docs/release-notes/docs-release-notes/docs-5-31-2024.mdx b/src/content/docs/release-notes/docs-release-notes/docs-5-31-2024.mdx index c47d14aa6f7..3fc60c7c822 100644 --- a/src/content/docs/release-notes/docs-release-notes/docs-5-31-2024.mdx +++ b/src/content/docs/release-notes/docs-release-notes/docs-5-31-2024.mdx @@ -30,7 +30,7 @@ version: 'version: May 24-30, 2024' * Added new IP ranges to [data ingest IP blocks](/docs/new-relic-solutions/get-started/networks/#ingest-blocks) and [user-facing domains](/docs/new-relic-solutions/get-started/networks/#user-facing-domains). * Cleaned up the content in [Atlassian Jira integration](/docs/more-integrations/open-source-telemetry-integrations/atlassian/atlassian-integration) to make it easier to use. * Updated latest supported versions in the [Node.js instrumented modules](/docs/apm/agents/nodejs-agent/getting-started/compatibility-requirements-nodejs-agent/#instrument) table. -* Added new iOS background reporting section to [configure mobile monitoring settings](/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings/#ios-background-reporting). +* Added the **Background reporting** section in the **iOS** tab of [**Configure mobile monitoring settings**](/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings). * Completed a clarity and quality improvement edit of [browser monitoring and the Rube agent](/docs/apm/agents/ruby-agent/features/new-relic-browser-ruby-agent). * Updated the [Ruby agent configuration](/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration) with changes related to the v.9.10.0 release. * Removed an old and no longer wanted OpenTelemetry troubleshooting doc. diff --git a/src/i18n/content/es/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx b/src/i18n/content/es/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx index 43b62935456..1d8854c8973 100644 --- a/src/i18n/content/es/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx +++ b/src/i18n/content/es/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx @@ -13,7 +13,7 @@ translationType: machine Esta característica es compatible con iOS agente versión 7.4.0 y superiores. Los tiempos de lanzamiento de la aplicación no se informan cuando se emplean simuladores o durante la depuración. -Con el agente iOS, puede informar el tiempo de lanzamiento de la aplicación, también conocido como "tiempo frío" y "tiempo caliente" (no se informan los tiempos cálidos y precalentados). De forma predeterminada, los tiempos de lanzamiento de la aplicación se recopilan con el indicador de característica [`NRFeatureFlag_AppStartMetrics`](/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings/#applaunchtime). +Con el agente iOS, puede informar el tiempo de lanzamiento de la aplicación, también conocido como "tiempo frío" y "tiempo caliente" (no se informan los tiempos cálidos y precalentados). De forma predeterminada, los tiempos de lanzamiento de la aplicación se recopilan con el indicador de característica [`NRFeatureFlag_AppStartMetrics`](/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings/#ios-applaunchtime). ## Ver el tiempo de lanzamiento de la aplicación [#app-launch-time] diff --git a/src/i18n/content/jp/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx b/src/i18n/content/jp/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx index 2097b0d9403..a2e688d506b 100644 --- a/src/i18n/content/jp/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx +++ b/src/i18n/content/jp/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx @@ -13,7 +13,7 @@ translationType: machine この機能は、iOS エージェント バージョン 7.4.0 以降でサポートされています。 シミュレーターの使用時やデバッグ中は、アプリのリリース時間は報告されません。 -iOS エージェントを使用すると、アプリのリリース時間 (「コールド時間」および「ホット時間」とも呼ばれる) を報告できます (ウォーム時間とプレウォーム時間は報告されません)。 デフォルトでは、アプリのリリース時間は機能フラグ[`NRFeatureFlag_AppStartMetrics`](/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings/#applaunchtime)を使用して収集されます。 +iOS エージェントを使用すると、アプリのリリース時間 (「コールド時間」および「ホット時間」とも呼ばれる) を報告できます (ウォーム時間とプレウォーム時間は報告されません)。 デフォルトでは、アプリのリリース時間は機能フラグ[`NRFeatureFlag_AppStartMetrics`](/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings/#ios-applaunchtime)を使用して収集されます。 ## アプリの起動時間を表示 [#app-launch-time] diff --git a/src/i18n/content/kr/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx b/src/i18n/content/kr/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx index a4bd7b7263e..98e67ab1dbd 100644 --- a/src/i18n/content/kr/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx +++ b/src/i18n/content/kr/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx @@ -13,7 +13,7 @@ translationType: machine 이 기능은 iOS 에이전트 버전 7.4.0 이상에서 지원됩니다. 시뮬레이터를 사용하거나 디버깅하는 동안에는 앱 설치 시간이 보고되지 않습니다. -iOS 에이전트를 사용하면 "콜드 타임" 및 "핫 타임"이라고도 알려진 앱 설치 시간을 보고할 수 있습니다(웜 시간 및 예열 시간은 보고되지 않음). 기본적으로 앱 설치 시간은 기능 플래그 [`NRFeatureFlag_AppStartMetrics`](/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings/#applaunchtime) 를 통해 수집됩니다. +iOS 에이전트를 사용하면 "콜드 타임" 및 "핫 타임"이라고도 알려진 앱 설치 시간을 보고할 수 있습니다(웜 시간 및 예열 시간은 보고되지 않음). 기본적으로 앱 설치 시간은 기능 플래그 [`NRFeatureFlag_AppStartMetrics`](/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings/#ios-applaunchtime) 를 통해 수집됩니다. ## 앱 실행 시간 보기 [#app-launch-time] diff --git a/src/i18n/content/pt/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx b/src/i18n/content/pt/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx index 0515f7cc650..5b650f8f872 100644 --- a/src/i18n/content/pt/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx +++ b/src/i18n/content/pt/docs/mobile-monitoring/new-relic-mobile-ios/configuration/app-launch-times-ios-apps.mdx @@ -13,7 +13,7 @@ translationType: machine Este recurso é compatível com o agente iOS versão 7.4.0 e superior. Os tempos de lançamento do aplicativo não são informados ao usar simuladores ou durante a depuração. -Com o agente iOS, você pode reportar o tempo de lançamento do aplicativo, também conhecido como “tempo frio” e “tempo quente” (tempos quentes e pré-aquecidos não são informados). Por padrão, os tempos de lançamento do app são coletados com a flag de recurso [`NRFeatureFlag_AppStartMetrics`](/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings/#applaunchtime). +Com o agente iOS, você pode reportar o tempo de lançamento do aplicativo, também conhecido como “tempo frio” e “tempo quente” (tempos quentes e pré-aquecidos não são informados). Por padrão, os tempos de lançamento do app são coletados com a flag de recurso [`NRFeatureFlag_AppStartMetrics`](/docs/mobile-monitoring/new-relic-mobile/mobile-sdk/configure-settings/#ios-applaunchtime). ## Ver o horário de lançamento do aplicativo [#app-launch-time] From 46dfc09445780871eb2b8b821254bd73319d91bb Mon Sep 17 00:00:00 2001 From: sujitnewrelic Date: Wed, 29 Jan 2025 13:50:27 +0530 Subject: [PATCH 22/67] grammar correction --- .../browser-agent-release-notes/browser-agent-v1.279.1.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes/browser-agent-v1.279.1.mdx b/src/content/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes/browser-agent-v1.279.1.mdx index 223839136d8..ddde1a7235a 100644 --- a/src/content/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes/browser-agent-v1.279.1.mdx +++ b/src/content/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes/browser-agent-v1.279.1.mdx @@ -12,7 +12,7 @@ security: [] ### Bug fixes #### CLS timing node not being reported post new Harvester -Re-introduce the `cumulativeLayoutShift` timing of `PageViewTiming` events into EoL harvests. After v1.278.0, this timing stopped being sent when the user leaves the page, resulting in a drop in CLS counts. The node contain attributes that aid in identifying the cause of bad scores. +Reintroduce the `cumulativeLayoutShift` timing of `PageViewTiming` events into EoL harvests. After v1.278.0, this timing stopped being sent when the user leaves the page, resulting in a drop in CLS counts. The node contains attributes that aid in identifying the cause of bad scores. ## Support statement @@ -20,4 +20,4 @@ New Relic recommends that you upgrade the agent regularly to ensure that you're New browser agent releases are rolled out to customers in small stages over a period of time. Because of this, the date the release becomes accessible to your account may not match the original publish date. Please see this [status dashboard](https://newrelic.github.io/newrelic-browser-agent-release/) for more information. -Consistent with our [browser support policy](https://docs.newrelic.com/docs/browser/new-relic-browser/getting-started/compatibility-requirements-browser-monitoring/#browser-types), v1.279.1 of the Browser agent was built for and tested against these browsers and version ranges: Chrome 122-132, Edge 122-132, Safari 17-17, and Firefox 124-134. For mobile devices, v1.279.1 was built and tested for Android OS 15 and iOS Safari 17-18.1. \ No newline at end of file +Consistent with our [browser support policy](https://docs.newrelic.com/docs/browser/new-relic-browser/getting-started/compatibility-requirements-browser-monitoring/#browser-types), v1.279.1 of the Browser agent was built for and tested against these browsers and version ranges: Chrome 122-132, Edge 122-132, Safari 17-17, and Firefox 124-134. For mobile devices, v1.279.1 was built and tested for Android OS 15 and iOS Safari 17-18.1. From 5e1c62e78951ba0d8caed0d7f14e0c191d4ed805 Mon Sep 17 00:00:00 2001 From: sujitnewrelic Date: Wed, 29 Jan 2025 15:09:09 +0530 Subject: [PATCH 23/67] chore: Updated a missing info in the tip Updated a missing info in the tip, reported by a customer to one of our support engineer. --- src/install/kubernetes/prepare-install.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/install/kubernetes/prepare-install.mdx b/src/install/kubernetes/prepare-install.mdx index d78fbb527e5..add7938b97d 100644 --- a/src/install/kubernetes/prepare-install.mdx +++ b/src/install/kubernetes/prepare-install.mdx @@ -65,7 +65,7 @@ Depending on where you store your clusters, there are different integration spec ``` - The installer provides `newrelic-bundle` as default `release_name` and `newrelic` as default `namespace`. + The installer provides `newrelic-bundle` or `nri-bundle` as default `release_name` and `newrelic` as default `namespace`. 2. If you're using signed certificates, make sure they are properly configured by using the following variables in the `DaemonSet` portion of your manifest. Set your YAML key path to `spec.template.spec.containers.name.env` and the `.pem` file as follows: From fa1f4299b6057b3b0f6b87cba955d22032014988 Mon Sep 17 00:00:00 2001 From: Vidyadhar Gowd J Date: Wed, 29 Jan 2025 15:42:40 +0530 Subject: [PATCH 24/67] CLoud integration GCP onboarding info addition --- .../connect-google-cloud-platform-services-new-relic.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/content/docs/infrastructure/google-cloud-platform-integrations/get-started/connect-google-cloud-platform-services-new-relic.mdx b/src/content/docs/infrastructure/google-cloud-platform-integrations/get-started/connect-google-cloud-platform-services-new-relic.mdx index 676d152639b..add34b8416f 100644 --- a/src/content/docs/infrastructure/google-cloud-platform-integrations/get-started/connect-google-cloud-platform-services-new-relic.mdx +++ b/src/content/docs/infrastructure/google-cloud-platform-integrations/get-started/connect-google-cloud-platform-services-new-relic.mdx @@ -64,6 +64,8 @@ These are the requirements for the authorization: You need a user with **Project IAM Admin** role to add the service account ID as a member in your GCP project. + Before adding the service account ID, ensure you click the "Fetch data" button on the New Relic onboarding wizard to verify authorization for data retrieval from Google. + In the GCP project **IAM & admin**, the service account must have the **Viewer** role and the **Service Usage Consumer** role or, alternatively, a [custom role](/docs/integrations/google-cloud-platform-integrations/get-started/integrations-custom-roles). From 141223a257165a09a87d37d30c73fa14460af7c3 Mon Sep 17 00:00:00 2001 From: svc-docs-eng-opensource-bot Date: Wed, 29 Jan 2025 12:05:35 +0000 Subject: [PATCH 25/67] chore: add translations --- .../docs/apis/rest-api-v2/migrate-to-nrql.mdx | 6 +- .../browser-pro-features/session-replay.mdx | 428 +++++++++ .../browser-apis/recordReplay.mdx | 1 - ...google-vertexai-monitoring-integration.mdx | 866 ++++++++++++++++++ .../service-level-management/create-slm.mdx | 4 +- 5 files changed, 1299 insertions(+), 6 deletions(-) create mode 100644 src/i18n/content/es/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx create mode 100644 src/i18n/content/es/docs/infrastructure/google-cloud-platform-integrations/gcp-integrations-list/google-vertexai-monitoring-integration.mdx diff --git a/src/i18n/content/es/docs/apis/rest-api-v2/migrate-to-nrql.mdx b/src/i18n/content/es/docs/apis/rest-api-v2/migrate-to-nrql.mdx index 2f778c24bad..58acc109c7c 100644 --- a/src/i18n/content/es/docs/apis/rest-api-v2/migrate-to-nrql.mdx +++ b/src/i18n/content/es/docs/apis/rest-api-v2/migrate-to-nrql.mdx @@ -60,7 +60,7 @@ FROM Metric WHERE appId = $APP_ID AND metricTimesliceName = 'HttpDispatcher' ``` -| Valor (RPM) | Función NRQL | | -------------------------- | ------------------------------------------------------------------------------------------------- | | `average_response_time` | `average(newrelic.timeslice.value) * 1000` | | `calls_per_minute` | `rate(count(newrelic.timeslice.value), 1 minute)` | | `call_count` | `count(newrelic.timeslice.value)` | | `min_response_time` | `min(newrelic.timeslice.value) * 1000` | | `max_response_time` | `max(newrelic.timeslice.value) * 1000` | | `average_exclusive_time` | `average(newrelic.timeslice.value['totalExclusive'] / newrelic.timeslice.value['count']) * 1000` | | `average_value` | `average(newrelic.timeslice.value)` | | `total_call_time_per_minute` | `rate(sum(newrelic.timeslice.value), 1 minute)` | | `requests_per_minute` | `rate(count(newrelic.timeslice.value), 1 minute)` | | `standard_deviation` | `stddev(newrelic.timeslice.value) * 1000` | | `average_time` | `average(newrelic.timeslice.value) * 1000` | | `count` | `count(newrelic.timeslice.value)` | | `used_bytes_by_host` | `average(newrelic.timeslice.value) * 1024 * 1024` | | `used_mb_by_host` | `average(newrelic.timeslice.value)` | | `total_used_mb` | `sum(newrelic.timeslice.value)` | | `average_call_time` | `average(newrelic.timeslice.value) * 1000` | | `total_value` | `sum(newrelic.timeslice.value)` | | `min_value` | `min(newrelic.timeslice.value)` | | `max_value` | `max(newrelic.timeslice.value)` | | `rate` | `rate(sum(newrelic.timeslice.value), 1 second)` | | `throughput` | `rate(count(newrelic.timeslice.value), 1 second)` | | `as_percentage` | `average(newrelic.timeslice.value) * 100` | | `errors_per_minute` | `rate(count(newrelic.timeslice.value), 1 minute)` | | `error_count` | `count(newrelic.timeslice.value)` | | `total_time` | `sum(newrelic.timeslice.value) * 1000` | | `sessions_active` | `average(newrelic.timeslice.value)` | | `total_visits` | `sum(newrelic.timeslice.value)` | | `percent` | `average(newrelic.timeslice.value) * 100` | | `percent(CPU/User Time)` | `100 * sum(newrelic.timeslice.value) / $TIME_WINDOW_IN_SECONDS` | | `time_percentage` | `100 * sum(newrelic.timeslice.value) / $TIME_WINDOW_IN_SECONDS` | | `utilization` | `100 * sum(newrelic.timeslice.value) / $TIME_WINDOW_IN_SECONDS` | | `visits_percentage` | `100 * sum(newrelic.timeslice.value) / $TIME_WINDOW_IN_SECONDS` | +\| Valor (RPM) | Función NRQL | | -------------------------- | ------------------------------------------------------------------------------------------------- | | `average_response_time` | `average(newrelic.timeslice.value) * 1000` | | `calls_per_minute` | `rate(count(newrelic.timeslice.value), 1 minute)` | | `call_count` | `count(newrelic.timeslice.value)` | | `min_response_time` | `min(newrelic.timeslice.value) * 1000` | | `max_response_time` | `max(newrelic.timeslice.value) * 1000` | | `average_exclusive_time` | `average(newrelic.timeslice.value['totalExclusive'] / newrelic.timeslice.value['count']) * 1000` | | `average_value` | `average(newrelic.timeslice.value)` | | `total_call_time_per_minute` | `rate(sum(newrelic.timeslice.value), 1 minute)` | | `requests_per_minute` | `rate(count(newrelic.timeslice.value), 1 minute)` | | `standard_deviation` | `stddev(newrelic.timeslice.value) * 1000` | | `average_time` | `average(newrelic.timeslice.value) * 1000` | | `count` | `count(newrelic.timeslice.value)` | | `used_bytes_by_host` | `average(newrelic.timeslice.value) * 1024 * 1024` | | `used_mb_by_host` | `average(newrelic.timeslice.value)` | | `total_used_mb` | `sum(newrelic.timeslice.value)` | | `average_call_time` | `average(newrelic.timeslice.value) * 1000` | | `total_value` | `sum(newrelic.timeslice.value)` | | `min_value` | `min(newrelic.timeslice.value)` | | `max_value` | `max(newrelic.timeslice.value)` | | `rate` | `rate(sum(newrelic.timeslice.value), 1 second)` | | `throughput` | `rate(count(newrelic.timeslice.value), 1 second)` | | `as_percentage` | `average(newrelic.timeslice.value) * 100` | | `errors_per_minute` | `rate(count(newrelic.timeslice.value), 1 minute)` | | `error_count` | `count(newrelic.timeslice.value)` | | `total_time` | `sum(newrelic.timeslice.value) * 1000` | | `sessions_active` | `average(newrelic.timeslice.value)` | | `total_visits` | `sum(newrelic.timeslice.value)` | | `percent` | `average(newrelic.timeslice.value) * 100` | | `percent(CPU/User Time)` | `100 * sum(newrelic.timeslice.value) / $TIME_WINDOW_IN_SECONDS` | | `time_percentage` | `100 * sum(newrelic.timeslice.value) / $TIME_WINDOW_IN_SECONDS` | | `utilization` | `100 * sum(newrelic.timeslice.value) / $TIME_WINDOW_IN_SECONDS` | | `visits_percentage` | `100 * sum(newrelic.timeslice.value) / $TIME_WINDOW_IN_SECONDS` | Si la función incluye `$TIME_WINDOW_IN_SECONDS`, significa que debes reemplazarla con la ventana de tiempo que deseas consultar. @@ -68,13 +68,13 @@ Por ejemplo, si consulta un intervalo de tiempo de 30 minutos, reemplazará `$TI ### Apdex métricas -| Valor (RPM) | Función NRQL | | ------------- | ---------------------------------------------------------------------------------- | | `score` | `apdex(newrelic.timeslice.value)` | | `s` | `apdex(newrelic.timeslice.value)` o `count(newrelic.timeslice.value)` | | `t` | `apdex(newrelic.timeslice.value)` o `sum(newrelic.timeslice.value)` | | `f` | `apdex(newrelic.timeslice.value)` o `sum(newrelic.timeslice.value['totalExclusive'])`| | `count` | `apdex(newrelic.timeslice.value)` | | `value` | `apdex(newrelic.timeslice.value)` | | `threshold` | `max(newrelic.timeslice.value)` | | `threshold_min` | `min(newrelic.timeslice.value)` | +\| Valor (RPM) | Función NRQL | | ------------- | ---------------------------------------------------------------------------------- | | `score` | `apdex(newrelic.timeslice.value)` | | `s` | `apdex(newrelic.timeslice.value)` o `count(newrelic.timeslice.value)` | | `t` | `apdex(newrelic.timeslice.value)` o `sum(newrelic.timeslice.value)` | | `f` | `apdex(newrelic.timeslice.value)` o `sum(newrelic.timeslice.value['totalExclusive'])`| | `count` | `apdex(newrelic.timeslice.value)` | | `value` | `apdex(newrelic.timeslice.value)` | | `threshold` | `max(newrelic.timeslice.value)` | | `threshold_min` | `min(newrelic.timeslice.value)` | ### Métricas para EndUser & Mobile Estas métricas devolverán el mismo resultado que obtendría de la REST API v2, pero algunos resultados pueden diferir de lo que ve en la New Relic UI. Esto se debe a que la UI emplea evento en lugar de datos de intervalo de tiempo. Si desea obtener los mismos resultados que la UI, debe consultar el evento directamente. -| Valor (RPM) | Función NRQL | | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `average_response_time` | `sum(newrelic.timeslice.value) / count(newrelic.timeslice.value) * 1000 `| | `error_percentage` | `(filter(count(newrelic.timeslice.value), WHERE metricTimesliceName = 'EndUser/errors') / filter(count(newrelic.timeslice.value), WHERE metricTimesliceName = 'Browser'))`| | `average_fe_response_time` | `sum(newrelic.timeslice.value['totalExclusive']) / count(newrelic.timeslice.value) * 1000` | | `average_be_response_time` | `1000 * (sum(newrelic.timeslice.value) - sum(newrelic.timeslice.value['totalExclusive'])) / count(newrelic.timeslice.value)` | | `average_network_time` | `(sum(newrelic.timeslice.value) - sum(newrelic.timeslice.value['totalExclusive']) - sum(newrelic.timeslice.value['sumOfSquares'])) / count(newrelic.timeslice.value)` | | `total_network_time` | `(sum(newrelic.timeslice.value) - sum(newrelic.timeslice.value['totalExclusive']) - sum(newrelic.timeslice.value['sumOfSquares']))` | | `network_time_percentage` | `(sum(newrelic.timeslice.value) - sum(newrelic.timeslice.value['totalExclusive']) - sum(newrelic.timeslice.value['sumOfSquares'])) / $TIME_WINDOW_IN_SECONDS` | | `total_fe_time` | `sum(newrelic.timeslice.value['totalExclusive'])` | | `fe_time_percentage` | `100 * sum(newrelic.timeslice.value['totalExclusive']) / $TIME_WINDOW_IN_SECONDS` | | `average_dom_content_load_time` | `average(newrelic.timeslice.value) * 1000` | | `average_queue_time` | `average(newrelic.timeslice.value['totalExclusive']) * 1000` | | `total_queue_time` | `sum(newrelic.timeslice.value['totalExclusive']) * 1000` | | `total_dom_content_time` | `sum(newrelic.timeslice.value) * 1000` | | `total_app_time` | `sum(newrelic.timeslice.value['sumOfSquares'])` | | `average_app_time` | `sum(newrelic.timeslice.value['sumOfSquares']) / count(newrelic.timeslice.value)` | | `average_sent_bytes` | `sum(newrelic.timeslice.value['totalExclusive']) * 1000` | | `average_received_bytes` | `1000 * sum(newrelic.timeslice.value) / count(newrelic.timeslice.value)` | | `launch_count` | `count(newrelic.timeslice.value)` | +\| Valor (RPM) | Función NRQL | | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `average_response_time` | `sum(newrelic.timeslice.value) / count(newrelic.timeslice.value) * 1000 `| | `error_percentage` | `(filter(count(newrelic.timeslice.value), WHERE metricTimesliceName = 'EndUser/errors') / filter(count(newrelic.timeslice.value), WHERE metricTimesliceName = 'Browser'))`| | `average_fe_response_time` | `sum(newrelic.timeslice.value['totalExclusive']) / count(newrelic.timeslice.value) * 1000` | | `average_be_response_time` | `1000 * (sum(newrelic.timeslice.value) - sum(newrelic.timeslice.value['totalExclusive'])) / count(newrelic.timeslice.value)` | | `average_network_time` | `(sum(newrelic.timeslice.value) - sum(newrelic.timeslice.value['totalExclusive']) - sum(newrelic.timeslice.value['sumOfSquares'])) / count(newrelic.timeslice.value)` | | `total_network_time` | `(sum(newrelic.timeslice.value) - sum(newrelic.timeslice.value['totalExclusive']) - sum(newrelic.timeslice.value['sumOfSquares']))` | | `network_time_percentage` | `(sum(newrelic.timeslice.value) - sum(newrelic.timeslice.value['totalExclusive']) - sum(newrelic.timeslice.value['sumOfSquares'])) / $TIME_WINDOW_IN_SECONDS` | | `total_fe_time` | `sum(newrelic.timeslice.value['totalExclusive'])` | | `fe_time_percentage` | `100 * sum(newrelic.timeslice.value['totalExclusive']) / $TIME_WINDOW_IN_SECONDS` | | `average_dom_content_load_time` | `average(newrelic.timeslice.value) * 1000` | | `average_queue_time` | `average(newrelic.timeslice.value['totalExclusive']) * 1000` | | `total_queue_time` | `sum(newrelic.timeslice.value['totalExclusive']) * 1000` | | `total_dom_content_time` | `sum(newrelic.timeslice.value) * 1000` | | `total_app_time` | `sum(newrelic.timeslice.value['sumOfSquares'])` | | `average_app_time` | `sum(newrelic.timeslice.value['sumOfSquares']) / count(newrelic.timeslice.value)` | | `average_sent_bytes` | `sum(newrelic.timeslice.value['totalExclusive']) * 1000` | | `average_received_bytes` | `1000 * sum(newrelic.timeslice.value) / count(newrelic.timeslice.value)` | | `launch_count` | `count(newrelic.timeslice.value)` | ### Seriales temporales y resúmenes diff --git a/src/i18n/content/es/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx b/src/i18n/content/es/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx new file mode 100644 index 00000000000..eabee30ff24 --- /dev/null +++ b/src/i18n/content/es/docs/browser/browser-monitoring/browser-pro-features/session-replay.mdx @@ -0,0 +1,428 @@ +--- +title: Session Replay +metaDescription: Play back user interactions to debug faster and improve page performance. +freshnessValidatedDate: '2024-11-11T00:00:00.000Z' +translationType: machine +--- + +Session Replay captura la interacción en su aplicación sitio web y mapea otros telemetry data para ayudarlo a comprender las rutas de sus usuarios. Session Replay se puede emplear para la resolución de problemas y mejorar la experiencia del usuario final, tales como: + +* **Resolución de problemas Errores de JavaScript**: soluciona la causa de un error viendo qué estaba haciendo el usuario cuando ocurrió el error. Por ejemplo, si un usuario final recibe un error al intentar completar una transacción de comercio electrónico, puede usar Session Replay para ver qué pasos tomó y qué datos ingresó antes de que ocurriera el error. Esto puede ayudarle a identificar y solucionar rápidamente la causa raíz del problema. +* **Mejorar la experiencia del usuario**: descubra áreas de su aplicación web que están causando frustración en el usuario. Por ejemplo, es posible que vea que el usuario se pierde en su navegación o hace clic en botones que no hacen nada. +* **Identificación de problemas en los recorridos de los usuarios clave**: identifique áreas de su aplicación web que están causando problemas de rendimiento. Por ejemplo, si Session Replay revela que la página `/cart/checkout` está experimentando un tiempo de carga de la página excesivo, priorizaría corregir este recorrido crítico del usuario. + +Screenshot of session replay details + +## Cómo funciona Session Replay [#how-it-works] + +Cuando un usuario carga su página web, Session Replay toma una instantánea del modelo de objetos de documento (DOM), que representa la estructura y los elementos visuales de la página. Para garantizar información de estilo precisa, el agente del browser accede a sus archivos CSS. Luego, el agente integra estos estilos directamente en la grabación de repetición, eliminando la necesidad de hacer referencia a archivos CSS externos durante la reproducción. A medida que el usuario interactúa con la página, una biblioteca dentro del agente del browser captura cualquier cambio realizado en el DOM. Estos datos capturados se almacenan de forma segura en la base de datos de New Relic. + +Las repeticiones se almacenan hasta: + +* 4 horas de sesión de usuario +* 30 minutos de inactividad + +De forma predeterminada, los datos de eventos browser se almacenan durante 8 días, pero la retención real de datos depende de su cuenta. + +Para obtener más detalles sobre Session Replay, consulte las siguientes secciones: + +* [Consumo de datos](#data-consumption): Ver o proyectar el consumo de datos. +* [Preocupaciones de privacidad y seguridad del usuario](#data-security): conozca cómo protegemos sus datos de usuario y cumplimos con los requisitos de privacidad. +* [Session Replay y el rendimiento de su aplicación](#app-performance): aprenda cómo Session Replay minimiza el impacto en el rendimiento de su aplicación. + +## Empezar [#get-started] + + + + ### Habilitar Session Replay [#enable-configure-settings] + + 1. Vaya a **[one.newrelic.com](https://one.newrelic.com/all-capabilities) &gt; All Capabilities &gt; Browser**. + 2. Seleccione la aplicación de su browser . + 3. En el menú de la izquierda, haga clic en **Application settings**. + 4. En la página de configuración de la aplicación, asegúrese de que esté seleccionado **Pro** o **Pro + SPA** agente del navegador. Session Replay no está disponible para el agente Lite del navegador. + 5. Active las configuraciones **Session traces** y **Session replay** . + + + + ### Configurar tasas de muestreo [#configure-sampling-rates] + + Establezca una frecuencia de muestreo (0%-100%) para las siguientes muestras: + + * **User sessions** registra una muestra aleatoria de todas las sesiones de usuario. + + * **Errored session** registra una muestra aleatoria de todas las sesiones con errores. El agente almacena en el búfer una ventana deslizante de datos durante hasta 30 segundos en el lado del cliente y, si se producen errores, los datos almacenados en el búfer se recopilarán y se registrará el resto de la sesión. Si no se produce un error, la repetición nunca se recopila. + + Por ejemplo, si establece la tasa de muestreo de la sesión en 50% y la tasa de muestreo de error en 100%, significa que: + + * Se grabará la mitad de todas las sesiones de usuario. + + * Todas las sesiones con errores serán grabadas, incluso si no forman parte de la muestra del 50%. + + + + ### (Opcional) Configurar ajustes de privacidad [#configure-privacy-settings] + + De forma predeterminada, todo el texto y las entradas se reemplazan con asteriscos. A continuación se muestra un ejemplo de cómo se ve una repetición con privacidad predeterminada: + + Example of default privacy settings + + Si esta configuración es apropiada, continúe con el siguiente paso. + + Si necesita personalizar qué contenido o entrada del usuario se captura, tiene opciones para enmascarar, bloquear o ignorar clases y atributos específicos de contenido o entrada del usuario. Asegúrese de consultar con su equipo de privacidad antes de cambiar la configuración de privacidad. + + ### Enmascarar texto sensible [#mask-text] + + Puede enmascarar texto confidencial, lo que significa que el texto se reemplazará con asteriscos (\*). Por ejemplo, puede enmascarar el ID de cuenta de un usuario que se muestra en una URL. + + Para especificar qué entrada debe enmascararse, tiene algunas opciones: + + * En la página **Application settings** , agregue sus propios selectores de CSS o marque las casillas de enmascaramiento. Tenga en cuenta que el uso de selectores de enmascarar **no** enmascarará la entrada del usuario, por lo que si necesita ocultar la entrada del usuario, le recomendamos utilizar selectores de bloque. + + Screenshot of mask settings in the ui + + * Agregue nuestra clase CSS `nr-mask` o atributo `data-nr-mask` al HTML de su página web. Por ejemplo, para enmascarar el ID de una cuenta para que no se muestre en la URL, agregue `nr-mask` al `
` que contiene el ID de la cuenta: + + ```html +
Account ID: 99881123
+ ``` + + Estas opciones utilizan un asterisco (\*) para enmascarar todo el texto de ese elemento, ocultando el texto real pero revelando la cantidad de caracteres ingresados. Sin embargo, los asteriscos no son números válidos, por lo que enmascarar campos específicos del tipo de número, como números de teléfono o de tarjeta de crédito, dará como resultado un campo en blanco en una repetición. + + ### Bloquear contenido del sitio [#block-content] + + Puedes bloquear secciones enteras de contenido en tu sitio, lo que significa que la sección aparecerá como un marcador de posición vacío en Session Replay. Por ejemplo, si tiene una imagen en su página web Acerca de nosotros y no necesita capturarla, puede bloquear la clase que contiene la imagen. + + Para bloquear clases o atributos específicos, tienes algunas opciones: + + * En la página de configuración de la aplicación, agregue sus selectores CSS en el campo \**Bloquear selectores* . + + Screenshot of session replay settings + + * Agregue manualmente nuestra clase CSS `nr-block` o atributo `data-nr-block` al HTML de su página web. Por ejemplo, si desea bloquear texto e imágenes irrelevantes de Session Replay, agregue `nr-block` a `
`: + + ```html + + + Sample image and text + + +
+ Image description +
+ + + ``` + + ### Ignorar la entrada del usuario [#ignore-input] + + Puede ignorar los cambios en un campo de entrada del usuario, lo que significa que el campo de entrada seguirá mostrar en la repetición, pero no mostrará los cambios en el valor. Por ejemplo, puede ignorar la clase que contiene los campos de dirección de email o tarjeta de crédito. Los campos de entrada de contraseña siempre están enmascarados.  + + Para ignorar la entrada, agregue la clase CSS `nr-ignore` al nombre de clase del campo de entrada. Por ejemplo, si desea ignorar información confidencial en una página de facturación, agregue `class="nr-ignore"` a ``: + + ```html +
+

Sensitive Information

+

Credit card number:

+

Expiration date:

+

CVV code:

+
+ ``` + + + + ### (Para copiar/pegar desplegar agente) Actualizar manualmente el fragmento de JavaScript [#update-snippet] + + Si implementa el agente del navegador usando el método copiar/pegar, deberá copiar/pegar desde la UI nuevamente. Esto se debe a que cuando habilita Session Replay, el fragmento de JavaScript se actualiza para incluir las nuevas actualizaciones de configuración. + + Para actualizar su código de agente: + + 1. Vaya a la página **Application Settings** y copie el fragmento de JavaScript. + + Screenshot of the application settings page. + + 2. Pégalo en tu código donde estaba el fragmento anterior. + + 3. Desplegar tu aplicación. + + + + ### Ver la repetición de la sesión en New Relic [#view-data] + + Puede encontrar Session Replay en dos lugares: + + * En la página **Session replay** : + + 1. Vaya a **[one.newrelic.com > All Capabilities](https://one.newrelic.com/all-capabilities) &gt; Browser**. + + 2. Seleccione la aplicación de su browser . + + 3. En el menú de la izquierda, desplácese hacia abajo y haga clic en **Session replay**. + + 4. Haga clic en cada repetición para ver los detalles de la sesión. + + screenshot of the session replay page in browser + + * En la página **Errors inbox** : + + 1. En el menú browser de la izquierda, haga clic en **Errors**. + + 2. Haga clic en las páginas **Triage** y **Group errors** para ver las repeticiones adjuntas a los errores. + + Screenshot of replays in errors inbox + + + + + Algunas configuraciones, incluida la habilitación o deshabilitación de la reproducción de sesión y el ajuste de las frecuencias de ejemplificación para el rendimiento general y los errores, se movieron a la configuración del lado del servidor. Por ejemplo, luego de actualizar estas configuraciones para el método de instalación copiar/pegar, no es necesario volver a implementar el script. Esto es aplicable para el agente del browser versión `1.259.0` o superior. + + +## Resolución de problemas [#troubleshoot] + + + + ### Problema + + La característica Session Replay está habilitada, pero no ves ninguna repetición. + + ### Solución + + Aquí hay algunas posibles soluciones: + + * Verifique sus tasas de muestreo. Hay muestreo tanto para repeticiones como para errores. + + * Asegúrate de tener permiso para ver repeticiones. + + * Asegúrate de estar utilizando la versión Pro o Pro+SPA del agente del navegador. Session Replay no funciona con el agente Lite del navegador. + + * Asegúrese de que su agente del navegador cumpla con estos requisitos: + + * Versión del agente v1.260.0 o superior. Recomendamos [actualizar a la última versión del agente](/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes) a medida que continuamos realizando mejoras. + * Tipo de agente: Pro o Pro+SPA. Session Replay no funciona con el agente Lite del navegador. + * [El seguimiento de sesiones](/docs/browser/browser-monitoring/browser-pro-features/session-traces-explore-webpages-life-cycle/#requirements) está habilitado. + + * El de su final browser admite la de usuario a browsernivel de API necesaria para grabar una Session Replay (verifique la compatibilidad en [MutationObserver](https://caniuse.com/mutationobserver)). + + * En [Errors Inbox](/docs/errors-inbox/errors-inbox/), filtra tus vistas para que siempre veas una repetición. De forma predeterminada, los datos de eventos browser se almacenan durante 8 días, pero la retención real de datos depende de su cuenta. + + * Si está utilizando el método de copiar y pegar desplegable, asegúrese de [actualizar su código de agente](#update-snippet). + + * Si está utilizando el método de implementación APM, es posible que deba esperar un momento para que Session Replay se habilite automáticamente. Si aún no ve datos, intente reiniciar el agente. + + * Si [elimina](https://docs.newrelic.com/docs/data-apis/manage-data/drop-data-using-nerdgraph/) datos de eventos de PageView, es posible que la repetición de sesión no se muestre en la UI. + + + + ### Problema + + Estás viendo repeticiones, pero no se muestran correctamente. + + Esto puede deberse a que sus archivos CSS están alojados en un dominio separado y las medidas de seguridad de intercambio de recursos entre orígenes (CORS) impiden que nuestro agente acceda a los archivos CSS. Esto puede dar como resultado repeticiones incompletas o inexactas, ya que es posible que falte información de estilo esencial. + + Esto es lo que sucede detrás de escena: + + * Session Replay funciona reconstruyendo el DOM del usuario, que incluye la estructura y los elementos visuales de su sitio web. Para lograr esto, nuestro agente necesita acceder a sus archivos CSS para capturar con precisión información de estilo. Luego incorporamos estos estilos directamente en la grabación de repetición, eliminando la necesidad de hacer referencia a los archivos CSS originales durante la reproducción. + + * Si sus archivos CSS están alojados en un dominio separado, CORS puede impedir que nuestro agente acceda a ellos. + + ### Solución + + Para asegurarse de que sus archivos CSS sean accesibles, agregue el atributo `crossorigin="anonymous"` a sus elementos `` dentro de su código HTML. Este atributo indica al browser que permita el acceso entre orígenes para esos archivos CSS específicos, lo que permite a nuestro agente del navegador registrar e integrar la información de estilo. + + A continuación se muestra un ejemplo de cómo agregar el atributo `crossorigin="anonymous"` : + + ```html + + ``` + + + + ### Problema + + La función de reproducción de sesión está habilitada, pero no ves datos de reproducción para el contenido iframe. + + ### Solución + + El comportamiento de Session Replay en escenarios iframe depende del origen del iframe y de la ubicación del agente del browser. + + Suponiendo que un sitio web consta de una ventana de nivel superior con un iframe secundario, aquí hay algunas posibles soluciones: + + * **Iframes del mismo origen**: + + * Si coloca el agente del browser en la ventana de nivel superior, Session Replay captura tanto la ventana como el iframe. + * Si coloca el agente del browser en el iframe, Session Replay solo captura lo que está en el iframe. + * Si coloca el agente del browser tanto en la ventana de nivel superior como en el iframe, Session Replay captura lo que sucede independientemente tanto en la ventana como en el iframe, lo que da como resultado dos sesiones separadas. + + * **Iframes de origen cruzado**: + + * Si coloca el agente del browser en la ventana de nivel superior, Session Replay solo captura lo que hay en la ventana. El iframe aparecerá en blanco en la repetición de la sesión. + * Si coloca el agente del browser en el iframe de nivel superior, Session Replay solo captura lo que está en el iframe. + + La repetición de sesión **no** es compatible con `` elementos. + + + +## Grabar manualmente la repetición de la sesión [#manual-replays] + +Si es necesario, puede `force` mediante programación una Session Replay para iniciar o detener la grabación empleando métodos API . A continuación se muestran algunos casos de uso: + +* Permitir que el usuario opte por la grabación de interacciones. Por ejemplo, si aparece una ventana emergente que pregunta "¿Permitir que se grabe esta sesión para analizar el rendimiento?" y un usuario consiente: + + 1. Llame a `newrelic.recordReplay()` para iniciar la grabación. + 2. Una vez que se complete la sesión o se retire el consentimiento, use `newrelic.pauseReplay()` para dejar de capturar datos. + +* Grabe sesiones según criterios específicos, como: + + * Comience a grabar solo sesiones en URL específicas, como el flujo de pago de un producto. + * Detenga la grabación de páginas confidenciales como `/billing` o `/health-records`. + +Consulte la documentación de la API para obtener instrucciones: + +* [`newrelic.recordReplay`](/docs/browser/new-relic-browser/browser-apis/recordReplay/) +* [`newrelic.pauseReplay`](/docs/browser/new-relic-browser/browser-apis/pauseReplay/) + +## Deshabilitar el seguimiento automático Session Replay [#auto-replays] + +Puede evitar que la reproducción de sesión se inicie automáticamente, incluso cuando se muestrea, estableciendo la opción de configuración API `autoStart` en `false`. Esto resulta útil en escenarios en los que es necesario priorizar acciones específicas sobre la ejemplificación automática. Por ejemplo, es posible que no desee que Session Replay se ejecute automáticamente en páginas confidenciales, como las que cumplen con HIPAA. En tales casos, puede emplear la API `.start()` para activar manualmente la característica de reproducción luego de obtener el consentimiento del usuario (y su aplicación llama a `.start()`). + +La configuración `autoStart: false` indica al agente que posponga su inicialización hasta que se llame explícitamente mediante `.start()`. Esto garantiza que la reproducción de sesión no se creará en absoluto, incluso si el backend toma muestras de su aplicación para grabar. + + + Llamar a `.start()` no garantiza que se grabará una Session Replay . Simplemente retrasa la importación del módulo y la evaluación de los resultados de la ejemplificación hasta este punto. Si necesita forzar una grabación, consulte [Grabar manualmente la reproducción de la sesión](#manual-replays). + + +Para comenzar a emplear esta API, consulte [`newrelic.start`](/docs/browser/new-relic-browser/browser-apis/start/). + +## Utilice Nerdgraph para configurar los ajustes de reproducción [#nerdgraph-mutation] + +Puede configurar los ajustes Session Replay usando nuestra [API NerdGraph](/docs/apis/nerdgraph/get-started/introduction-new-relic-nerdgraph/) en lugar de usar la UI. Este método es útil si necesita realizar cambios masivos, como aplicar frecuencias de muestreo a múltiples entidades browser . + +Aquí hay un ejemplo de mutación y variables para crear una nueva aplicación browser con la configuración predeterminada: + +
+ + + + + + + + + + + + + + + +
+ Mutación + + Variables +
+ ```graphql + mutation SessionReplayConfigUpdate($guid: EntityGuid!, $settings: AgentApplicationSettingsUpdateInput!) { + agentApplicationSettingsUpdate(guid: $guid, settings: $settings) { + browserSettings { + sessionReplay { + blockSelector + errorSamplingRate + maskTextSelector + enabled + collectFonts + inlineImages + inlineStylesheet + samplingRate + maskAllInputs + maskInputOptions { + color + date + datetimeLocal + email + month + number + range + search + select + tel + text + textArea + time + url + week + } + } + } + errors { + field + errorClass + description + } + } + } + ``` + + ```json + { + "sessionReplay": { + "enabled": true, + "collectFonts": true, + "blockSelector": ".private-fields", + "maskTextSelector": "*", + "inlineStylesheet": false, + "maskAllInputs": true, + "maskInputOptions": { + "color": true, + "date": true, + "textArea": true + }, + "samplingRate": 9.99, + "errorSamplingRate": 1.11 + } + } + ``` +
+ +## Consumo de datos [#data-consumption] + +Session Replay sigue el mismo precio de consumo que los otros bytes de su browser . La cantidad de bytes producidos depende del recuento, la duración y los niveles de actividad del usuario de las sesiones, así como de la complejidad del DOM de su sitio. + +La forma más precisa de proyectar su costo por repetición es habilitar la característica durante un periodo de prueba corto y medir su consumo real. Alternativamente, puedes usar un promedio de 5,3 MB por repetición como una aproximación aproximada, aunque ten en cuenta que el costo real puede variar significativamente. Una fórmula sencilla para proyectar sus costos aproximados es: `sessions` x `sampling_rate` x `gb_per_replay` x `cost_per_gb`. He aquí un ejemplo: + +``` +1 million (sessions) x 5% (sampling_rate) x 0.0053 (gb_per_replay) x $0.35 (cost_per_gb) = $92.75 for 50,000 replays +``` + +Para controlar su consumo, [ajuste sus tasas de muestreo](#configure-sampling-rates). + +## Preocupaciones de seguridad y privacidad del usuario [#data-security] + +Priorizamos la privacidad de los datos y creamos Session Replay con configuraciones predeterminadas estables para minimizar la exposición potencial de información confidencial de los clientes. Puede [personalizar aún más la configuración de privacidad](#configure-privacy-settings) para satisfacer sus necesidades específicas. + +Session Replay no captura capturas de pantalla ni videos. En cambio, registra solo los cambios de estado DOM esenciales necesarios para reconstruir la interacción del usuario. Esto reduce significativamente la cantidad de datos almacenados. + +### Cumplimiento de las leyes de privacidad de datos + +New Relic actúa como procesador de datos según GDPR y proveedor de servicios según CCPA. Esto significa que procesamos datos de acuerdo con sus instrucciones. En última instancia, el cumplimiento de estas leyes depende de cómo implemente Session Replay dentro de su aplicación. + +De forma predeterminada, todo el texto y las entradas del usuario, incluidos los datos personales, están enmascarados dentro de las grabaciones. Puede desenmascarar selectivamente elementos específicos si es necesario, pero la configuración predeterminada garantiza que ninguna información de identificación personal sea fácilmente visible. Este enfoque proporciona una base estable para la privacidad de los datos y al mismo tiempo ofrece flexibilidad para sus necesidades específicas. + +## Session Replay y el rendimiento de tu app [#app-performance] + +Session Replay minimiza el impacto en el rendimiento de su aplicación con: + +* **Impacto inicial mínimo**: Session Replay se carga de forma asincrónica después de cargar la página completa, lo que garantiza que no interfiera con el rendimiento métrico de la carga temprana de la página. + +* **Seguimiento de mutaciones DOM **: una vez cargado, Session Replay monitorea los cambios DOM y los informa como carga comprimida. El tamaño de estas cargas se correlaciona con la complejidad del árbol DOM . + +* **Técnicas de optimización del rendimiento**: el tamaño de la carga útil también puede aumentar si el DOM es grande. Sin embargo, Session Replay utiliza una serie de técnicas para reducir el tamaño de la carga, como por ejemplo: + + * Compresión GZIP + + * Reducción de duplicación + + * Recolección estratégica de carga: solo envía una carga grande (comprimida) cuando se captura el DOM completo, lo que generalmente solo ocurre cuando se importa por primera vez la característica de reproducción. Después de eso, solo enviará pequeñas cargas relacionadas con las acciones del usuario. El agente del browser recogerá lo que ocurra primero de lo siguiente: + + * La carga útil alcanza más de 64 KB comprimidos + * Pasan 60 segundos + * La visibilidad de la página cambia (cambio de pestaña, enfoque, navegación, etc.) + * La sesión termina \ No newline at end of file diff --git a/src/i18n/content/es/docs/browser/new-relic-browser/browser-apis/recordReplay.mdx b/src/i18n/content/es/docs/browser/new-relic-browser/browser-apis/recordReplay.mdx index 2bd23b34c67..ff653549517 100644 --- a/src/i18n/content/es/docs/browser/new-relic-browser/browser-apis/recordReplay.mdx +++ b/src/i18n/content/es/docs/browser/new-relic-browser/browser-apis/recordReplay.mdx @@ -28,7 +28,6 @@ Browser API utilizada para forzar una repetición para comenzar a grabar. `newrelic.recordReplay()` Se puede llamar para forzar manualmente una repetición para comenzar a grabar. Debes cumplir con los siguientes requisitos: * La cuenta tiene derecho a grabar repeticiones. -* El seguimiento de sesiones está habilitado * El rastreo de sesión está habilitado * El observador de mutación browser global está presente en la versión actual del browser que se está utilizando. * La característica Session Replay se importa normalmente o se establece en `autoStart: false` y ya se ha &quot;iniciado&quot;. diff --git a/src/i18n/content/es/docs/infrastructure/google-cloud-platform-integrations/gcp-integrations-list/google-vertexai-monitoring-integration.mdx b/src/i18n/content/es/docs/infrastructure/google-cloud-platform-integrations/gcp-integrations-list/google-vertexai-monitoring-integration.mdx new file mode 100644 index 00000000000..16532764be8 --- /dev/null +++ b/src/i18n/content/es/docs/infrastructure/google-cloud-platform-integrations/gcp-integrations-list/google-vertexai-monitoring-integration.mdx @@ -0,0 +1,866 @@ +--- +title: Integración de monitoreo de Google VertexAI +tags: + - Integrations + - Google Cloud Platform integrations + - GCP integrations list +metaDescription: 'New Relic Google VertexAI integration: the data it reports and how to enable it.' +freshnessValidatedDate: never +translationType: machine +--- + +[La integración de New Relic](/docs/infrastructure/introduction-infra-monitoring) incluye una integración para informar sus datos de ejecución de GCP a nuestros productos. Aquí explicamos cómo activar la integración y qué datos recopila. + +## Activar la integración [#activate] + +Para habilitar la integración, siga los procedimientos estándar para [conectar su servicio GCP a New Relic](/docs/connect-google-cloud-platform-services-infrastructure). + +## Configuración y sondeo [#polling] + +Puede cambiar la frecuencia de sondeo y filtrar datos usando [las opciones de configuración](/docs/integrations/new-relic-integrations/getting-started/configure-polling-frequency-data-collection-cloud-integrations). + +Información [de sondeo](/docs/integrations/google-cloud-platform-integrations/getting-started/polling-intervals-gcp-integrations) predeterminada para la integración de GCP Run: + +* New Relic intervalo de sondeo: 5 minutos + +## Buscar y utilizar datos [#find-data] + +Para encontrar sus datos de integración, vaya a **[one.newrelic.com > All capabilities](https://one.newrelic.com/all-capabilities) &gt; Infrastructure &gt; GCP** y seleccione una integración. + +Los datos se adjuntan a los siguientes [tipos de eventos](/docs/data-apis/understand-data/new-relic-data-types/#event-data): + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Entidad + + Tipo de evento + + Proveedor +
+ Extremo + + `GcpVertexAiEndpointSample` + + `GcpVertexAiEndpoint` +
+ Tienda caracteristica + + `GcpVertexAiFeaturestoreSample` + + `GcpVertexAiFeaturestore` +
+ Tienda característica online + + `GcpVertexAiFeatureOnlineStoreSample` + + `GcpVertexAiFeatureOnlineStore` +
+ Ubicación + + `GcpVertexAiLocationSample` + + `GcpVertexAiLocation` +
+ Índice + + `GcpVertexAiIndexSample` + + `GcpVertexAiIndex` +
+ PipelineJob + + `GcpVertexAiPipelineJobSample` + + `GcpVertexAiPipelineJob` +
+ +Para obtener más información sobre cómo utilizar sus datos, consulte [Comprender y utilizar los datos de integración](/docs/infrastructure/integrations/find-use-infrastructure-integration-data). + +## Datos métricos [#metrics] + +Esta integración recopila datos de GCP para VertexAI. + +### Datos extremos de VertexAI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Métrica + + Unidad + + Descripción +
+ `prediction.online.accelerator.duty_cycle` + + Por ciento + + Fracción de tiempo promedio durante el último periodo de muestra durante el cual los aceleradores estuvieron procesando activamente. +
+ `prediction.online.accelerator.memory.bytes_used` + + Bytes + + Cantidad de memoria aceleradora asignada por la réplica del modelo de despliegue. +
+ `prediction.online.error_count` + + Contar + + Número de errores de predicción en línea. +
+ `prediction.online.memory.bytes_used` + + Bytes + + Cantidad de memoria asignada por la réplica del modelo de despliegue y actualmente en uso. +
+ `prediction.online.network.received_bytes_count` + + Bytes + + Número de bytes recibidos a través de la red por la réplica del modelo de desplegar. +
+ `prediction.online.network.sent_bytes_count` + + Bytes + + Número de bytes enviados a través de la red por la réplica del modelo de desplegar. +
+ `prediction.online.prediction_count` + + Contar + + Número de predicciones en línea. +
+ `prediction.online.prediction_latencies` + + Milisegundos + + Latencia de predicción online del modelo desplegar. +
+ `prediction.online.private.prediction_latencies` + + Milisegundos + + Latencia de predicción online del modelo privado desplegar. +
+ `prediction.online.replicas` + + Contar + + Número de réplicas activas empleadas por el modelo desplegar. +
+ `prediction.online.response_count` + + Contar + + Número de códigos de respuesta de predicción en línea diferentes. +
+ `prediction.online.target_replicas` + + Contar + + Número objetivo de réplicas activas necesarias para el modelo de despliegue. +
+ +### Datos de VertexAI Featurestore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Métrica + + Unidad + + Descripción +
+ `featurestore.cpu_load` + + Por ciento + + La carga promedio de CPU para un nodo en el almacenamiento en línea de Featurestore. +
+ `featurestore.cpu_load_hottest_node` + + Por ciento + + La carga de CPU para el nodo más activo en el almacenamiento en línea de Featurestore. +
+ `featurestore.node_count` + + Contar + + La cantidad de nodos para el almacenamiento en línea de Featurestore. +
+ `featurestore.online_entities_updated` + + Contar + + Número de entidad actualizada en el almacenamiento en línea de Featurestore. +
+ `featurestore.online_serving.latencies` + + Milisegundos + + Latencia de servicio online por EntityType. +
+ `featurestore.online_serving.request_bytes_count` + + Bytes + + Tamaño de la solicitud por EntityType. +
+ `featurestore.online_serving.request_count` + + Contar + + Recuento de servicios en línea de Featurestore por EntityType. +
+ `featurestore.online_serving.response_size` + + Bytes + + Tamaño de respuesta por EntityType. +
+ `featurestore.storage.billable_processed_bytes` + + Bytes + + Número de bytes facturados por datos fuera de línea procesados. +
+ `featurestore.storage.stored_bytes` + + Bytes + + Bytes almacenados en Featurestore. +
+ `featurestore.streaming_write.offline_processed_count` + + Contar + + Número de solicitudes de escritura en streaming procesadas para almacenamiento sin conexión. +
+ `featurestore.streaming_write.offline_write_delays` + + Segundos + + Tiempo (en segundos) desde que se llama a la API de escritura hasta que se escribe en el almacenamiento fuera de línea. +
+ +### Datos de VertexAI FeatureOnlineStore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Métrica + + Unidad + + Descripción +
+ `featureonlinestore.online_serving.request_count` + + Contar + + Número de recuento de porciones por FeatureView. +
+ `featureonlinestore.online_serving.serving_bytes_count` + + Bytes + + Tamaño de respuesta de publicación por FeatureView. +
+ `featureonlinestore.online_serving.serving_latencies` + + Milisegundos + + Latencia de servicio en línea mediante FeatureView. +
+ `featureonlinestore.running_sync` + + Milisegundos + + Número de sincronizaciones en ejecución en un momento determinado. +
+ `featureonlinestore.serving_data_ages` + + Segundos + + Medida de la antigüedad de los datos de servicio en segundos. +
+ `featureonlinestore.serving_data_by_sync_time` + + Contar + + Desglose de datos en Feature Online Store por timestamp sincronizada. +
+ `featureonlinestore.storage.bigtable_cpu_load` + + Por ciento + + La carga promedio de CPU de los nodos en Feature Online Store. +
+ `featureonlinestore.storage.bigtable_cpu_load_hottest_node` + + Por ciento + + La carga de CPU del nodo más caliente en Feature Online Store. +
+ `featureonlinestore.storage.bigtable_nodes` + + Contar + + El número de nodos de Feature Online Store(Bigtable). +
+ `featureonlinestore.storage.stored_bytes` + + Contar + + Bytes almacenados en Feature Online Store. +
+ +### Datos de ubicación de VertexAI + + + + | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ `online_prediction_requests_per_base_model` + + Contar + + Número de solicitudes por modelo base. +
+ `quota.online_prediction_requests_per_base_model.exceeded` + + Contar + + Número de intentos de superar el límite de la métrica de cuota. +
+ `quota.online_prediction_requests_per_base_model.limit` + + Contar + + Límite actual de la métrica de cuota. +
+ `quota.online_prediction_requests_per_base_model.usage` + + Contar + + Uso actual en la métrica de cuota. +
+ `executing_vertexai_pipeline_jobs` + + Contar + + Número de trabajos de canalización que se ejecutan. +
+ `executing_vertexai_pipeline_tasks` + + Contar + + Número de tareas de canalización que se ejecutan. +
+ +### Datos del índice VertexAI + + + + | + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ `matching_engine.stream_update.datapoint_count` + + Contar + + Número de puntos de datos insertados o eliminados correctamente. +
+ `matching_engine.stream_update.latencies` + + Milisegundos + + La latencia entre el usuario recibe una UpsertDatapointsResponse o RemoveDatapointsResponse y esa actualización surte efecto. +
+ `matching_engine.stream_update.request_count` + + Contar + + Número de solicitudes de actualización de flujo. +
+ +### Datos del trabajo de pipeline de VertexAI + + + + | + + + + + + + + + + + + + + + + + + +
+
+ `pipelinejob.duration` + + Segundos + + Segundos de tiempo de ejecución del trabajo de canalización que se ejecuta (desde la creación hasta el final). +
+ `pipelinejob/task_completed_count` + + Contar + + Número total de tareas de canalización completadas. +
\ No newline at end of file diff --git a/src/i18n/content/es/docs/service-level-management/create-slm.mdx b/src/i18n/content/es/docs/service-level-management/create-slm.mdx index 76f154304b7..46ce61036b3 100644 --- a/src/i18n/content/es/docs/service-level-management/create-slm.mdx +++ b/src/i18n/content/es/docs/service-level-management/create-slm.mdx @@ -51,7 +51,7 @@ Por ejemplo, en un nivel alto, una experiencia clave del usuario en New Relic po Para esa experiencia del usuario, podríamos crear un SLO como: -| periodo | objetivo | categoría | indicador | | ------------ | ------ | -------- | ------------------------------------------------------------------- | | últimos 28 días | 99,9% | latencia | los datos ingeridos por un usuario están disponibles para consulta en menos de 1 minuto | +\| periodo | objetivo | categoría | indicador | | ------------ | ------ | -------- | ------------------------------------------------------------------- | | últimos 28 días | 99,9% | latencia | los datos ingeridos por un usuario están disponibles para consulta en menos de 1 minuto | Tenga en cuenta que estos tipos de experiencia del usuario generalmente involucran más de un servicio y se extienden a través de múltiples límites de equipos y organizaciones. @@ -59,7 +59,7 @@ Al aumentar la granularidad de la experiencia subyacente del usuario, otra exper Este SLO podría verse así: -| periodo | objetivo | categoría | indicador | | ------------ | ------ | ------------ | ------------------------------------------------- | | últimos 28 días | 99.9% | disponibilidad | el usuario interactúa exitosamente con la dashboard UI | +\| periodo | objetivo | categoría | indicador | | ------------ | ------ | ------------ | ------------------------------------------------- | | últimos 28 días | 99.9% | disponibilidad | el usuario interactúa exitosamente con la dashboard UI | Como ejemplo de llevar la granularidad demasiado lejos, agregar un widget de gráfico en un dashboard también es una experiencia del usuario. Sin embargo, la creación de un SLO específico para esta acción no proporciona valor adicional en comparación con el SLO anterior sobre la interacción exitosa de los usuarios con la dashboard UI. From 0ac79c22390d559787fc57cc8d49e512754eb674 Mon Sep 17 00:00:00 2001 From: adutta-newrelic Date: Wed, 29 Jan 2025 18:32:04 +0530 Subject: [PATCH 26/67] upates --- .../session-replay/additional-information.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx index 8821e11f25b..db056cba9ea 100644 --- a/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx +++ b/src/content/docs/browser/browser-monitoring/browser-pro-features/session-replay/additional-information.mdx @@ -30,7 +30,7 @@ By default, all text and user inputs, including personal data, are masked within ## Session replay and your app's performance [#app-performance] -Session replay minimizes impact on your app's performance with: +Session replay minimizes impact on your applications performance with: * **Minimal initial impact**: Session replay loads asynchronously after full page load, ensuring no interference with early page load performance metrics. * **DOM mutation tracking**: Once loaded, session replay monitors DOM changes and reports them as compressed payloads. The size of these payloads correlates with the complexity of the DOM tree. From 891801fe9b9768b17e22de3e71b16d7373b302a5 Mon Sep 17 00:00:00 2001 From: Kai Steinbach Date: Wed, 29 Jan 2025 14:30:57 +0100 Subject: [PATCH 27/67] Update new-relic-infrastructure-agent-1600.mdx correction to the release date's year --- .../new-relic-infrastructure-agent-1600.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/release-notes/infrastructure-release-notes/infrastructure-agent-release-notes/new-relic-infrastructure-agent-1600.mdx b/src/content/docs/release-notes/infrastructure-release-notes/infrastructure-agent-release-notes/new-relic-infrastructure-agent-1600.mdx index 96c5a8db8ee..c7ae2f3da05 100644 --- a/src/content/docs/release-notes/infrastructure-release-notes/infrastructure-agent-release-notes/new-relic-infrastructure-agent-1600.mdx +++ b/src/content/docs/release-notes/infrastructure-release-notes/infrastructure-agent-release-notes/new-relic-infrastructure-agent-1600.mdx @@ -1,6 +1,6 @@ --- subject: Infrastructure agent -releaseDate: '2024-01-20' +releaseDate: '2025-01-20' version: 1.60.0 --- From d3e23f6eee7fbc7ecbf900d039abd0a8a36e4594 Mon Sep 17 00:00:00 2001 From: rohit-bandlamudi-nr Date: Wed, 29 Jan 2025 19:10:53 +0530 Subject: [PATCH 28/67] doc: added fluentbit doc for 3.1.2 --- .../fluentbit-24-08-31.mdx | 23 +++++++++++++++++++ .../fluentbit-24-10-31.mdx | 4 +++- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/content/docs/release-notes/fluentbit-release-notes/fluentbit-24-08-31.mdx diff --git a/src/content/docs/release-notes/fluentbit-release-notes/fluentbit-24-08-31.mdx b/src/content/docs/release-notes/fluentbit-release-notes/fluentbit-24-08-31.mdx new file mode 100644 index 00000000000..f10d1d66962 --- /dev/null +++ b/src/content/docs/release-notes/fluentbit-release-notes/fluentbit-24-08-31.mdx @@ -0,0 +1,23 @@ +--- +subject: Fluent Bit +releaseDate: '2024-08-31' +version: 3.1.2 +metaDescription: Release notes for Fluent bit version 3.1.2 +features: ["file_cache_advise (default: on) to reduce file cache usage", "emitter alias", "plugin pause/resume mechanism] +bugs: ["Centos 7 package fix", "prevent crash during reload"] +security: ["Security1"] +--- + +### Support for Fluent Bit 3.1.2 + +Users will now receive Fluent Bit version 3.1.2, which includes fixes for known vulnerabilities. For more details, refer https://fluentbit.io/announcements/. + +### Changed + +* Infrastructure agent recommends Fluent Bit 3.1.2 packages. +* [Fluent Bit Output Plugin Docker image](https://hub.docker.com/r/newrelic/newrelic-fluentbit-output) uses Fluent Bit 3.1.2. +* [New Relic Logging Helm chart](https://github.com/newrelic/helm-charts/tree/master/charts/newrelic-logging) installs the new plugin image. + +### Notes + +To stay up to date with the most recent fixes and enhancements, subscribe to our [Logs RSS feed](/docs/release-notes/logs-release-notes/). \ No newline at end of file diff --git a/src/content/docs/release-notes/fluentbit-release-notes/fluentbit-24-10-31.mdx b/src/content/docs/release-notes/fluentbit-release-notes/fluentbit-24-10-31.mdx index 23ab86ef3f4..ea64ddc0600 100644 --- a/src/content/docs/release-notes/fluentbit-release-notes/fluentbit-24-10-31.mdx +++ b/src/content/docs/release-notes/fluentbit-release-notes/fluentbit-24-10-31.mdx @@ -3,7 +3,9 @@ subject: Fluent Bit releaseDate: '2024-10-31' version: 3.1.9 metaDescription: Release notes for Fluent bit version 3.1.9 -features: ["Multiline reset fixes high CPU, prevent crash during reload, improved error messaging, YAML memory fixes, ctraces upgraded, Calyptia_Fleet input and Elasticsearch input fixes, Multiline filter enhancement, and Calyptia output updates for Windows and agent registration."] +features: ["Multiline reset fixes high CPU", "improved error messaging", "ctraces upgraded", "Calyptia_Fleet input and Elasticsearch input fixes", "Multiline filter enhancement", "Calyptia output updates for Windows and agent registration"] +bugs: ["YAML memory fixes", "prevent crash during reload"] +security: ["Security"] --- ### Support for Fluent Bit 3.1.9 From 3c110cf5ec1b44a2f4178d55ed11595b8aad9edf Mon Sep 17 00:00:00 2001 From: johnathannewrelic <129548163+johnathannewrelic@users.noreply.github.com> Date: Wed, 29 Jan 2025 10:13:03 -0800 Subject: [PATCH 29/67] Update tutorial-manage-users-groups-scim.mdx New Relic employee in the #gts-accounts-security space updating a doc to include important detail. --- .../tutorial-manage-users-groups-scim.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/accounts/accounts/automated-user-management/tutorial-manage-users-groups-scim.mdx b/src/content/docs/accounts/accounts/automated-user-management/tutorial-manage-users-groups-scim.mdx index fe31545a328..58e06124575 100644 --- a/src/content/docs/accounts/accounts/automated-user-management/tutorial-manage-users-groups-scim.mdx +++ b/src/content/docs/accounts/accounts/automated-user-management/tutorial-manage-users-groups-scim.mdx @@ -529,13 +529,13 @@ Once your SCIM API integration is complete, all users brought into New Relic sta The user's type attribute is defined in the [custom schema](/docs/accounts/accounts/automated-user-management/scim-support-automated-user-management#user-type) `urn:ietf:params:scim:schemas:extension:newrelic:2.0:User`. Include this schema and the `nrUserType` string attribute in your create or update request to set a user's type. -Valid values for `nrUserType` include: +Valid values for `nrUserType` include, which are case sensitive: * `Full User` * `Core User` * `Basic User` -To create a new `Basic user` send a `POST` request `/scim/v2/Users` and include the custom New Relic schema extension: +To create a new `Basic User` send a `POST` request `/scim/v2/Users` and include the custom New Relic schema extension: ```shell curl -X 'POST' -H 'Content-Type: application/json' -H "Authorization: Bearer $YOUR_TOKEN" 'https://scim-provisioning.service.newrelic.com/scim/v2/Users' --data-binary @- < Date: Wed, 29 Jan 2025 10:20:06 -0800 Subject: [PATCH 30/67] Update okta-scimsso-application-configuration.mdx New Relic employee on the #gts-accounts-security team updating the doc to include an important detail. --- .../okta-scimsso-application-configuration.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration.mdx b/src/content/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration.mdx index 9213d289850..3c529cba2d0 100644 --- a/src/content/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration.mdx +++ b/src/content/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration.mdx @@ -109,7 +109,7 @@ To manage your users' user type from Okta: 4. Next, you'll configure your Okta user profile to have this field. Steps: * In the **Profile editor**, go to **Users** and click the **User (default)** profile. - * Add a new **New Relic user type** attribute to that profile ([see Okta user profile instructions](https://developer.okta.com/docs/concepts/user-profiles/#universal-directory-schemas)). How you set this will depend on your own setup and preferences for defining user type. Note that the expected values for user type are `Basic User`, `Core User`, and `Full User`. Below is an example with information filled in. + * Add a new **New Relic user type** attribute to that profile ([see Okta user profile instructions](https://developer.okta.com/docs/concepts/user-profiles/#universal-directory-schemas)). How you set this will depend on your own setup and preferences for defining user type. Note that the expected values for user type are `Basic User`, `Core User`, and `Full User` which are case sensitive. Below is an example with information filled in. Set Okta user profile to have new attribute 5. In the **People** section, define the user type for your users. How you do this will depend on your setup and preferences. For example, you may choose to set this manually by setting each user’s user type, or you may use Okta to manage these in bulk. From 87f447d6282fcea12d486ddafc982b0c74cc304b Mon Sep 17 00:00:00 2001 From: newrelic-ruby-agent-bot Date: Wed, 29 Jan 2025 19:27:41 +0000 Subject: [PATCH 31/67] chore(ruby agent): add release notes --- .../ruby-release-notes/ruby-agent-9-17-0.mdx | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/content/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0.mdx diff --git a/src/content/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0.mdx b/src/content/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0.mdx new file mode 100644 index 00000000000..c872dd034e9 --- /dev/null +++ b/src/content/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0.mdx @@ -0,0 +1,59 @@ +--- +subject: Ruby agent +releaseDate: '2025-01-29' +version: 9.17.0 +downloadLink: https://rubygems.org/downloads/newrelic_rpm-9.17.0.gem +features: ["Support Ruby 3.4.0", "Add instrumentation for aws-sdk-firehose", "Kubernetes APM auto-attach - new agent version precedent", "Add health checks when the agent runs within Agent Control", "Add Redshift as recognized ActiveRecord adapter", "Add instrumentation for aws-sdk-kinesis"] +bugs: ["Stop emitting inaccurate debug-level log about deprecated configuration options", "Do not attempt to decorate logs with `nil` messages", "Stop renaming final Grape segment"] +security: [] +--- + + + We recommend updating to the latest agent version as soon as it's available. If you can't upgrade to the latest version, update your agents to a version no more than 90 days old. Read more about [keeping agents up to date](/docs/new-relic-solutions/new-relic-one/install-configure/update-new-relic-agent/). + + See the New Relic Ruby agent [EOL policy](https://docs.newrelic.com/docs/apm/agents/ruby-agent/getting-started/ruby-agent-eol-policy/) for information about agent releases and support dates. + + +## v9.17.0 + +- **Feature: Support Ruby 3.4.0** + + The agent now supports Ruby 3.4.0. We've made incremental changes throughout the preview stage to reach compatibility. This release includes an update to the Thread Profiler for compatibility with Ruby 3.4.0's new backtrace format. [Issue#2992](https://github.com/newrelic/newrelic-ruby-agent/issues/2992) [PR#2997](https://github.com/newrelic/newrelic-ruby-agent/pull/2997) + +- **Feature: Add instrumentation for aws-sdk-firehose** + + The agent now has instrumentation for the [aws-sdk-firehose](https://rubygems.org/gems/aws-sdk-firehose) gem. [PR#2973](https://github.com/newrelic/newrelic-ruby-agent/pull/2973) + +- **Feature: Kubernetes APM auto-attach - new agent version precedent** + + Previously, when a customer installed the Ruby agent via [Kubernetes APM auto-attach](https://docs.newrelic.com/docs/kubernetes-pixie/kubernetes-integration/installation/k8s-agent-operator/) and also had the Ruby agent listed in their `Gemfile`, the agent version in `Gemfile` would take precedence. Now, the agent version installed by auto-attach takes priority. [PR#3018](https://github.com/newrelic/newrelic-ruby-agent/pull/3018) + +- **Feature: Add health checks when the agent runs within Agent Control** + + When the agent is started within an [Agent Control](https://docs-preview.newrelic.com/docs/new-relic-agent-control) environment, a health check file will be created at the configured file location for every agent process. By default, this location is: '/newrelic/apm/health'. The health check files will be updated at the configured frequency, which defaults to every five seconds. [PR#2995](https://github.com/newrelic/newrelic-ruby-agent/pull/2995) + +- **Feature: Add Redshift as recognized ActiveRecord adapter** + + When the agent does not recognize an ActiveRecord adapter, the host, port, and database name information is not added to the datastore span. Redshift will now be treated like PostgreSQL, and the agent will save the host, port, and database name on the span. [PR#3032](https://github.com/newrelic/newrelic-ruby-agent/pull/3032) + +- **Feature: Add instrumentation for aws-sdk-kinesis** + + The agent now has instrumentation for the [aws-sdk-kinesis](https://rubygems.org/gems/aws-sdk-kinesis) gem. It will record message broker segments for `get_records`, `put_record`, and `put_records` operations. All other operations will record standard segments. [PR#2974](https://github.com/newrelic/newrelic-ruby-agent/pull/2974) + +- **Bugfix: Stop emitting inaccurate debug-level log about deprecated configuration options** + + In the previous major release, we dropped support for `disable_` configuration options in favor of `instrumentation.`. Previously, a DEBUG level log warning appeared whenever `disable_*` options were set to `true`, even for libraries (e.g. Action Dispatch) without equivalent `instrumentation.*` options: + + >DEBUG : [DEPRECATED] configuration disable_ for will be removed in the next major release. Use instrumentation. with one of ["auto", "disabled", "prepend", "chain"] + + This inaccurate warning has been removed. If you are disabling instrumentation using `instrumentation.: disabled` or `NEW_RELIC_INSTRUMENTATION_=disabled`, please verify the option exists by consulting our [configuration documentation](https://docs.newrelic.com/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration/#instrumentation). If the option does not exist, check the ['Disabling' section](https://docs.newrelic.com/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration/#disabling) to see if there is a related option. We apologize for the confusion. [PR#3005](https://github.com/newrelic/newrelic-ruby-agent/pull/3005) + +- **Bugfix: Do not attempt to decorate logs with `nil` messages** + + The agent no longer attempts to add New Relic linking metadata to logs with `nil` messages. Thank you, [@arlando](https://github.com/arlando) for bringing this to our attention! [Issue#2985](https://github.com/newrelic/newrelic-ruby-agent/issues/2985) [PR#2986](https://github.com/newrelic/newrelic-ruby-agent/pull/2986) + +- **Bugfix: Stop renaming final Grape segment** + + Previously, the agent renamed the final segment in Grape transactions to `"Middleware/Grape/#{class_name}/call"`. This was a part of an old instrumentation pattern that is no longer relevant. Many thanks to [@seriousdev-gh](https://github.com/seriousdev-gh) for bringing this issue to our attention and along with a great reproduction and suggested fix. [PR#2987](https://github.com/newrelic/newrelic-ruby-agent/pull/2987). + + From 15cdfbc09df031dd4b72d6da6871bc957221eca4 Mon Sep 17 00:00:00 2001 From: jbedell-newrelic <126519854+jbedell-newrelic@users.noreply.github.com> Date: Wed, 29 Jan 2025 15:44:55 -0500 Subject: [PATCH 32/67] Create java-agent-8180.mdx --- .../java-release-notes/java-agent-8180.mdx | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/content/docs/release-notes/agent-release-notes/java-release-notes/java-agent-8180.mdx diff --git a/src/content/docs/release-notes/agent-release-notes/java-release-notes/java-agent-8180.mdx b/src/content/docs/release-notes/agent-release-notes/java-release-notes/java-agent-8180.mdx new file mode 100644 index 00000000000..f440b69128f --- /dev/null +++ b/src/content/docs/release-notes/agent-release-notes/java-release-notes/java-agent-8180.mdx @@ -0,0 +1,85 @@ +--- +subject: Java agent +releaseDate: ‘2025-01-30' +version: 8.18.0 +downloadLink: 'https://download.newrelic.com/newrelic/java-agent/newrelic-agent/8.18.0/' +features: [“Added scala3 source detection “, “Vertx: decreased the amount of tokens created”, “kafka-clients-metrics: Refactor node topic metrics”, “New instrumentation module for Struts2 v6.7.0”, “New instrumentation module for Kafka 3.9”, “All AWS instrumentation modules: do not hide http request”, “Added support for distributed tracing in AWS SQS”, “Added relationship metric support for Kafka clients node metrics”] +bugs: [“Fix edge case in JsonTemplateLayout with certain escaped sequences”, “Correct Apdex on transaction event if an error is present”, “Don't add null port to hostname attribute on JFR events”, “Fix memory issue with httpclient-5.0 instrumentation”] +security: [] +--- + + + Download this agent version + + + +## New features and improvements + +- [2172](https://github.com/newrelic/newrelic-java-agent/pull/2172) Add scala3 source detection by @kanderson250 +- [2185](https://github.com/newrelic/newrelic-java-agent/pull/2185) Vertx: decrease amount of tokens created by @meiao +- [2199](https://github.com/newrelic/newrelic-java-agent/pull/2199) Instrumentation module for Struts2 v6.7.0 by @jtduffy +- [2203](https://github.com/newrelic/newrelic-java-agent/pull/2203) Kafka 3.9 support by @meiao +- [2204](https://github.com/newrelic/newrelic-java-agent/pull/2204) Sqs distributed trace by @obenkenobi +- [2202](https://github.com/newrelic/newrelic-java-agent/pull/2202) Kafka clients node metrics by @meiao + +## Fixes + +- [2187](https://github.com/newrelic/newrelic-java-agent/pull/2187) Fix edge case in JsonTemplateLayout with certain escaped sequences by @jtduffy +- [2191](https://github.com/newrelic/newrelic-java-agent/pull/2191) Correct Apdex on transaction event if an error is present by @jtduffy +- [2192](https://github.com/newrelic/newrelic-java-agent/pull/2192) Don't add null port to hostname attribute on JFR events by @jasonjkeller +- [2197](https://github.com/newrelic/newrelic-java-agent/pull/2197) Fix memory issue with httpclient-5.0 instrumentation by @jasonjkeller + +## Update to latest version [#procedures] + +To identify which version of the Java agent you're currently using, run `java -jar newrelic.jar -v`. Your Java agent version will be printed to your console. + +Then, to update to the latest Java agent version: + +1. Back up the **entire** [Java agent root directory](/docs/agents/manage-apm-agents/troubleshooting/find-agent-root-directory#java-agent) to another location. Rename that directory to `NewRelic_Agent#.#.#`, where `#.#.#` is the agent version number. +2. [Download the agent.](/docs/release-notes/agent-release-notes/java-release-notes). +3. Unzip the new agent download file, then copy `newrelic-api.jar` and `newrelic.jar` into the original [Java agent root directory](/docs/agents/manage-apm-agents/troubleshooting/find-agent-root-directory#java-agent). +4. Compare your old `newrelic.yml` with the newly downloaded `newrelic.yml` from the zip, and [update the file if needed](#diff). +5. Restart your Java dispatcher. + +If you experience issues after the Java agent update, restore from the backed-up New Relic agent directory. + +## Update agent config differences [#diff] + +We add new settings to `newrelic.yml` as we release new versions of the agent. You can use `diff` or another diffing utility to see what's changed, and add the new config settings to your old file. Make sure not to overwrite any customizations you've made to the file, such as your license key, app name, or changes to default settings. + +For example, if you `diff` the default `newrelic.yml` files for Java agent versions 7.10.0 and 7.11.0, the results printed to the console will be like: + +```yaml +➜ diff newrelic_7.10.0.yml newrelic_7.11.0.yml +... +107a108,119 +> # Whether the log events should include context from loggers with support for that. +> include_context_data: +> +> # When true, application logs will contain context data. +> enabled: false +> +> # A comma separated list of attribute keys whose values should be sent to New Relic. +> #include: +> +> # A comma separated list of attribute keys whose values should not be sent to New Relic. +> #exclude: +> +125a138 +> +128c141 +< enabled: false +--- +> enabled: true +... +``` + +In this example, these lines were added to the default `newrelic.yml` in Java agent version 7.11.0. If you're moving to 7.11.0 or higher, you should add these new lines to your original `newrelic.yml`. + +## Support statement: + +* New Relic recommends that you upgrade the agent regularly to ensure that you're getting the latest features and performance benefits. Additionally, older releases will no longer be supported when they reach [end-of-life](https://docs.newrelic.com/docs/using-new-relic/cross-product-functions/install-configure/notification-changes-new-relic-saas-features-distributed-software/). From 151fd2aab9e09021ffa15284c2c62a191883b8f8 Mon Sep 17 00:00:00 2001 From: bizob2828 <1874937+bizob2828@users.noreply.github.com> Date: Wed, 29 Jan 2025 21:20:37 +0000 Subject: [PATCH 33/67] docs: Updated Node.js agent compatibility report --- ...compatibility-requirements-nodejs-agent.mdx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/content/docs/apm/agents/nodejs-agent/getting-started/compatibility-requirements-nodejs-agent.mdx b/src/content/docs/apm/agents/nodejs-agent/getting-started/compatibility-requirements-nodejs-agent.mdx index 0fcc65356f5..eb93ea6b7b2 100644 --- a/src/content/docs/apm/agents/nodejs-agent/getting-started/compatibility-requirements-nodejs-agent.mdx +++ b/src/content/docs/apm/agents/nodejs-agent/getting-started/compatibility-requirements-nodejs-agent.mdx @@ -276,21 +276,21 @@ version. | --- | --- | --- | --- | | `@apollo/gateway` | 2.3.0 | 2.9.3 | `@newrelic/apollo-server-plugin@1.0.0` | | `@apollo/server` | 4.0.0 | 4.11.3 | `@newrelic/apollo-server-plugin@2.1.0` | -| `@aws-sdk/client-bedrock-runtime` | 3.474.0 | 3.734.0 | 11.13.0 | -| `@aws-sdk/client-dynamodb` | 3.0.0 | 3.734.0 | 8.7.1 | -| `@aws-sdk/client-sns` | 3.0.0 | 3.734.0 | 8.7.1 | -| `@aws-sdk/client-sqs` | 3.0.0 | 3.734.0 | 8.7.1 | -| `@aws-sdk/lib-dynamodb` | 3.377.0 | 3.734.0 | 8.7.1 | +| `@aws-sdk/client-bedrock-runtime` | 3.474.0 | 3.738.0 | 11.13.0 | +| `@aws-sdk/client-dynamodb` | 3.0.0 | 3.738.0 | 8.7.1 | +| `@aws-sdk/client-sns` | 3.0.0 | 3.738.0 | 8.7.1 | +| `@aws-sdk/client-sqs` | 3.0.0 | 3.738.0 | 8.7.1 | +| `@aws-sdk/lib-dynamodb` | 3.377.0 | 3.738.0 | 8.7.1 | | `@aws-sdk/smithy-client` | 3.47.0 | 3.374.0 | 8.7.1 | | `@elastic/elasticsearch` | 7.16.0 | 8.17.0 | 11.9.0 | | `@grpc/grpc-js` | 1.4.0 | 1.12.5 | 8.17.0 | | `@hapi/hapi` | 20.1.2 | 21.3.12 | 9.0.0 | | `@koa/router` | 11.0.2 | 13.1.0 | 3.2.0 | -| `@langchain/core` | 0.1.17 | 0.3.33 | 11.13.0 | +| `@langchain/core` | 0.1.17 | 0.3.37 | 11.13.0 | | `@nestjs/cli` | 9.0.0 | 11.0.2 | 10.1.0 | | `@opensearch-project/opensearch` | 2.1.0 | 3.2.0 | 12.10.0 | -| `@prisma/client` | 5.0.0 | 6.2.1 | 11.0.0 | -| `@smithy/smithy-client` | 2.0.0 | 4.1.2 | 11.0.0 | +| `@prisma/client` | 5.0.0 | 6.3.0 | 11.0.0 | +| `@smithy/smithy-client` | 2.0.0 | 4.1.3 | 11.0.0 | | `amqplib` | 0.5.0 | 0.10.5 | 2.0.0 | | `apollo-server` | 3.0.0 | 3.13.0 | `@newrelic/apollo-server-plugin@1.0.0` | | `apollo-server-express` | 3.0.0 | 3.13.0 | `@newrelic/apollo-server-plugin@1.0.0` | @@ -312,7 +312,7 @@ version. | `mysql` | 2.2.0 | 2.18.1 | 1.32.0 | | `mysql2` | 2.0.0 | 3.12.0 | 1.32.0 | | `next` | 13.4.19 | 15.1.6 | 12.0.0 | -| `openai` | 4.0.0 | 4.80.0 | 11.13.0 | +| `openai` | 4.0.0 | 4.81.0 | 11.13.0 | | `pg` | 8.2.0 | 8.13.1 | 9.0.0 | | `pg-native` | 3.0.0 | 3.2.0 | 9.0.0 | | `pino` | 7.0.0 | 9.6.0 | 8.11.0 | From 58b69b962f953875121b8a1ff6b6af11687cac8e Mon Sep 17 00:00:00 2001 From: newrelic-node-agent-team Date: Wed, 29 Jan 2025 21:21:57 +0000 Subject: [PATCH 34/67] chore: Adds Node.js agent v12.11.3 release notes. --- .../node-agent-12-11-3.mdx | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/content/docs/release-notes/agent-release-notes/nodejs-release-notes/node-agent-12-11-3.mdx diff --git a/src/content/docs/release-notes/agent-release-notes/nodejs-release-notes/node-agent-12-11-3.mdx b/src/content/docs/release-notes/agent-release-notes/nodejs-release-notes/node-agent-12-11-3.mdx new file mode 100644 index 00000000000..31588154987 --- /dev/null +++ b/src/content/docs/release-notes/agent-release-notes/nodejs-release-notes/node-agent-12-11-3.mdx @@ -0,0 +1,35 @@ +--- +subject: Node.js agent +releaseDate: '2025-01-29' +version: 12.11.3 +downloadLink: 'https://www.npmjs.com/package/newrelic' +security: [] +bugs: ["Fixed transaction-shim to properly create new transactions when the existing transaction is not active","Fixed issue with `bluebird` and `when` instrumentation where checking active context crashed when transaction prematurely ends"] +features: [] +--- + +## Notes + +#### Bug fixes + +* Fixed issue with `bluebird` and `when` instrumentation where checking active context crashed when transaction prematurely ends ([#2909](https://github.com/newrelic/node-newrelic/pull/2909)) ([4a30d5c](https://github.com/newrelic/node-newrelic/commit/4a30d5c5082e963cca3664f2ed152017f6360d21)) +* Fixed transaction-shim to properly create new transactions when the existing transaction is not active ([#2912](https://github.com/newrelic/node-newrelic/pull/2912)) ([3ad8c59](https://github.com/newrelic/node-newrelic/commit/3ad8c59e15e037a366ddf6803729b61ecfa701f3)) + +#### Documentation + +* Updated compatibility report ([#2902](https://github.com/newrelic/node-newrelic/pull/2902)) ([cb16516](https://github.com/newrelic/node-newrelic/commit/cb16516e90a3dc2cefb98e6131a7243412aefbfc)) + +#### Miscellaneous chores + +* Updated lint rule suppression comment ([#2895](https://github.com/newrelic/node-newrelic/pull/2895)) ([559dc98](https://github.com/newrelic/node-newrelic/commit/559dc98e18c8ba8280b73779780f3efc1c946ed7)) + +#### Continuous integration + +* Move init container release from lambda to GHA ([#2848](https://github.com/newrelic/node-newrelic/pull/2848)) ([8d8608d](https://github.com/newrelic/node-newrelic/commit/8d8608d1089cafaeb8c17354034c96fe1b49597a)) + + +### Support statement: + +We recommend updating to the latest agent version as soon as it's available. If you can't upgrade to the latest version, update your agents to a version no more than 90 days old. Read more about keeping agents up to date. (https://docs.newrelic.com/docs/new-relic-solutions/new-relic-one/install-configure/update-new-relic-agent/) + +See the New Relic Node.js agent EOL policy for information about agent releases and support dates. (https://docs.newrelic.com/docs/apm/agents/nodejs-agent/getting-started/nodejs-agent-eol-policy/) \ No newline at end of file From 7e0d08abd07e738511952d3c4cd29b5e321d0158 Mon Sep 17 00:00:00 2001 From: Uma Annamalai Date: Wed, 29 Jan 2025 14:29:15 -0800 Subject: [PATCH 35/67] Add release notes for Python Agent v10.5.0. --- .../php-release-notes/php-agent-9190309.mdx | 2 +- .../python-agent-100500.mdx | 49 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/content/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500.mdx diff --git a/src/content/docs/release-notes/agent-release-notes/php-release-notes/php-agent-9190309.mdx b/src/content/docs/release-notes/agent-release-notes/php-release-notes/php-agent-9190309.mdx index 7c8fcbac651..0a23c6ac7d9 100644 --- a/src/content/docs/release-notes/agent-release-notes/php-release-notes/php-agent-9190309.mdx +++ b/src/content/docs/release-notes/agent-release-notes/php-release-notes/php-agent-9190309.mdx @@ -18,7 +18,7 @@ security: [] * Fixed Symfony 5 auto detect ([#113](https://github.com/newrelic/newrelic-php-agent/issues/113), [#256](https://github.com/newrelic/newrelic-php-agent/pull/256)). Thank you @piotrantosik for your contribution! * Fixed URL of New Relic for PHP docs website used in error messages ([#334](https://github.com/newrelic/newrelic-php-agent/pull/334)) -* Fixed URL of New Relic of PHP docs website in README ([#254](https://github.com/newrelic/newrelic-php-agent/pull/254)). Thank you @revilon1991 for you contribution! +* Fixed URL of New Relic of PHP docs website in README ([#254](https://github.com/newrelic/newrelic-php-agent/pull/254)). Thank you @revilon1991 for your contribution! ### End of Life Notices diff --git a/src/content/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500.mdx b/src/content/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500.mdx new file mode 100644 index 00000000000..86288aaf331 --- /dev/null +++ b/src/content/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500.mdx @@ -0,0 +1,49 @@ +--- +subject: 'Python agent' +releaseDate: '2025-01-29' +version: 10.5.0 +downloadLink: 'https://pypi.python.org/pypi/newrelic' +features: ['Add Agent Control health reporting', 'Add support for cassandra-driver', 'Add support for new langchain vectorstore', 'Enhance stack traces logged by NewRelicContextFormatter'] +bugs: ['Fix compatibility issues with structlog's ProcessorFormatter', 'Check for ExceptionMiddleware removal in starlette.exceptions'] +security: [] +--- + +## Notes + +This release of the Python agent adds Agent Control health reporting, instrumentation for [cassandra-driver](https://pypi.org/project/cassandra-driver/), support for new a [langchain](https://pypi.org/project/langchain/) vectorstore, improves `NewRelicContextFormatter` stack traces logging, fixes compatibility issues with the [structlog] `ProcessorFormatter`, and checks for `ExceptionMiddleware` removal in `starlette.exceptions`. + +Install the agent using `easy_install/pip/distribute` via the [Python Package Index](https://pypi.python.org/pypi/newrelic) or download it directly from the [New Relic download site](https://download.newrelic.com/python_agent/release). + +## New features + +* Add Agent Control health reporting + + * Adds agent health reporting capability to support the upcoming release of New Relic Fleet Control. + +* Add support for cassandra-driver + + * Instrumentation support was added for [cassandra-driver](https://pypi.org/project/cassandra-driver/). + +* Add support for new langchain vectorstore + + * Adds instrumentation for `"TablestoreVectorStore` in [langchain](https://pypi.org/project/langchain/). + +* Enhance stack traces logged by `NewRelicContextFormatter` + + * The `NewRelicContextFormatter` now reports exception causes when logging stack traces. Thanks [@sweco](https://github.com/sweco) for your contribution! + +## Bug fixes + +* Fix compatibility issues with structlog's `ProcessorFormatter` + + * Fix was added for the case where the [structlog](https://pypi.org/project/structlog/) `ProcessorFormatter` is used as a `logging.Formatter` for both logging and structlog log entries. + +* Check for `ExceptionMiddleware` removal in `starlette.exceptions` + + * After [starlette](https://pypi.org/project/starlette/) v0.45.0 the import proxy for ExceptionMiddleware was removed from starlette.exceptions (and now only resides in starlette.middleware.exceptions). + +## Support statement + +We recommend updating to the latest agent version as soon as it's available. If you can't upgrade to the latest version, update your agents to a version no more than 90 days old. Read [more](/docs/new-relic-solutions/new-relic-one/install-configure/update-new-relic-agent/) about keeping agents up to date. + +See the New Relic Python agent [EOL policy](/docs/apm/agents/python-agent/getting-started/python-agent-eol-policy/) for information about agent releases and support dates. From 5e7dad00e4abc660dc28d63e52041d39c6f79129 Mon Sep 17 00:00:00 2001 From: Uma Annamalai Date: Wed, 29 Jan 2025 14:37:02 -0800 Subject: [PATCH 36/67] Fixups. --- .../python-release-notes/python-agent-100500.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500.mdx b/src/content/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500.mdx index 86288aaf331..e8bea8d6126 100644 --- a/src/content/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500.mdx +++ b/src/content/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500.mdx @@ -10,7 +10,7 @@ security: [] ## Notes -This release of the Python agent adds Agent Control health reporting, instrumentation for [cassandra-driver](https://pypi.org/project/cassandra-driver/), support for new a [langchain](https://pypi.org/project/langchain/) vectorstore, improves `NewRelicContextFormatter` stack traces logging, fixes compatibility issues with the [structlog] `ProcessorFormatter`, and checks for `ExceptionMiddleware` removal in `starlette.exceptions`. +This release of the Python agent adds Agent Control health reporting, instrumentation for [cassandra-driver](https://pypi.org/project/cassandra-driver/), support for new a [langchain](https://pypi.org/project/langchain/) vectorstore, improves `NewRelicContextFormatter` stack traces logging, fixes compatibility issues with the [structlog](https://pypi.org/project/structlog/) `ProcessorFormatter`, and checks for `ExceptionMiddleware` removal in `starlette.exceptions`. Install the agent using `easy_install/pip/distribute` via the [Python Package Index](https://pypi.python.org/pypi/newrelic) or download it directly from the [New Relic download site](https://download.newrelic.com/python_agent/release). @@ -26,7 +26,7 @@ Install the agent using `easy_install/pip/distribute` via the [Python Package In * Add support for new langchain vectorstore - * Adds instrumentation for `"TablestoreVectorStore` in [langchain](https://pypi.org/project/langchain/). + * Adds instrumentation for `TablestoreVectorStore` in [langchain](https://pypi.org/project/langchain/). * Enhance stack traces logged by `NewRelicContextFormatter` From c3669111315fc6faa62543d0e04dfc49562a93d8 Mon Sep 17 00:00:00 2001 From: newrelic-ruby-agent-bot Date: Wed, 29 Jan 2025 23:51:59 +0000 Subject: [PATCH 37/67] chore(ruby agent): Update config docs --- .../ruby-agent-configuration.mdx | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/src/content/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration.mdx b/src/content/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration.mdx index 96f814a134f..3061389c876 100644 --- a/src/content/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration.mdx +++ b/src/content/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration.mdx @@ -585,7 +585,7 @@ The [transaction traces](/docs/apm/traces/transaction-traces/transaction-traces) - If `true`, enables the collection of explain plans in transaction traces. This setting will also apply to explain plans in slow SQL traces if [`slow_sql.explain_enabled`](#slow_sql-explain_enabled) is not set separately. + If `true`, enables the collection of explain plans in transaction traces. This setting will also apply to explain plans in slow SQL traces if [`slow_sql.explain_enabled`](#slow_sql-explain_enabled) isn't set separately. @@ -925,7 +925,7 @@ Available logging-related config options include: Sets the minimum level a log event must have to be forwarded to New Relic. -This is based on the integer values of Ruby's `Logger::Severity` constants: https://github.com/ruby/ruby/blob/master/lib/logger/severity.rb +This is based on the integer values of [Ruby's `Logger::Severity` constants](https://github.com/ruby/logger/blob/113b82a06b3076b93a71cd467e1605b23afb3088/lib/logger/severity.rb). The intention is to forward logs with the level given to the configuration, as well as any logs with a higher level of severity. @@ -2033,6 +2033,18 @@ Use these settings to toggle instrumentation types during agent startup. Controls auto-instrumentation of bunny at start-up. May be one of: `auto`, `prepend`, `chain`, `disabled`. + + + + + + + +
TypeString
Default`auto`
Environ variable`NEW_RELIC_INSTRUMENTATION_AWS_SDK_FIREHOSE`
+ + Controls auto-instrumentation of the aws-sdk-firehose library at start-up. May be one of `auto`, `prepend`, `chain`, `disabled`. +
+ @@ -2045,6 +2057,18 @@ Use these settings to toggle instrumentation types during agent startup. Controls auto-instrumentation of the aws_sdk_lambda library at start-up. May be one of `auto`, `prepend`, `chain`, `disabled`. + +
+ + + + + +
TypeString
Default`auto`
Environ variable`NEW_RELIC_INSTRUMENTATION_AWS_SDK_KINESIS`
+ + Controls auto-instrumentation of the aws-sdk-kinesis library at start-up. May be one of `auto`, `prepend`, `chain`, `disabled`. +
+ @@ -2722,7 +2746,7 @@ Use these settings to toggle instrumentation types during agent startup.
- If `true`, the security agent is loaded (the agent performs a Ruby 'require') + If `true`, the security agent is loaded (a Ruby 'require' is performed)
@@ -2962,7 +2986,7 @@ Use these settings to toggle instrumentation types during agent startup. - Specifies the length of time (in minutes) that the IAST scan will run. + Indicates the duration (in minutes) for which the IAST scan will be performed. @@ -2986,7 +3010,7 @@ Use these settings to toggle instrumentation types during agent startup. - If `true`, allows IAST to continuously gather trace data in the background. Collected data will be used by the security agent to perform an IAST scan at the scheduled time. + If `true`, allows IAST to continuously gather trace data in the background. The security agent uses collected data to perform an IAST scan at the scheduled time. @@ -3054,7 +3078,7 @@ Use these settings to toggle instrumentation types during agent startup. - If `true`, the agent will operate in a streamlined mode suitable for use with short-lived serverless functions. NOTE: Only AWS Lambda functions are supported currently and this option is not intended for use without [New Relic's Ruby Lambda layer](https://docs.newrelic.com/docs/serverless-function-monitoring/aws-lambda-monitoring/get-started/monitoring-aws-lambda-serverless-monitoring/) offering. + If `true`, the agent will operate in a streamlined mode suitable for use with short-lived serverless functions. NOTE: Only AWS Lambda functions are supported currently and this option isn't intended for use without [New Relic's Ruby Lambda layer](https://docs.newrelic.com/docs/serverless-function-monitoring/aws-lambda-monitoring/get-started/monitoring-aws-lambda-serverless-monitoring/) offering. @@ -3220,7 +3244,7 @@ Use these settings to toggle instrumentation types during agent startup. - If true, the agent strips messages from all exceptions except those in the [allowlist](#strip_exception_messages-allowlist). Enabled automatically in [high security mode](/docs/accounts-partnerships/accounts/security/high-security). + If true, the agent strips messages from all exceptions except those in the [allowed classes list](#strip_exception_messages-allowed_classes). Enabled automatically in [high security mode](/docs/accounts-partnerships/accounts/security/high-security). @@ -3254,7 +3278,7 @@ Use these settings to toggle instrumentation types during agent startup. An array of strings to specify which keys inside a Stripe event's `user_data` hash should be reported to New Relic. Each string in this array will be turned into a regular expression via `Regexp.new` to -permit advanced matching. Setting the value to `["."]` will report all `user_data`. +enable advanced matching. Setting the value to `["."]` will report all `user_data`. @@ -3269,7 +3293,8 @@ permit advanced matching. Setting the value to `["."]` will report all `user_dat An array of strings to specify which keys and/or values inside a Stripe event's `user_data` hash should not be reported to New Relic. Each string in this array will be turned into a regular expression via -`Regexp.new` to permit advanced matching. For each hash pair, if either the key or value is matched the pair is not reported. By default, no `user_data` is reported. Use this option only if the +`Regexp.new` to permit advanced matching. For each hash pair, if either the key or value is matched the pair +isn't reported. By default, no `user_data` is reported. Use this option only if the `stripe.user_data.include` option is also used. From 4a395eafe669649649b7150f2feb4c3a67b72493 Mon Sep 17 00:00:00 2001 From: WriteMayur Date: Thu, 30 Jan 2025 10:48:43 +0530 Subject: [PATCH 38/67] fix the broken link for inline popups --- src/data/popovers_en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/popovers_en.json b/src/data/popovers_en.json index 71f4f843be6..83453b7eee4 100644 --- a/src/data/popovers_en.json +++ b/src/data/popovers_en.json @@ -115,7 +115,7 @@ "header": "User key", "text": "Your user key allows you to make queries using Nerdgraph or our REST API for any accounts you have access to.", "learnMore": "Learn more", - "learnMoreUrl": "https://docs.newrelic.com/docs/apis/intro-apis/new-relic-keys/#user-key", + "learnMoreUrl": "https://docs.newrelic.com/docs/apis/intro-apis/new-relic-api-keys/#user-key", "primaryButton": "Open in New Relic", "primaryButtonUrl": "https://one.newrelic.com/api-keys" } From 2c08e4d8f0993308835cdbc2925345a3c9e21435 Mon Sep 17 00:00:00 2001 From: sujitnewrelic Date: Thu, 30 Jan 2025 10:54:18 +0530 Subject: [PATCH 39/67] Syntax correction Syntax correction --- .../fluentbit-release-notes/fluentbit-24-08-31.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/content/docs/release-notes/fluentbit-release-notes/fluentbit-24-08-31.mdx b/src/content/docs/release-notes/fluentbit-release-notes/fluentbit-24-08-31.mdx index f10d1d66962..6fd5d7aaa89 100644 --- a/src/content/docs/release-notes/fluentbit-release-notes/fluentbit-24-08-31.mdx +++ b/src/content/docs/release-notes/fluentbit-release-notes/fluentbit-24-08-31.mdx @@ -3,14 +3,14 @@ subject: Fluent Bit releaseDate: '2024-08-31' version: 3.1.2 metaDescription: Release notes for Fluent bit version 3.1.2 -features: ["file_cache_advise (default: on) to reduce file cache usage", "emitter alias", "plugin pause/resume mechanism] +features: ["file_cache_advise (default: on) to reduce file cache usage", "emitter alias", "plugin pause/resume mechanism"] bugs: ["Centos 7 package fix", "prevent crash during reload"] security: ["Security1"] --- ### Support for Fluent Bit 3.1.2 -Users will now receive Fluent Bit version 3.1.2, which includes fixes for known vulnerabilities. For more details, refer https://fluentbit.io/announcements/. +Users will now receive Fluent Bit version 3.1.2, which includes fixes for known vulnerabilities. For more details, refer https://fluentbit.io/announcements/. ### Changed From 08d2073317af29af25444fa3fe106cf5671059d5 Mon Sep 17 00:00:00 2001 From: mlakshmiharita Date: Thu, 30 Jan 2025 11:26:27 +0530 Subject: [PATCH 40/67] Create docs-1-31-2025.mdx please do not merge --- .../docs-release-notes/docs-1-31-2025.mdx | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx diff --git a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx new file mode 100644 index 00000000000..89958e6e052 --- /dev/null +++ b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx @@ -0,0 +1,35 @@ +--- +subject: "Docs" +releaseDate: '2025-01-31' +version: 'version: January 24-30, 2025' +--- + +### New docs + +* [New Relic Digital Operational Resilience Act (DORA) subcontractor](/docs/security/security-privacy/compliance/certificates-standards-regulations/dora/dora-subcontractors) provides a list of DORA subcontractors that New Relic uses to provide services to customers. +* [Digital Operations Resilience Act (DORA) locations of processing](/docs/security/security-privacy/compliance/certificates-standards-regulations/dora/dora-data-locations) provides information about the locations where New Relic processes and stores personal data in the context of the DORA regulation. + +### Major changes + +* Updated the compatibility reports for [Node.js agent](/docs/apm/agents/nodejs-agent/getting-started/compatibility-requirements-nodejs-agent/) and [.NET agent](/docs/apm/agents/net-agent/getting-started/net-agent-compatibility-requirements). + +### Minor change + +* Documented the existing capability in the [NRQL reference](/docs/nrql/nrql-syntax-clauses-functions/#select-star-with-columns-query) to use the `*` with `SELECT` clause to retrieve all available attributes along with specified additional columns. + + +### Release note + +Check out our What's New posts to learn about new features and releases: + +* What's new posts for: + * [Office 365 connectors for Microsoft Teams End-of-life](/whats-new/2025/01/whats-new-01-23-msconnector-eol). + * [REST API Keys End-of-life](/whats-new/2025/01/whats-new-03-01-rest-api-keys-eol). + * [Configuring cross account alerts for improved organization and manageability](/whats-new/2025/01/whats-new-01-17-cross-account-alerts). + * [React 18](/whats-new/2025/01/whats-new-01-22-React18-upgrade). + +Stay up-to-date on our most recent release: + +* [Go agent v3.36.0](/docs/release-notes/agent-release-notes/go-release-notes/go-agent-3-36-0/) + * Enhanced the securityagent integration to improve trace handling and security analysis. + * Fixes bugs \ No newline at end of file From 8596798ba247aa710b321ac4e7aa35484906c43a Mon Sep 17 00:00:00 2001 From: sujitnewrelic Date: Thu, 30 Jan 2025 13:11:14 +0530 Subject: [PATCH 41/67] (chore): Added a missing section Added a missing section highlighted in https://newrelic.slack.com/archives/C0DSGL3FZ/p1738166889292739 --- src/install/ibm-mq/whatsNext.mdx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/install/ibm-mq/whatsNext.mdx b/src/install/ibm-mq/whatsNext.mdx index c9aa2f92e55..77dbf8ca46d 100644 --- a/src/install/ibm-mq/whatsNext.mdx +++ b/src/install/ibm-mq/whatsNext.mdx @@ -9,6 +9,17 @@ To configure the integration, edit the config in the integration's YAML config f To read all about these common settings, refer to our [configuration format](/docs/create-integrations/infrastructure-integrations-sdk/specifications/host-integrations-newer-configuration-format/#configuration-basics) document. +### Permissions [#permissions] +To monitor IBM MQ infrastructure, the `username` designated in the integration config must be granted certain permissions. These permissions vary depending on monitored queues, channels, and topics. + +In general, the `username` should have the following permissions: + - Have `DISPLAY` and `INQUIRY` enabled, and the ability to connect to the queue manager. + - Access the channel specified in the integration config (by default `SYSTEM.DEF.SVRCONN`). + - Operate privilege commands on queues `SYSTEM.DEFAULT.MODEL.QUEUE` and `SYSTEM.ADMIN.COMMAND.QUEUE` having the `DISPLAY` permission. + - Access with `DISPLAY` and `SUBSCRIBE` for the topics `SYSTEM.ADMIN.TOPIC` and `SYSTEM.BROKER.ADMIN.STREAM`. + +Remember, some additional permissions might be needed depending on your specific setup. + ### IBM MQ instance settings [#instance-settings] The following configuration options are available: From d00f6bb50bfd290383f8dcdb6fc3b52ff6291f63 Mon Sep 17 00:00:00 2001 From: sujitnewrelic Date: Thu, 30 Jan 2025 13:22:48 +0530 Subject: [PATCH 42/67] Syntax correction Syntax correction --- .../agent-release-notes/java-release-notes/java-agent-8180.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/release-notes/agent-release-notes/java-release-notes/java-agent-8180.mdx b/src/content/docs/release-notes/agent-release-notes/java-release-notes/java-agent-8180.mdx index f440b69128f..24dec489cf4 100644 --- a/src/content/docs/release-notes/agent-release-notes/java-release-notes/java-agent-8180.mdx +++ b/src/content/docs/release-notes/agent-release-notes/java-release-notes/java-agent-8180.mdx @@ -1,6 +1,6 @@ --- subject: Java agent -releaseDate: ‘2025-01-30' +releaseDate: '2025-01-30' version: 8.18.0 downloadLink: 'https://download.newrelic.com/newrelic/java-agent/newrelic-agent/8.18.0/' features: [“Added scala3 source detection “, “Vertx: decreased the amount of tokens created”, “kafka-clients-metrics: Refactor node topic metrics”, “New instrumentation module for Struts2 v6.7.0”, “New instrumentation module for Kafka 3.9”, “All AWS instrumentation modules: do not hide http request”, “Added support for distributed tracing in AWS SQS”, “Added relationship metric support for Kafka clients node metrics”] From 2f09bc67e00628e74018e3671c800a1b326ef19b Mon Sep 17 00:00:00 2001 From: sujitnewrelic Date: Thu, 30 Jan 2025 14:27:48 +0530 Subject: [PATCH 43/67] grammar update --- .../tutorial-manage-users-groups-scim.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/accounts/accounts/automated-user-management/tutorial-manage-users-groups-scim.mdx b/src/content/docs/accounts/accounts/automated-user-management/tutorial-manage-users-groups-scim.mdx index 58e06124575..f239c21f961 100644 --- a/src/content/docs/accounts/accounts/automated-user-management/tutorial-manage-users-groups-scim.mdx +++ b/src/content/docs/accounts/accounts/automated-user-management/tutorial-manage-users-groups-scim.mdx @@ -529,7 +529,7 @@ Once your SCIM API integration is complete, all users brought into New Relic sta The user's type attribute is defined in the [custom schema](/docs/accounts/accounts/automated-user-management/scim-support-automated-user-management#user-type) `urn:ietf:params:scim:schemas:extension:newrelic:2.0:User`. Include this schema and the `nrUserType` string attribute in your create or update request to set a user's type. -Valid values for `nrUserType` include, which are case sensitive: +Valid values for `nrUserType` include, which all are case sensitive: * `Full User` * `Core User` From 8f63fc0d7c73e43a2150bd26466f9cb256cea6e4 Mon Sep 17 00:00:00 2001 From: Gaurab Manandhar Date: Thu, 30 Jan 2025 14:48:30 +0530 Subject: [PATCH 44/67] fix: verify-mdx fix --- ...google-vertexai-monitoring-integration.mdx | 60 ++++++++++--------- ...google-vertexai-monitoring-integration.mdx | 42 ++++++++++++- 2 files changed, 72 insertions(+), 30 deletions(-) diff --git a/src/content/docs/infrastructure/google-cloud-platform-integrations/gcp-integrations-list/google-vertexai-monitoring-integration.mdx b/src/content/docs/infrastructure/google-cloud-platform-integrations/gcp-integrations-list/google-vertexai-monitoring-integration.mdx index 2a59c5d6510..047c84bc841 100644 --- a/src/content/docs/infrastructure/google-cloud-platform-integrations/gcp-integrations-list/google-vertexai-monitoring-integration.mdx +++ b/src/content/docs/infrastructure/google-cloud-platform-integrations/gcp-integrations-list/google-vertexai-monitoring-integration.mdx @@ -686,17 +686,19 @@ This integration collects GCP data for VertexAI. - + + - + - + + @@ -790,17 +792,19 @@ This integration collects GCP data for VertexAI.
- Metric -
+ Metric + - Unit - + Unit + - Description - + Description +
- + + - + - + + @@ -852,17 +856,19 @@ This integration collects GCP data for VertexAI.
- Metric -
+ Metric + - Unit - + Unit + - Description - + Description +
- + + - + - + + diff --git a/src/i18n/content/es/docs/infrastructure/google-cloud-platform-integrations/gcp-integrations-list/google-vertexai-monitoring-integration.mdx b/src/i18n/content/es/docs/infrastructure/google-cloud-platform-integrations/gcp-integrations-list/google-vertexai-monitoring-integration.mdx index 16532764be8..48bdd733836 100644 --- a/src/i18n/content/es/docs/infrastructure/google-cloud-platform-integrations/gcp-integrations-list/google-vertexai-monitoring-integration.mdx +++ b/src/i18n/content/es/docs/infrastructure/google-cloud-platform-integrations/gcp-integrations-list/google-vertexai-monitoring-integration.mdx @@ -685,7 +685,19 @@ Esta integración recopila datos de GCP para VertexAI.
- Metric -
+ Metric + - Unit - + Unit + - Description - + Description +
- | + + + + + + @@ -779,7 +791,19 @@ Esta integración recopila datos de GCP para VertexAI.
+
+ Métrica + + Unidad + + Descripción +
- | + + + + + + @@ -831,7 +855,19 @@ Esta integración recopila datos de GCP para VertexAI.
+
+ Métrica + + Unidad + + Descripción +
- | + + + + + + From 370316cfd746cba5ea5588dd1861222bcfb373e9 Mon Sep 17 00:00:00 2001 From: sujitnewrelic Date: Thu, 30 Jan 2025 15:28:10 +0530 Subject: [PATCH 45/67] grammar corerction --- .../okta-scimsso-application-configuration.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration.mdx b/src/content/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration.mdx index 3c529cba2d0..ad19760b49f 100644 --- a/src/content/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration.mdx +++ b/src/content/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration.mdx @@ -109,7 +109,7 @@ To manage your users' user type from Okta: 4. Next, you'll configure your Okta user profile to have this field. Steps: * In the **Profile editor**, go to **Users** and click the **User (default)** profile. - * Add a new **New Relic user type** attribute to that profile ([see Okta user profile instructions](https://developer.okta.com/docs/concepts/user-profiles/#universal-directory-schemas)). How you set this will depend on your own setup and preferences for defining user type. Note that the expected values for user type are `Basic User`, `Core User`, and `Full User` which are case sensitive. Below is an example with information filled in. + * Add a new **New Relic user type** attribute to that profile ([see Okta user profile instructions](https://developer.okta.com/docs/concepts/user-profiles/#universal-directory-schemas)). How you set this will depend on your own setup and preferences for defining user type. Note that the expected values for user type are `Basic User`, `Core User`, and `Full User`, which all are case sensitive. Below is an example with information filled in. Set Okta user profile to have new attribute 5. In the **People** section, define the user type for your users. How you do this will depend on your setup and preferences. For example, you may choose to set this manually by setting each user’s user type, or you may use Okta to manage these in bulk. From 29a40cc7d89a5095582712cd6b20375a96d38790 Mon Sep 17 00:00:00 2001 From: WriteMayur Date: Thu, 30 Jan 2025 15:45:05 +0530 Subject: [PATCH 46/67] update the docs with legal, customer, and editorial feedback --- .../agentic-ai/alert-intelligence-tool.mdx | 66 +++++++++++++++++++ .../agentic-ai/change-intelligence-tool.mdx | 26 ++++---- .../agentic-ai/github-copilot-integration.mdx | 14 ++-- .../agentic-ai/introduction-agentic-ai.mdx | 11 ++-- src/nav/agentic-ai.yml | 2 + 5 files changed, 92 insertions(+), 27 deletions(-) create mode 100644 src/content/docs/agentic-ai/alert-intelligence-tool.mdx diff --git a/src/content/docs/agentic-ai/alert-intelligence-tool.mdx b/src/content/docs/agentic-ai/alert-intelligence-tool.mdx new file mode 100644 index 00000000000..7e93e9a52bd --- /dev/null +++ b/src/content/docs/agentic-ai/alert-intelligence-tool.mdx @@ -0,0 +1,66 @@ +--- +title: Alert Intelligence Tool +metaDescription: "The Alert Intelligence Tool within New Relic's Agentic Integration enhances your ability to assess application health and performance through the agentic integration with our partners." +tags: + - GitHub Copilot Integration + - New Relic AI + - Agentic AI +freshnessValidatedDate: never +--- + + +The Alert Intelligence Tool within New Relic's Agentic Integration enhances your ability to assess application health and performance through the agentic integration with our partners. This tool allows users to inquire about alerts and anomalies related to their applications, providing real-time insights and facilitating efficient troubleshooting. This tool provides detailed insights into your application's alert history and current issues, enabling you to quickly identify and address any problems that may arise, ensuring a smooth and reliable user experience. + + +Your access to the New Relic platform grants you comprehensive visibility into all data related to your application + + +### Alert Intelligence features + +The Alert Intelligence tool offers a range of features to help you monitor and analyze your application's performance: + +- **Aggregate report**: Provides a comprehensive summary of key alert metrics directly within your preferred partner agentic chat experience, such as: + + - **Security Vulnerabilities:** Identification of new security vulnerabilities detected in the monitored timeframe. + - **Log issues:** Detection of errors, warnings, or other log-related issues. + - **Tracing information:** Detailed tracing data for in-depth analysis. + - **Golden signals:** Alerts indicating anomalous values in latency, traffic, errors, or saturation. + - **Threshold alerts:** Notifications for alerts that exceed predefined thresholds. + - **Error reporting:** Comprehensive error tracking and reporting capabilities. + - **Direct links:** Provides direct links to New Relic for further investigation of any issues discovered, allowing for deeper insights and analysis. + +- **Alert analysis**: Offers a detailed analysis of the alert history, including the alert type, severity, and any issues encountered. + + + +### Use the Alert Intelligence + + +**Prerequisites:** + +- Ensure that you have enabled [New Relic AI](/docs/new-relic-solutions/new-relic-one/core-concepts/new-relic-ai/#enable) and configured [alerts](/docs/alerts/overview/). + +**To use alert intelligence:** + +
+
+ Métrica + + Unidad + + Descripción +
+ + + + + + + + + + + + + + + + + + + + +
ActionExample prompt
To generate a Alert Intelligence report`@newrelic I just got paged by an alert? What happened`
To analyze a specific alert`@newrelic analyze alert `
To focus on a specific service or time frame`@newrelic check for recent alerts related to in the past
\ No newline at end of file diff --git a/src/content/docs/agentic-ai/change-intelligence-tool.mdx b/src/content/docs/agentic-ai/change-intelligence-tool.mdx index 639472e0a95..b5ca7631b01 100644 --- a/src/content/docs/agentic-ai/change-intelligence-tool.mdx +++ b/src/content/docs/agentic-ai/change-intelligence-tool.mdx @@ -9,12 +9,12 @@ freshnessValidatedDate: never --- -The Change Intelligence Tool within New Relic's Agentic Integration enhances your ability to assess application performance using GitHub Copilot chat. This tool allows users to inquire about performance metrics and system behavior following application deployment, providing real-time insights and facilitating efficient post-deployment analysis. This tool provides detailed insights into your application's performance and stability following each new deployment. This enables you to quickly identify and address any issues that may arise, ensuring a smooth and reliable user experience. +The Change Intelligence Tool within New Relic's Agentic Integration enhances your ability to assess application performance through the agentic integration with our partners. This tool allows users to inquire about performance metrics and system behavior following application deployment to provide real-time insights and facilitate efficient post-deployment analysis. This tool provides detailed insights into your application's performance and stability following each new deployment. This enables you to quickly identify and address any issues that may arise, ensuring a smooth and reliable user experience. Your access to the New Relic platform grants you comprehensive visibility into all data related to your application. -### Change Intelligence Features +### Change Intelligence features The Change Intelligence tool offers a range of features to help you monitor and analyze your application's performance post-deployment: @@ -22,17 +22,17 @@ The Change Intelligence tool offers a range of features to help you monitor and - **Aggregate report**: Provides a comprehensive summary of key performance metrics directly within your native GitHub Copilot experience, such as: - **Security vulnerabilities**: Identification of new security vulnerabilities detected since the last deployment. - - **Log Issues**: Detection of errors, warnings, or other log-related issues. - - **Tracing Information**: Detailed tracing data for in-depth analysis. - - **Golden Signals**: Alerts indicating anomalous values in latency, traffic, errors, or saturation. - - **Threshold Alerts**: Notifications for alerts that exceed predefined thresholds. - - **Error Reporting**: Comprehensive error tracking and reporting capabilities. + - **Log issues**: Detection of errors, warnings, or other log-related issues. + - **Tracing information**: Detailed tracing data for in-depth analysis. + - **Golden signals**: Alerts indicating anomalous values in latency, traffic, errors, or saturation. + - **Threshold alerts**: Notifications for alerts that exceed predefined thresholds. + - **Error reporting**: Comprehensive error tracking and reporting capabilities. -- **Direct Links**: Provides direct links to New Relic for further investigation of any issues discovered, allowing for deeper insights and analysis. -- **Deployment Analysis**: Offers a detailed analysis of the deployment process, including the deployment number, status, and any issues encountered. +- **Direct links**: Provides direct links to New Relic for further investigation of any issues discovered, allowing for deeper insights and analysis. +- **Deployment analysis**: Offers a detailed analysis of the deployment process, including the deployment number, status, and any issues encountered. -### Use the Change Intelligence within GitHub Copilot +### Use the Change Intelligence **Prerequisites:** @@ -52,7 +52,7 @@ For more information on integrating the New Relic Change Tracking feature with G Action - Use this prompt + Example prompt @@ -60,10 +60,6 @@ For more information on integrating the New Relic Change Tracking feature with G To generate a Change Intelligence report `@newrelic how did my deployment for go?` - - To analyze a specific account - `@newrelic select account ` or `use account ` - To analyze a specific deployment `@newrelic analyze deployment ` or `` diff --git a/src/content/docs/agentic-ai/github-copilot-integration.mdx b/src/content/docs/agentic-ai/github-copilot-integration.mdx index 5f72f164a65..dde1dd22f2c 100644 --- a/src/content/docs/agentic-ai/github-copilot-integration.mdx +++ b/src/content/docs/agentic-ai/github-copilot-integration.mdx @@ -16,19 +16,23 @@ This guide will walk you through the process of installing and using the New Rel ### Prerequisites -Before getting started, review the following prerequisites to ensure a smooth setup process: +Before you begin, make sure that the following prerequisites are met to ensure a smooth setup process: -- Visual Studio Code -- Access to [GitHub Copilot](https://github.com/features/copilot) -- [GitHub Copilot Chat](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot-chat) extension in Visual Studio Code +- An IDE is installed on your system. +- You have access to [GitHub Copilot](https://github.com/features/copilot). +- The GitHub Copilot extension is installed in your IDE. For more information, refer [GitHub Copilot documentation](https://docs.github.com/en/copilot/managing-copilot/configure-personal-settings/installing-the-github-copilot-extension-in-your-environment). +- The [GitHub Copilot extension policy](https://docs.github.com/en/enterprise-cloud@latest/copilot/managing-copilot/managing-github-copilot-in-your-organization/managing-policies-for-copilot-in-your-organization#setting-a-policy-for-github-copilot-extensions-in-your-organization) is enabled for your organization. + +If you want to restrict access to GitHub Copilot for certain roles, configure the settings on GitHub. To restrict access to New Relic AI for specific roles or employees, you can use New Relic's Role-Based Access Control (RBAC). For more information, refer [New Relic user management](/docs/accounts/accounts-billing/new-relic-one-user-management/user-management-concepts/#understand-concepts). + **To install New Relic Agent in GitHub Copilot:** 1. On GitHub MarketPlace, go to [New Relic Agent](https://github.com/marketplace/newrelic-copilot-extension). 2. Click **Add > Install it for free**. - After the agent is installed, you can use it within the GitHub Chat extension in Visual Studio Code. For more information, refer [using the New Relic Agent in Copilot](#communicate-with-New-Relic-Agent-in-gitHub-copilot). + After the agent is installed, you can use it within the GitHub Chat extension in your IDE. For more information, refer [using the New Relic Agent in Copilot](#communicate-with-New-Relic-Agent-in-gitHub-copilot). ## Communicate with New Relic Agent in GitHub Copilot diff --git a/src/content/docs/agentic-ai/introduction-agentic-ai.mdx b/src/content/docs/agentic-ai/introduction-agentic-ai.mdx index 270437dd6c0..1ea02a83ced 100644 --- a/src/content/docs/agentic-ai/introduction-agentic-ai.mdx +++ b/src/content/docs/agentic-ai/introduction-agentic-ai.mdx @@ -41,19 +41,16 @@ For more information, refer [Getting Started with New Relic Agent for GitHub Cop Each agentic integration comes with various tools to use New Relic platform capabilities and provide observability insights, alerts, and predictions: -- **Change intelligence:** The change intelligence tool assists you to understand and mitigate potential risks by providing comprehensive change analysis and forecasting. You can use this tool to gain instant insights into the impact of system changes. It helps you to assess the potential risks associated with deployments and configuration modifications. +- **Change intelligence:** The change intelligence tool assists you to understand and mitigate potential risks by providing comprehensive change analysis and forecasting. You can use this tool to gain instant insights into the impact of system changes. It helps you to assess the potential risks associated with deployments and configuration modifications. For more information, refer [Change Intelligence Tool](/docs/agentic-ai/change-intelligence-tool). -- **Alert Intelligence:** The Alert Intelligence tool offers advanced alert analysis to swiftly resolve incidents. It provides real-time notifications and immediate recommendations to prevent escalation. +- **Alert Intelligence:** The Alert Intelligence tool offers advanced alert analysis to swiftly resolve incidents. It provides real-time notifications and immediate recommendations to prevent escalation. For more information, refer [Alert Intelligence Tool](/docs/agentic-ai/alert-intelligence-tool). ## Pricing -Agentic Integrations are available as part of the New Relic Advanced Compute SKU. Here's how the feature will be charged: +Agentic Integrations are billable for all customers during preview and after GA. During preview, all customers will have access to Agentic Integrations, however when released as GA, access is only available to customers with New Relic Advanced Compute offering. -- **Compute or Advanced Users:** If you are on a Compute or Advanced SKU, you will be charged for NRQLs (New Relic Query Language queries). -- **User-Based Pricing without Advanced SKU:** Customers on user-based pricing without the Advanced SKU will not be charged for NRQLs. - -For further details on pricing, please contact our sales team or refer to your specific contract terms. +For further details on pricing, please contact our sales team or refer to your Order. ## Stay updated diff --git a/src/nav/agentic-ai.yml b/src/nav/agentic-ai.yml index 95baec9b44e..ed4e9f787ee 100644 --- a/src/nav/agentic-ai.yml +++ b/src/nav/agentic-ai.yml @@ -7,3 +7,5 @@ pages: path: /docs/agentic-ai/github-copilot-integration - title: Change Intelligence tool path: /docs/agentic-ai/change-intelligence-tool + - title: Alert Intelligence tool + path: /docs/agentic-ai/alert-intelligence-tool From 23b9ea3ae0bf9bbcb1a51c4c516263104492b1df Mon Sep 17 00:00:00 2001 From: mlakshmiharita Date: Thu, 30 Jan 2025 15:55:06 +0530 Subject: [PATCH 47/67] Doc release notes WIP. Please do not merge. --- .../docs-release-notes/docs-1-31-2025.mdx | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx index 89958e6e052..cf997fd0910 100644 --- a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx +++ b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx @@ -4,32 +4,31 @@ releaseDate: '2025-01-31' version: 'version: January 24-30, 2025' --- -### New docs - -* [New Relic Digital Operational Resilience Act (DORA) subcontractor](/docs/security/security-privacy/compliance/certificates-standards-regulations/dora/dora-subcontractors) provides a list of DORA subcontractors that New Relic uses to provide services to customers. -* [Digital Operations Resilience Act (DORA) locations of processing](/docs/security/security-privacy/compliance/certificates-standards-regulations/dora/dora-data-locations) provides information about the locations where New Relic processes and stores personal data in the context of the DORA regulation. - ### Major changes -* Updated the compatibility reports for [Node.js agent](/docs/apm/agents/nodejs-agent/getting-started/compatibility-requirements-nodejs-agent/) and [.NET agent](/docs/apm/agents/net-agent/getting-started/net-agent-compatibility-requirements). +* Updated the compatibility reports for [Node.js agent](/docs/apm/agents/nodejs-agent/getting-started/compatibility-requirements-nodejs-agent/). +* Enhanced the observability for front-end applications with the new auto logging feature, which is now available for Pro and Pro+SPA browser agents. This enhancement allows automatic collection of `console` log messages at the `WARN` level, supports sampling rate configuration, offers log viewing through the Logs page or Errors inbox, and adheres to standard data consumption pricing. +* Enables local log viewing on Linux systems and offers easy access for monitoring and troubleshooting the [KTranslate](/docs.newrelic.com/docs/network-performance-monitoring/advanced/ktranslate-container-health/) service. +* Improved connectivity and security by updating [network](/docs/new-relic-solutions/get-started/networks/) blocks with new effective IP ranges. +* Revised the [OTLP](/docs/opentelemetry/best-practices/opentelemetry-otlp/) release version, ensuring compatibility with both earlier and later versions. +* New Relic PHP agent allows [custom events](/docs/data-apis/custom-data/custom-events/apm-report-custom-events-attributes/) creation, with a default limit of 30,000 per minute that can be increased to 100,000. It also supports the addition of custom attributes and provides guidelines on naming restrictions and event type limits. +* Updated for the deprecation and End of support for [NewRelic Xamarin NuGet Package](/docs.newrelic.com/docs/mobile-monitoring/new-relic-mobile-xamarin/monitor-your-xamarin-application/). ### Minor change -* Documented the existing capability in the [NRQL reference](/docs/nrql/nrql-syntax-clauses-functions/#select-star-with-columns-query) to use the `*` with `SELECT` clause to retrieve all available attributes along with specified additional columns. - +* New Relic Ruby agent offers a public API with detailed instructions on [RubyDoc](/docs/apm/agents/ruby-agent/api-guides/guide-using-ruby-agent-api/), enabling improved data collection for Ruby applications. +* Updated the supported Python versions. ### Release note -Check out our What's New posts to learn about new features and releases: - -* What's new posts for: - * [Office 365 connectors for Microsoft Teams End-of-life](/whats-new/2025/01/whats-new-01-23-msconnector-eol). - * [REST API Keys End-of-life](/whats-new/2025/01/whats-new-03-01-rest-api-keys-eol). - * [Configuring cross account alerts for improved organization and manageability](/whats-new/2025/01/whats-new-01-17-cross-account-alerts). - * [React 18](/whats-new/2025/01/whats-new-01-22-React18-upgrade). - Stay up-to-date on our most recent release: * [Go agent v3.36.0](/docs/release-notes/agent-release-notes/go-release-notes/go-agent-3-36-0/) * Enhanced the securityagent integration to improve trace handling and security analysis. - * Fixes bugs \ No newline at end of file + * Fixes bugs. +* [Browser agent v1.279.0](/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes/browser-agent-v1.279.0/) + * Deprecation of First Input Delay (FID), in favor of Interaction To Next Paint (INP). +* [Android agent v7.6.3](/docs/release-notes/mobile-release-notes/android-release-notes/android-763/) + * Introduced build-time feature flag for LogInstrumentation. + * Enhanced logging. + * Fixes bugs. \ No newline at end of file From 37abc65f8b909890f17e8044ffac59f1fcc581c3 Mon Sep 17 00:00:00 2001 From: sujitnewrelic Date: Thu, 30 Jan 2025 15:59:39 +0530 Subject: [PATCH 48/67] syntax correction --- .../ruby-release-notes/ruby-agent-9-17-0.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/content/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0.mdx b/src/content/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0.mdx index c872dd034e9..46c62b69ad9 100644 --- a/src/content/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0.mdx +++ b/src/content/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0.mdx @@ -44,7 +44,9 @@ security: [] In the previous major release, we dropped support for `disable_` configuration options in favor of `instrumentation.`. Previously, a DEBUG level log warning appeared whenever `disable_*` options were set to `true`, even for libraries (e.g. Action Dispatch) without equivalent `instrumentation.*` options: - >DEBUG : [DEPRECATED] configuration disable_ for will be removed in the next major release. Use instrumentation. with one of ["auto", "disabled", "prepend", "chain"] +```json + >DEBUG : [DEPRECATED] configuration disable_ for will be removed in the next major release. Use instrumentation. with one of ["auto", "disabled", "prepend", "chain"] +``` This inaccurate warning has been removed. If you are disabling instrumentation using `instrumentation.: disabled` or `NEW_RELIC_INSTRUMENTATION_=disabled`, please verify the option exists by consulting our [configuration documentation](https://docs.newrelic.com/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration/#instrumentation). If the option does not exist, check the ['Disabling' section](https://docs.newrelic.com/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration/#disabling) to see if there is a related option. We apologize for the confusion. [PR#3005](https://github.com/newrelic/newrelic-ruby-agent/pull/3005) From 5c72ae2450bc5b43886511fe03bcb3dbb788339c Mon Sep 17 00:00:00 2001 From: sujitnewrelic Date: Thu, 30 Jan 2025 16:23:23 +0530 Subject: [PATCH 49/67] syntax correction --- .../python-release-notes/python-agent-100500.mdx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/content/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500.mdx b/src/content/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500.mdx index e8bea8d6126..e33c005439c 100644 --- a/src/content/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500.mdx +++ b/src/content/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500.mdx @@ -4,8 +4,7 @@ releaseDate: '2025-01-29' version: 10.5.0 downloadLink: 'https://pypi.python.org/pypi/newrelic' features: ['Add Agent Control health reporting', 'Add support for cassandra-driver', 'Add support for new langchain vectorstore', 'Enhance stack traces logged by NewRelicContextFormatter'] -bugs: ['Fix compatibility issues with structlog's ProcessorFormatter', 'Check for ExceptionMiddleware removal in starlette.exceptions'] -security: [] +bugs: ['Fix compatibility issues with structlog ProcessorFormatter', 'Check for ExceptionMiddleware removal in starlette.exceptions'] --- ## Notes From 40db70b17d0e540972c9258722903859b5d05ada Mon Sep 17 00:00:00 2001 From: sujitnewrelic Date: Thu, 30 Jan 2025 16:39:36 +0530 Subject: [PATCH 50/67] Updated the comments in PR --- .../ruby-release-notes/ruby-agent-9-17-0.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0.mdx b/src/content/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0.mdx index 46c62b69ad9..88575b74150 100644 --- a/src/content/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0.mdx +++ b/src/content/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0.mdx @@ -42,13 +42,13 @@ security: [] - **Bugfix: Stop emitting inaccurate debug-level log about deprecated configuration options** - In the previous major release, we dropped support for `disable_` configuration options in favor of `instrumentation.`. Previously, a DEBUG level log warning appeared whenever `disable_*` options were set to `true`, even for libraries (e.g. Action Dispatch) without equivalent `instrumentation.*` options: + In the previous major release, we dropped support for many `disable_library_name` configuration options in favor of `instrumentation.library_name`. Previously, a DEBUG level log warning appeared whenever `disable_*` options were set to `true`, even for libraries (e.g. Action Dispatch) without equivalent `instrumentation.*` options: ```json - >DEBUG : [DEPRECATED] configuration disable_ for will be removed in the next major release. Use instrumentation. with one of ["auto", "disabled", "prepend", "chain"] + >DEBUG : [DEPRECATED] configuration disable_library_name for library_name will be removed in the next major release. Use instrumentation. library_name with one of ["auto", "disabled", "prepend", "chain"] ``` - This inaccurate warning has been removed. If you are disabling instrumentation using `instrumentation.: disabled` or `NEW_RELIC_INSTRUMENTATION_=disabled`, please verify the option exists by consulting our [configuration documentation](https://docs.newrelic.com/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration/#instrumentation). If the option does not exist, check the ['Disabling' section](https://docs.newrelic.com/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration/#disabling) to see if there is a related option. We apologize for the confusion. [PR#3005](https://github.com/newrelic/newrelic-ruby-agent/pull/3005) + This inaccurate warning has been removed. If you are disabling instrumentation using `instrumentation.library_name: disabled` or `NEW_RELIC_INSTRUMENTATION_LIBRARY_NAME=disabled`, please verify the option exists by consulting our [configuration documentation](https://docs.newrelic.com/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration/#instrumentation). If the option does not exist, check the ['Disabling' section](https://docs.newrelic.com/docs/apm/agents/ruby-agent/configuration/ruby-agent-configuration/#disabling) to see if there is a related option. We apologize for the confusion. [PR#3005](https://github.com/newrelic/newrelic-ruby-agent/pull/3005) - **Bugfix: Do not attempt to decorate logs with `nil` messages** From 68cba39858a862a2274f4d5c9cef380741a104d9 Mon Sep 17 00:00:00 2001 From: Oren Ben-Meir <46640034+obenkenobi@users.noreply.github.com> Date: Thu, 30 Jan 2025 10:54:02 -0500 Subject: [PATCH 51/67] Update instrument-aws-sqs-message-queues.mdx --- .../instrumentation/instrument-aws-sqs-message-queues.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx b/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx index b8f243fbbe2..09e43681f8a 100644 --- a/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx +++ b/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx @@ -17,8 +17,8 @@ To see all supported SQS libraries, check the [Java compatibility and requiremen ## View SQS Distributed Tracing -Out of the box, our AWS SQS SDK instrumentation adds distributed trace headers as message attributes to SQS messages. -However for message recieven operations, we don't offer an out of the box way to accept these headers. +Out of the box, our AWS SQS SDK instrumentation adds distributed trace headers as message attributes to SQS messages for versions `2.1.0` and later. +However for message reciever operations, we don't offer an out of the box way to accept these headers. Instead we recommend cxustomers to use custom instrumentation to read the distributed trace headers. Here is an example of how to read the distributed trace headers from an SQS message using the V2 SDK: @@ -143,4 +143,4 @@ public class SQSReceivedMessageHeaders implements Headers { } } -``` \ No newline at end of file +``` From 216af19111ede3c839541ee2d5cb7bcbf0da05e5 Mon Sep 17 00:00:00 2001 From: jbedell-newrelic <126519854+jbedell-newrelic@users.noreply.github.com> Date: Thu, 30 Jan 2025 10:57:58 -0500 Subject: [PATCH 52/67] Update compatibility-requirements-java-agent.mdx --- .../getting-started/compatibility-requirements-java-agent.mdx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/content/docs/apm/agents/java-agent/getting-started/compatibility-requirements-java-agent.mdx b/src/content/docs/apm/agents/java-agent/getting-started/compatibility-requirements-java-agent.mdx index 8b8b2b27125..5941de72103 100644 --- a/src/content/docs/apm/agents/java-agent/getting-started/compatibility-requirements-java-agent.mdx +++ b/src/content/docs/apm/agents/java-agent/getting-started/compatibility-requirements-java-agent.mdx @@ -168,6 +168,7 @@ The agent automatically instruments these frameworks and libraries: * AmazonS3 client 1.2.13 to latest * AmazonSNS and AmazonSNSAsync clients 1.11.12 to latest * AmazonSQS and AmazonSQSAsync clients 1.3.22 to latest + * Distributed Tracing for sending messages is supported from 2.1.0 to latest * Cats Effect v2 * Scala 2.12: 2.1 to latest * Scala 2.13: 2.1 to latest @@ -211,7 +212,7 @@ The agent automatically instruments these frameworks and libraries: * Spring Web Services from 1.5.7 to latest * Spring Webflux 5.0.0.RELEASE to latest * SqsClient 2.1.0 to latest - * Struts 2.0 to 6.6.1 + * Struts 2.0 to latest * Thrift 0.8.0 to latest * Vert.x 3.2.0 to 4.5.x * ZIO From 2ec0ffdb08c30e1e5387459f93072f6583ac9649 Mon Sep 17 00:00:00 2001 From: jbedell-newrelic <126519854+jbedell-newrelic@users.noreply.github.com> Date: Thu, 30 Jan 2025 11:03:03 -0500 Subject: [PATCH 53/67] Update java-agent-config-file-template.mdx --- .../java-agent-config-file-template.mdx | 74 ++++++++++++++++--- 1 file changed, 65 insertions(+), 9 deletions(-) diff --git a/src/content/docs/apm/agents/java-agent/configuration/java-agent-config-file-template.mdx b/src/content/docs/apm/agents/java-agent/configuration/java-agent-config-file-template.mdx index eba8ff87da2..885f4efd6d8 100644 --- a/src/content/docs/apm/agents/java-agent/configuration/java-agent-config-file-template.mdx +++ b/src/content/docs/apm/agents/java-agent/configuration/java-agent-config-file-template.mdx @@ -459,15 +459,71 @@ common: &default_settings agent: enabled: false - # These are the category of security events that can be detected. Set to false to disable detection of - # individual event types. Default is true for each event type. - detection: - rci: - enabled: true - rxss: - enabled: true - deserialization: - enabled: true + # This configuration allows users to specify a unique test identifier when running IAST Scan with CI/CD + iast_test_identifier: 'run-id' + + # Security controllers + scan_controllers: + # The scan_request_rate_limit configuration allows to specify maximum number of replay request played per minute. + # The maximum is 3600 and the minimum is 12 replay request per minute. + iast_scan_request_rate_limit: 3600 # Number of IAST replay request played per minute, Default is 3600 + # This configuration allows users to the number of application instances for a specific entity where IAST analysis is performed. + scan_instance_count: 0 # Values are 1 or 0, 0 signifies run on all application instances + + # The scan_schedule configuration allows to specify when IAST scans should be executed + scan_schedule: + # The delay field specifies the delay in minutes before the IAST scan starts. This allows to schedule the scan to start at a later time. + delay: 0 #In minutes, default is 0 min + # The duration field specifies the duration of the IAST scan in minutes. This determines how long the scan will run. + duration: 0 #In minutes, default is forever + + # The schedule field specifies a cron expression that defines when the IAST scan should start. + #schedule: "" #By default, schedule is inactive + + # Allow continuously sample collection of IAST events + always_sample_traces: false # Default is false + + # The exclude_from_iast_scan configuration allows to specify APIs, parameters, and categories that should not be scanned by Security Agents. + exclude_from_iast_scan: + # The api field specifies list of APIs using regular expression (regex) patterns that follow the syntax of Perl 5. The regex pattern should provide a complete match for the URL without the endpoint. + # Example: + # api: + # - .*account.* + # - .*/\api\/v1\/.*?\/login + api: [ ] + + # The parameters configuration allows users to specify headers, query parameters, and body keys that should be excluded from IAST scans. + # Example: + # http_request_parameters: + # header: + # - X-Forwarded-For + # query: + # - username + # - password + # body: + # - account.email + # - account.contact + http_request_parameters: + # A list of HTTP header keys. If a request includes any headers with these keys, the corresponding IAST scan will be skipped. + header: [ ] + # A list of query parameter keys. The presence of these parameters in the request's query string will lead to skipping the IAST scan. + query: [ ] + # A list of keys within the request body. If these keys are found in the body content, the IAST scan will be omitted. + body: [ ] + + # The iast_detection_category configuration allows to specify which categories of vulnerabilities should not be detected by Security Agents. + # If any of these categories are set to true, Security Agents will not generate events or flag vulnerabilities for that category. + iast_detection_category: + insecure_settings: false + invalid_file_access: false + sql_injection: false + nosql_injection: false + ldap_injection: false + javascript_injection: false + command_injection: false + xpath_injection: false + ssrf: false + rxss: false # Slow transaction detection will report an event to New Relic ("SlowTransaction") whenever a Transaction's # time exceeds the threshold value (in ms). A transaction will only be reported once and by default, only From 5671bd0ae84495f89b069aaf62f838e5c112be22 Mon Sep 17 00:00:00 2001 From: Brian Hensley <48165493+brnhensley@users.noreply.github.com> Date: Thu, 30 Jan 2025 14:09:19 -0800 Subject: [PATCH 54/67] chore: fix broken link --- src/content/docs/service-level-management/consume-slm.mdx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/content/docs/service-level-management/consume-slm.mdx b/src/content/docs/service-level-management/consume-slm.mdx index ffc626c99f7..7020e8c4758 100644 --- a/src/content/docs/service-level-management/consume-slm.mdx +++ b/src/content/docs/service-level-management/consume-slm.mdx @@ -139,14 +139,18 @@ As the total amount of tolerated bad responses will vary with the request throug ### SLI attainment over time and SLO target (%) [#sli-attainment] -The last chart shows two time series: the (SLI attainment over time)[#sli-over-time], and the SLO target. When the SLI value is below the SLO target,your service is missing the SLO. Use this chart to learn in which time ranges your service missed the SLO target. +The last chart shows two time series: the [SLI attainment over time](#sli-over-time), and the SLO target. When the SLI value is below the SLO target, your service is missing the SLO. Use this chart to learn in which time ranges your service missed the SLO target. ### Charting the SLI attainment on a dashboard [#sli-attainment-dashboard] You can chart SLI attainment time series on your custom dashboards using the following query: ```sql -FROM Metric SELECT clamp_max((count(newrelic.sli.valid) - count(newrelic.sli.bad)) / count(newrelic.sli.valid) * 100, 100) AS 'SLI attainment' WHERE sli.id = '' UNTIL 2 MINUTES AGO TIMESERIES AUTO +FROM Metric SELECT clamp_max( + (count(newrelic.sli.valid) - count(newrelic.sli.bad)) / + count(newrelic.sli.valid) * 100, 100) AS 'SLI attainment' +WHERE sli.id = 'SLI_ID' +UNTIL 2 MINUTES AGO TIMESERIES AUTO ``` Where `sli.id` is the SLI identifier. The easiest way to add a chart like this to your dashboard is by using the **Add to dashboard** option, available on the **Details** view. From 70f3b14af7f6fb21970c063d3741a86075f0074b Mon Sep 17 00:00:00 2001 From: Brian Hensley <48165493+brnhensley@users.noreply.github.com> Date: Thu, 30 Jan 2025 14:16:19 -0800 Subject: [PATCH 55/67] chore: replace `{var}` syntax with `VAR` for doc consistancy --- .../service-level-management/create-slm.mdx | 118 +++++++++--------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/src/content/docs/service-level-management/create-slm.mdx b/src/content/docs/service-level-management/create-slm.mdx index 8390fd68d35..39955deaac4 100644 --- a/src/content/docs/service-level-management/create-slm.mdx +++ b/src/content/docs/service-level-management/create-slm.mdx @@ -111,10 +111,10 @@ Based on `Transaction` events, these SLIs are the most common for request-driven ```sql FROM Transaction - WHERE entityGuid = '{entityGuid}' + WHERE entityGuid = 'ENTITY_GUID' ``` - Where `{entityGuid}` is the service's GUID. + Where `ENTITY_GUID` is the service's GUID. **Bad events fields** @@ -122,10 +122,10 @@ Based on `Transaction` events, these SLIs are the most common for request-driven ```sql FROM TransactionError - WHERE entityGuid = '{entityGuid}' AND error.expected != true + WHERE entityGuid = 'ENTITY_GUID' AND error.expected != true ``` - Where `{entityGuid}` is the service's GUID. + Where `ENTITY_GUID` is the service's GUID. @@ -150,10 +150,10 @@ Based on `Transaction` events, these SLIs are the most common for request-driven ```sql FROM Transaction - WHERE entityGuid = '{entityGuid}' AND transactionType = 'Web' + WHERE entityGuid = 'ENTITY_GUID' AND transactionType = 'Web' ``` - Where `{entityGuid}` is the service's GUID. + Where `ENTITY_GUID` is the service's GUID. **Good events fields** @@ -161,11 +161,11 @@ Based on `Transaction` events, these SLIs are the most common for request-driven ```sql FROM Transaction - WHERE entityGuid = '{entityGuid}' AND transactionType = 'Web' AND duration < {duration} + WHERE entityGuid = 'ENTITY_GUID' AND transactionType = 'Web' AND duration < DURATION ``` - * Where `{entityGuid}` is the service's GUID. - * Where `{duration}` is the response time that you consider provides a good experience for your client service or end-user, in seconds. + * Where `ENTITY_GUID` is the service's GUID. + * Where `DURATION` is the response time that you consider provides a good experience for your client service or end-user, in seconds. @@ -187,11 +187,11 @@ Based on OpenTelemetry spans, these SLIs are the most common for request-driven ```sql FROM Span - WHERE entity.guid = '{entityGuid}' AND (span.kind IN ('server', 'consumer') + WHERE entity.guid = 'ENTITY_GUID' AND (span.kind IN ('server', 'consumer') OR kind IN ('server', 'consumer')) ``` - Where `{entityGuid}` is the service's GUID. + Where `ENTITY_GUID` is the service's GUID. **Bad events fields** @@ -199,11 +199,11 @@ Based on OpenTelemetry spans, these SLIs are the most common for request-driven ```sql FROM Span - WHERE entity.guid = '{entityGuid}' AND (span.kind IN ('server', 'consumer') + WHERE entity.guid = 'ENTITY_GUID' AND (span.kind IN ('server', 'consumer') OR kind IN ('server', 'consumer')) AND otel.status_code = 'ERROR' ``` - Where `{entityGuid}` is the service's GUID. + Where `ENTITY_GUID` is the service's GUID. **Good events fields** @@ -241,12 +241,12 @@ Based on OpenTelemetry spans, these SLIs are the most common for request-driven ```sql FROM Span - WHERE entity.guid = '{entityGuid}' AND (span.kind IN ('server', 'consumer') - OR kind IN ('server', 'consumer')) AND duration.ms < {duration} + WHERE entity.guid = 'ENTITY_GUID' AND (span.kind IN ('server', 'consumer') + OR kind IN ('server', 'consumer')) AND duration.ms < DURATION ``` - * Where `{entityGuid}` is the service's GUID. - * Where `{duration}` is the response time that you consider provides a good experience for your client service or end-user, in seconds. + * Where `ENTITY_GUID` is the service's GUID. + * Where `DURATION` is the response time that you consider provides a good experience for your client service or end-user, in seconds. @@ -271,10 +271,10 @@ Note: This feature is still in beta. ```sql FROM Metric SELECT sum(getField(apm.service.transaction.duration, count)) - WHERE appName = '{appName}' + WHERE appName = 'APP_NAME' ``` - Where `{appName}` is the APM app name. + Where `APP_NAME` is the APM app name. **Bad events fields** @@ -283,10 +283,10 @@ Note: This feature is still in beta. ```sql FROM Metric SELECT sum(getField(apm.service.error.count, count)) - WHERE appName = '{appName}' AND getField(`apm.service.error.count`, count) > 0 + WHERE appName = 'APP_NAME' AND getField(`apm.service.error.count`, count) > 0 ``` - Where `{appName}` is the APM app name. + Where `APP_NAME` is the APM app name. @@ -342,10 +342,10 @@ The following SLIs are based on Google's Browser Core Web Vitals. ```sql FROM PageView - WHERE entityGuid = '{entityGuid}' + WHERE entityGuid = 'ENTITY_GUID' ``` - Where `{entityGuid}` is the browser app GUID. + Where `ENTITY_GUID` is the browser app GUID. **Bad events fields** @@ -353,10 +353,10 @@ The following SLIs are based on Google's Browser Core Web Vitals. ```sql FROM JavaScriptError - WHERE entityGuid = '{entityGuid}' AND firstErrorInSession IS true + WHERE entityGuid = 'ENTITY_GUID' AND firstErrorInSession IS true ``` - Where `{entityGuid}` is the browser app GUID. + Where `ENTITY_GUID` is the browser app GUID. **Good events fields** @@ -383,17 +383,17 @@ The following SLIs are based on Google's Browser Core Web Vitals. ```sql FROM PageViewTiming - WHERE entityGuid = '{entityGuid}' AND largestContentfulPaint < '{largestContentfulPaint}' + WHERE entityGuid = 'ENTITY_GUID' AND largestContentfulPaint < 'LARGEST_CONTENTFUL_PAINT' ``` - * Where `{entityGuid}` is the browser app GUID. - * Where `{largestContentfulPaint}` is the amount of time (in milliseconds) to render the largest content element visible in the viewport that you consider provides a good experience for your end user. A frequent standard is 4000 ms. + * Where `ENTITY_GUID` is the browser app GUID. + * Where `LARGEST_CONTENTFUL_PAINT` is the amount of time (in milliseconds) to render the largest content element visible in the viewport that you consider provides a good experience for your end user. A frequent standard is 4000 ms. - To determine a realistic number to use for `{largestContentfulPaint}` in your environment, one typical practice is to select the 95 percentile duration of the responses for the last 7 or 15 days. Find it by using the query builder: + To determine a realistic number to use for `LARGEST_CONTENTFUL_PAINT` in your environment, one typical practice is to select the 95 percentile duration of the responses for the last 7 or 15 days. Find it by using the query builder: ```sql SELECT percentile(largestContentfulPaint, 95) FROM PageViewTiming - WHERE entityGuid = '{entityGuid}' SINCE 7 days ago LIMIT MAX + WHERE entityGuid = 'ENTITY_GUID' SINCE 7 days ago LIMIT MAX ``` @@ -410,10 +410,10 @@ The following SLIs are based on Google's Browser Core Web Vitals. ```sql FROM PageViewTiming - WHERE entityGuid = '{entityGuid}' AND interactionToNextPaint IS NOT NULL + WHERE entityGuid = 'ENTITY_GUID' AND interactionToNextPaint IS NOT NULL ``` - Where `{entityGuid}` is the browser app GUID. + Where `ENTITY_GUID` is the browser app GUID. **Good events fields** @@ -421,17 +421,17 @@ The following SLIs are based on Google's Browser Core Web Vitals. ```sql FROM PageViewTiming - WHERE entityGuid = '{entityGuid}' AND interactionToNextPaint < {interactionToNextPaint} + WHERE entityGuid = 'ENTITY_GUID' AND interactionToNextPaint < INTERACTION_TO_NEXT_PAINT ``` - * Where `{entityGuid}` is the browser app GUID. - * Where `{interactionToNextPaint}` is the amount of time (in milliseconds) the browser should respond in to provide a good experience for your end user. A frequent standard is 300 ms. + * Where `ENTITY_GUID` is the browser app GUID. + * Where `INTERACTION_TO_NEXT_PAINT` is the amount of time (in milliseconds) the browser should respond in to provide a good experience for your end user. A frequent standard is 300 ms. - To determine a realistic number to use for `{interactionToNextPaint}` in your environment, one typical practice is to select the 95 percentile duration of the responses for the last 7 or 15 days. Find it by using the query builder: + To determine a realistic number to use for `INTERACTION_TO_NEXT_PAINT` in your environment, one typical practice is to select the 95 percentile duration of the responses for the last 7 or 15 days. Find it by using the query builder: ```sql SELECT percentile(interactionToNextPaint, 95) FROM PageViewTiming - WHERE entityGuid = '{entityGuid}' SINCE 7 days ago LIMIT MAX FACET deviceType + WHERE entityGuid = 'ENTITY_GUID' SINCE 7 days ago LIMIT MAX FACET deviceType ``` @@ -448,10 +448,10 @@ The following SLIs are based on Google's Browser Core Web Vitals. ```sql FROM PageViewTiming - WHERE entityGuid = '{entityGuid}' AND cumulativeLayoutShift IS NOT NULL + WHERE entityGuid = 'ENTITY_GUID' AND cumulativeLayoutShift IS NOT NULL ``` - Where `{entityGuid}` is the browser app GUID. + Where `ENTITY_GUID` is the browser app GUID. If you’d like to create separate SLIs to track CLS in desktop and mobile devices separately, add one of these clauses at the end of the field: @@ -464,22 +464,22 @@ The following SLIs are based on Google's Browser Core Web Vitals. ```sql FROM PageViewTiming - WHERE entityGuid = '{entityGuid}' AND cumulativeLayoutShift < {cumulativeLayoutShift} + WHERE entityGuid = 'ENTITY_GUID' AND cumulativeLayoutShift < CUMULATIVE_LAYOUT_SHIFT ``` - * Where `{entityGuid}` is the browser app GUID. - * Where `{cumulativeLayoutShift}` is a pre-set value. To provide a good user experience, your site should strive to have a CLS score of 0.1 or less. A CLS score of 0.25 or more is considered a poor user experience. + * Where `ENTITY_GUID` is the browser app GUID. + * Where `CUMULATIVE_LAYOUT_SHIFT` is a pre-set value. To provide a good user experience, your site should strive to have a CLS score of 0.1 or less. A CLS score of 0.25 or more is considered a poor user experience. If you’ve decided to create separate SLIs to track CLS in desktop and mobile devices separately when you defined the valid events query, add this clause at the end of the field: * `AND deviceType = 'Mobile'` * `AND deviceType = 'Desktop'` - To determine a realistic number to select for `{cumulativeLayoutShift}` in your environment, one typical practice is to select the 75th percentile of page loads for the last 7 or 15 days, segmented across mobile and desktop devices. Find it by using the query builder: + To determine a realistic number to select for `CUMULATIVE_LAYOUT_SHIFT` in your environment, one typical practice is to select the 75th percentile of page loads for the last 7 or 15 days, segmented across mobile and desktop devices. Find it by using the query builder: ```sql SELECT percentile(cumulativeLayoutShift, 95) FROM PageViewTiming - WHERE entityGuid = '{entityGuid}' SINCE 7 days ago LIMIT MAX FACET deviceType + WHERE entityGuid = 'ENTITY_GUID' SINCE 7 days ago LIMIT MAX FACET deviceType ``` @@ -500,10 +500,10 @@ The following SLIs are based on Google's Browser Core Web Vitals. ```sql FROM SyntheticCheck - WHERE entity.guid = '{entityGuid}' + WHERE entity.guid = 'ENTITY_GUID' ``` - Where `{entityGuid}` is the synthetic check's GUID. + Where `ENTITY_GUID` is the synthetic check's GUID. **Good events fields** @@ -511,10 +511,10 @@ The following SLIs are based on Google's Browser Core Web Vitals. ```sql FROM SyntheticCheck - WHERE entity.guid = '{entityGuid}' AND result='SUCCESS' + WHERE entity.guid = 'ENTITY_GUID' AND result='SUCCESS' ``` - Where `{entityGuid}` is the synthetic check's GUID. + Where `ENTITY_GUID` is the synthetic check's GUID. @@ -614,7 +614,7 @@ To create service levels, follow these steps: ```sql FROM JavaScriptError SELECT count(*) - WHERE entityGuid = '{entityGuid}' AND firstErrorInSession IS true + WHERE entityGuid = 'ENTITY_GUID' AND firstErrorInSession IS true ``` Example using `sum()`: From 2eaba0f79f4df3f47aff2a6aa2f3e6f68ae5be28 Mon Sep 17 00:00:00 2001 From: sujitnewrelic Date: Fri, 31 Jan 2025 09:09:37 +0530 Subject: [PATCH 56/67] Linguistic correction --- .../instrument-aws-sqs-message-queues.mdx | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx b/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx index 09e43681f8a..b1663bc567e 100644 --- a/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx +++ b/src/content/docs/apm/agents/java-agent/instrumentation/instrument-aws-sqs-message-queues.mdx @@ -10,16 +10,13 @@ redirects: freshnessValidatedDate: never --- -The Java Agent suports instrumentation for AWS SQS message queues. Our SQS instrumentation creates message broker traces but customers -may want extra information about the usage of the SQS SDK. This document provides examples on how to do it. +The Java Agent supports instrumentation for AWS SQS message queues. While our SQS instrumentation generates message broker traces, you may want additional information about the usage of the SQS SDK. -To see all supported SQS libraries, check the [Java compatibility and requirements page](/docs/agents/java-agent/getting-started/compatibility-requirements-java-agent). +To see all supported SQS libraries, refer to [Java compatibility and requirements page](/docs/agents/java-agent/getting-started/compatibility-requirements-java-agent). ## View SQS Distributed Tracing -Out of the box, our AWS SQS SDK instrumentation adds distributed trace headers as message attributes to SQS messages for versions `2.1.0` and later. -However for message reciever operations, we don't offer an out of the box way to accept these headers. -Instead we recommend cxustomers to use custom instrumentation to read the distributed trace headers. +The AWS SQS SDK instrumentation automatically includes distributed trace headers as message attributes for SQS messages. This functionality is available starting from version 2.1.0. However, for message receiver operations, there isn't a built-in method to process these headers. We suggest that you implement custom instrumentation to read the distributed trace headers. Here is an example of how to read the distributed trace headers from an SQS message using the V2 SDK: @@ -68,7 +65,7 @@ Here is an example of how to read the distributed trace headers from an SQS mess } ``` -Below is the wrapper class `SQSReceivedMessageHeaders` that extracts the distributed trace headers from the SQS message: +Here is the wrapper class `SQSReceivedMessageHeaders` that extracts the distributed trace headers from the SQS message: ```java import com.newrelic.api.agent.HeaderType; From 127800b42fbdd35e91cc385c2123cd08f17bb565 Mon Sep 17 00:00:00 2001 From: WriteMayur Date: Fri, 31 Jan 2025 11:13:24 +0530 Subject: [PATCH 57/67] updated the pricing section as per legal feedback --- .../agentic-ai/alert-intelligence-tool.mdx | 4 ++-- .../agentic-ai/change-intelligence-tool.mdx | 4 ++-- .../agentic-ai/github-copilot-integration.mdx | 12 +++++----- .../agentic-ai/introduction-agentic-ai.mdx | 22 ++++++++++--------- 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/src/content/docs/agentic-ai/alert-intelligence-tool.mdx b/src/content/docs/agentic-ai/alert-intelligence-tool.mdx index 7e93e9a52bd..cab45d1d44a 100644 --- a/src/content/docs/agentic-ai/alert-intelligence-tool.mdx +++ b/src/content/docs/agentic-ai/alert-intelligence-tool.mdx @@ -15,7 +15,7 @@ The Alert Intelligence Tool within New Relic's Agentic Integration enhances your Your access to the New Relic platform grants you comprehensive visibility into all data related to your application -### Alert Intelligence features +### Alert Intelligence features [#features] The Alert Intelligence tool offers a range of features to help you monitor and analyze your application's performance: @@ -33,7 +33,7 @@ The Alert Intelligence tool offers a range of features to help you monitor and a -### Use the Alert Intelligence +### Use the Alert Intelligence [#use] **Prerequisites:** diff --git a/src/content/docs/agentic-ai/change-intelligence-tool.mdx b/src/content/docs/agentic-ai/change-intelligence-tool.mdx index b5ca7631b01..ce06619e482 100644 --- a/src/content/docs/agentic-ai/change-intelligence-tool.mdx +++ b/src/content/docs/agentic-ai/change-intelligence-tool.mdx @@ -14,7 +14,7 @@ The Change Intelligence Tool within New Relic's Agentic Integration enhances you Your access to the New Relic platform grants you comprehensive visibility into all data related to your application. -### Change Intelligence features +### Change Intelligence features [#features] The Change Intelligence tool offers a range of features to help you monitor and analyze your application's performance post-deployment: @@ -32,7 +32,7 @@ The Change Intelligence tool offers a range of features to help you monitor and - **Deployment analysis**: Offers a detailed analysis of the deployment process, including the deployment number, status, and any issues encountered. -### Use the Change Intelligence +### Use the Change Intelligence [#use] **Prerequisites:** diff --git a/src/content/docs/agentic-ai/github-copilot-integration.mdx b/src/content/docs/agentic-ai/github-copilot-integration.mdx index dde1dd22f2c..da88a863a47 100644 --- a/src/content/docs/agentic-ai/github-copilot-integration.mdx +++ b/src/content/docs/agentic-ai/github-copilot-integration.mdx @@ -12,9 +12,9 @@ The New Relic agent for GitHub Copilot extension provides intelligent insights a This guide will walk you through the process of installing and using the New Relic agent within the GitHub Copilot extension. -## Install the New Relic Agent in GitHub Copilot +## Install the New Relic Agent in GitHub Copilot [#install-new-relic-agent] -### Prerequisites +### Prerequisites [#prerequisites] Before you begin, make sure that the following prerequisites are met to ensure a smooth setup process: @@ -32,18 +32,18 @@ If you want to restrict access to GitHub Copilot for certain roles, configure th 1. On GitHub MarketPlace, go to [New Relic Agent](https://github.com/marketplace/newrelic-copilot-extension). 2. Click **Add > Install it for free**. - After the agent is installed, you can use it within the GitHub Chat extension in your IDE. For more information, refer [using the New Relic Agent in Copilot](#communicate-with-New-Relic-Agent-in-gitHub-copilot). + After the agent is installed, you can use it within the GitHub Chat extension in your IDE. For more information, refer [using the New Relic Agent in Copilot](#communicate-with-new-relic-agent-in-gitHub-copilot). -## Communicate with New Relic Agent in GitHub Copilot +## Communicate with New Relic Agent in GitHub Copilot [#communicate-with-new-relic-agent-in-gitHub-copilot] The New Relic agent within Github Copilot can assist with a variety of tasks and offer valuable insights. To interact with the New Relic Agent, in the Copilot chat input box, type `@newrelic`. -### Sign-in to New Relic Agent +### Sign-in to New Relic Agent [#sign-in] When you initiate conversation for the first-time with New Relic Agent, you will be prompted to sign in. Follow the instructions to complete the sign-in process. -### Chat message structure +### Chat message structure [#chat-message-structure] To interact with the New Relic Agent, enter your prompt as follows: diff --git a/src/content/docs/agentic-ai/introduction-agentic-ai.mdx b/src/content/docs/agentic-ai/introduction-agentic-ai.mdx index 1ea02a83ced..2ab10637d0e 100644 --- a/src/content/docs/agentic-ai/introduction-agentic-ai.mdx +++ b/src/content/docs/agentic-ai/introduction-agentic-ai.mdx @@ -17,17 +17,17 @@ freshnessValidatedDate: never New Relic's Agentic Integration provides an AI-driven solution to automate and optimize observability workflows, enhancing system management and monitoring. This integration facilitates seamless operations by automating repetitive tasks through AI agents, reducing manual intervention. By integrating seamlessly with platforms such as, GitHub Copilot, Amazon Q, Gemini Code Assist, and ServiceNow, Agentic Integrations transform complex workflows into seamless operations. -## Key features +## Key features [#features] - **Intelligent automation:** Leverage AI to automate and streamline complex workflows, reducing the need for manual tool-switching and enhancing productivity. - **Enhanced observability:** Gain comprehensive insights into your systems, enabling faster detection, analysis, and resolution of incidents. - **Seamless integration:** Connect with popular platforms such as GitHub Copilot to bring powerful analytics and insights directly into your existing workflows. -## Current integrations +## Current integrations [#integrations] -### GitHub Copilot +### GitHub Copilot [#github-copilot] -Integrate New Relic insights directly into your IDE with GitHub Copilot. You can use Agent AI to access logs, errors, and recommendations without leaving your coding environment. It provides real-time insights as they develop and deploy the application. +Integrate New Relic insights directly into your IDE with GitHub Copilot. You can use Agent AI to access logs, errors, and recommendations without leaving your coding environment. It provides real-time insights as they develop and deploy the code. This integration offers: @@ -37,22 +37,24 @@ This integration offers: For more information, refer [Getting Started with New Relic Agent for GitHub Copilot](/docs/agentic-ai/github-copilot-integration). -## Tools +## Tools [#tools] Each agentic integration comes with various tools to use New Relic platform capabilities and provide observability insights, alerts, and predictions: -- **Change intelligence:** The change intelligence tool assists you to understand and mitigate potential risks by providing comprehensive change analysis and forecasting. You can use this tool to gain instant insights into the impact of system changes. It helps you to assess the potential risks associated with deployments and configuration modifications. For more information, refer [Change Intelligence Tool](/docs/agentic-ai/change-intelligence-tool). +- **[Change Intelligence Tool:](/docs/agentic-ai/change-intelligence-tool)** The change intelligence tool assists you to understand and mitigate potential risks by providing comprehensive change analysis and forecasting. You can use this tool to gain instant insights into the impact of system changes. It helps you to assess the potential risks associated with deployments and configuration modifications. For more information, refer [Change Intelligence Tool](/docs/agentic-ai/change-intelligence-tool). -- **Alert Intelligence:** The Alert Intelligence tool offers advanced alert analysis to swiftly resolve incidents. It provides real-time notifications and immediate recommendations to prevent escalation. For more information, refer [Alert Intelligence Tool](/docs/agentic-ai/alert-intelligence-tool). +- **[Alert Intelligence Tool](/docs/agentic-ai/alert-intelligence-tool):** The Alert Intelligence tool offers advanced alert analysis to swiftly resolve incidents. It provides real-time notifications and immediate recommendations to prevent escalation. For more information, refer [Alert Intelligence Tool](/docs/agentic-ai/alert-intelligence-tool). -## Pricing +## Pricing [#pricing] -Agentic Integrations are billable for all customers during preview and after GA. During preview, all customers will have access to Agentic Integrations, however when released as GA, access is only available to customers with New Relic Advanced Compute offering. + +Your use of Agentic Integrations are billable during preview in accordance with your Order as an Advanced Compute Product regardless of user type. For Advanced Compute Product features, related New Relic Query Language queries (NRQLS) are also billable as Advanced Compute. New Relic intends to release Agentic Integrations as an Advanced Compute Product feature once generally available. For further details on pricing, please contact our sales team or refer to your Order. -## Stay updated + +## Stay updated [#stay-updated] This page will be continuously updated with new documentation and resources. We're committed to providing you with the leading edge in observability technology. Stay tuned for the latest developments and opportunities. From 62c4fd0ef81c3ed93ba96c4a243bf20fcacf157b Mon Sep 17 00:00:00 2001 From: mlakshmiharita Date: Fri, 31 Jan 2025 14:18:40 +0530 Subject: [PATCH 58/67] Release notes WIP. Jan 24-30, release notes. --- .../release-notes/docs-release-notes/docs-1-31-2025.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx index cf997fd0910..93600a40e40 100644 --- a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx +++ b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx @@ -7,11 +7,11 @@ version: 'version: January 24-30, 2025' ### Major changes * Updated the compatibility reports for [Node.js agent](/docs/apm/agents/nodejs-agent/getting-started/compatibility-requirements-nodejs-agent/). -* Enhanced the observability for front-end applications with the new auto logging feature, which is now available for Pro and Pro+SPA browser agents. This enhancement allows automatic collection of `console` log messages at the `WARN` level, supports sampling rate configuration, offers log viewing through the Logs page or Errors inbox, and adheres to standard data consumption pricing. +* Enhanced front-end observability with a new auto logging feature for Pro and Pro+SPA browser agents, enabling automatic collection of `WARN` level `console` log messages, configurable sampling rates, and log viewing via the Logs page or Errors inbox, following standard data consumption pricing. * Enables local log viewing on Linux systems and offers easy access for monitoring and troubleshooting the [KTranslate](/docs.newrelic.com/docs/network-performance-monitoring/advanced/ktranslate-container-health/) service. -* Improved connectivity and security by updating [network](/docs/new-relic-solutions/get-started/networks/) blocks with new effective IP ranges. -* Revised the [OTLP](/docs/opentelemetry/best-practices/opentelemetry-otlp/) release version, ensuring compatibility with both earlier and later versions. -* New Relic PHP agent allows [custom events](/docs/data-apis/custom-data/custom-events/apm-report-custom-events-attributes/) creation, with a default limit of 30,000 per minute that can be increased to 100,000. It also supports the addition of custom attributes and provides guidelines on naming restrictions and event type limits. +* Improved connectivity and security by updating [network blocks](/docs/new-relic-solutions/get-started/networks/) with new effective IP ranges. +* Revised the [OTLP release version](/docs/opentelemetry/best-practices/opentelemetry-otlp/), ensuring compatibility with both earlier and later versions. +* [New Relic PHP agent allows custom events](/docs/data-apis/custom-data/custom-events/apm-report-custom-events-attributes/) creation, with a default limit of 30,000 per minute that can be increased to 100,000. It also supports the addition of custom attributes and provides guidelines on naming restrictions and event type limits. * Updated for the deprecation and End of support for [NewRelic Xamarin NuGet Package](/docs.newrelic.com/docs/mobile-monitoring/new-relic-mobile-xamarin/monitor-your-xamarin-application/). ### Minor change From cde436bc1ea658e274bc27a026eef96f8a0a4f23 Mon Sep 17 00:00:00 2001 From: sujitnewrelic Date: Fri, 31 Jan 2025 17:16:03 +0530 Subject: [PATCH 59/67] Updated the bullet points as per the RN format --- .../docs-release-notes/docs-1-31-2025.mdx | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx index 93600a40e40..fa1e943ab32 100644 --- a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx +++ b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx @@ -4,19 +4,20 @@ releaseDate: '2025-01-31' version: 'version: January 24-30, 2025' --- +### New doc +* Added a new document for the [Auto logging](/docs/browser/browser-monitoring/browser-pro-features/auto-logging) feature that enhances front-end observability for Pro and Pro+SPA browser agents, enabling automatic collection of `WARN` level `console` log messages. + ### Major changes * Updated the compatibility reports for [Node.js agent](/docs/apm/agents/nodejs-agent/getting-started/compatibility-requirements-nodejs-agent/). -* Enhanced front-end observability with a new auto logging feature for Pro and Pro+SPA browser agents, enabling automatic collection of `WARN` level `console` log messages, configurable sampling rates, and log viewing via the Logs page or Errors inbox, following standard data consumption pricing. -* Enables local log viewing on Linux systems and offers easy access for monitoring and troubleshooting the [KTranslate](/docs.newrelic.com/docs/network-performance-monitoring/advanced/ktranslate-container-health/) service. -* Improved connectivity and security by updating [network blocks](/docs/new-relic-solutions/get-started/networks/) with new effective IP ranges. -* Revised the [OTLP release version](/docs/opentelemetry/best-practices/opentelemetry-otlp/), ensuring compatibility with both earlier and later versions. -* [New Relic PHP agent allows custom events](/docs/data-apis/custom-data/custom-events/apm-report-custom-events-attributes/) creation, with a default limit of 30,000 per minute that can be increased to 100,000. It also supports the addition of custom attributes and provides guidelines on naming restrictions and event type limits. -* Updated for the deprecation and End of support for [NewRelic Xamarin NuGet Package](/docs.newrelic.com/docs/mobile-monitoring/new-relic-mobile-xamarin/monitor-your-xamarin-application/). +* Added a methord in [KTranslate Docker container health monitoring](/docs/network-performance-monitoring/advanced/ktranslate-container-health) to check the log locally from the Linux package. +* updated [network blocks](/docs/new-relic-solutions/get-started/networks/) with new effective IP ranges to improved connectivity and security. +* Updated the [OTLP protocol version](/docs/opentelemetry/best-practices/opentelemetry-otlp/#otlp-version-support) that New relic uses. +* Updated [APM: Report custom events and attributes](/docs/data-apis/custom-data/custom-events/apm-report-custom-events-attributes/#php-att) to include the ability to increase the maximum number of custom events in the PHP agent from 30,000 to 100,000 per minute. +* Added a call-out for the deprecation and end of support for [NewRelic Xamarin NuGet Package](/docs/mobile-monitoring/new-relic-mobile-xamarin/monitor-your-xamarin-application/). ### Minor change -* New Relic Ruby agent offers a public API with detailed instructions on [RubyDoc](/docs/apm/agents/ruby-agent/api-guides/guide-using-ruby-agent-api/), enabling improved data collection for Ruby applications. * Updated the supported Python versions. ### Release note @@ -24,11 +25,11 @@ version: 'version: January 24-30, 2025' Stay up-to-date on our most recent release: * [Go agent v3.36.0](/docs/release-notes/agent-release-notes/go-release-notes/go-agent-3-36-0/) - * Enhanced the securityagent integration to improve trace handling and security analysis. - * Fixes bugs. + * Enhanced the security agent integration to improve trace handling and security analysis. + * Fixed bugs. * [Browser agent v1.279.0](/docs/release-notes/new-relic-browser-release-notes/browser-agent-release-notes/browser-agent-v1.279.0/) - * Deprecation of First Input Delay (FID), in favor of Interaction To Next Paint (INP). + * Deprecated First Input Delay (FID), in favor of Interaction To Next Paint (INP). * [Android agent v7.6.3](/docs/release-notes/mobile-release-notes/android-release-notes/android-763/) * Introduced build-time feature flag for LogInstrumentation. * Enhanced logging. - * Fixes bugs. \ No newline at end of file + * Fixed bugs. \ No newline at end of file From 2c92d3dbde3a9ae0501a19f193635aa08d3791da Mon Sep 17 00:00:00 2001 From: mlakshmiharita Date: Fri, 31 Jan 2025 18:56:50 +0530 Subject: [PATCH 60/67] Update docs-1-31-2025.mdx Updated for the doc release notes. --- .../docs-release-notes/docs-1-31-2025.mdx | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx index fa1e943ab32..c8862a4ba6c 100644 --- a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx +++ b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx @@ -19,6 +19,9 @@ version: 'version: January 24-30, 2025' ### Minor change * Updated the supported Python versions. +* The instructions for [configuring Okta user profile](https://docs.newrelic.com/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration/) attribute values are case-sensitive. +* [SCIM API 'nrUserType'](https://docs.newrelic.com/docs/accounts/accounts/automated-user-management/tutorial-manage-users-groups-scim/#manage-user-type) values are case sensitive. +* Updated the supportes PHP agent versions. ### Release note @@ -32,4 +35,25 @@ Stay up-to-date on our most recent release: * [Android agent v7.6.3](/docs/release-notes/mobile-release-notes/android-release-notes/android-763/) * Introduced build-time feature flag for LogInstrumentation. * Enhanced logging. + * Fixed bugs. +* [Python agent v10.5.0](https://docs.newrelic.com/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500/) + * Introduced agent health reporting. + * Fixed bugs. +* [Ruby agent v9.17.0](https://docs.newrelic.com/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0/) + * Support Ruby 3.4.0. + * Added instrumentation for aws-sdk-firehose. + * Enhanced Kubernetes APM auto-attach - new agent version precedent. + * Added health checks when the agent runs within Agent Control. + * Added Redshift as recognized ActiveRecord adapter. + * Added instrumentation for aws-sdk-kinesis. + * Fixed bugs. +* [Node.js agent v12.11.3](https://docs.newrelic.com/docs/release-notes/agent-release-notes/nodejs-release-notes/node-agent-12-11-3/) + * Fixed bugs. +* [Java agent v8.18.0](https://docs.newrelic.com/docs/release-notes/agent-release-notes/java-release-notes/java-agent-8180/) + * Added scala3 source detection. + * Vertx: decreased the amount of tokens created. + * New instrumentation module for Struts2 v6.7.0. + * New instrumentation module for Kafka 3.9. + * Added support for distributed tracing in AWS SQS. + * Added relationship metric support for Kafka clients node metrics. * Fixed bugs. \ No newline at end of file From 3300fe203b02caea3f13993d62196fd070905c02 Mon Sep 17 00:00:00 2001 From: mlakshmiharita Date: Fri, 31 Jan 2025 19:16:46 +0530 Subject: [PATCH 61/67] release notes --- .../release-notes/docs-release-notes/docs-1-31-2025.mdx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx index c8862a4ba6c..a30bc39d85b 100644 --- a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx +++ b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx @@ -36,10 +36,10 @@ Stay up-to-date on our most recent release: * Introduced build-time feature flag for LogInstrumentation. * Enhanced logging. * Fixed bugs. -* [Python agent v10.5.0](https://docs.newrelic.com/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500/) +* [Python agent v10.5.0](/docs.newrelic.com/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500/) * Introduced agent health reporting. * Fixed bugs. -* [Ruby agent v9.17.0](https://docs.newrelic.com/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0/) +* [Ruby agent v9.17.0](/docs.newrelic.com/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0/) * Support Ruby 3.4.0. * Added instrumentation for aws-sdk-firehose. * Enhanced Kubernetes APM auto-attach - new agent version precedent. @@ -47,9 +47,9 @@ Stay up-to-date on our most recent release: * Added Redshift as recognized ActiveRecord adapter. * Added instrumentation for aws-sdk-kinesis. * Fixed bugs. -* [Node.js agent v12.11.3](https://docs.newrelic.com/docs/release-notes/agent-release-notes/nodejs-release-notes/node-agent-12-11-3/) +* [Node.js agent v12.11.3](/docs.newrelic.com/docs/release-notes/agent-release-notes/nodejs-release-notes/node-agent-12-11-3/) * Fixed bugs. -* [Java agent v8.18.0](https://docs.newrelic.com/docs/release-notes/agent-release-notes/java-release-notes/java-agent-8180/) +* [Java agent v8.18.0](/docs.newrelic.com/docs/release-notes/agent-release-notes/java-release-notes/java-agent-8180/) * Added scala3 source detection. * Vertx: decreased the amount of tokens created. * New instrumentation module for Struts2 v6.7.0. From cab75f9da92c862ab21c572671835d63cadb48dd Mon Sep 17 00:00:00 2001 From: mlakshmiharita Date: Fri, 31 Jan 2025 19:43:28 +0530 Subject: [PATCH 62/67] Release Notes updates Please review release notes and approve. Thank you. --- .../docs-release-notes/docs-1-31-2025.mdx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx index a30bc39d85b..d547263426f 100644 --- a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx +++ b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx @@ -19,8 +19,8 @@ version: 'version: January 24-30, 2025' ### Minor change * Updated the supported Python versions. -* The instructions for [configuring Okta user profile](https://docs.newrelic.com/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration/) attribute values are case-sensitive. -* [SCIM API 'nrUserType'](https://docs.newrelic.com/docs/accounts/accounts/automated-user-management/tutorial-manage-users-groups-scim/#manage-user-type) values are case sensitive. +* The attribute values specified in the [Okta user profile configuration](/docs.newrelic.com/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration/) are case-sensitive. +* [SCIM API user type](/docs/accounts/accounts/automated-user-management/tutorial-manage-users-groups-scim/#manage-user-type) values are case sensitive. * Updated the supportes PHP agent versions. ### Release note @@ -52,8 +52,13 @@ Stay up-to-date on our most recent release: * [Java agent v8.18.0](/docs.newrelic.com/docs/release-notes/agent-release-notes/java-release-notes/java-agent-8180/) * Added scala3 source detection. * Vertx: decreased the amount of tokens created. - * New instrumentation module for Struts2 v6.7.0. - * New instrumentation module for Kafka 3.9. + * Added new instrumentation modules for Struts2 v6.7.0 and Kafka 3.9. * Added support for distributed tracing in AWS SQS. * Added relationship metric support for Kafka clients node metrics. + * Fixed bugs. +* [Fluent Bit v3.1.9](docs/release-notes/fluentbit-release-notes/fluentbit-24-10-31/) + * Multiline reset fixes high CPU. + * Improved error messaging and Multiline filter. + * Upgraded CTraces. + * Calyptia output updates for Windows and agent registration. * Fixed bugs. \ No newline at end of file From 6ad0225cab1e5e1dce28310178665cd0527b89ac Mon Sep 17 00:00:00 2001 From: mlakshmiharita Date: Fri, 31 Jan 2025 19:45:05 +0530 Subject: [PATCH 63/67] Update docs-1-31-2025.mdx --- .../docs/release-notes/docs-release-notes/docs-1-31-2025.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx index d547263426f..c19c34ea71f 100644 --- a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx +++ b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx @@ -11,7 +11,7 @@ version: 'version: January 24-30, 2025' * Updated the compatibility reports for [Node.js agent](/docs/apm/agents/nodejs-agent/getting-started/compatibility-requirements-nodejs-agent/). * Added a methord in [KTranslate Docker container health monitoring](/docs/network-performance-monitoring/advanced/ktranslate-container-health) to check the log locally from the Linux package. -* updated [network blocks](/docs/new-relic-solutions/get-started/networks/) with new effective IP ranges to improved connectivity and security. +* Updated [network blocks](/docs/new-relic-solutions/get-started/networks/) with new effective IP ranges to improved connectivity and security. * Updated the [OTLP protocol version](/docs/opentelemetry/best-practices/opentelemetry-otlp/#otlp-version-support) that New relic uses. * Updated [APM: Report custom events and attributes](/docs/data-apis/custom-data/custom-events/apm-report-custom-events-attributes/#php-att) to include the ability to increase the maximum number of custom events in the PHP agent from 30,000 to 100,000 per minute. * Added a call-out for the deprecation and end of support for [NewRelic Xamarin NuGet Package](/docs/mobile-monitoring/new-relic-mobile-xamarin/monitor-your-xamarin-application/). From 5ad757bed3d4fe1f707a829ec8635c8a27e5c82f Mon Sep 17 00:00:00 2001 From: mlakshmiharita Date: Fri, 31 Jan 2025 19:46:01 +0530 Subject: [PATCH 64/67] Update docs-1-31-2025.mdx --- .../docs/release-notes/docs-release-notes/docs-1-31-2025.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx index c19c34ea71f..141508e697f 100644 --- a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx +++ b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx @@ -21,7 +21,7 @@ version: 'version: January 24-30, 2025' * Updated the supported Python versions. * The attribute values specified in the [Okta user profile configuration](/docs.newrelic.com/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration/) are case-sensitive. * [SCIM API user type](/docs/accounts/accounts/automated-user-management/tutorial-manage-users-groups-scim/#manage-user-type) values are case sensitive. -* Updated the supportes PHP agent versions. +* Updated the supported PHP agent versions. ### Release note From 70d0c90411ffb25504cd76d2e231d4e300abdcb6 Mon Sep 17 00:00:00 2001 From: mlakshmiharita Date: Fri, 31 Jan 2025 19:56:22 +0530 Subject: [PATCH 65/67] Corrections to file paths Corrections to file paths --- .../docs-release-notes/docs-1-31-2025.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx index 141508e697f..8f33c9281cd 100644 --- a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx +++ b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx @@ -19,7 +19,7 @@ version: 'version: January 24-30, 2025' ### Minor change * Updated the supported Python versions. -* The attribute values specified in the [Okta user profile configuration](/docs.newrelic.com/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration/) are case-sensitive. +* The attribute values specified in the [Okta user profile configuration](/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration/) are case-sensitive. * [SCIM API user type](/docs/accounts/accounts/automated-user-management/tutorial-manage-users-groups-scim/#manage-user-type) values are case sensitive. * Updated the supported PHP agent versions. @@ -36,10 +36,10 @@ Stay up-to-date on our most recent release: * Introduced build-time feature flag for LogInstrumentation. * Enhanced logging. * Fixed bugs. -* [Python agent v10.5.0](/docs.newrelic.com/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500/) +* [Python agent v10.5.0](/docs/release-notes/agent-release-notes/python-release-notes/python-agent-100500/) * Introduced agent health reporting. * Fixed bugs. -* [Ruby agent v9.17.0](/docs.newrelic.com/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0/) +* [Ruby agent v9.17.0](/docs/release-notes/agent-release-notes/ruby-release-notes/ruby-agent-9-17-0/) * Support Ruby 3.4.0. * Added instrumentation for aws-sdk-firehose. * Enhanced Kubernetes APM auto-attach - new agent version precedent. @@ -47,9 +47,9 @@ Stay up-to-date on our most recent release: * Added Redshift as recognized ActiveRecord adapter. * Added instrumentation for aws-sdk-kinesis. * Fixed bugs. -* [Node.js agent v12.11.3](/docs.newrelic.com/docs/release-notes/agent-release-notes/nodejs-release-notes/node-agent-12-11-3/) +* [Node.js agent v12.11.3](/docs/release-notes/agent-release-notes/nodejs-release-notes/node-agent-12-11-3/) * Fixed bugs. -* [Java agent v8.18.0](/docs.newrelic.com/docs/release-notes/agent-release-notes/java-release-notes/java-agent-8180/) +* [Java agent v8.18.0](/docs/release-notes/agent-release-notes/java-release-notes/java-agent-8180/) * Added scala3 source detection. * Vertx: decreased the amount of tokens created. * Added new instrumentation modules for Struts2 v6.7.0 and Kafka 3.9. From bdab0098e989e774e8d3826a238e1ad16feacde5 Mon Sep 17 00:00:00 2001 From: sujitnewrelic Date: Fri, 31 Jan 2025 20:11:48 +0530 Subject: [PATCH 66/67] minor change --- .../release-notes/docs-release-notes/docs-1-31-2025.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx index 8f33c9281cd..528da3eee84 100644 --- a/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx +++ b/src/content/docs/release-notes/docs-release-notes/docs-1-31-2025.mdx @@ -19,8 +19,8 @@ version: 'version: January 24-30, 2025' ### Minor change * Updated the supported Python versions. -* The attribute values specified in the [Okta user profile configuration](/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration/) are case-sensitive. -* [SCIM API user type](/docs/accounts/accounts/automated-user-management/tutorial-manage-users-groups-scim/#manage-user-type) values are case sensitive. +* The attribute values specified in the [Okta user profile configuration](/docs/accounts/accounts/automated-user-management/okta-scimsso-application-configuration/) are now case-sensitive. +* [SCIM API user type](/docs/accounts/accounts/automated-user-management/tutorial-manage-users-groups-scim/#manage-user-type) values are now case sensitive. * Updated the supported PHP agent versions. ### Release note @@ -61,4 +61,4 @@ Stay up-to-date on our most recent release: * Improved error messaging and Multiline filter. * Upgraded CTraces. * Calyptia output updates for Windows and agent registration. - * Fixed bugs. \ No newline at end of file + * Fixed bugs. From 836b4038d90bcf52c310fa6b8eb940120661729e Mon Sep 17 00:00:00 2001 From: Gaurab Manandhar Date: Fri, 31 Jan 2025 20:41:45 +0530 Subject: [PATCH 67/67] chore: update the frequency of release notes workflow to run 4 times a day --- .github/workflows/agent-release-notes.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/agent-release-notes.yml b/.github/workflows/agent-release-notes.yml index f3a0bbfbed6..37d616b89e4 100644 --- a/.github/workflows/agent-release-notes.yml +++ b/.github/workflows/agent-release-notes.yml @@ -3,7 +3,10 @@ name: Generate Agent Release Notes on: workflow_dispatch: schedule: - - cron: '0 2 * * *' # 7PM PDT + - cron: '0 0 * * *' # At 00:00 UTC + - cron: '0 6 * * *' # At 06:00 UTC + - cron: '0 12 * * *' # At 12:00 UTC + - cron: '0 18 * * *' # At 18:00 UTC jobs: generate-json: