שיטות מומלצות לשימוש במערכת התמיכה של Google Cloud Apigee

אתם צופים במסמכי התיעוד של Apigee ושל Apigee Hybrid.
לעיון במסמכי התיעוד של Apigee Edge.

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

תיאור הבעיה

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

Key information תיאור ‫Apigee ב-Google Cloud Apigee Hybrid
מוצר המוצר הספציפי של Apigee שבו נצפתה הבעיה, כולל פרטי הגרסה אם רלוונטי.
  • גרסה היברידית
פרטי הבעיה תיאור ברור ומפורט של הבעיה, כולל הודעת השגיאה המלאה, אם יש כזו.
  • הודעת השגיאה
  • פלט של כלי לניפוי באגים
  • השלבים לשחזור הבעיה
  • השלמת בקשת API או פקודה
  • הודעת השגיאה
  • פלט של כלי לניפוי באגים
  • השלבים לשחזור הבעיה
  • השלמת בקשת API או פקודה
  • יומני אבחון של רכיבים
  • מדדים של Cloud Monitoring
שעה חותמת הזמן הספציפית שבה הבעיה התחילה וכמה זמן היא נמשכה.
  • התאריך, השעה ואזור הזמן שבהם הבעיה התרחשה
  • משך הבעיה
  • התאריך, השעה ואזור הזמן שבהם הבעיה התרחשה
  • משך הבעיה
הגדרה מידע מפורט על המקום שבו הבעיה מתרחשת.
  • שם הארגון
  • שם הסביבה
  • שם ה-proxy ל-API
  • גרסה קודמת

בחלקים הבאים נרחיב על כך בפירוט.

מוצר

יש מוצרים שונים של Apigee, ‏ Apigee ב-Google Cloud ו-Apigee hybrid, ולכן אנחנו צריכים מידע ספציפי לגבי המוצר שבו הייתה הבעיה.

בטבלה הבאה מופיעות כמה דוגמאות למידע מלא בעמודה DOs ולמידע חלקי בעמודה DON'Ts:

DOs מה לא לעשות
הפריסה של ה-proxy ל-API‏ OAuth2 נכשלה בארגון Apigee on Google Cloud ...

הפריסה של proxy ל-API נכשלה

(אנחנו צריכים לדעת באיזה מוצר של Apigee נתקלת בבעיה).

קיבלנו את השגיאה הבאה כשניסינו לגשת ל-Cassandra באמצעות cqlsh ב-Apigee hybrid גרסה 1.3 ...

אין לנו גישה ל-Cassandra באמצעות cqlsh.

(חסרים פרטי הגרסה ההיברידית)

פרטי הבעיה

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

בטבלה הבאה מופיעות כמה דוגמאות למידע מלא בעמודה DOs ולמידע חלקי בעמודה DON'Ts:

DOs מה לא לעשות

שרת ה-proxy החדש edgemicro נכשל עם השגיאה הבאה:edgemicro_auth

{"error":"missing_authorization","error_description":"Missing Authorization header"}

שרת proxy חדש של edgemicro שנוצר היום לא פועל

(שם ה-proxy לא ידוע. לא ברור אם ה-proxy מחזיר שגיאה או תגובה לא צפויה כלשהי).

הלקוחות שלנו מקבלים שגיאות 500 עם הודעת השגיאה הבאה בזמן שליחת בקשות ל-proxy ל-API:

{"fault":{"faultstring":"Execution of JSReadResponse failed with error: Javascript runtime error: \"TypeError: Cannot read property \"content\" from undefined. (JSReadResponse.js:23)","detail":{"errorcode":"steps.javascript.ScriptExecutionFailed"}}}

הלקוחות שלנו מקבלים שגיאות 500 כשהם שולחים בקשות ל-proxy ל-API.

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

שעה

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

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

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

DOs מה לא לעשות
נצפה מספר גדול של 503s אתמול בין 2020-11-06 17:30 PDT לבין 2020-11-06 17:35 PDT...

מספר עצום של 503s נצפו אתמול בשעה 17:30 למשך 5 דקות.

(אנחנו נאלצים להשתמש בתאריך המשתמע, וגם לא ברור באיזו אזור זמן הבעיה הזו נצפתה).

נצפו זמני אחזור ארוכים בשרתי proxy של ה-API הבאים מ-2020-11-09 15:30 IST עד 2020-11-09 18:10 IST ...

בשבוע שעבר נצפו זמני אחזור ארוכים בחלק משרתי ה-API Proxy.

