מדידה וניפוי באגים של ביצועים באמצעות Google Analytics 4 ו-BigQuery

במאמר הזה מוסבר איך שולחים נתוני Web Vitals לנכסי Google Analytics 4 ומייצאים את הנתונים לניתוח ב-BigQuery וב-Looker Studio.

Google מספקת מספר כלים – חיפוש מסוף, PageSpeed תובנות (PSI), וגם חוויית המשתמש ב-Chrome דיווח (CrUX) – שמאפשרת למפתחים לראות את ביצועי האתרים שלהם ביחס לאתר הליבה מדדי תפקוד של המשתמשים האמיתיים ב .

הכלים האלה מצוינים כי הם מספקים לכם סקירה כללית של ביצועי האתר בקרב משתמשים אמיתיים, וממש אין צורך בהגדרות כלשהן כדי להתחיל להשתמש בהם.

עם זאת, יש כמה סיבות חשובות שבגללן לא כדאי להסתמך על כלים בלבד למדידת ביצועי האתר שלכם:

  • כלים מבוססי CrUX מדווחים על נתונים לפי תקופות חודשיות או 28 ימים קודמים. כלומר, צריך להמתין זמן רב לאחר ביצוע שינויים כדי שנוכל לראות את התוצאות.
  • אפשר לפלח כלים שמבוססים על CrUX רק לפי מספר מוגבל של מאפיינים, כמו מדינה, סוג חיבור וקטגוריית מכשיר (מחשב או נייד). אי אפשר לפלח את הנתונים לפי מאפיינים ספציפיים לעסק (לדוגמה: אינטראקציה ראשונית משתמשים, משתמשים בקבוצת ניסוי מסוימת וכו').
  • כלים מבוססי CrUX יכולים לומר לך מה הביצועים שלך, אבל הם לא יכולים לדעת למה. כלים לניתוח נתונים מאפשרים לכם לשלוח נתונים נוספים כדי לעזור לכם לעקוב אחר הנתונים ולנפות באגים.

לכן, אנחנו ממליצים לכל בעלי האתרים לעקוב אחרי המדדים של Core Web Vitals באמצעות הכלי הקיים שלהם לניתוח נתונים. בפוסט הזה מוסבר איך משתמשים בחינם כלים ש-Google מציעה כדי לעשות זאת.

אחרי שתסיימו את ההגדרה, תוכלו ליצור מרכזי בקרה כמו אלה:

צילום מסך של הדוח Web Vitals Connector

צילום מסך של הדוח Web Vitals Connector

אם אתם רוצים לקבל סקירה כללית ויזואלית של כל השלבים שמפורטים כאן, תוכלו לעיין בשיחה שלנו מ-Google I/O 2021:

מדידה

תמיד הייתה אפשרות למדוד ביצועים באמצעות Google Analytics באמצעות מדדים מותאמים אישית, הן כמה תכונות חדשות ב-Google Analytics 4 (GA4) שמפתחים במיוחד צריך להתרגש לקראתם.

אמנם ממשק האינטרנט של Google Analytics כולל כלי ניתוח רבי עוצמה, אך קשה לנצח את העוצמה והגמישות של גישה לנתוני אירועים גולמיים באמצעות שאילתה בשפה שכנראה אתם כבר מכירים.

כדי להתחיל למדוד את מדדי הליבה לבדיקת חוויית המשתמש באתר באמצעות Google Analytics 4 ו-BigQuery, תצטרכו לעשות שלושה דברים:

  1. יוצרים Google Analytics 4 נכס וגם פרויקט ב-BigQuery.
  2. הפעלת ייצוא ל-BigQuery בהגדרת הנכס של Google Analytics, כך שכל הנתונים שתקבלו יאוכלס באופן אוטומטי בטבלאות של פרויקט BigQuery.
  3. מוסיפים את קוד ה-JavaScript של web-vitals לספרייה באתר, כדי שתוכלו למדוד את מדדי הליבה לבדיקת חוויית המשתמש באתר לשלוח את הנתונים ל-Google Analytics 4, כולל נתוני השיוך (Attribution).

ניתוח

בסיום ההגדרה, נתוני האירועים יאוכלסו ב-BigQuery ואתם אמורים לבצע שאילתה על הנתונים באופן הבא:

SELECT * FROM `my_project_id.analytics_XXXXX.events_*`
WHERE event_name IN ('LCP', 'INP', 'CLS')

לפניכם תצוגה מקדימה של התוצאות שהתקבלו מהשאילתה:

נתוני אירועים של Web Vitals ב-BigQuery

שליחת שאילתות על הנתונים של מדדי Web Vitals

לפני שמתחילים להריץ שאילתות על נתוני האירועים ב-Web Vitals, חשוב להבין איך הנתונים נצברים.

הדבר שהכי חשוב להבין הוא, שבמקרים מסוימים, מספר אירועים יכול להיות התקבלו לגבי אותו מדד, באותו דף. מצב כזה יכול לקרות אם ערך המדד שידווחו על שינויים וערך מעודכן (אירוע נפוץ ב-CLS).

לגבי אירועים של Web Vitals, הערך האחרון שנשלח הוא תמיד המדויק ביותר. לכן לפני שמבצעים ניתוח כלשהו, חשוב לסנן לפי הערכים האלה בלבד. קטע הקוד שסופק על ידי ספריית ה-JavaScript של Web-vitals כדי לשלוח נתונים אל מערכת Google Analytics 4 כוללת שליחת מזהה ייחודי לכל מדד, כך שאפשר להשתמש את השאילתה הבאה כדי להגביל את התוצאות רק לערך האחרון שהתקבל מזהה מדד:

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)

