מסנני מעקב

במדריך הזה מוסבר איך להגדיר מסננים כשמשתמשים ב-Monitoring API. משתמשים במסננים כדי לציין משאבים במעקב, סוגי מדדים וסדרות זמן.

לפני שמתחילים

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

אם אתם לא מכירים את התוויות, כדאי לקרוא את המאמר תוויות.

שימוש במסננים

אפשר להשתמש במסננים ב-Monitoring API כדי:

בחירת מסננים

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

  • resource: התאמה ל משאבים במעקב מסוג מסוים או עם ערכי תוויות מסוימים.

    • המסנן הבא מתאים לכל המשאבים שבמעקב שהם מכונות וירטואליות (VM) של Compute Engine:

      resource.type = "gce_instance"
  • metric: מתאים ל סוג מדד או סדרת זמן מסוימת עם תווית מסוימת שתואמת לערך ספציפי.

    • המסנן הבא תואם לסוג מדד ספציפי:

      metric.type = "compute.googleapis.com/instance/cpu/usage_time"
    • המסנן הבא מתאים לסדרות זמן עם תווית בשם instance_name, שהערך שלה מתחיל ב-gke-hipster או ב-gke-nginx:

      metric.labels.instance_name = monitoring.regex.full_match("gke-(hipster|nginx).*")

בטבלה הבאה מפורטים הסלקטורים שמותרים במסננים על סמך הקריאה ל-Monitoring API:

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

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

אחזור נתונים של פעולות על ציר הזמן

Method: projects.timeSeries.list
Filter objects: project, resource.type, resource.labels.[KEY], metric.type, metric.labels.[KEY]

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

המסנן שצוין לשיטה timeSeries.list חייב לכלול בורר metric, והבורר הזה חייב לציין בדיוק סוג אחד של מדד:

  • כדי להחזיר את כל סדרות הזמן של סוג מסוים של מדד:
    metric.type = "compute.googleapis.com/instance/cpu/usage_time"
    
  • כדי לקבל את כל סדרות הזמן ממכונה ספציפית של Compute Engine, משתמשים במסנן הבא:

    metric.type = "compute.googleapis.com/instance/cpu/usage_time" AND
    metric.labels.instance_name = "my-instance-name"
    

  • כדי להחזיר את כל סדרות הזמן ממכונות של Compute Engine שהשמות שלהן מתחילים ב-frontend-, משתמשים במסנן הבא:

    metric.type = "compute.googleapis.com/instance/cpu/usage_time" AND
    metric.labels.instance_name = starts_with("frontend-")
    

  • כדי להחזיר את כל סדרות הזמן ממכונות של Compute Engine ששמותיהן מתחילים ב-gke-hipster או ב-gke-nginx, משתמשים במסנן הבא:

    metric.type = "compute.googleapis.com/instance/cpu/usage_time" AND
    metric.labels.instance_name = monitoring.regex.full_match("^gke-(hipster|nginx).*")
    

תיאורי מדדים של כרטיסי מוצר

Method: projects.metricDescriptors.list
Filter objects: project, metric.type

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

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

metric.type = starts_with("compute.googleapis.com")

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

הצגת תיאורי משאבים במעקב

Method: projects.monitoredResourceDescriptors.list
Filter objects: resource.type

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

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

resource.type = starts_with("pubsub")

רשימה מלאה של סוגי המשאבים במעקב שמוגדרים ב-Monitoring זמינה במאמר רשימת משאבים במעקב.

דוגמאות

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

    # Metric descriptor:
    { "name": "projects/my-project-id/metricDescriptors/compute.googleapis.com%2Finstance%2Fdisk%2Fread_bytes_count"
      "type": "compute.googleapis.com/instance/disk/read_bytes_count",
      "labels": [ { "key": "device_name",
                    "description": "The name of the disk device." } ] }

    # Monitored resource descriptor:
    {  "name": "monitoredResourceDescriptors/gce_instance"
       "type": "gce_instance",
       "labels": [
         { "key": "instance_id",
           "description": "The instance ID provide by Google Compute Engine." },
         { "key": "zone",
           "description": "The Google Cloud Platform zone hosting the instance."
         } ] }

    # Resource descriptor for a virtual machine instance.
    { "type": "gce_instance",
      "instance_id": "1472038649266883453",
      "zone": "us-east-1b",
      "disks": [ "log_partition" ],
      "machine_type": "n1-standard-2",
      "tags": { "environment": "bleeding-edge",
                "role": "frobulator" },
      "project_id": "my-project-id" }

דוגמאות לאחזור מדדים

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

metric.type = "compute.googleapis.com/instance/disk/read_bytes_count"

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

metric.type = "compute.googleapis.com/instance/disk/read_bytes_count" AND
metric.labels.device_name = "log_partition"

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

resource.type = "gce_instance" AND
resource.labels.instance_id = "1472038649266883453" AND
metric.type = "compute.googleapis.com/instance/disk/read_bytes_count" AND
metric.labels.device_name = "log_partition"

הפניה: תחביר של מסננים

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

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

    <monitoring_filter> ::= <resource_selector> AND
                             <metric_selector>

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

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

השוואות

