قياس الأداء وتصحيح الأخطاء فيه باستخدام "إحصاءات Google 4" وBigQuery

تعرَّف على كيفية إرسال بيانات "مؤشرات أداء الويب" إلى مواقع "إحصاءات Google 4" وتصدير البيانات لتحليلها في BigQuery وLooker Studio.

توفّر Google عددًا من الأدوات، مثل Search Console (وحدة تحكّم محرّك بحث Google) وإحصاءات PageSpeed (PSI) وتقرير تجربة المستخدم في Chrome (CrUX)، والتي تتيح للمطوّرين معرفة مستوى أداء مواقعهم الإلكترونية وفقًا لمقاييس مؤشرات أداء الويب الأساسية للمستخدمين الفعليين في أماكن إقامتهم.

تُعدّ هذه الأدوات رائعة من حيث أنّها تمنحك نظرة عامة على أداء المستخدمين الفعلي لموقعك الإلكتروني، ولا تتطلّب أي إعدادات على الإطلاق لبدء استخدامها.

ومع ذلك، هناك بعض الأسباب المهمة التي تجعلك لا تعتمد على هذه الأدوات وحدها لقياس أداء موقعك الإلكتروني:

  • تُبلغ الأدوات المستندة إلى CrUX عن البيانات إما على أساس شهري أو على أساس الفترات السابقة التي تبلغ 28 يومًا. ويعني ذلك أنك ستضطر إلى الانتظار لفترة طويلة بعد إجراء أي تغييرات قبل أن تتمكن من رؤية النتائج.
  • لا يمكن تقسيم الأدوات المستندة إلى CrUX إلا بعدد محدود من السمات، مثل البلد ونوع الاتصال وفئة الجهاز (كمبيوتر مكتبي أو جهاز جوّال). لا يمكنك تقسيم البيانات حسب سمات خاصة بنشاطك التجاري (على سبيل المثال: المستخدِمون المتفاعلون أو المستخدِمون في مجموعة تجربة معيّنة وما إلى ذلك).
  • يمكن للأدوات المستندة إلى CrUX أن تُطلعك على مستوى أدائك، ولكن لا يمكنها إعلامك بالأسباب. باستخدام أدوات الإحصاءات، يمكنك إرسال بيانات إضافية لمساعدتك في تتبُّع المشاكل وتصحيحها.

لهذه الأسباب، ننصح جميع مالكي المواقع الإلكترونية بمراقبة مقاييس "مؤشرات أداء الويب الأساسية" باستخدام أداة الإحصاءات الحالية. توضّح هذه المشاركة كيفية استخدام الأدوات المجانية التي تقدّمها Google لإجراء ذلك.

بعد الانتهاء من إعداد كل شيء، ستتمكّن من إنشاء لوحات بيانات مثل هذه:

لقطة شاشة لتقرير Web Vitals Connector

لقطة شاشة لتقرير "أداة ربط مؤشرات أداء الويب"

للحصول على نظرة عامة مرئية على جميع الخطوات الموضّحة هنا، يمكنك الاطّلاع على محادثتنا من Google I/O لعام 2021:

القياس

كان من الممكن دائمًا قياس الأداء باستخدام "إحصاءات Google" باستخدام المقاييس المخصّصة، ولكن هناك بعض الميزات الجديدة في إحصاءات Google 4 (GA4) التي يجب أن يطّلع عليها المطوّرون بشكل خاص.

  • مَعلمات الأحداث المخصّصة بدون الحاجة إلى الضبط
  • BigQuery Export مجاني، لكي تتمكّن من طلب بياناتك باستخدام لغة الاستعلامات البنيوية (SQL)

على الرغم من أنّ واجهة الويب في "إحصاءات Google" تتضمّن أدوات تحليل فعّالة، فإنه من الصعب التغلب على فعالية ومرونة الوصول إلى بيانات الأحداث الأوّلية باستخدام لغة طلب بحث تعرف عليها على الأرجح.

لبدء قياس "مؤشرات أداء الويب الأساسية" باستخدام "إحصاءات Google‏ 4" وBigQuery، عليك تنفيذ ثلاثة إجراءات:

  1. أنشئ موقعًا على "إحصاءات Google‏ 4" و مشروعًا على BigQuery.
  2. فعِّل BigQuery Export في إعدادات موقعك على "إحصاءات Google"، وسيتمّ تلقائيًا تعبئة كلّ البيانات التي تتلقّاها في جداول مشروع BigQuery.
  3. أضِف مكتبة JavaScript الخاصة بمقياس مؤشرات الأداء الرئيسية للويب إلى موقعك الإلكتروني، حتى تتمكّن من قياس مقاييس "مؤشرات الأداء الرئيسية للويب" وإرسال البيانات إلى "إحصاءات Google‏ 4" ، بما في ذلك بيانات تحديد المصدر.

