נתוני Analytics תקועים בתור של מכתבים מתים ב-Kpidd

אתם קוראים את מסמכי התיעוד של Apigee Edge.
למעבר אל מסמכי התיעוד של Apigee X
info

תיאור הבעיה

חסרים נתונים של Analytics בממשק המשתמש החדש של Edge כי שרת Qpidd לא מעביר הודעות של Analytics ל-PostgreSQL. ב-Edge, הרכיב edge-qpid-server תואם לשרת Qpidd.

מערכת Qpidd מתחזקת שני תורים לכל קבוצת ניתוח נתונים:

  • ax-q-axgroup001-consumer-group-001

    התור הזה מכיל הודעות של ניתוח נתונים שנשלחות ממעבדי הבקשות ומהנתבים. ההודעות נשלפות מכאן על ידי edge-qpid-server, שמנתח את ההודעות ומכניס אותן ל-PostgreSQL. אחרי שההודעות מעובדות, הן מוסרות מהתור.

  • ax-q-axgroup001-consumer-group-001-dl

    התור הזה הוא תור של הודעות שלא ניתן להעביר. הוא משמש כיעד להודעות ש-edge-qpid-server לא הצליח לעבד, ולכן לא רוצה לקבל יותר. השדה הזה מתמלא בדרך כלל כשחורגים ממספר המשלוחים המקסימלי, או אם PostgreSQL דחה הוספה של נתונים חדשים בגלל שגיאות בזמן ריצה.

הודעת השגיאה

יכול להיות שהסיבה לכך היא שגיאות זמן ריצה שונות ברכיב edge-qpid-server. בדרך כלל, אם edge-qpid-server מקבל שגיאת זמן ריצה מ-PostgreSQL, הוא יוצר את תור ההודעות שלא נמסרו אם הוא עדיין לא קיים, ואז שולח אליו את ההודעה הבאה:

yyyy-MM-dd HH:mm:ss,SSS ax-q-axgroup001-consumer-group-001-persistpool-thread-6 WARN c.a.a.m.MessageConsumer - MessageConsumer.process() : Sending message batch to the DLQ.

סיבות אפשריות

סיבה תיאור ההוראות לפתרון בעיות רלוונטיות ל:
הודעות תקועות בתור של הודעות שלא ניתן להעביר (dead letter queue) של qpidd ‫edge-qpid-server לא הצליח להבין הודעות שהוא קרא מהברוקר של Qpidd או לא הצליח לשמור הודעות ב-PostgreSQL. משתמשים ב-Edge Private Cloud

שלבים נפוצים לאבחון

מריצים את הפקודה הבאה בצומת Qpid כדי להציג את הנתונים הסטטיסטיים של התור ב-Qpidd:

/opt/apigee/apigee-qpidd/bin/qpid-stat -q

הפלט מחזיר את קבוצת התורים שרשומים ב-broker. אם התור עם השם שמסתיים ב--dl מכיל הודעות (Q-Depth(Messages) ב-Edge for Private Cloud בגרסה 4.53.00 ואילך, או msg ב-Edge for Private Cloud בגרסה 4.52.x ומטה), ההודעות תקועות בתור ההודעות הבלתי ניתנות למסירה.

פלט לדוגמה ב-Edge for Private Cloud בגרסה 4.53.00 ואילך (כולל 4.54.00,‏ Apache Qpid Broker-J):

+---------------------------------------+-------------------+-------------------+-------------------+-------------------+-----------+----------+-------------------+------------+
|               Queue Name              | Messages Enqueued | Total Enqueued(B) | Messages Dequeued | Total Dequeued(B) | Consumers | Bindings | Q-Depth(Messages) | Q-Depth(B) |
+---------------------------------------+-------------------+-------------------+-------------------+-------------------+-----------+----------+-------------------+------------+
|   ax-q-axgroup001-consumer-group-001  |        185        |      13800000     |        185        |      13800000     |     6     |    1     |         0         |     0      |
+---------------------------------------+-------------------+-------------------+-------------------+-------------------+-----------+----------+-------------------+------------+
| ax-q-axgroup001-consumer-group-001-dl |         70        |      3900000      |         0         |         0         |     0     |    1     |         70        |  3900000   |
+---------------------------------------+-------------------+-------------------+-------------------+-------------------+-----------+----------+-------------------+------------+