(לא ברור באיזה יום ובמשך כמה זמן הבעיה הזו נצפתה בשבוע האחרון).

הגדרה

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

  • אם אתם משתמשים ב-Apigee ב-Google Cloud, יכול להיות שיש לכם יותר מארגון אחד, ולכן אנחנו צריכים לדעת את הארגון הספציפי ופרטים נוספים שקשורים לבעיה שזיהיתם:
    • שמות הארגון והסביבה
    • שם ה-proxy ל-API ומספרי הגרסאות (לגבי כשלים בבקשות ל-API)
  • אם אתם משתמשים בהגדרה היברידית, יכול להיות שאתם משתמשים באחת מ פלטפורמות היברידיות רבות נתמכות ובטופולוגיות התקנה. לכן אנחנו צריכים לדעת באיזו פלטפורמה היברידית ובאיזו טופולוגיה אתם משתמשים, כולל פרטים כמו מספר מרכזי הנתונים והצמתים.

בטבלה הבאה מופיעות דוגמאות למידע מלא בעמודה DOs ולמידע חלקי בעמודה DON'Ts:

DOs מה לא לעשות

401 מספר השגיאות ב-Apigee ב-Google Cloud עלה מאז 2020-11-06 09:30 CST.

פרטי ההגדרה של Apigee:

פרטי ה-API שנכשל:
  שמות הארגונים: myorg
  שמות הסביבות: test
  שמות ה-proxy ל-API: myproxy
  מספרי הגרסאות: 3

שגיאה:

{"fault":{"faultstring":"Failed to resolve API Key variable request.header.X-APP-API_KEY","detail":{"errorcode":"steps.oauth.v2.FailedToResolveAPIKey"}}}

מספר השגיאות עלה.401

(היא לא מספקת מידע על המוצר שבו נעשה שימוש, על התקופה שבה הבעיה נצפתה או על פרטי ההגדרה).

ניפוי הבאגים נכשל עם השגיאה הבאה ב-Apigee Hybrid גרסה 1.3

שגיאה:

Error while Creating trace session for corp-apigwy-discovery, revision 3, environment dev.

Failed to create DebugSession {apigee-hybrid-123456 dev corp-apigwy-discovery 3 ca37384e-d3f4-4971-9adb-dcc36c392bb1}

פרטי ההגדרה של Apigee Hybrid:

  • פלטפורמת Apigee Hybrid:
      Anthos GKE on-prem גרסה 1.4.0
  • פרויקט ב-Google Cloud, ארגון וסביבה היברידיים
      מזהה פרויקט ב-Google Cloud: apigee-hybrid-123456
      ארגון Apigee Hybrid: apigee-hybrid-123456
      סביבת Apigee Hybrid: dev
  • פרטים על שם אשכול Kubernetes
      k8sCluster:
      name: user-cluster-1
      region: us-east1
  • טופולוגיה של הרשת
    הקובץ network-topology.png צורף.
ניפוי הבאגים נכשל ב-Apigee Hybrid.

קבצים נלווים

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

בקטע הזה מתוארים כמה ארטיפקטים שימושיים שרלוונטיים לכל מוצרי Apigee:

פריטי מידע שנוצרו בתהליך הפיתוח (Artifact) משותפים לכל מוצרי Apigee

הארטיפקטים הבאים שימושיים לכל מוצרי Apigee: ‫Apigee ב-Google Cloud ו-Apigee hybrid:

פריט מידע שנוצר בתהליך תיאור
פלט של כלי לניפוי באגים הפלט של כלי הניפוי מכיל מידע מפורט על בקשות ה-API שמועברות דרך מוצרי Apigee. האפשרות הזו שימושית לכל שגיאות זמן הריצה, כמו 4XX, ‏ 5XX ובעיות בזמן האחזור.
צילומי מסך צילומי מסך עוזרים להעביר את ההקשר של ההתנהגות או השגיאה בפועל שנצפו. הוא יכול לעזור לכם לפתור שגיאות או בעיות שזיהיתם, למשל בממשק המשתמש או ב-Analytics.
HAR (Http ARchive) קובץ HAR הוא קובץ שמתועד על ידי כלים של סשנים ב-HTTP לצורך ניפוי באגים שקשורים לממשק המשתמש. אפשר לצלם את המסך באמצעות דפדפנים כמו Chrome,‏ Firefox או Internet Explorer.
tcpdumps הכלי tcpdump מתעד חבילות TCP/IP שהועברו או התקבלו ברשת. האפשרות הזו שימושית לפתרון בעיות שקשורות לרשת, כמו כשלים בתהליך הלחיצה של TLS, שגיאות 502 ובעיות של זמן אחזור וכו'.