כל השאילתות האחרות שיש להן הפניה בפוסט הזה יתחילו כך של שאילתת משנה.

שאילתות לדוגמה

בחלקים הבאים מוצגות כמה דוגמאות לשאילתות נפוצות של מדדי Web Vitals שרוצים להציג.

LCP, INP ו-CLS באחוזון 75% (p75) ברחבי האתר

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  metric_name,
  APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS p75,
  COUNT(1) as count
FROM (
  SELECT
    metric_name,
    ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
  FROM web_vitals_events
)
GROUP BY 1

כל ערכי ה-LCP הנפרדים מהגבוה לנמוך

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
FROM web_vitals_events
WHERE metric_name = 'LCP'
ORDER BY metric_value DESC
# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  page_path,
  APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS LCP,
  COUNT(1) as count
FROM (
  SELECT
    REGEXP_SUBSTR((SELECT value.string_value FROM UNNEST(event_params) WHERE key = "page_location"), r'\.com(\/[^?]*)') AS page_path,
    ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
  FROM web_vitals_events
  WHERE metric_name = 'LCP'
)
GROUP BY 1
ORDER BY count DESC
LIMIT 10

10 הדפים המובילים עם ה-CLS הגרוע ביותר (p75)

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  page_path,
  APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS CLS,
  COUNT(1) as count
FROM (
  SELECT
    REGEXP_SUBSTR((SELECT value.string_value FROM UNNEST(event_params) WHERE key = "page_location"), r'\.com(\/[^?]*)') AS page_path,
    ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
  FROM web_vitals_events
  WHERE metric_name = 'CLS'
)
GROUP BY 1
HAVING count > 50 # Limit to relatively popular pages
ORDER BY CLS DESC
LIMIT 10

ניפוי באגים

השאילתות הקודמות מראות איך אפשר להריץ שאילתות על נתוני המדד Web Vitals, שיעזרו לכם לבצע שאילתות כדי להבין את הביצועים הנוכחיים ואת המגמות שלהם לאורך זמן. אבל מה אפשר לעשות אם הביצועים נמוכים מהצפוי, אבל לא ידוע לך בוודאות למה?

אם אין אפשרות לנקוט פעולה, לא חשוב לדעת מה הציונים שלכם. ולתקן את הבעיות.

במאמר ניפוי באגים בביצועים בשדה מוסבר איך אפשר לשלוח מידע נוסף על תוצאות ניפוי הבאגים עם נתוני הניתוח. אם בצעו את ההוראות שמפורטות בפוסט הזה, אתם אמורים לראות מידע יופיע גם ב-BigQuery.

שאילתות לדוגמה

השאילתות הבאות מדגימות איך אפשר להשתמש בפרמטר האירוע debug_target כדי לזהות את שורש הבעיות בביצועים.

הרכיבים המובילים שתורמים ל-CLS

debug_target היא מחרוזת סלקטור ב-CSS שתואמת לרכיב ב- הדף הרלוונטי ביותר לערך המדד.

עם CLS, debug_target מייצג את הרכיב הגדול ביותר מהגדול ביותר שינוי הפריסה שתרמה לערך ה-CLS. אם לא השתנה רכיבים כלשהם, הערך של debug_target יהיה null.