التحليل

بعد الانتهاء من الإعداد، من المفترض أن تظهر لك بيانات الأحداث في واجهة BigQuery، ومن المفترض أن تتمكّن من طلب البحث عن البيانات على النحو التالي:

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

في ما يلي معاينة للنتائج الواردة من طلب البحث هذا:

بيانات أحداث "مؤشرات أداء الويب" في BigQuery

طلب بيانات "مؤشرات أداء الويب"

قبل بدء طلب بيانات أحداث Web Vitals، من المهم معرفة كيفية تجميع البيانات.

من المهمّ معرفة أنّه في بعض الحالات، قد يتم تسجيل أحداث متعددة للمقياس نفسه في الصفحة نفسها. ويمكن أن يحدث ذلك إذا تغيّرت قيمة المقياس وتم تسجيل قيمة معدَّلة (وهو أمر شائع في CLS).

بالنسبة إلى أحداث Web Vitals، تكون آخر قيمة تم إرسالها هي القيمة الأكثر دقة دائمًا، لذلك، قبل إجراء أي تحليل، من المهم الفلترة حسب هذه القيم فقط. إنّ مقتطف الرمز الذي تقدّمه مكتبة JavaScript لبيانات قياس الأداء في المواقع الإلكترونية لإرسال البيانات إلى "إحصاءات Google‏ 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
)

يُرجى العِلم أنّ جميع طلبات البحث الأخرى المُشار إليها في هذا المنشور ستبدأ بهذا الاستعلام الفرعي.

أمثلة على طلبات البحث

تعرض الأقسام القليلة التالية بعض الأمثلة على طلبات البحث الشائعة في "مؤشرات أداء الويب" التي قد تريد تنفيذها.

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

تصحيح الأخطاء

توضّح طلبات البحث السابقة كيفية طلب بيانات مقياس "مؤشرات أداء الويب"، ما يساعدك في فهم أدائك الحالي واتجاهاته بمرور الوقت. ولكن، ماذا يمكنك فعله إذا كان أداؤك أسوأ من المتوقّع ولكنّك لا تعرف السبب؟

لا فائدة من معرفة قيمة نتائجك إذا لم تتمكّن من اتّخاذ إجراء وإصلاح المشاكل.

يشرح مقالة تصحيح أخطاء الأداء في الميدان كيفية إرسال معلومات إضافية حول تصحيح الأخطاء مع بيانات الإحصاءات. في حال اتّباع التعليمات المفصّلة في هذا المنشور، من المفترض أن تظهر معلومات تصحيح الأخطاء في BigQuery أيضًا.

أمثلة على طلبات البحث

توضّح طلبات البحث التالية كيفية استخدام مَعلمة الحدث debug_target للمساعدة في تحديد السبب الأساسي لمشاكل الأداء.

أهم العناصر التي تساهم في متغيّرات التصميم التراكمية (CLS)

debug_target هي سلسلة لأداة اختيار لغة CSS تتطابق مع العنصر على الصفحة الأكثر صلةً بقيمة المقياس.

في متغيّرات التصميم التراكمية (CLS)، يمثّل debug_target أكبر عنصر من أكبر متغيّر تصميم ساهم في قيمة CLS. وإذا لم يتم تغيير أي عناصر، ستكون قيمة debug_target هي null.

سيُدرِج طلب البحث التالي الصفحات من الأسوأ إلى الأفضل حسب متغيّر التصميم التراكمية عند القيمة المئوية السابعة والخمسين، مجمّعة حسب 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 بالمقياس ذي الصلة لتصحيح الأخطاء:

WHERE metric_name = 'INP'
WHERE metric_name = '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 طريقة سريعة لعرض أيّ نتائج طلب بحث من خلال Data Studio. ‫Looker Studio هي أداة مجانية للتمثيل البصري للبيانات وإنشاء لوحات البيانات. لعرض نتائج طلب البحث بيانيًا، بعد تنفيذ طلب البحث في واجهة مستخدم BigQuery، انقر على زر "استكشاف البيانات" و اختَر استكشاف باستخدام 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

تجسيد بيانات "مؤشرات أداء الويب"

عند إنشاء لوحات بيانات لبيانات أحداث "مؤشرات أداء الويب الأساسية" كما هو موضّح سابقًا، ليس من الفعال استخدام مجموعة بيانات التصدير في "إحصاءات Google‏ 4" مباشرةً. بسبب بنية بيانات "إحصاءات Google‏ 4" والمعالجة المُسبَقة المطلوبة لمقاييس "مؤشرات الأداء الرئيسية للويب"، سيتم تشغيل أجزاء من طلبك عدة مرات. يؤدي ذلك إلى حدوث مشكلتَين: أداء لوحة البيانات وتكاليف BigQuery.