פלט לדוגמה ב-Edge for Private Cloud בגרסה 4.52.x ובגרסאות קודמות (מתווך qpidd מדור קודם ב-C++‎):

Queues
  queue                                     dur  autoDel  excl  msg   msgIn  msgOut  bytes  bytesIn  bytesOut   cons  bind
  ========================================================================================================================
  ax-q-axgroup-001-consumer-group-001       Y                   0     185    185     0       13.8m   13.8m      6      2
  ax-q-axgroup-001-consumer-group-001-dl    Y                   0     70     70      0        3.9m    3.9m      0      2

הסיבה: הודעות תקועות בתור של הודעות שלא ניתן למסור ב-qpidd

אבחון

המצב הזה יכול לקרות בתרחישים הבאים:

  1. בוצע שדרוג בעבר, ובמהלכו PostgreSQL לא פעל.
  2. הפסקה זמנית של PostgreSQL בגלל בעיות ברשת.
  3. הכלי edge-qpid-server ניסה לשלוח הודעה ל-PostgreSQL, אבל PostgreSQL החזיר שגיאת זמן ריצה.

רזולוציה

פועלים לפי השלבים שמתאימים לגרסה של Edge for Private Cloud כדי להעביר הודעות תקועות מתור ההודעות שלא נמסרו בחזרה לתור הניתוח הראשי.

‫Edge for Private Cloud בגרסה 4.53.00 ואילך (כולל 4.54.00)

ב-Edge for Private Cloud בגרסה 4.53.00 ואילך (כולל 4.54.00) נעשה שימוש ב-Apache Qpid Broker-J ‏ (10.0.1 בגרסה 4.54.00 ו-8.0.6 בגרסה 4.53.x). ה-CLI הקודם של qpid-tool הוסר ב-Edge for Private Cloud בגרסה 4.53.00 ואילך, ואי אפשר להשתמש בו. במקום זאת, השתמשו ב-Apache Qpid Broker-J HTTP Management API בארכיטקטורת REST (moveMessages) או ב-Qpid Web Management Console כדי להעביר הודעות מהתור של ההודעות שלא נשלחו בחזרה לתור הראשי של ניתוח הנתונים:

  1. רושמים את השמות המדויקים של התור הראשי ותור ההודעות המתות מתוך הפלט של שלבי אבחון נפוצים (לדוגמה, ax-q-axgroup001-consumer-group-001 ו-ax-q-axgroup001-consumer-group-001-dl, או ax-q-axgroup-001-consumer-group-001 ו-ax-q-axgroup-001-consumer-group-001-dl).

  2. בצומת Qpid, מריצים את הפקודה curl הבאה כדי להפעיל את הפעולה moveMessages בתור ההודעות שלא נמסרו, באמצעות ה-Management API לניהול HTTP של Qpid Broker-J (יציאה 8090 כברירת מחדל):

    curl -u QPID_USER:QPID_PASSWORD -X POST \
      -H "Content-Type: application/json" \
      -d '{"destination": "ax-q-axgroup001-consumer-group-001"}' \
      http://127.0.0.1:8090/api/latest/queue/default/default/ax-q-axgroup001-consumer-group-001-dl/moveMessages

    כאשר:

    • ‫QPID_USER ו-QPID_PASSWORD הם פרטי הכניסה לניהול Qpid שהוגדרו ב-/opt/apigee/customer/application/qpidd.properties או ב-/opt/apigee/token/application/qpidd.properties (ברירת המחדל היא guest:guest).
    • אם שמות התורים של Analytics ב-qpid-stat -q שונים, מחליפים את ax-q-axgroup001-consumer-group-001 ואת ax-q-axgroup001-consumer-group-001-dl.
    • כדי להעביר הודעות בקבוצות, צריך לכלול את "limit" בגוף הבקשה ב-JSON (לדוגמה, "limit": 100000).
    • אם SSL/TLS מופעל ב-Qpid Management API ‏(conf_qpidd_qpid_management.https.enabled=true), משתמשים ב-https:// ומעבירים את --cacert (או -k) אל curl.
  3. בודקים את פלט הפקודה. קריאה מוצלחת מחזירה מערך JSON של מזהי ההודעות הפנימיים שהועברו:

    [ 3, 4, 5 ]

    אם המערך שמוחזר ריק ([]), לא היו הודעות בתור ההודעות הנטושות שאפשר להעביר.

  4. מחכים 5 דקות ואז מריצים את /opt/apigee/apigee-qpidd/bin/qpid-stat -q מהשלבים הנפוצים לאבחון. מוודאים שההודעות בתור הראשי (ax-q-axgroup001-consumer-group-001) עוברות עיבוד, ושהערך Q-Depth(Messages) בתור ההודעות שלא נמסרו (ax-q-axgroup001-consumer-group-001-dl) נשאר 0.

