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

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

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

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

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

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

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

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

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

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

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

قياس

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

على الرغم من أنّ واجهة الويب في "إحصاءات 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', 'FID', 'CLS')

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

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

بيانات "مؤشرات أداء الويب" الخاصة بطلبات البحث

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

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

بالنسبة إلى أحداث "مؤشرات أداء الويب"، تكون دائمًا القيمة الأخيرة التي يتم إرسالها هي الأكثر دقة، لذلك قبل إجراء أي تحليل، من المهم الفلترة بحثًا عن تلك القيم فقط. يتضمّن مقتطف الرمز المقدَّم من مكتبة 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', 'FID', '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 وFID و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', 'FID', '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', 'FID', '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', 'FID', '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 صفحات ذات أسوأ متغيّرات التصميم التراكمية (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', 'FID', '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.

سيسرد طلب البحث التالي الصفحات من الأسوأ إلى الأفضل حسب متغيّرات التصميم التراكمية (CLS) عند النسبة المئوية الخامسة والسبعين، مجمّعة حسب 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', 'FID', '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 ومهلة الاستجابة الأولى (FID). فقط استبدل عبارة where بالمقياس ذي الصلة لتصحيح الأخطاء:

WHERE metric_name = 'CLS'
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', 'FID', '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 طريقة سريعة لعرض أي نتائج طلب بحث من خلال "مركز البيانات من Google". 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

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

عند إنشاء لوحات بيانات لبيانات أحداث "مؤشرات أداء الويب" كما هو موضّح أعلاه، ليس من المفيد استخدام مجموعة بيانات تصدير "إحصاءات 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', 'FID', '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" الأصلية.
  • تتوفّر معلومات رقم تعريف الجلسة ونوع المستخدم (الجديد في مقابل مكرِّر الزيارة) ومعلومات التفاعل مع الجلسة مباشرةً في أعمدة.
  • يتم partitioned الجدول حسب التاريخ وتجميعه حسب اسم المقياس. عادة ما يقلل هذا من كمية البيانات التي تتم معالجتها لكل استعلام.
  • نظرًا لأنك لا تحتاج إلى استخدام أحرف البدل للاستعلام عن هذا الجدول، يمكن تخزين نتائج الاستعلام مؤقتًا لمدة تصل إلى 24 ساعة. هذا يقلل التكاليف من تكرار نفس الاستعلام.
  • إذا كنت تستخدم محرك BigQuery BI، يمكنك تشغيل عوامل التشغيل ودوال SQL المحسّنة في هذا الجدول.

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

استخدام "موصِّل مؤشرات أداء الويب"

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

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

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

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

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

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

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

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

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

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

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

ملخّص

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

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

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