11 גילוי באמצעות שאילתות ODBC SQL

סקירה כללית

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

מפתח פריט

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

ניתן להשתמש בשני מפתחות פריט בכללי הגילוי של "צג מסד נתונים":

  • db.odbc.discovery[<קיצור ייחודי description>,<dsn>,<מחרוזת חיבור>] - פריט זה הופך את תוצאת שאילתת SQL למערך JSON, הופך את ה- שמות העמודות מהשאילתה מביאים למאקרו גילוי ברמה נמוכה שמות בשילוב עם ערכי השדות שהתגלו. פקודות מאקרו אלו יכולות להיות משמש ביצירת אבות טיפוס של פריט, טריגר וכו'. ראה גם: שימוש db.odbc.discovery.
  • db.odbc.get[<קיצור ייחודי description>,<dsn>,<מחרוזת חיבור>] - פריט זה הופך את תוצאת שאילתת SQL למערך JSON, תוך שמירה על ה- שמות העמודות המקוריים מהשאילתה נוצרים כשם שדה ב-JSON בשילוב עם הערכים שהתגלו. לְעוּמַת db.odbc.discovery[], פריט זה אינו יוצר גילוי ברמה נמוכה פקודות מאקרו ב-JSON המוחזר, לכן אין צורך לבדוק אם שמות העמודות יכולים להיות שמות מאקרו חוקיים. הגילוי ברמה נמוכה ניתן להגדיר פקודות מאקרו כשלב נוסף לפי הצורך, באמצעות ה- LLD מותאם אישית מאקרו פונקציונליות כאשר JSONPath מצביע על הערכים שהתגלו ב- החזיר JSON. ראה גם: שימוש ב-db.odbc.get.

שימוש ב-db.odbc.discovery

כדוגמה מעשית להמחשה כיצד משתנה שאילתת SQL לתוך JSON, הבה נבחן גילוי ברמה נמוכה של פרוקסי Zabbix על ידי ביצוע שאילתת ODBC על מסד הנתונים של Zabbix. זה שימושי עבור יצירה אוטומטית של "zabbix[proxy,<name>,lastaccess]" פריטים פנימיים לניטור אילו פרוקסי חיים.

הבה נתחיל עם תצורת כלל גילוי:

lld_rule_odbc.png

כל שדות הקלט החובה מסומנים בכוכבית אדומה.

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

 mysql> SELECT h1.host, COUNT(h2.host) AS count FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxy_hostid WHERE h1.status IN (5, 6) GROUP BY h1.host;
        +--------+--------+
        | מארח | לספור |
        +--------+--------+
        | יפן 1 | 5 |
        | יפן 2 | 12 |
        | לטביה | 3 |
        +--------+--------+
        3 שורות בסט (0.01 שניות)

לפי הפעולה הפנימית של פריט "db.odbc.discovery[,{$DSN}]", התוצאה של שאילתה זו הופכת אוטומטית לתוצאות הבאות JSON:

[
            {
                "{#HOST}": "יפן 1",
                "{#COUNT}": "5"
            },
            {
                "{#HOST}": "יפן 2",
                "{#COUNT}": "12"
            },
            {
                "{#HOST}": "לטביה",
                "{#COUNT}": "3"
            }
       ]

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

אם זה לא ברור איך שם עמודה ישתנה לתוך שם מאקרו, מומלץ להשתמש בכינויי עמודות כמו "COUNT(h2.host) AS count" בדוגמה למעלה.

במקרה שלא ניתן להמיר שם עמודה לשם מאקרו חוקי, ה- כלל הגילוי הופך ללא נתמך, עם פירוט הודעת השגיאה מספר העמודה הפוגענית. אם רוצים עזרה נוספת, התקבל שמות העמודות מסופקים תחת DebugLevel=4 בקובץ היומן של שרת Zabbix:

 $ grep db.odbc.discovery /tmp/zabbix_server.log
         ...
         23876:20150114:153410.856 ב-db_odbc_discovery() query:'SELECT h1.host, COUNT(h2.host) FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxy_hostid GROUP IN (5BY1.6) IN (5BY1. h1.host;'
         23876:20150114:153410.860 עמודת db_odbc_discovery()[1]:'host'
         23876:20150114:153410.860 עמודה db_odbc_discovery()[2]:'COUNT(h2.host)'
         23876:20150114:153410.860 סוף db_odbc_discovery():NOTSUPPORTED
         23876:20150114:153410.860 פריט [שרת Zabbix:db.odbc.discovery[proxies,{$DSN}]] שגיאה: לא ניתן להמיר את שם העמודה מס' 2 למאקרו.

כעת, כאשר אנו מבינים כיצד שאילתת SQL הופכת ל-JSON אובייקט, נוכל להשתמש במאקרו {#HOST} באבות טיפוס של פריט:

item_prototype_odbc.png

לאחר ביצוע הגילוי, ייווצר פריט עבור כל פרוקסי:

discovered_items_odbc1.png

שימוש ב-db.odbc.get

באמצעות db.odbc.get[,{$DSN}] ובדוגמה הבאה של SQL:

 mysql> SELECT h1.host, COUNT(h2.host) AS count FROM hosts h1 LEFT JOIN hosts h2 ON h1.hostid = h2.proxy_hostid WHERE h1.status IN (5, 6) GROUP BY h1.host;
        +--------+--------+
        | מארח | לספור |
        +--------+--------+
        | יפן 1 | 5 |
        | יפן 2 | 12 |
        | לטביה | 3 |
        +--------+--------+
        3 שורות בסט (0.01 שניות)

ה-JSON הזה יוחזר:

[
            {
                "host": "יפן 1",
                "count": "5"
            },
            {
                "host": "יפן 2",
                "count": "12"
            },
            {
                "host": "לטביה",
                "count": "3"
            }
       ]

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

 {#HOST} → $.host

כעת ניתן להשתמש במאקרו {#HOST} הזה באבות טיפוס של פריטים:

item_prototype_odbc.png