אחוזונים ומדדים עם ערכי חלוקה

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

כשמציגים מדד התפלגות במפת חום, אפשר להשתמש באפשרות בסרגל הכלים של התרשים כדי להוסיף שכבת-על של האחוזון ה-50, ה-95 וה-99. כדי להציג מדד התפלגות בתרשים קו, צריך להגדיר את התרשים כך שימיר את ערך ההתפלגות לערך מספרי. כדי לבצע את ההמרה הזו, אפשר להשתמש בכלי ליישור שבוחר אחוזון.

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

דוגמה עם נתונים סינתטיים

מומלץ להשתמש במודל של Exponential דליים עם סולם של 1, מקדם גידול של 2 ו-10 דליים סופיים. ההיסטוגרמה הזו מכילה 12 משבצות: 10 משבצות סופיות, משבצת אחת שמציינת רק גבול עליון ומשבצת אחת שמציינת רק גבול תחתון. בדוגמה הזו, הרוחב של הקטגוריה הסופית עם האינדקס n+1 גדול פי שניים מהרוחב של הקטגוריה הסופית עם האינדקס n.

בדוגמאות הבאות אפשר לראות שרוחב הדלי קובע את השגיאה המקסימלית בין האחוזון המחושב לבין המדידות. הם גם מראים שמספר הדגימות בהיסטוגרמה חשוב. לדוגמה, אם מספר הדגימות קטן מ-20, האחוזונים ה-95 וה-99 תמיד יהיו באותו bucket.

מקרה 1: המספר הכולל של הדוגמאות הוא 1.

כשמדובר במדידה יחידה, שלושת ערכי האחוזון שונים, אבל הם מציגים רק את האחוזון ה-50, ה-95 וה-99 של אותו bucket. אי אפשר לקבוע את השגיאה בין האומדן לבין המדידות בפועל כי המדידה לא ידועה.

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

מספר הקטגוריה גבול תחתון סף עליון ספירה טווח אחוזונים
0 1 0 0
1 1 2 0 0
2 2 4 0 0
3 4 8 0 0
4 8 16 0 0
5 16 32 0 0
6 32 64 0 0
7 64 128 0 0
8 128 256 1 ‫0 - 100
9 256 512 0 0
10 512 1024 0 0
11 1024 0 0

כדי לחשב את האחוזון ה-50:

  1. משתמשים בספירות של הקטגוריות כדי לקבוע איזו קטגוריה מכילה את האחוזון ה-50. בדוגמה הזו, קטגוריה מספר 8 מכילה את האחוזון ה-50.
  2. כדי לחשב את האומדן, משתמשים בכלל הבא:

    pth percentage = bucket_low +
                    (bucket_up - bucket_low)*(p - p_low)/(p_up - p_low)
    

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

לדוגמה, האחוזון ה-50 מחושב כך:

   50th percentile = 128 + (256-128)*(50-0)/(100-0)
                   = 128 + 128 * 50 / 100
                   = 128 + 64
                   = 192

כדי לחשב את האחוזון ה-95, מחליפים את 50 ב-95 בביטוי הקודם. בדוגמה הזו יש בדיוק דגימה אחת, ולכן האחוזונים הם:

מאון מספר הקטגוריה ערך
50th 8 192
95 8 249.6
‫99 8 254.7

אפשר להגביל את השגיאה בין האומדן לבין המדידות בפועל, אבל אי אפשר לקבוע אותה כי המדידה לא ידועה.

מקרה 2: המספר הכולל של הדגימות הוא 10.

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

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

מספר הקטגוריה גבול תחתון סף עליון ספירה טווח אחוזונים
0 1 4 ‫0 - 40
1 1 2 2 ‫40-60
2 2 4 1 ‫60 - 70
3 4 8 1 ‫70-80
4 8 16 1 ‫80-90
5 16 32 0 0
6 32 64 0 0
7 64 128 0 0
8 128 256 1 ‫90-100
9 256 512 0 0
10 512 1024 0 0
11 1024 0 0

אפשר להשתמש בהליך שמתואר למעלה כדי לחשב את האחוזונים ה-50, ה-95 וה-99. לדוגמה, האחוזון ה-50, שנמצא בדלי מספר 1, מחושב באופן הבא:

50th percentile = 1 + (2-1)*(50-40)/(60-40)
                = 1 + (1 * 10 / 20)
                = 1 + 0.5
                = 1.5

באופן דומה, האחוזון ה-95 מחושב כך:

95th percentile = 128 + (256-128)*(95-90)/(100-90)
                = 128 + 128 * 5 / 10
                = 128 + 64
                = 192

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

מאון מספר הקטגוריה ערך שגיאה מקסימלית
50th 1 1.5 ‫0.5
95 8 192 74
‫99 8 243.2 ‫115.2

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

דוגמה עם נתונים אמיתיים

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

זיהוי מודל הדלי

כדי לדעת באילו באקטים נעשה שימוש במדד מסוים במהלך מרווח זמן ספציפי, צריך להפעיל את השיטה projects.timeSeries/list של Cloud Monitoring API.

