本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
教學︰使用 Evidently 範例應用程式進行 A/B 測試
重要
支援終止通知:2025 年 10 月 16 日, AWS 將停止對 CloudWatch Evidently 的支援。2025 年 10 月 16 日之後,您將無法再存取 Evidently 主控台或 Evidently 資源。
本節提供使用 Amazon CloudWatch Evidently 進行 A/B 測試的教學課程。本教學將介紹 Evidently 範例應用程式,這是一個簡單的回應應用程式。範例應用程式將設定為顯示或不顯示 showDiscount 功能。若是對使用者顯示功能,在購物網站上顯示的價格會以 20% 的折扣顯示。
除了對某些使用者顯示折扣,對其他使用者則不顯示,在本教學中,您可以設定 Evidently 從這兩個變體中收集頁面載入時間指標。
警告
此案例需要具有程式設計存取和長期登入資料的 IAM 使用者,這會造成安全風險。為了協助降低此風險,建議您只為這些使用者提供執行任務所需的許可,並在不再需要這些使用者時將其移除。如有必要,可以更新存取金鑰。如需詳細資訊,請參閱《IAM 使用者指南》中的更新存取金鑰。
步驟 1:下載範例應用程式
首先下載 Evidently 範例應用程式。
下載範例應用程式
從以下 Simple Storage Service (Amazon S3) 儲存貯體下載範例應用程式︰
https://evidently-sample-application.s3.us-west-2.amazonaws.com/evidently-sample-shopping-app.zip解壓縮套件。
步驟 2:新增 Evidently 端點並設定憑證
接著,將 Evidently 的區域和端點新增至範例應用程式套件中 src 目錄的 config.js 檔案,如以下範例所示:
evidently: { REGION: "us-west-2", ENDPOINT: "https://evidently.us-west-2.amazonaws.com (https://evidently.us-west-2.amazonaws.com/)", },
此外,您還必須確保應用程式具有呼叫 CloudWatch Evidently 的許可。
授予範例應用程式呼叫 Evidently 的許可
聯合到您的 AWS 帳戶。
建立 IAM 使用者並將 AmazonCloudWatchEvidentlyFullAccess 政策連接至此使用者。
請記下 IAM 使用者的存取金鑰 ID 和私密存取金鑰,因為下一個步驟您會需要它們。
在之前於本節中修改的同一個
config.js檔案中,輸入存取金鑰 ID 和機密存取金鑰的值,如以下範例所示:credential: { accessKeyId: "Access key ID", secretAccessKey: "Secret key" }重要
我們使用此步驟讓範例應用程式儘可能簡單,以便您嘗試。不建議您將 IAM 使用者憑證置於實際的生產應用程式。建議您改為使用 Amazon Cognito 進行身分驗證。如需詳細資訊,請參閱將 Amazon Cognito 與 Web 和行動應用程式整合。
步驟 3:設定功能評估的程式碼
使用 CloudWatch Evidently 評估功能時,您必須使用 EvaluateFeature 操作,以隨機選取每個使用者工作階段的功能變化。此操作會根據您在實驗中指定的百分比,將使用者工作階段指派給功能的每個變化。
設定書店示範應用程式的功能評估程式碼
將用戶端建置器新增至
src/App.jsx檔案,以便範例應用程式呼叫 Evidently。import Evidently from 'aws-sdk/clients/evidently'; import config from './config'; const defaultClientBuilder = ( endpoint, region, ) => { const credentials = { accessKeyId: config.credential.accessKeyId, secretAccessKey: config.credential.secretAccessKey } return new Evidently({ endpoint, region, credentials, }); };將以下項目新增至
const App程式碼區段以啟動用戶端。if (client == null) { client = defaultClientBuilder( config.evidently.ENDPOINT, config.evidently.REGION, );透過新增以下程式碼建構
evaluateFeatureRequest。此程式碼會預先填寫我們在本教學後面推薦的專案名稱和功能名稱。只要您還在 Evidently 主控台中指定這些專案和功能名稱,則可以替換自己的專案名稱和功能名稱。const evaluateFeatureRequest = { entityId: id, // Input Your feature name feature: 'showDiscount', // Input Your project name' project: 'EvidentlySampleApp', };新增可呼叫 Evidently 進行進行功能評估的程式碼。傳送請求時,Evidently 會隨機指派使用者工作階段是否查看
showDiscount功能。client.evaluateFeature(evaluateFeatureRequest).promise().then(res => { if(res.value?.boolValue !== undefined) { setShowDiscount(res.value.boolValue); } getPageLoadTime() })
步驟 4:設定實驗指標的程式碼
對於自訂指標,請使用 Evidently 的 PutProjectEvents API 將指標結果傳送至 Evidently。下方範例會介紹如何設定自訂指標,以及如何將實驗資料傳送到 Evidently。
新增以下函數來計算頁面載入時間並使用 PutProjectEvents 將指標值傳送到 Evidently。將下面的函數新增至 Home.tsx,並在 EvaluateFeature API 內呼叫此函數:
const getPageLoadTime = () => { const timeSpent = (new Date().getTime() - startTime.getTime()) * 1.000001; const pageLoadTimeData = `{ "details": { "pageLoadTime": ${timeSpent} }, "UserDetails": { "userId": "${id}", "sessionId": "${id}"} }`; const putProjectEventsRequest = { project: 'EvidentlySampleApp', events: [ { timestamp: new Date(), type: 'aws.evidently.custom', data: JSON.parse(pageLoadTimeData) }, ], }; client.putProjectEvents(putProjectEventsRequest).promise(); }
以下是您下載檔案時完成所有編輯後的 App.js 檔案狀態。
import React, { useEffect, useState } from "react"; import { BrowserRouter as Router, Switch } from "react-router-dom"; import AuthProvider from "contexts/auth"; import CommonProvider from "contexts/common"; import ProductsProvider from "contexts/products"; import CartProvider from "contexts/cart"; import CheckoutProvider from "contexts/checkout"; import RouteWrapper from "layouts/RouteWrapper"; import AuthLayout from "layouts/AuthLayout"; import CommonLayout from "layouts/CommonLayout"; import AuthPage from "pages/auth"; import HomePage from "pages/home"; import CheckoutPage from "pages/checkout"; import "assets/scss/style.scss"; import { Spinner } from 'react-bootstrap'; import Evidently from 'aws-sdk/clients/evidently'; import config from './config'; const defaultClientBuilder = ( endpoint, region, ) => { const credentials = { accessKeyId: config.credential.accessKeyId, secretAccessKey: config.credential.secretAccessKey } return new Evidently({ endpoint, region, credentials, }); }; const App = () => { const [isLoading, setIsLoading] = useState(true); const [startTime, setStartTime] = useState(new Date()); const [showDiscount, setShowDiscount] = useState(false); let client = null; let id = null; useEffect(() => { id = new Date().getTime().toString(); setStartTime(new Date()); if (client == null) { client = defaultClientBuilder( config.evidently.ENDPOINT, config.evidently.REGION, ); } const evaluateFeatureRequest = { entityId: id, // Input Your feature name feature: 'showDiscount', // Input Your project name' project: 'EvidentlySampleApp', }; // Launch client.evaluateFeature(evaluateFeatureRequest).promise().then(res => { if(res.value?.boolValue !== undefined) { setShowDiscount(res.value.boolValue); } }); // Experiment client.evaluateFeature(evaluateFeatureRequest).promise().then(res => { if(res.value?.boolValue !== undefined) { setShowDiscount(res.value.boolValue); } getPageLoadTime() }) setIsLoading(false); },[]); const getPageLoadTime = () => { const timeSpent = (new Date().getTime() - startTime.getTime()) * 1.000001; const pageLoadTimeData = `{ "details": { "pageLoadTime": ${timeSpent} }, "UserDetails": { "userId": "${id}", "sessionId": "${id}"} }`; const putProjectEventsRequest = { project: 'EvidentlySampleApp', events: [ { timestamp: new Date(), type: 'aws.evidently.custom', data: JSON.parse(pageLoadTimeData) }, ], }; client.putProjectEvents(putProjectEventsRequest).promise(); } return ( !isLoading? ( <AuthProvider> <CommonProvider> <ProductsProvider> <CartProvider> <CheckoutProvider> <Router> <Switch> <RouteWrapper path="/" exact component={() => <HomePage showDiscount={showDiscount}/>} layout={CommonLayout} /> <RouteWrapper path="/checkout" component={CheckoutPage} layout={CommonLayout} /> <RouteWrapper path="/auth" component={AuthPage} layout={AuthLayout} /> </Switch> </Router> </CheckoutProvider> </CartProvider> </ProductsProvider> </CommonProvider> </AuthProvider> ) : ( <Spinner animation="border" /> ) ); }; export default App;
每當使用者存取範例應用程式時,自訂指標會傳送至 Evidently 進行分析。Evidently 會分析每個指標,並在 Evidently 儀表板上即時顯示結果。以下範例顯示了指標酬載:
[ {"timestamp": 1637368646.468, "type": "aws.evidently.custom", "data": "{\"details\":{\"pageLoadTime\":2058.002058},\"userDetails\":{\"userId\":\"1637368644430\",\"sessionId\":\"1637368644430\"}}" } ]
步驟 5:建立專案、功能和實驗
接下來,您可以在 CloudWatch Evidently 主控台中建立專案、功能和實驗。
為此教學課程建立專案、功能和實驗
透過 https://console.aws.amazon.com/cloudwatch/
開啟 CloudWatch 主控台。 在導覽窗格中,選擇 Application Signals, Evidently。
選擇 Create project (建立專案) 並填寫欄位。您必須使用
EvidentlySampleApp,以使範例的專案名稱正常工作。針對評估事件儲存,選擇不存放評估事件。填寫完欄位後,選擇 Create Project (建立專案)。
如需詳細資訊,請參閱建立新專案。
專案建立之後,在該專案中建立功能。命名功能
showDiscount。在此功能中,建立Boolean類型的兩個變化。命名具有False值的第一個變化disable並命名第二個具有True值的第二個變化enable。如需建立功能的詳細資訊,請參閱 將功能新增至專案。
完成建立功能後,請在專案中建立實驗。命名實驗
pageLoadTime。此實驗將使用稱為
pageLoadTime的自訂指標,測量正在測試之頁面的頁面載入時間。實驗的自訂指標使用 Amazon EventBridge 建立。如需 EventBridge 的詳細資訊,請參閱什麼是 Amazon EventBridge?若要建立該自訂指標,請在建立實驗時執行下列動作:
在 Metrics (指標) 下,對於 Metric source (指標來源),選擇 Custom metrics (自訂指標)。
對於 Metric name (指標名稱),輸入
pageLoadTime。對於 Goal (目標),選擇 Decrease (降低)。這表示我們想要以此指標的較低值來表示功能的最佳變化。
對於 Metric rule (指標規則),輸入下列內容:
針對 Entity ID (實體 ID),輸入
UserDetails.userId。對於 Value key (值索引鍵),輸入
details.pageLoadTime。對於 Unit (單位),輸入
ms。
選擇 Add metric (新增指標)。
對於 Audiences (受眾),選取 100%,以便將所有使用者輸入實驗中。將變化之間的流量分割設定為每個 50%。
之後,請選擇 Create experiment (建立實驗) 來建立實驗。建立後,在您讓 Evidently 啟動前,它不會啟動。
步驟 6:開始實驗並測試 CloudWatch Evidently
最後的步驟是開始實驗並啟動範例應用程式。
開始教學課程實驗
透過 https://console.aws.amazon.com/cloudwatch/
開啟 CloudWatch 主控台。 在導覽窗格中,選擇 Application Signals, Evidently。
選擇 EvidentlySampleApp 專案。
選擇 Experiments (實驗) 索引標籤。
選擇 pageLoadTime 旁的按鈕,然後選擇 Actions (動作)、Start experiment (開始實驗)。
選擇實驗結束的時間。
選擇 Start experiment (開始實驗)。
實驗會即刻開始。
接著,使用以下命令啟動 Evidently 範例應用程式:
npm install -f && npm start
應用程式啟動之後,系統會將您指派給正在測試的兩個功能變體之一。一個變體顯示「20% 的折扣」,另一個則不顯示。繼續重新整理頁面以查看不同的變體。
注意
Evidently 具有黏性評估。功能評估是確定性的,意味著針對相同的 entityId 和功能,使用者將始終收到相同的變體指派。變體指派變更僅發生在將實體新增至撥號的覆寫或實驗流量時。
但是,為了讓您輕鬆使用範例應用程式教學,Evidently 每次在您重新整理頁面時,都會重新指派範例應用程式功能評估,以便您可以體驗這兩種變體,而無需新增覆寫。
疑難排解
我們建議您使用 npm 6.14.14 版。如果您看到有關建置或啟動範例應用程式的任何錯誤,並且您使用不同版本的 npm,請執行以下操作。
安裝 npm 6.14.14 版
下載 node-v14.17.5.pkg
並執行此 pkg 來安裝 npm。 如果您看到
webpack not found錯誤,請導覽至evidently-sample-shopping-app資料夾並嘗試以下操作:刪除
package-lock.json刪除
yarn-lock.json刪除
node_modules從
package.json刪除 Webpack 相依項執行下列命令:
npm install -f && npm