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

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

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

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

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

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

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

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

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

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

للحصول على نظرة عامة مرئية على جميع الخطوات الموضّحة هنا، يمكنك الاطّلاع على محادثتنا من 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
)

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

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

تعرض الأقسام القليلة التالية بعض الأمثلة على طلبات البحث الشائعة في 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

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

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

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

يشرح مقالة تصحيح أخطاء الأداء في الميدان كيفية إرسال معلومات إضافية حول تصحيح الأخطاء مع بيانات الإحصاءات. في حال اتّباع التعليمات المفصّلة في هذا المنشور، من المفترض أن تظهر معلومات تصحيح الأخطاء في 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'

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

تصور

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

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

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

شاشة تفويض 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، التي تمنحك الحرية في إنشاء تقاريرك بالطريقة التي تريدها بالضبط.