‫Edge for Private Cloud 4.52.x ואילך

  1. רושמים את שמות התורים מהשלבים הנפוצים לאבחון. לדוגמה:

    • ax-q-axgroup-001-consumer-group-001
    • ax-q-axgroup-001-consumer-group-001-dl
  2. מריצים את הפקודה qpid-tool כדי להיכנס להנחיית qpid אינטראקטיבית:

    qpid-tool

    הפקודה הזו מחזירה את התוצאה הבאה:

    Management Tool for QPID
    qpid:
  3. מריצים את הפקודה list broker כדי לקבל רשימה של ברוקרים פעילים:

    list broker

    הפקודה הזו מחזירה את התוצאה הבאה:

    Object Summary:
    ID   Created   Destroyed  Index
    =======================================
    125  21:00:00  -          amqp-broker

    בעמודה ID מצוין המזהה של הברוקר.

  4. חשוב לזכור את המזהה של הברוקר. בדוגמה, זה 125.

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

    call 125 queueMoveMessages ax-q-axgroup-001-consumer-group-001-dl ax-q-axgroup-001-consumer-group-001 100000 {}

    הפקודה הזו מחזירה את התוצאה הבאה:

    OK (0) - {}

    אם אין פלט, לא היה מה לעשות, כלומר לא היו הודעות להעברה. אם לא מופיע OK (0), צריך לפנות אל התמיכה של Apigee Edge.

  6. יוצאים מהטרמינל qpid-tool:

    quit
  7. מחכים 5 דקות ומריצים שוב את שלבי האבחון משלבי אבחון נפוצים. מוודאים שההודעות בתור בפועל עוברות עיבוד, ושהמספר של ההודעות שלא ניתן למסור msg נשאר 0.

אם הבעיה נמשכת, עוברים לקטע הבא.

צריך לאסוף פרטי אבחון

אם הבעיה נמשכת אחרי שביצעתם את ההוראות שלמעלה, אספו את נתוני האבחון הבאים ושתפו אותם עם התמיכה של Apigee Edge:

  • יומני Qpidd: ‏ /opt/apigee/var/log/apigee-qpidd/qpidd.log (Edge for Private Cloud בגרסה 4.53.00 ואילך) ו-/opt/apigee/var/log/apigee-qpidd/apigee-qpidd.log
  • יומני PostgreSQL: /opt/apigee/var/log/apigee-postgresql/apigee-postgresql.log
  • יומנים של שרת Edge-qpid: /opt/apigee/var/log/edge-qpid-server/logs/system.log
  • יומנים של שרת Edge-postgres: /opt/apigee/var/log/edge-postgres-server/logs/system.log
  • נתונים סטטיסטיים של תור Qpidd:

    /opt/apigee/apigee-qpidd/bin/qpid-stat -q
  • קבוצת Analytics שמוחזרת על ידי פקודת ה-curl הבאה:

    curl -u sysadminEmail:password http://mgmt:8080/v1/analytics/groups/ax