לדוגמה, כדי לזהות את מודל הקטגוריות של מדד מסוים:

  1. עוברים לדף האינטרנט projects.timeSeries/list.
  2. ב-APIs Explorer, מזינים את המסנן שמציין את המדד, שעת התחלה ושעת סיום.

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

    metric.type="serviceruntime.googleapis.com/api/request_latencies"
    resource.type="consumed_api"
    

    בדוגמה הזו, שדה הסינון מציין סוג מדד וסוג משאב. מידע נוסף על המסננים האלה זמין במאמר בנושא מסנני Monitoring.

  3. לוחצים על Enter.

זוהי תגובת ה-API של list למדד של ערך ההפצה שזמין בפרויקט אחד Google Cloud :

{
  "timeSeries": [
    {
      "metric": {...},
      "resource": {...},
      },
      "metricKind": "DELTA",
      "valueType": "DISTRIBUTION",
      "points": [
        {
          "interval": {
            "startTime": "2020-11-03T15:05:00Z",
            "endTime": "2020-11-03T15:06:00Z"
          },
          "value": {
            "distributionValue": {
              "count": "3",
              "mean": 25.889,
              "bucketOptions": {
                "exponentialBuckets": {
                  "numFiniteBuckets": 66,
                  "growthFactor": 1.4,
                  "scale": 1
                }
              },
              "bucketCounts": [
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
                "3"
              ]
            }
          }
        },

בתגובת ה-API, השדה value מתאר את הנתונים שמאוחסנים במערך points. השדות count ו-mean מדווחים שבפרק הזמן שצוין בוצעו 3 מדידות והערך הממוצע שלהן היה 25.889. בשדה bucketOptions מוצג שהמודל האקספוננציאלי מוגדר עם 66 קטגוריות, קנה מידה של 1 וגורם צמיחה של 1.4.

כדי לחשב את הגבולות התחתון והעליון של הקטגוריה עם האינדקס n, משתמשים בכללים הבאים:

  • הסף התחתון (‎1 ≤ n < N) = קנה מידה * (גורם הצמיחה)(n-1)
  • רף עליון (0 ≤ n < N-1) = קנה מידה * (גורם גידול)n

בביטויים הקודמים, N הוא המספר הכולל של הדליים.

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

קטגוריה n גבול תחתון סף עליון נקודת אמצע
0 1 לא רלוונטי
1 1 ‫1.40 1.20
2 ‫1.40 1.96 1.68
...
9 14.76 20.66 17.71
10 20.66 28.93 24.79
11 28.93 40.50 34.71
...

אימות החישובים של האחוזונים

עכשיו, אחרי שיודעים את הגדרות הקטגוריה, אפשר לחזות את הערכים של האחוזון ה-50, ה-95 וה-99 לכל קבוצת מדידות. לדוגמה, אם יש דגימה אחת והיא בדלי מספר 10, אז ערך האחוזון ה-50 הוא 24.79.

כדי לאחזר את ערכי האחוזון ה-50, ה-95 וה-99 של המדד, אפשר להשתמש בשיטת ה-API‏ projects.timeSeries/list ולכלול תקופת התאמה וכלי התאמה. בדוגמה הזו, ההגדרות הבאות נבחרו:

  • מיישר שיניים: ALIGN_PERCENTILE_50,‏ ALIGN_PERCENTILE_95 או ALIGN_PERCENTILE_99
  • תקופת ההתאמה: 60 שניות

בבחירה ALIGN_PERCENTILE_50, כל ערך בסדרת הזמן הוא האחוזון ה-50 של קטגוריה:

{
  "timeSeries": [
    {
      "metric": {...},
      "resource": {...},
      "metricKind": "GAUGE",
      "valueType": "DOUBLE",
      "points": [
        {
          "interval": {
            "startTime": "2020-11-03T15:06:36Z",
            "endTime": "2020-11-03T15:06:36Z"
          },
          "value": {
            "doubleValue": 24.793256140799986
          }
        },
        {
          "interval": {
            "startTime": "2020-11-03T15:05:36Z",
            "endTime": "2020-11-03T15:05:36Z"
          },
          "value": {
            "doubleValue": 34.710558597119977
          }
        },
        {
          "interval": {
            "startTime": "2020-11-03T15:04:36Z",
            "endTime": "2020-11-03T15:04:36Z"
          },
          "value": {
            "doubleValue": 24.793256140799986
          }
        }
      ]
    },

בשתיים מהדוגמאות, האחוזון ה-50 נמצא בדלי 10, ובדוגמה השנייה הוא נמצא בדלי 11.

בטבלה הבאה מוצגות התוצאות של הפעלת השיטה projects.timeSeries/list עם כלי יישור שונים. השורה הראשונה מתאימה למקרה שבו לא צוין כלי ליישור. אם לא מציינים פונקציית יישור, מוחזרים מודל הדלי והערכים הממוצעים. בשלוש השורות הבאות מפורטים הנתונים שמוחזרים כשמגדירים את הכלי להתאמה ל-ALIGN_PERCENTILE_50, ל-ALIGN_PERCENTILE_95 ול-ALIGN_PERCENTILE_99:

נתון סטטיסטי דוגמה @ 15:06 דוגמה @ 15:05 דוגמה @ 15:04
mean 25.889 33.7435 לא זמין.
האחוזון ה-50 24.79 34.71 24.79
אחוזון 95 28.51 39.91 28.51
אחוזון 99 28.84 40.37 28.84

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

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

המאמרים הבאים

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