בשאילתה הבאה יופיעו דפים מהגרוע ביותר לטוב ביותר לפי ה-CLS שלהם ב-75 אחוזון, מקובצים לפי debug_target:

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  page_path,
  debug_target,
  APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS CLS,
  COUNT(1) as count
FROM (
  SELECT
    REGEXP_SUBSTR((SELECT value.string_value FROM UNNEST(event_params) WHERE key = "page_location"), r'\.com(\/[^?]*)') AS page_path,
    (SELECT value.string_value FROM UNNEST(event_params) WHERE key = "debug_target") as debug_target,
    ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
    *
  FROM web_vitals_events
  WHERE metric_name = 'CLS'
)
GROUP BY 1, 2
HAVING count > 50 # Limit to relatively popular pages
ORDER BY CLS DESC

תוצאת שאילתה לגבי הרכיבים המובילים שתרמו ל-CLS

הידיעה אילו רכיבים בדף משתנים כדי להקל על ביצוע לזהות את שורש הבעיה ולתקן אותה.

חשוב לזכור: ייתכן שהרכיבים שמדווחים כאן אינם זהים רואים משתנים בניפוי באגים בדפים באופן מקומי, וזו הסיבה לכך חשוב לתעד את הנתונים האלה מלכתחילה. קשה מאוד לתקן דברים שאתם לא מבינים שהן בעיות!

ניפוי באגים במדדים אחרים

השאילתה הקודמת מציגה את התוצאות של מדד CLS, אבל בדיוק אותן תוצאות יכולה לשמש לדיווח על יעדי ניפוי הבאגים עבור LCP ו-INP. יישור מחליפים את הסעיף שבו צריך לעמוד במדד הרלוונטי לניפוי באגים:

WHERE metric_name = 'INP'
WHERE metric_name = 'LCP'

שוב, אפשר לעיין בקטע ביצועי ניפוי באגים לקבלת הוראות לאיסוף לשלוח מידע על תוצאות ניפוי הבאגים בכל אחד ממדדי הליבה לבדיקת חוויית המשתמש באתר.

הצג

לפעמים קשה לקבל תובנות רק על ידי עיון בתוצאות השאילתה. בלבד. לדוגמה, השאילתה הבאה מפרטת ערכים יומיים של האחוזון ה-75 LCP במערך הנתונים.

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  event_date,
  metric_name,
  APPROX_QUANTILES(ROUND(metric_value, 2), 100)[OFFSET(75)] AS p75
FROM
  (
    SELECT
      event_date,
      metric_name,
      ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value'), 3) AS metric_value
    FROM web_vitals_events
    WHERE
      metric_name = 'LCP'
  )
GROUP BY
  1, 2
ORDER BY event_date

על סמך תוצאות השאילתה האלה, קשה לזהות מגמות או חריגים יוצאי דופן רק על סמך הנתונים.

תוצאות של שאילתות לגבי ערך המדד היומי

במקרים כאלה, הצגה חזותית של הנתונים יכולה לעזור לכם להפיק תובנות מהר יותר.

המחשה חזותית של תוצאות שאילתות ב-Looker Studio

ב-BigQuery אפשר לראות במהירות תוצאות של שאילתות בעזרת נתונים אולפן. Looker Studio הוא תצוגה חזותית של נתונים וכלי למרכז השליטה שניתנים לשימוש בחינם. כדי להמחיש את תוצאות השאילתה, אחרי שמריצים את השאילתה בממשק המשתמש של BigQuery, לוחצים על הלחצן Explore Data (עיון בנתונים) בוחרים באפשרות Explore with Looker Studio.

בדיקה באמצעות האפשרות של Looker Studio ב-BigQuery

הפעולה הזו תיצור קישור ישיר מ-BigQuery ל-Looker Studio בכלי הניתוחים צפייה. בתצוגה הזו אפשר לבחור את השדות שרוצים להציג, לבחור סוגי תרשימים, הגדרת מסננים ויצירת תרשימים אד-הוק לניתוח חזותי מהיר. מתוצאות השאילתה הקודמת, ניתן ליצור את תרשים הקו הזה כדי לראות את המגמה של ערכי LCP לאורך זמן:

תרשים קו של ערכי LCP יומיים ב-Looker Studio