פריטי מידע נוספים שנוצרו בתהליך פיתוח (Artifact) עבור סביבה היברידית

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

פריט מידע שנוצר בתהליך תיאור
פלטפורמת Apigee Hybrid מציינים את אחת מ פלטפורמות ההיברידיות הנתמכות שבהן נעשה שימוש:
  • GKE
  • GKE on-prem
  • ‫AKS (Azure Kubernetes Service)
  • Amazon EKS
  • ‫GKE ב-AWS
גרסאות של Apigee Hybrid ושל רכיבים תלויים
  • גרסת ה-CLI של Apigee Hybrid:
    apigeectl version
  • גרסת Apigee Connect Agent:
    kubectl -n=apigee get pods -l app=apigee-connect-agent -o=json | jq '.items[].spec.containers[].image'
  • גרסת Apigee MART:
    kubectl -n=apigee get pods -l app=apigee-mart -o=json | jq '.items[].spec.containers[].image'
  • גרסת Apigee Synchronizer:
    kubectl -n=apigee get pods -l app=apigee-synchronizer -o=json | jq '.items[].spec.containers[].image'
  • גרסת Apigee Cassandra:
    kubectl -n=apigee get pods -l app=apigee-cassandra -o=json | jq '.items[].spec.containers[].image'
  • גרסת Apigee Runtime:
    kubectl -n=apigee get pods -l app=apigee-runtime -o=json | jq '.items[].spec.containers[].image'
  • גרסאות ה-CLI והשרת של Kubernetes:
    kubectl version
  • גרסאות של שרת ו-CLI של Istio:
    istioctl version
הטופולוגיה של הרשת תרשים טופולוגיית ההתקנה של Apigee שמתאר את ההגדרה ההיברידית, כולל כל מרכזי הנתונים, אשכולות Kubernetes, מרחבי השמות וה-Pods.
קובץ YAML של שינויים מברירת המחדל קובץ overrides.yaml שמשמש בכל מרכז נתונים להתקנת מישור זמן הריצה של Apigee Hybrid.
הסטטוס של הפריסה של Apigee Hybrid

הפלט של הפקודות הבאות בכל מרכז נתונים או אשכול Kubernetes:

kubectl get pods -A
kubectl get services -A

יומני רכיבים של Apigee Hybrid

צריך לספק קישורים ליומנים של Cloud Operations ‏ (StackDriver) עבור הרכיבים ההיברידיים או

אפשר לאחזר את יומני הרכיבים של Apigee hybrid באמצעות הפקודות הבאות בכל מרכז נתונים או אשכול Kubernetes ולשתף אותם איתנו:

kubectl -n {namespace} get pods
kubectl -n {namespace} logs {pod-name}

  • יומנים של Apigee Connect Agent:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-connect-agent-pod-name}
  • יומני MART:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-mart-pod-name}
  • יומני סנכרון:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {synchronizer-pod-name}
  • יומני Cassandra של Apigee:
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-cassandra-pod-name}
  • יומני MP/Apigee Runtime (של כל הפודים של apigee-runtime):
    kubectl -n {namespace} get pods
    kubectl -n {namespace} logs {apigee-runtime-pod-name}
תיאור של יומנים

מידע מפורט על הפוד.

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

kubectl -n apigee describe pod {pod-name}

Cloud Monitoring
  • קישור ללוח הבקרה של המדדים
  • תמונות מצב של לוחות בקרה שקשורים למדדים של Cloud Monitoring.

Apigee Hybrid must-gather

אפשר גם להריץ את סקריפט Must-Gather על סמך הפקודות שמפורטות בהמשך.

###--- "kubectl config" commands to get the config details of the whole Apigee Hybrid cluster ---####

kubectl config get-clusters 2>&1 | tee /tmp/k_config_get_clusters_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl config get-contexts 2>&1 | tee /tmp/k_config_get_contexts_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl config get-users 2>&1 | tee /tmp/k_config_get_users_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl config view 2>&1 | tee /tmp/k_config_view_$(date +%Y.%m.%d_%H.%M.%S).txt

### --- Collect all details of all nodes in the Kubernetes cluster.---###

kubectl describe node 2>&1 |  tee /tmp/k_describe_node_$(date +%Y.%m.%d_%H.%M.%S).txt

###--- "kubectl get -A " commands to get CRD details for the whole Apigee Hybrid setup ---####