يمكنك استخدام وضع الحماية في BigQuery بدون أي رسوم. باستخدام الإصدار المجاني من BigQuery، يمكنك الحصول على 1 تيرابايت مجاني من بيانات طلبات البحث التي تتم معالجتها شهريًا. بالنسبة إلى طرق التحليل المذكورة في هذه المشاركة، من المفترض أن تتمكّن من البقاء ضمن هذا الحدّ المجاني كل شهر ما لم تكن تستخدِم مجموعة بيانات كبيرة جدًا أو تُجري طلبات بحث مكثّفة في مجموعة البيانات بانتظام. ولكن إذا كان لديك موقع إلكتروني يتلقّى عددًا كبيرًا من الزيارات وتريد مراقبة المقاييس المختلفة بانتظام باستخدام لوحة بيانات تفاعلية سريعة، ننصحك باستخدام ميزة المعالجة المسبقة وعرض بيانات مؤشرات الأداء الرئيسية للموقع الإلكتروني مع الاستفادة من ميزات كفاءة BigQuery، مثل التقسيم والتجميع والتخزين المؤقت.

سيُجري النص البرمجي التالي معالجة أولية لبيانات 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');

تتمتع مجموعة البيانات المحفوظة هذه بعدة مزايا:

  • يتم تبسيط هيكل البيانات ويسهل الاستعلام عنها.
  • ولا يحتفظ سوى بأحداث "مؤشرات الأداء الرئيسية للويب" من مجموعة بيانات "إحصاءات Google‏ 4" الأصلية.
  • يتوفّر رقم تعريف الجلسة ونوع المستخدِم (جديد مقابل مكرّر الزيارة) ومعلومات التفاعل في الجلسة مباشرةً في الأعمدة.
  • يتم تقسيم الجدول حسب التاريخ وتجميعه حسب اسم المقياس. ويؤدي ذلك عادةً إلى تقليل كمية البيانات التي تتم معالجتها لكل طلب بحث.
  • بما أنّك لا تحتاج إلى استخدام أحرف البدل لإجراء طلب بحث في هذا الجدول، يمكن أن يتم تخزين نتائج طلب البحث مؤقتًا في ذاكرة التخزين المؤقت لمدة تصل إلى 24 ساعة. هذا يقلل التكاليف من تكرار الاستعلام ذاته.
  • إذا كنت تستخدم محرك ذكاء الأعمال في BigQuery، يمكنك تنفيذ دوالّ SQL و عوامل التشغيل المحسّنة في جدول التحليلات هذا.

يمكنك إجراء طلب بحث عن هذا الجدول الذي يظهر مباشرةً من داخل واجهة مستخدم BigQuery أو استخدامه في Looker Studio باستخدام موصِّل BigQuery.

استخدام Web Vitals Connector

بما أنّ إنشاء لوحة بيانات من الصفر يستغرق وقتًا طويلاً، طوّرنا حلًا موحّدًا سينشئ لك لوحة بيانات مستندة إلى نموذج. تأكَّد أولاً من أنّك قد أنشأت جدول "مؤشرات أداء الويب" باستخدام الطلب السابق. بعد ذلك، انتقِل إلى موصِّل مؤشرات أداء الويب في Looker Studio باستخدام هذا الرابط: goo.gle/web-vitals-connector

بعد تقديم تفويض لمرة واحدة، من المفترض أن تظهر لك شاشة التهيئة التالية:

شاشة تفويض "موصل مؤشرات أداء الويب"

قدِّم معرّف جدول BigQuery الذي تمّت تحويله إلى جدول مادي (أي الجدول المستهدَف) و رقم تعريف مشروع الفوترة في BigQuery. بعد النقر على "ربط"، ستنشئ Looker Studio لوحة بيانات جديدة مستندة إلى نموذج وتربط بياناتك بها. يمكنك تعديل لوحة البيانات وتعديلها ومشاركتها كما تشاء. إذا أنشأت لوحة بيانات مرة واحدة، لن تحتاج إلى الانتقال إلى رابط الموصّل مرة أخرى، ما لم تكن تريد إنشاء لوحات بيانات متعدّدة من مجموعات بيانات مختلفة.

أثناء التنقّل في لوحة البيانات، يمكنك الاطّلاع على المؤشرات اليومية لمقاييس Web Vitals وبعض معلومات الاستخدام لموقعك الإلكتروني، مثل المستخدِمين والجلسات، في علامة التبويب الملخّص.

في علامة التبويب تحليل المستخدِمين، يمكنك اختيار مقياس ثم الحصول على تقسيم لأجزاء المقياس المئوية بالإضافة إلى عدد المستخدِمين حسب مقاييس استخدام العمل المختلفة.