בעזרת הקישור הישיר הזה בין BigQuery ל-Looker Studio, אפשר ליצור תרשימים מכל אחת מהשאילתות שלכם ולנתח באופן חזותי. אבל אם רוצים כדי לבצע ניתוח נוסף, אפשר לעיין בכמה תרשימים מרכז בקרה אינטראקטיבי כדי לקבל תצוגה מקיפה יותר או להציג פירוט לנתונים. אם יש מרכז בקרה מועיל, לא צריך לכתוב שאילתות וליצור תרשימים באופן ידני בכל פעם שרוצים לנתח את המדדים.

אפשר ליצור מרכז בקרה ב-Looker Studio באמצעות הממשק המקורי של BigQuery . כדי לעשות את זה, עוברים אל datastudio.google.com, יצירת מקור נתונים, בוחרים את מחבר BigQuery ובוחרים את מערך הנתונים שרוצים לעבוד עם:

שימוש במחבר המקורי של BigQuery ב-Looker Studio

יצירת גרסה מהותית של נתונים בדוח ה-Web Vitals

כשיוצרים לוחות בקרה של נתוני האירועים ב-Web Vitals כפי שתואר קודם, חשוב ולכן אי אפשר להשתמש ישירות במערך הנתונים לייצוא של Google Analytics 4. בעקבות המבנה של נתוני GA4 והעיבוד מראש שנדרש כדי לבצע את דוח ה-Web Vitals מסוימים, חלקים מהשאילתה שלך יפעלו כמה פעמים. הפעולה הזו יוצרת שתי בעיות: ביצועים של לוחות הבקרה ועלויות ב-BigQuery.

אפשר להשתמש בארגז החול של BigQuery. ללא תשלום. עם free usagetier, בכל חודש מקבלים בחינם 1TB לעיבוד נתוני שאילתות, ומתחילים לשלם אחרי שהנפח הזה מנוצל. לשיטות הניתוח כמו שהסברנו כאן, אלא אם אתם משתמשים במערך נתונים גדול משמעותית מריצים שאילתות רבות על מערך הנתונים באופן קבוע, במגבלה הזו בחינם בכל חודש. אבל אם יש לכם אתר עם נפח תנועה גבוה ואתם רוצים עוקבים בקביעות אחרי מדדים שונים באמצעות מרכז בקרה אינטראקטיבי מהיר, להציע עיבוד מראש וניצול של נתוני תפקוד האפליקציה, תוך שימוש תכונות יעילות של BigQuery כמו חלוקה למחיצות (partitioning), קיבוץ לאשכולות (clustering) ושמירה במטמון.

הסקריפט הבא יעבד מראש את הנתונים שלכם ב-BigQuery (טבלת המקור) ליצור טבלה מהותית (טבלת יעד). כשמשתמשים בשאילתה הזו לבד יכול להיות שתרצו גם להגדיר טווח תאריכים לטבלת המקור להקטין את כמות הנתונים שמעובדים.

# Materialize Web Vitals metrics from GA4 event export data

# Replace target table name
CREATE OR REPLACE TABLE bigquery_project_id.ga4_demo_dev.web_vitals_summary
  PARTITION BY DATE(event_timestamp)
  CLUSTER BY metric_name
AS
SELECT
  ga_session_id,
  IF(
    EXISTS(SELECT 1 FROM UNNEST(events) AS e WHERE e.event_name = 'first_visit'),
    'New user',
    'Returning user') AS user_type,
  IF(
    (SELECT MAX(session_engaged) FROM UNNEST(events)) > 0, 'Engaged', 'Not engaged')
    AS session_engagement,
  evt.* EXCEPT (session_engaged, event_name),
  event_name AS metric_name,
  FORMAT_TIMESTAMP('%Y%m%d', event_timestamp) AS event_date