kubectl get clusterissuers -A -o wide 2>&1 | tee /tmp/k_get_clusterissuers_all$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get certificate -A -o wide 2>&1 | tee /tmp/k_get_certificate_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get certificaterequest -A -o wide 2>&1 | tee /tmp/k_get_certificaterequest_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get crd -A -o yaml 2>&1 | tee /tmp/k_get_crd_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ConfigMap -A 2>&1 | tee /tmp/k_get_ConfigMap_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ClusterRole -A -o wide 2>&1 | tee /tmp/k_get_clusterrole_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ClusterRoleBinding -A -o wide 2>&1 | tee /tmp/k_get_clusterrole_binding_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get Deployments -A -o wide >&1 | tee /tmp/k_get_deployments_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get events -A -o wide 2>&1 | tee /tmp/k_get_events_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get endpoints -A  2>&1 | tee /tmp/k_get_endpoints_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get issuers -A -o wide 2>&1 | tee /tmp/k_get_issuers_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get mutatingwebhookconfigurations  2>&1 | tee /tmp/k_get_mutatingwebhookconfigurations_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get nodes -o wide --show-labels 2>&1 | tee /tmp/k_get_nodes_labels_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ns 2>&1 | tee /tmp/k_get_namespace_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get PriorityClass -A -o wide 2>&1 | tee /tmp/k_get_PriorityClass_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get pv -A -o wide 2>&1 | tee /tmp/k_get_pv_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get pvc -A -o wide 2>&1 | tee /tmp/k_get_pvc_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get Role -A -o wide 2>&1 | tee /tmp/k_get_role_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get RoleBinding -A -o wide 2>&1 | tee /tmp/k_get_Role_Binding_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get replicaset -A -o wide 2>&1 | tee /tmp/k_get_replicaset_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get sa -A -o wide 2>&1 | tee /tmp/k_get_service_accounts_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get services -A -o wide 2>&1 | tee /tmp/k_get_services_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get svc -A 2>&1 | tee /tmp/k_get_svc_all$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get secrets -A 2>&1 | tee /tmp/k_get_secrets_all_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get validatingwebhookconfigurations -A  2>&1  | tee /tmp/k_get_validatingwebhookconfigurations_all$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get validatingwebhookconfigurations apigee-validating-webhook-configuration 2>&1  | tee /tmp/k_get_apigee-validating-webhook-configuration_$(date +%Y.%m.%d_%H.%M.%S).txt

### --- List top resource consuming nodes and pods ---####

kubectl top nodes 2>&1 | tee /tmp/k_top_nodes_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl top pod -A --containers 2>&1 | tee /tmp/k_top_pod_all_containers_$(date +%Y.%m.%d_%H.%M.%S).txt

###----- "kubectl get" commands to fetch list of all CRD for "apigee" namespace ----- #####

kubectl get all -n apigee -o wide 2>&1 | tee /tmp/k_get_all_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ad -n apigee 2>&1 | tee /tmp/k_get_ad_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get apigeeorganization -n apigee 2>&1 | tee /tmp/k_get_apigeeorganization_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get apigeeenv -n apigee  2>&1 | tee /tmp/k_get_apigeeenv_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get apigeeds -n apigee  2>&1 | tee /tmp/k_get_apigeeds_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get apigeedatastore -n apigee 2>&1 | tee /tmp/k_get_apigeedatastore_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ApigeeDeployment -n apigee 2>&1 | tee /tmp/k_get_apigeedeployment_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ApigeeRedis -n apigee 2>&1 | tee /tmp/k_get_ApigeeRedis_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ApigeeRoute -n apigee 2>&1 | tee /tmp/k_get_ApigeeRoute_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ApigeeRouteConfig -n apigee 2>&1 | tee /tmp/k_get_ApigeeRoutesconfig_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get Apigeetelemetry -n apigee 2>&1 | tee /tmp/k_get_Apigeetelemetry_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get apigeeissues -n apigee 2>&1 | tee /tmp/k_get_apigeeissues_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get ControllerRevision -n apigee -o wide 2>&1 | tee /tmp/k_get_ControllerRevision_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get cronjob -n apigee -o wide 2>&1 | tee /tmp/k_get_cronjob_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get gateway -n apigee 2>&1 | tee /tmp/k_get_gateway_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get PodDisruptionBudget -n apigee -o wide 2>&1 | tee /tmp/k_get_PodDisruptionBudget_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get sc -n apigee -o wide 2>&1 | tee /tmp/k_get_storageclass_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get sr -n apigee -o wide 2>&1 | tee /tmp/k_get_sr_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get sts -n apigee 2>&1 | tee /tmp/k_get_sts_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get volumesnapshot -n apigee -o wide 2>&1 | tee /tmp/k_get_volumesnapshot_n_apigee_$(date +%Y.%m.%d_%H.%M.%S).txt