ستساعدك علامة التبويب تحليل مسار الصفحة في تحديد الجوانب التي تواجه مشاكل في موقعك الإلكتروني. يمكنك هنا اختيار مقياس للاطّلاع على النظرة العامة. ولكنك ترى أيضًا خريطة مبعثرة لجميع مسارات الصفحات مع القيمة المئوية على المحور ص وعدد السجلات على المحور س. يمكن أن تساعد خريطة التنقّل في تحديد الصفحات التي تحقّق قيمًا متدنية عن القيم المتوقّعة للمقاييس. بعد اختيار الصفحات باستخدام الرسم البياني بالنقاط المبعثرة لجدول مسار الصفحة، يمكنك التوغّل أكثر في منطقة المشكلة من خلال عرض جدول تصحيح الأخطاء المستهدف.

علامة التبويب تحليل الأرباح هي مثال على كيفية مراقبة نشاطك التجاري ومقاييس الأداء في المكان نفسه. يعرض هذا القسم جميع الجلسات التي قام فيها المستخدم بعملية شراء. يمكنك مقارنة الأرباح المكتسَبة مقارنةً بتجربة المستخدم خلال جلسة معيّنة

الاستخدام المتقدّم

عندما تصبح أكثر دراية بمجموعة البيانات، يمكنك تحرير لوحة المعلومات وإضافة المخططات الخاصة بك للحصول على تحليل أكثر ثراءً واستهدافًا. لجعل لوحة البيانات أكثر فائدة، يمكنك اتّخاذ الخطوات التالية:

  • إعداد طلب بحث مجدوَل في BigQuery للحصول على بيانات محدّثة لا يأخذ طلب البحث الذي أجريناه سابقًا سوى لقطة لبياناتك في تلك اللحظة. إذا أردت إبقاء لوحة البيانات محدّثة بالبيانات الجديدة، يمكنك إجراء طلب بحث مُجدوَل سيتم تنفيذه كل يوم وإلحاق الجدول المحسَّن بالبيانات الجديدة.
  • دمج بيانات الطرف الأول (مثل إدارة علاقات العملاء) للحصول على إحصاءات النشاط التجاري في جدول الجدول التحليلي، يمكنك إضافة user_id كعمود منفصل. سيتيح لك ذلك دمج بيانات الطرف الأول. إذا لم تكن بيانات الطرف الأول متوفّرة في BigQuery، يمكنك تحميل البيانات أو استخدام مصدر بيانات موحّد.
  • أبلِغ عن إصدار موقعك الإلكتروني أو تطبيقك كمَعلمة في البيانات التي ترسلها إلى "إحصاءات Google"، وأضِفه كعمود في الجدول المحسَّن. بعد ذلك، يمكنك إضافة بيانات الإصدار هذه كسمة في الرسوم البيانية لتسهيل الاطّلاع على أثر تغييرات الإصدار في الأداء.
  • إذا كنت تتوقّع استخدامًا كثيفًا بشكلٍ كبير لمجموعة البيانات من خلال طلب بحث مباشر أو لوحة البيانات، يمكنك تجربة استخدام الإصدار المدفوع من BigQuery BI Engine.

ملخّص

لقد تناول هذا المنشور أساسيات كيفية استخدام "إحصاءات Google‏ 4" وBigQuery لقياس الأداء وتصحيح الأخطاء باستخدام بيانات المستخدِمين الفعليين التي يتم جمعها في الميدان. وشرحت الندوة أيضًا كيفية إنشاء تقارير ولوحات بيانات مبرمَجة باستخدام Looker Studio وموصّل مؤشرات أداء الويب لتسهيل عرض البيانات قدر الإمكان.

بعض النقاط الرئيسية من هذه المشاركة:

  • إنّ قياس الأداء باستخدام بيانات المستخدمين الفعلية أمر مهم لفهم موقعك الإلكتروني و تصحيح الأخطاء فيه وتحسينه.
  • يمكنك الحصول على إحصاءات أكثر تفصيلاً عندما تكون مقاييس الأداء ومقاييس نشاطك التجاري في النظام نفسه. تتيح "إحصاءات Google" وBigQuery إجراء ذلك.
  • من خلال تصدير بيانات "إحصاءات Google" الأوّلية إلى BigQuery، يمكنك إجراء تحليل مخصّص ومفصّل باستخدام لغة طلبات بحث تعرفها على الأرجح.
  • توفّر Google عددًا من واجهات برمجة التطبيقات وأدوات العروض المرئية، مثل Looker Studio، التي تمنحك الحرية في إنشاء تقاريرك بالطريقة التي تريدها بالضبط.