FROM
  (
    SELECT
      ga_session_id,
      ARRAY_AGG(custom_event) AS events
    FROM
      (
        SELECT
          ga_session_id,
          STRUCT(
            country,
            device_category,
            device_os,
            traffic_medium,
            traffic_name,
            traffic_source,
            page_path,
            debug_target,
            event_timestamp,
            event_name,
            metric_id,
            IF(event_name = 'LCP', metric_value / 1000, metric_value) AS metric_value,
            user_pseudo_id,
            session_engaged,
            session_revenue) AS custom_event
        FROM
          (
            SELECT
              (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id')
                AS ga_session_id,
              (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
                AS metric_id,
              ANY_VALUE(device.category) AS device_category,
              ANY_VALUE(device.operating_system) AS device_os,
              ANY_VALUE(traffic_source.medium) AS traffic_medium,
              ANY_VALUE(traffic_source.name) AS traffic_name,
              ANY_VALUE(traffic_source.source) AS traffic_source,
              ANY_VALUE(
                REGEXP_SUBSTR(
                  (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'),
                  r'^[^?]+')) AS page_path,
              ANY_VALUE(
                (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'debug_target'))
                AS debug_target,
              ANY_VALUE(user_pseudo_id) AS user_pseudo_id,
              ANY_VALUE(geo.country) AS country,
              ANY_VALUE(event_name) AS event_name,
              SUM(ecommerce.purchase_revenue) AS session_revenue,
              MAX(
                (
                  SELECT
                    COALESCE(
                      value.double_value, value.int_value, CAST(value.string_value AS NUMERIC))
                  FROM UNNEST(event_params)
                  WHERE key = 'session_engaged'
                )) AS session_engaged,
              TIMESTAMP_MICROS(MAX(event_timestamp)) AS event_timestamp,
              MAX(
                (
                  SELECT COALESCE(value.double_value, value.int_value)
                  FROM UNNEST(event_params)
                  WHERE key = 'metric_value'
                )) AS metric_value,
            FROM
              # Replace source table name
              `bigquery_project_id.analytics_XXXXX.events_*`
            WHERE
              event_name IN ('LCP', 'INP', 'CLS', 'first_visit', 'purchase')
            GROUP BY
              1, 2
          )
      )
    WHERE
      ga_session_id IS NOT NULL
    GROUP BY ga_session_id
  )
CROSS JOIN UNNEST(events) AS evt
WHERE evt.event_name NOT IN ('first_visit', 'purchase');

למערך הנתונים המהותי הזה יש מספר יתרונות:

  • מבנה הנתונים שטוח יותר וקל יותר להריץ שאילתות.
  • היא שומרת רק את אירועי Web Vitals ממערך הנתונים המקורי של GA4.
  • מזהה סשן, סוג משתמש (חדש לעומת חוזר) ומידע על ההתעניינות בסשן זמינה ישירות בעמודות.
  • הטבלה היא חלוקה למחיצות לפי תאריך ואשכולות לפי שם המדד. בדרך כלל הפעולה הזו מפחיתה את כמות הנתונים שמעובדים לכל אחד מהם שאילתה.
  • מכיוון שאין צורך להשתמש בתווים כלליים לחיפוש כדי לשלוח שאילתה על הטבלה הזו, תוצאות השאילתה יכולות נשמרים במטמון למשך עד 24 שעות. כך תוכלו להפחית את העלויות עקב חזרה על אותן הפעולות שאילתה.
  • אם אתם משתמשים במנוע ה-BI של BigQuery, אתם יכולים להריץ פונקציות SQL שעברו אופטימיזציה אופרטורים בנושא הזה טבלה.

אפשר לשלוח שאילתות ישירות על הטבלה מהותית מתוך ממשק המשתמש של BigQuery או להשתמש בה ב-Looker Studio באמצעות המחבר של BigQuery.

איך משתמשים במחבר Web Vitals

מאחר שיצירת מרכז בקרה מאפס גוזלת זמן רב, פיתחנו שייצור עבורך תבנית לוח בקרה. קודם כל, צריך לוודא מציגים את הטבלה של Web Vitals בהתאם לשאילתה הקודמת. לאחר מכן ניגשים אל מחבר Web Vitals ל-Looker Studio דרך הקישור הזה: goo.gle/web-vitals-connector

אחרי מתן הרשאה חד-פעמית, אתם אמורים לראות את הפרטים הבאים מסך ההגדרות האישיות:

מסך האישור של מחבר Web Vitals

מספקים את מזהה הטבלה המהותית ב-BigQuery (כלומר טבלת היעד) ואת מזהה הפרויקט לחיוב ב-BigQuery. אחרי שלוחצים על ההתחברות, ב-Looker Studio ייווצר לוח בקרה חדש בתבנית ולשייך אליו את הנתונים. אפשר לערוך, לשנות ולשתף את מרכז הבקרה איך שאתם רוצים. אם יוצרים מרכז בקרה פעם אחת, צריך להיכנס שוב לקישור המחבר, אלא אם רוצים ליצור ממערכי נתונים שונים.

בזמן הניווט במרכז הבקרה, אפשר לראות את המגמות היומיות של דוח ה-Web Vitals מדדי שימוש מסוימים ומידע על השימוש באתר שלכם, כמו משתמשים וסשנים, הכרטיסייה סיכום.

בכרטיסייה ניתוח משתמשים, אתם יכולים לבחור מדד ולקבל פירוט של באחוזון המדדים ובמספר המשתמשים לפי שימוש ועסקים שונים מדדים.

הכרטיסייה ניתוח מסלולי דפים תעזור לך לזהות אזורים בעייתיים האתר. כאן אפשר לבחור מדד כדי לראות את הסקירה הכללית. אבל אפשר גם לראות פיזור מפה של כל נתיבי הדפים עם ערך האחוזון על ציר ה-y ורשומה על ציר ה-X. מפת הפיזור יכולה לעזור בזיהוי דפים עם שיעור קליקים נמוך יותר מערכי המדדים הצפויים. לאחר בחירת הדפים באמצעות הפיזור של הטבלה נתיב הדף, אפשר להציג פירוט נוסף של אזור הבעיה לפי מציגים את הטבלה יעד ניפוי באגים.

בכרטיסייה ניתוח הכנסות אפשר לראות דוגמה למעקב אחר העסק שלכם. ומדדי הביצועים במקום אחד. בקטע הזה מוצגים כל הסשנים שבהם המשתמש ביצע רכישה. אפשר להשוות בין ההכנסה שמתקבלת לבין חוויית המשתמש במהלך פעילות ספציפית באתר .

שימוש מתקדם

ככל שתכירו יותר את מערך הנתונים, תוכלו לערוך את מרכז הבקרה ולהוסיף כדי לנתח תרשימים עשירים יותר ומטורגטים, כדי לשפר את מרכז הבקרה מומלץ לבצע את השלבים הבאים:

  • צריך להגדיר שאילתה מתוזמנת ב-BigQuery כדי לקבל נתונים מעודכנים. מהותיות שהפעלנו קודם לכן, היא רק תמונת מצב של הנתונים שלכם באותו רגע. אם אם רוצים לעדכן את מרכז הבקרה בנתונים חדשים, אפשר להפעיל שתפעל כל יום ותצרף את הטבלה מהותית .
  • מצטרפים לנתונים מאינטראקציה ישירה (First-Party) (למשל, ניהול קשרי לקוחות (CRM)) כדי לקבל תובנות עסקיות. במודל המהותי טבלה, אפשר להוסיף את user_id כעמודה נפרדת. כך תהיה לך אפשרות להצטרף אל נתונים מאינטראקציה ישירה (First-Party). אם הנתונים מאינטראקציה ישירה (First-Party) עדיין לא נמצאים ב-BigQuery, אתם יכולים לטעון את הנתונים או להשתמש בנתונים מאוחדים source.
  • דיווח על גרסת האתר או האפליקציה כפרמטר בנתונים שאתם שולחים ל-Google ב-Analytics ולהוסיף אותו כעמודה בטבלה המוצגת. לאחר מכן תוכלו להוסיף את נתוני הגרסאות כמאפיין בתרשימים, כדי שתוכלו לראות אותם בקלות שינויים בגרסה משפיעים על הביצועים.
  • אם אתם מצפים לשימוש משמעותי במערך הנתונים באמצעות או את מרכז הבקרה, אפשר לנסות להשתמש בגרסה בתשלום של BigQuery BI מנוע.

סיכום

הפוסט הזה עוסק בעקרונות הבסיסיים של השימוש ב-Google Analytics 4 וב-BigQuery כדי למדוד ביצועים ולנפות באגים באמצעות נתונים של משתמשים אמיתיים שנאספים בשטח. הוא להסביר גם איך ליצור דוחות ומרכזי בקרה אוטומטיים באמצעות Looker Studio. ואת מחבר Web Vitals כדי להציג את הנתונים בקלות רבה ככל האפשר.

נקודות עיקריות לגבי הפוסט הזה:

  • כדי להבין את זה חשוב מאוד למדוד ביצועים באמצעות נתוני משתמשים אמיתיים. לנפות באגים ואופטימיזציה של האתר.
  • איך לקבל תובנות מעמיקות יותר כשמדדי הביצועים והעסק והמדדים נמצאים באותה מערכת. Google Analytics ו-BigQuery גורמים לכך ככל האפשר.
  • ייצוא של נתונים גולמיים מ-Google Analytics ל-BigQuery נותן לך פוטנציאל בלתי מוגבל ניתוח מעמיק ומותאם אישית באמצעות שפת שאילתות שסביר להניח שאתם כבר מכירים.
  • ל-Google יש כמה ממשקי API וכלים להמחשה חזותית, כמו Looker Studio, החופש ליצור דוחות בדיוק כמו שאתם רוצים של BERT.