###----- "kubectl describe" commands to fetch details of all CRD for "apigee" namespace ----- #####

for p in $(kubectl -n apigee get apigeeorganization --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeorganization ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeorganization_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get apigeeenv --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeenv ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeenv_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get apigeeds --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeds ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeds_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get apigeedatastore --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeedatastore ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeedatastore_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get ApigeeDeployment --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeDeployment ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeDeployment_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get ApigeeRedis --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeRedis ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeRedis_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get ApigeeRoute --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeRoute ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeRoute_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get ApigeeRouteConfig --no-headers -o custom-columns=":metadata.name") ; do kubectl describe ApigeeRouteConfig ${p} -n apigee 2>&1 | tee /tmp/k_desc_ApigeeRouteConfig_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get Apigeetelemetry --no-headers -o custom-columns=":metadata.name") ; do kubectl describe Apigeetelemetry ${p} -n apigee 2>&1 | tee /tmp/k_desc_Apigeetelemetry_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get apigeeissues --no-headers -o custom-columns=":metadata.name") ; do kubectl describe apigeeissues ${p} -n apigee 2>&1 | tee /tmp/k_desc_apigeeissues_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get ControllerRevision --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe ControllerRevision ${p} 2>&1 | tee /tmp/k_desc_ControllerRevision_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get certificate --no-headers -o custom-columns=":metadata.name") ; do kubectl describe certificate ${p} -n apigee 2>&1 | tee /tmp/k_desc_certificate_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get cronjob --no-headers -o custom-columns=":metadata.name") ; do kubectl describe cronjob ${p} -n apigee 2>&1 | tee /tmp/k_desc_cronjob_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get daemonset --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe daemonset ${p} 2>&1 | tee /tmp/k_desc_daemonset_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get deployments --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe deployments ${p} 2>&1 | tee /tmp/k_desc_deployment_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get hpa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe hpa ${p} -n apigee 2>&1 | tee /tmp/k_desc_hpa_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get jobs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe jobs ${p} -n apigee 2>&1 | tee /tmp/k_desc_jobs_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe po ${p} 2>&1 | tee /tmp/k_desc_pod_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get PodDisruptionBudget --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe PodDisruptionBudget ${p} 2>&1 | tee /tmp/k_desc_PodDisruptionBudget_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get pv --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe pv ${p} 2>&1 | tee /tmp/k_desc_pv_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done
for p in $(kubectl -n apigee get pvc --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe pvc ${p} 2>&1 | tee /tmp/k_desc_pvc_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done
for p in $(kubectl -n apigee get rs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rs ${p} -n apigee 2>&1 | tee /tmp/k_desc_replicaset_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get sc --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe sc ${p} 2>&1 | tee /tmp/k_desc_storageclass_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done
for p in $(kubectl -n apigee get sts --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sts ${p} -n apigee 2>&1 | tee /tmp/k_desc_sts_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get secrets --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee describe secrets ${p} 2>&1 | tee /tmp/k_desc_secrets_n_apigee${p}_$(date +%Y.%m.%d_%H.%M.%S).txt; done
for p in $(kubectl -n apigee get services --no-headers -o custom-columns=":metadata.name") ; do kubectl describe service ${p} -n apigee 2>&1 | tee /tmp/k_desc_services_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get sa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sa ${p} -n apigee 2>&1 | tee /tmp/k_desc_service_account_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee get svc --no-headers -o custom-columns=":metadata.name") ; do kubectl describe svc ${p} -n apigee 2>&1 | tee /tmp/k_desc_svc_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done

###----- "kubectl logs" command to fetch logs of all containers in the "apigee" namespace ----- #####

for p in $(kubectl -n apigee get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee logs ${p} --all-containers 2>&1 | tee /tmp/k_logs_n_apigee_${p}_$(date +%Y.%m.%d_%H.%M.%S).log ; done

###----- "kubectl get" commands for "apigee-system" namespace ----- #####

kubectl get all -n apigee-system -o wide 2>&1 | tee /tmp/k_get_all_n_apigee_system_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get jobs -o wide -n apigee-system 2>&1 | tee /tmp/k_get_jobs_n_apigee_system_$(date +%Y.%m.%d_%H.%M.%S).txt

###----- "kubectl describe" commands for "apigee-system" namespace ----- #####

for p in $(kubectl -n apigee-system get certificate --no-headers -o custom-columns=":metadata.name") ; do kubectl describe certificate ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_certificate_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get deployment --no-headers -o custom-columns=":metadata.name") ; do kubectl describe deployment ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_deployment_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get jobs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe jobs ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_jobs_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee-system describe po ${p} 2>&1 | tee /tmp/k_desc_pod_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get rs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rs ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_replicaset_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get rolebinding --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rolebinding ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_rolebinding_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get services --no-headers -o custom-columns=":metadata.name") ; do kubectl describe service ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_services_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get sa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sa ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_serviceaccount_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n apigee-system get secrets --no-headers -o custom-columns=":metadata.name") ; do kubectl describe secrets ${p} -n apigee-system 2>&1 | tee /tmp/k_desc_secrets_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done