המסננים והבוררים שלהם מבוססים על השוואות. כל השוואה היא מהצורה הבאה:

  • [OBJECT]: בחירת ערך לבדיקה. אחת מהאפשרויות הבאות:

    metric.type
    metric.labels.[KEY]
    resource.type
    resource.labels.[KEY]
        

    ‫[KEY] הוא שם, כמו zone או instance_id.

    ‫[KEYSTRING] יכול להיות שם, אבל אם הוא מכיל תווים מיוחדים, צריך להוסיף לו מירכאות (").

  • [OPERATOR]: אופרטור השוואה; אחת מהאפשרויות הבאות:

    =            # equality (case-sensitive)
    > < >= <=    # numeric ordering
    !=           # not equal
    :            # "has" substring match and test for key (case-sensitive)
        
  • [VALUE]: ערך מילולי או קריאה לפונקציה מובנית; אחת מהאפשרויות הבאות:

    <string>     # "a Unicode string". Don't use apostrophes (`'`) to quote strings.
    <bool>       # true or false
    <number>     # 0, -2, 123456, 3.14156
    <function>   # operators on the right side of '=' or '!=':
                 #   starts_with(<string>)
                 #   ends_with(<string>)
                 #   has_substring(<string> [, ignore_case=false])
                 #   one_of(<string>,...,<string>) for up to 100 strings
                 #   monitoring.regex.full_match(<RE2-string>)
        

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

    • תלוי רישיות: display_name=has_substring("Demo")
    • תלוי רישיות: display_name=has_substring("Demo", false)
    • לא תלוי-רישיות: display_name=has_substring("Demo", true)

    כשמשתמשים בשיטה timeSeries.list, יש תמיכה רק בטופס has_substring(<string>).

    המסנן monitoring.regex.full_match מקבל מחרוזת של ביטוי רגולרי בתחביר של RE2.

אפשר להשתמש באופרטורים הבאים כדי לקבץ או לשנות השוואות. OR יש עדיפות גבוהה יותר ל-AND. האופרטורים צריכים להיכתב באותיות גדולות:

(...)        # grouping comparisons
AND          # conjunction (optional but recommended)
OR           # disjunction

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

ההשוואה x = one_of("a", "b", "c") שקולה לפעולות הבאות:

(x = "a" OR x = "b" OR x = "c")

בחירת מסננים

אפשר להשתמש בבוררים כדי להגביל את הבחירות של המסננים לפריטים מסוימים. בקטעים הבאים, משתמשים בסוגריים מסולסלים כדי להראות חזרה. לדוגמה, הסימון <x> {OR <y>} אומר שאפשר לכתוב כל אחת מהאפשרויות הבאות:

<x>
<x> OR <y>
<x> OR <y> OR <y>
<x> OR <y> OR <y> OR <y>
...

בוחר משאבים

בוחר משאבים מגביל את בחירת המסננים למשאבים – או לפריטים שמשויכים למשאבים – שיש להם סוג משאב ספציפי או ערכי תוויות:

<resource_selector> ::= <resource_type_expression>
                      | <resource_label_expression>
                      | <resource_type_expression> AND <resource_label_expression>

<resource_type_expression> ::= resource.type '=' <string>
                             | resource.type ':' <string>
                             | resource.type '=' starts_with '(' <string>')'
                             | resource.type '=' ends_with '(' <string> ')'

<r_label_comparison> ::= resource.labels.[KEY] '=' (<string> | <bool>)
                       | resource.labels.[KEY] ':' <string>
                       | resource.labels.[KEY] '=' (starts_with | ends_with) '(' <string> ')'
                       | resource.labels.[KEY] ('=' | '>' | '<' | '>=' | '<=') <number>

<resource_label_expression> ::= <r_label_comparison> {AND <r_label_comparison>}
                              | <r_label_comparison> {OR <r_label_comparison>}

אם משתמשים ביותר מ-<r_label_comparison> בסלקטור, כדאי להוסיף סוגריים מסביב לכולם כדי לשפר את הקריאות.

בורר המדדים

בורר מדדים מציין מדדים מסוימים או תיאורי מדדים על ידי הגבלת סוג המדד ותוויות המדד. כשמשתמשים בבורר המדדים עם השיטה projects.timeSeries.list, צריך לציין סוג מדד יחיד:

<metric_selector> ::= <metric_name_expression> [AND <metric_label_expression>]

<metric_name_expression> ::= metric.type '=' <string>
                           | metric.type ':' <string>
                           | metric.type '=' starts_with '(' <string> ')'
                           | metric.type '=' ends_with '(' <string> ')'

<metric_label_comparison> ::= metric.labels.[KEY] '=' <string> | <bool>
                            | metric.labels.[KEY] ':' <string>
                            | metric.labels.[KEY] '=' starts_with '(' <string> ')'
                            | metric.labels.[KEY] '=' ends_with '(' <string> ')'
                            | metric.labels.[KEY] ('=' | '>' | '<' | '>=' | '<=') <number>

<metric_label_expression> ::= <metric_label_comparison> {[AND] <metric_label_comparison>}
                            | <metric_label_comparison> {OR <metric_label_comparison>}

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

metric.type = "cloudsql.googleapis.com/database/state" AND
(metric.labels.resource_type = "instance" AND
 metric.labels.resource_id = "abc-123456")