現在、Apigee と Apigee ハイブリッドのドキュメントを表示しています。
Apigee Edge のドキュメントはこちらをご覧ください。
サポートケースに詳細と必須情報を記載していただければ、Google Cloud サポートチームが迅速かつ効率的に対応できるようになります。サポートケースに重要な詳細が欠落していると、追加の情報をリクエストする必要性が生じます。こうなると、複数回のやり取りが発生する可能性があります。このやり取りは時間を要するため、問題解決が遅れてしまう可能性があります。このベスト プラクティス ガイドでは、テクニカル サポートケースを迅速に解決するために必要な情報について説明します。
問題の説明
問題には、何が発生したか(および何が発生すると想定されていたか)、いつ、どのように発生したかに関する詳細を説明する情報を含める必要があります。適切なサポートケースには、Apigee の各プロダクトに関する以下の主要な情報が記載される必要があります。
主な情報 | 説明 | Apigee on Google Cloud | Apigee ハイブリッド |
---|---|---|---|
プロダクト | 問題が発生している具体的な Apigee プロダクト(可能な場合はバージョン情報も記載)。 |
|
|
問題の詳細 | 問題を概説する明確で詳細な説明(ある場合はエラーメッセージの全文も記載)。 |
|
|
時間 | 問題が発生した具体的なタイムスタンプと問題の持続時間。 |
|
|
設定 | 問題の発生場所に関する詳細情報 |
|
|
次のセクションで、これらのコンセプトについて詳しく説明します。
プロダクト
さまざまな Apigee プロダクト(Apigee on Google Cloud と Apigee ハイブリッド)があるため、どのプロダクトで問題が発生しているかに関する具体的な情報が必要です。
次の表はいくつかの例を示しています。DOs 列は完全な情報を、DON'Ts 列は不完全な情報を示しています。
DOs | DON'Ts |
---|---|
Apigee on Google Cloud 組織で API プロキシ OAuth2 をデプロイできませんでした。 |
API プロキシをデプロイできませんでした (問題が発生している Apigee プロダクトをお知らせください。) |
Apigee ハイブリッド バージョン 1.3 で cqlsh を使用して Cassandra にアクセスすると、以下のエラーが発生します... |
(ハイブリッド バージョンの情報が欠落しています) |
問題の詳細
エラー メッセージ(ある場合)、想定されていた挙動、実際に確認された挙動など、確認される問題に関する情報を正確に提供します。
次の表はいくつかの例を示しています。DOs 列は完全な情報を、DON'Ts 列は不完全な情報を示しています。
DOs | DON'Ts |
---|---|
新しい
|
今日作成された新しい (プロキシ名が不明です。プロキシがエラーを返しているか、予期しないレスポンスを返しているか不明瞭です。) |
クライアントが、API プロキシへのリクエスト中に次のエラー メッセージで
|
クライアントが、API プロキシへのリクエスト中に
( |
時間
時間は非常に重要な情報です。この問題に最初に気付いたのはいつか、問題がどの程度継続したか、まだ問題が継続中かをサポート エンジニアに知らせることが重要です。
問題を解決するサポート エンジニアがお客様と同じタイムゾーンにいない場合もあります。そのため、時間を相対的に説明してしまうと、問題の診断が難しくなります。そのため、ISO 8601 形式で日時を指定し、問題がいつ発生したかに関する情報を正確に伝えることをおすすめします。
次の表で例をいくつか示します。DOs 列は問題が発生した正確な時刻と期間を、DON'Ts 列には問題が発生した時間に関するあいまいで不正確な情報を示しています。
DOs | DON'Ts |
---|---|
昨日の 2020-11-06 17:30 PDT から 2020-11-06 17:35 PDT の間に、多数の 503s が確認されました。 |
昨日午後 5 時 30 分に多数の (暗示的に指定されたこの日付形式を使用せざるを得なくなります。また、この問題が確認された時刻のタイムゾーンが不明瞭です。) |
2020-11-09 15:30 IST から 2020-11-09 18:10 IST までの間に、以下の API プロキシで高いレイテンシが確認されました。 |
先週、一部の API プロキシで高いレイテンシが確認されました。 (この問題が先週のどの日に確認されたか、どの程度持続したかが不明瞭です。) |
設定
問題が発生している場所に関する詳細をお知らせください。使用しているプロダクトに応じて、次の情報が必要です。
- Apigee on Google Cloud を使用している場合は、複数の組織が存在する可能性があるため、問題が発生している組織やその他の詳細を具体的に把握する必要があります。
- 組織名と環境名
- API プロキシ名とリビジョン番号(API リクエストの失敗の場合)
- ハイブリッドを使用している場合、サポートされている数多くのハイブリッド プラットフォームおよびインストール トポロジのうちのいずれかを使用している可能性があります。そのため、データセンターとノードの数など、使用しているハイブリッド プラットフォームとトポロジについて知る必要があります。
次の表はいくつかの例を示しています。DOs 列は完全な情報を、DON'Ts 列は不完全な情報を示しています。
DOs | DON'Ts |
---|---|
2020-11-06 09:30 CST 以降、Apigee on Google Cloud で Apigee の設定の詳細:
失敗した API の詳細は以下のとおりです。
エラー:
|
(使用されているプロダクト、問題がいつから確認されるか、設定の詳細に関する情報が何もありません。) |
Apigee ハイブリッド バージョン 1.3 でデバッグが次のエラーで失敗します。 エラー:
Apigee ハイブリッドの設定の詳細:
| Apigee Hybrid でデバッグに失敗します。 |
有用な資料
問題に関連するアーティファクトを提供していただければ、確認される挙動をより正確に把握して、分析情報をより多く引き出せるため、問題の解決をスピードアップできます。
このセクションでは、すべての Apigee プロダクトの場合で役立つ有用なアーティファクトについて説明します。
すべての Apigee プロダクトに共通のアーティファクト
次のアーティファクトは、すべての Apigee プロダクト(Apigee on Google Cloud と Apigee ハイブリッド)で有用です。
アーティファクト | 説明 |
---|---|
デバッグツールの出力 | デバッグツールの出力には、Apigee プロダクトを通過する API リクエストに関する詳細情報が含まれます。これは、4XX 、5XX 、レイテンシの問題などのランタイム エラーに対して有用です。 |
スクリーンショット | スクリーンショットは、確認される実際の挙動やエラーのコンテキストを伝達するために活用できます。UI やアナリティクスなどで確認されるエラーや問題に対して有用です。 |
HAR(Http ARchive) | HAR は、UI 関連の問題をデバッグするために HTTP セッション ツールによってキャプチャされるファイルです。Chrome、Firefox、Internet Explorer などのブラウザを使用してキャプチャできます。 |
tcpdumps |
tcpdump ツールは、ネットワーク経由で送受信された TCP/IP パケットをキャプチャします。これは、TLS handshake エラー、502 エラー、レイテンシの問題など、ネットワーク関連のあらゆる問題に対して有用です。 |
ハイブリッドの追加アーティファクト
ハイブリッドの場合、問題の診断を迅速に行うために追加のアーティファクトが必要になる場合があります。
アーティファクト | 説明 |
---|---|
Apigee ハイブリッド プラットフォーム | 以下のサポートされているハイブリッド プラットフォームから、使用しているものを指定します。
|
Apigee ハイブリッドと従属コンポーネントのバージョン |
|
ネットワーク トポロジ | すべてのデータセンター、Kubernetes クラスタ、Namespace、Pod を含むハイブリッド セットアップを説明する Apigee インストール トポロジ図。 |
YAML ファイルをオーバーライド | Apigee ハイブリッド ランタイム プレーンをインストールするために各データセンターで使用される overrides.yaml ファイル。 |
Apigee ハイブリッド デプロイのステータス |
各データセンター / Kubernetes クラスタでの次のコマンドの出力。
|
Apigee ハイブリッド コンポーネント ログ |
ハイブリッド コンポーネント用の Stackdriver ログへのリンクを提供します。または 各データセンター / Kubernetes クラスタで次のコマンドを使用して Apigee ハイブリッド コンポーネント ログを取得し、共有できます。
|
ログの説明 |
Pod に関する詳細情報。 これは、Pod が
|
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 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 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ログが生成されたら、次のコマンドを使用してすべての出力ファイルを単一の tarball に圧縮します。
# tar -cvzf /tmp/apigee_hybrid_logs_$(date +%Y.%m.%d_%H.%M).tar.gz /tmp/k_*
tar ファイルのサイズが 25 MB を超えている場合は、Google ドライブにアップロードして Google とリンクを共有できます。split コマンドを使用して大きなファイルを 25 MB のチャンクに分割し、サポート ポータルにアップロードするという方法もあります。
# split -b 25M diagnostic.tar.gz "diagnostic.tar.gz.part"
ケース テンプレートとサンプルケース
このセクションでは、このドキュメントで説明されるベスト プラクティスに基づいた、さまざまなプロダクトのケース テンプレートとサンプルケースを示します。
Apigee Cloud
テンプレート
このセクションでは、Apigee on Google Cloud のサンプル テンプレートを説明します。
問題:
<問題の詳細な説明や、お客様側で確認される挙動の説明を記載します。可能な場合は、プロダクト名とバージョンを記載します。>
エラー メッセージ:
<表示されたエラー メッセージ全体を記載します(ある場合)>
問題の開始時刻(ISO 8601 形式)
問題の終了時刻(ISO 8601 形式)
Apigee の設定の詳細:
組織名:
環境名:
API プロキシ名:
リビジョン番号:
再現手順:
<問題を再現するための手順を記載します(可能な場合)>
診断情報:
<添付ファイルの一覧>
サンプルケース
このセクションでは、Apigee on Google Cloud のサンプルケースを説明します。
問題:
Public Cloud 組織で 503 サービス利用不可エラーが多数発生しています。問題を確認して解決いただくか、その解決方法を教えていただけますでしょうか。
エラー メッセージ:
{"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
API プロキシ名: myproxy
リビジョン番号: 3
再現手順:
次の curl
コマンドを実行すると問題を再現できます。
curl -X GET 'https://myorg-dev.apigee.net/v1/myproxy'
診断情報:
デバッグツールの出力(trace-503.xml
)
ハイブリッド
テンプレート
このセクションでは、Apigee ハイブリッドの場合のサンプル テンプレートを示します。
問題:
<問題の詳細な説明や、お客様側で確認される挙動の説明を記載します。可能な場合は、プロダクト名とバージョンを記載します。>
エラー メッセージ:
<表示されたエラー メッセージ全体を記載します(ある場合)>
問題の開始時刻(ISO 8601 形式)
問題の終了時刻(ISO 8601 形式)
Apigee ハイブリッドの設定の詳細:
- Apigee ハイブリット プラットフォーム
<ハイブリッドをインストールしたプラットフォームとそのバージョンに関する情報を記載します。>
- Google Cloud プロジェクト、ハイブリッド組織、ハイブリッド環境:
Google Cloud プロジェクト ID:
<Google Kubernetes Engine(GKE)を使用している場合は、クラスタが配置されているプロジェクト ID を必ず指定してください。GKE On-Prem、Azure Kubernetes Service、Amazon EKS を使用している場合は、ログの送信先となるプロジェクト ID を指定します。>
Apigee ハイブリッド組織:
Apigee ハイブリッド環境: - Apigee ハイブリッドとその他 CLI のバージョン:
Apigee ハイブリッド CLI(apigeectl
)バージョン:
Kubectl バージョン: - Kubernetes クラスタ名の詳細:
k8sCluster:
名前:
リージョン: - ネットワーク トポロジ:
<データセンター、Kubernetes クラスタ、Namespace、Pod など、Apigee ハイブリッドのセットアップを説明するネットワーク トポロジを添付します。> - YAML ファイルをオーバーライド:
<overrides.yaml ファイルを添付します>
再現手順:
<問題を再現するための手順を記載します(可能な場合)>
診断情報:
<添付ファイルの一覧>
サンプルケース
このセクションでは、Apigee ハイブリッドの場合のサンプルケースを示します。
問題:
Apigee ハイブリッド バージョン 1.3 で管理 API を実行するとエラーが発生します。
エラー メッセージ:
[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 ハイブリッドの設定の詳細:
- Apigee ハイブリッド プラットフォーム
GKE バージョン 1.15.1 - Google Cloud プロジェクト、ハイブリッド組織、ハイブリッド環境
Google Cloud プロジェクト ID:apigee-hybrid-123456
注: これは、クラスタが配置されているプロジェクト ID です。
Apigee ハイブリッド組織:apigee-hybrid-123456
Apigee ハイブリッド環境:dev
- Apigee ハイブリッドとその他 CLI のバージョン:
Apigee ハイブリッド CLI(apigeectl
)バージョン:
バージョン:1.2.0
commit:ac09109
ビルド ID:214
ビルド時間: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:
名前:user-cluster-1
リージョン:us-east1
- ネットワーク トポロジ
ファイルnetwork-topology.png
を添付しました - YAML ファイルをオーバーライド
ファイルoverrides.yaml
を添付しました
再現手順:
次の管理 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 のログ
- Synchronizer のログ