###----- "kubectl logs" command for "apigee-system" namespace ----- #####

for p in $(kubectl -n apigee-system get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n apigee-system logs ${p} --all-containers 2>&1 | tee /tmp/k_logs_n_apigee_system_${p}_$(date +%Y.%m.%d_%H.%M.%S).log ; done

###----- "kubectl get" command for "cert-manager" namespace ----- #####

kubectl get all -n cert-manager -o wide 2>&1 | tee /tmp/k_get_all_n_cert_manager_$(date +%Y.%m.%d_%H.%M.%S).txt
kubectl get crd -n cert-manager 2>&1 | tee /tmp/k_get_crd_n_cert_manager_$(date +%Y.%m.%d_%H.%M.%S).txt

###----- "kubectl describe" command for "cert-manager" namespace ----- #####

for p in $(kubectl -n cert-manager get deployment  --no-headers -o custom-columns=":metadata.name") ; do kubectl -n cert-manager describe deployment $(p) 2>&1 | tee /tmp/k_desc_deployment_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get endpoints --no-headers -o custom-columns=":metadata.name") ; do kubectl describe endpoints ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_endpoints_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n cert-manager describe po ${p} 2>&1 | tee /tmp/k_desc_po_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get rs --no-headers -o custom-columns=":metadata.name") ; do kubectl describe rs ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_replicaset_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get sa --no-headers -o custom-columns=":metadata.name") ; do kubectl describe sa ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_serviceaccount_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get secrets --no-headers -o custom-columns=":metadata.name") ; do kubectl describe secrets ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_secrets_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get services --no-headers -o custom-columns=":metadata.name") ; do kubectl describe service ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_service_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done
for p in $(kubectl -n cert-manager get svc --no-headers -o custom-columns=":metadata.name") ; do kubectl describe svc ${p} -n cert-manager 2>&1 | tee /tmp/k_desc_svc_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).txt ; done

###----- "kubectl logs" command for "cert-manager" namespace ----- #####

for p in $(kubectl -n cert-manager get po --no-headers -o custom-columns=":metadata.name") ; do kubectl -n cert-manager logs ${p} --all-containers 2>&1 | tee /tmp/k_logs_n_cert_manager_${p}_$(date +%Y.%m.%d_%H.%M.%S).log ; done

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

	# tar -cvzf /tmp/apigee_hybrid_logs_$(date +%Y.%m.%d_%H.%M).tar.gz /tmp/k_*

אם גודל קובץ ה-TAR גדול מ-25MB, אפשר להעלות אותו ל-Google Drive ולשתף איתנו את הקישור. אפשר גם להשתמש בפקודה split כדי לפצל את הקבצים הגדולים לחלקים של 25MB שאפשר להעלות לפורטל התמיכה.

	# split -b 25M diagnostic.tar.gz "diagnostic.tar.gz.part"

Apigee hybrid Cassandra must-gather

איסוף נתונים בסיסיים

עליך לספק את הפרטים הבאים:

  • פלטפורמת Apigee Hybrid (GKE,‏ GKE בארגון, AKS,‏ EKS וכו')
  • גרסת Apigee Hybrid
  • מזהה פרויקט בענן של Google
  • ארגון Apigee Hybrid
  • סביבת Apigee Hybrid
  • האם מדובר בפריסה באזור אחד או בכמה אזורים?
  • קובץ overrides.yaml (אחד לכל אשכול)
  • כמה ארגונים ב-Apigee Hybrid מותקנים באותו אשכול?
  • האם נעשו שינויים לאחרונה?

איסוף מידע על תוצאות ניפוי הבאגים ב-Cassandra

Run the below script to capture Cassandra debugging information from an Apigee hybrid cluster:


# Create a temporary directory to store the Cassandra debugging information.
mkdir /tmp/apigee-cassandra-debug-info/

# Loop through all Cassandra pods
for APIGEE_CASSANDRA_POD in $(kubectl -n apigee get pods -l app=apigee-cassandra --no-headers -o custom-columns=":metadata.name") ; do

  # Get Cassandra version
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD version' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_version_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt

  # Get Cassandra datacenter status
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD status' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_status_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt

  # Get Cassandra cluster information
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD describecluster' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_describecluster_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt

  # Get current ring/token status across the datacenter
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD ring' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_ring_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt

  # Get more information about heap usage, uptime, exceptions, etc
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD info' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_info_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt

  # Get gossip info
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD gossipinfo' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_gossipinfo_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt

  # Get Cassandra compaction details
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD compactionstats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_compactionstats_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD compactionhistory' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_compactionhistory_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD getcompactionthroughput' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_getcompactionthroughput_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD getconcurrentcompactors' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_getconcurrentcompactors_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt

  # Get status of current Cassandra operations
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD tablestats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_tablestats_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD tpstats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_tpstats_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD netstats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_netstat_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD tablestats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_tablestats_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD gcstats' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_gcstats_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt

  # Get proxy histograms (shows the full request latency recorded by the coordinator)
  kubectl -n apigee exec $APIGEE_CASSANDRA_POD -- bash -c 'nodetool -u $APIGEE_JMX_USER -pw $APIGEE_JMX_PASSWORD proxyhistograms' 2>&1 | tee /tmp/apigee-cassandra-debug-info/nodetool_proxyhistograms_$APIGEE_CASSANDRA_POD-$(date +%Y.%m.%d_%H.%M.%S).txt

done

# compress all collected data
tar -czvf apigee-cassandra-debug-info-$(date +%Y.%m.%d_%H.%M.%S).tar.gz -C /tmp apigee-cassandra-debug-info

תבניות של בקשות תמיכה ובקשות תמיכה לדוגמה

בסעיף הזה מפורטות תבניות של פניות ותבניות לדוגמה של פניות למוצרים שונים, על סמך השיטות המומלצות שמתוארות במסמך הזה:

Apigee Cloud

תבנית

בקטע הזה מופיעה תבנית לדוגמה של Apigee ב-Google Cloud.

הבעיה:

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

הודעת שגיאה:

<Include the complete error message observed (if any)>

שעת ההתחלה של הבעיה (בפורמט ISO 8601):

שעת הסיום של הבעיה (בפורמט ISO 8601):

פרטי ההגדרה של Apigee:
  שמות הארגונים:
  שמות הסביבות:
  שמות ה-proxy ל-API:
  מספרי הגרסאות:

צעדים לשחזור:

<כאן צריך לציין את השלבים לשחזור הבעיה, אם אפשר>

מידע אבחוני:

<רשימת הקבצים המצורפים>

דוגמה לבקשת תמיכה

בקטע הזה מופיעה דוגמה לבקשת תמיכה ב-Apigee ב-Google Cloud.

הבעיה:

אנחנו רואים מספר גבוה של שגיאות מסוג 503 (השירות לא זמין) בארגון Public Cloud שלנו. אפשר לבדוק את הבעיה ולפתור אותה או להסביר לנו איך לפתור אותה?

הודעת שגיאה:

{"fault":{"faultstring":"The Service is temporarily available", "detail":{"errorcode":"messaging.adaptors.http.flow.ServiceUnavailable"}}}

שעת ההתחלה של הבעיה (בפורמט ISO 8601): 2020-10-04 06:30 IST

שעת סיום הבעיה (בפורמט ISO 8601): הבעיה עדיין מתרחשת.

פרטים על ההגדרה של Apigee Cloud:
  שמות הארגונים: myorg
  שמות הסביבות: dev
  שמות ה-proxy ל-API: myproxy
  מספרי הגרסאות: 3

צעדים לשחזור:

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

curl -X GET 'https://myorg-dev.apigee.net/v1/myproxy'

מידע אבחוני:

פלט של כלי לניפוי באגים (trace-503.xml)

היברידי

תבנית

בקטע הזה מופיעה תבנית לדוגמה ל-Apigee Hybrid.

הבעיה:

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

הודעת שגיאה:

<Include the complete error message observed (if any)>

שעת ההתחלה של הבעיה (בפורמט ISO 8601):

שעת הסיום של הבעיה (בפורמט ISO 8601):

פרטי ההגדרה של Apigee Hybrid:

  • פלטפורמת Apigee Hybrid:

    <כאן צריך לספק מידע על הפלטפורמה שבה התקנת את הגרסה ההיברידית ואת הגרסה שלה.>

  • פרויקט Google Cloud, ארגון וסביבה היברידיים:
      מזהה פרויקט Google Cloud:
      <אם אתם משתמשים ב-Google Kubernetes Engine‏ (GKE), חשוב לציין את מזהה הפרויקט שבו נמצאים האשכולות. אם אתם משתמשים ב-GKE On-Prem, ב-Azure Kubernetes Service או ב-Amazon EKS, עליכם לציין את מזהה הפרויקט שאליו אתם שולחים את היומנים.>
      Apigee hybrid org:
      Apigee hybrid env:
  • Apigee Hybrid וגרסאות אחרות של CLI:
      גרסת Apigee Hybrid CLI ‏ (apigeectl):
      גרסת Kubectl:
  • פרטים על שם אשכול Kubernetes:
      k8sCluster:
      name:
      region:
  • טופולוגיית הרשת:
    <Attach the network topology describing the setup of your Apigee hybrid including data centers, Kubernetes clusters, namespaces, and pods.>
  • קובץ YAML של שינויים:
    <Attach the Overrides YAML file.>

שלבים לשחזור

<כאן צריך לציין את השלבים לשחזור הבעיה, אם אפשר>

מידע אבחוני:

<רשימת הקבצים המצורפים>

דוגמה לבקשת תמיכה

בקטע הזה מופיעה דוגמה לתרחיש שימוש ב-Apigee Hybrid.

הבעיה:

אנחנו מקבלים שגיאות כשמבצעים ממשקי API לניהול ב-Apigee hybrid version 1.3.

הודעת שגיאה:

[ERROR] 400 Bad Request
{
"error": {
"code": 400,
"message": "Error processing MART request: INTERNAL_ERROR",
"errors": [
{
"message": "Error processing MART request: INTERNAL_ERROR",
"domain": "global",
"reason": "failedPrecondition"
}
],
"status": "FAILED_PRECONDITION"
}
}

שעת ההתחלה של הבעיה (בפורמט ISO 8601): מאז 2020-10-24 10:30 PDT

שעת סיום הבעיה (בפורמט ISO 8601): הבעיה עדיין מתרחשת.

פרטי ההגדרה של Apigee Hybrid:

  • פלטפורמת Apigee Hybrid
    גרסת GKE‏ 1.15.1
  • פרויקט ב-Google Cloud, ארגון וסביבה היברידיים
      מזהה הפרויקט ב-Google Cloud: ‏ apigee-hybrid-123456
      הערה: זהו מזהה הפרויקט שבו נמצאים האשכולות.
      הארגון ב-Apigee Hybrid: apigee-hybrid-123456
      הסביבה ב-Apigee Hybrid: dev
  • גרסאות של Apigee Hybrid ושל CLI אחרים:
      גרסת Apigee Hybrid CLI ‏ (apigeectl):
        גרסה: 1.2.0
        Commit: ac09109
        מזהה Build: ‏214
        זמן Build: ‏2020-03-30T20:23:36Z
        גרסת Go: ‏go1.12

      גרסת Kubectl:
        גרסת לקוח:
    version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.0", GitCommit:"e8462b5b5dc2584fdcd18e6bcfe9f1e4d970a529", GitTreeState:"clean", BuildDate:"2019-06-19T16:40:16Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"darwin/amd64"}

        גרסת השרת:
    version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.10-gke.36", GitCommit:"34a615f32e9a0c9e97cdb9f749adb392758349a6", GitTreeState:"clean",
  • פרטים על שם אשכול Kubernetes:
      k8sCluster:
      name: user-cluster-1
      region: us-east1
  • טופולוגיה של הרשת
    הקובץ network-topology.png צורף
  • קובץ YAML של שינוי ברירת המחדל
    קובץ מצורף overrides.yaml

צעדים לשחזור:

מריצים את Management API הבא כדי לראות את השגיאה:

curl -X GET --header "Authorization: Bearer <TOKEN>" "https://apigee.googleapis.com/v1/organizations/apigee-hybrid-123456/environments/dev/keyvaluemaps"

מידע אבחוני:

הקבצים הבאים צורפו:

  • network-topology.png
  • overrides.yaml file
  • יומני MART
  • יומני סנכרון