Apigee Edge दस्तावेज़ देखा जा रहा है.
Apigee X दस्तावेज़ पर जाएं. जानकारी
समस्या का ब्यौरा
क्लाइंट ऐप्लिकेशन को एपीआई कॉल के रिस्पॉन्स के तौर पर, गड़बड़ी कोड के साथ 400 Bad Request
का एचटीटीपी स्टेटस कोड
messaging.adaptors.http.flow.DecompressionFailureAtRequest
मिलता है.
गड़बड़ी का मैसेज
क्लाइंट ऐप्लिकेशन को यह रिस्पॉन्स कोड मिलता है:
HTTP/1.1 400 Bad Request
इसके अलावा, आपको गड़बड़ी का एक मैसेज भी दिख सकता है, जो नीचे दिखाए गए मैसेज से मिलता-जुलता हो:
{ "fault":{ "faultstring":"Decompression failure at request", "detail":{ "errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest" } } }
संभावित कारण
यह गड़बड़ी सिर्फ़ तब दिखती है, जब:
- एचटीटीपी अनुरोध हेडर
Content-Encoding
में बताया गया एन्कोडिंग मान्य है और Apigee Edge के साथ काम करता है, - क्लाइंट ने एचटीटीपी अनुरोध के तौर पर जो पेलोड फ़ॉर्मैट भेजा है वह
Content-Encoding
हेडर में बताए गए कोड में बदलने के फ़ॉर्मैट से मेल नहीं खाता
लेकिन
इसकी वजह यह है कि Apigee Edge, बताए गए कोड में बदलने के तरीके का इस्तेमाल करके पेलोड को डिकोड नहीं कर पाता है. ऐसा इसलिए होता है, क्योंकि
पेलोड का फ़ॉर्मैट, Content-Encoding
हेडर में बताए गए फ़ॉर्मैट में नहीं होता.
यहां इस्तेमाल की जा सकने वाली Content-Encoding
वैल्यू के कुछ उदाहरण दिए गए हैं. साथ ही, यहां बताया गया है कि ऐसे मामलों में Apigee Edge
पर पेलोड फ़ॉर्मैट कैसा होगा:
स्थिति | कॉन्टेंट को कोड में बदलने का तरीका | अनुमानित पेलोड फ़ॉर्मैट |
---|---|---|
सिंगल एन्कोडिंग | gzip | Unix RFC1952 GZIP फ़ॉर्मैट देखें. |
सिंगल एन्कोडिंग | कम करना | इस फ़ॉर्मैट में, डिलेट कंप्रेशन एल्गोरिदम के साथ |
एक से ज़्यादा एन्कोडिंग | एक से ज़्यादा एन्कोडिंग उदाहरण के लिए, जब एन्कोडिंग दो बार की जाती है, तो यह हो सकता है:
|
पेलोड पर, दिए गए क्रम में एक से ज़्यादा एन्कोडिंग लागू की गई हैं, जैसा कि हेडर में दिखता है. |
इस गड़बड़ी की ये वजहें हो सकती हैं:
वजह | ब्यौरा | समस्या हल करने के लिए निर्देश |
---|---|---|
अनुरोध पेलोड फ़ॉर्मैट, Content-Encrypt हेडर में बताए गए एन्कोडिंग से मेल नहीं खाता | क्लाइंट ने जिस अनुरोध पेलोड को भेजा है उसके फ़ॉर्मैट को कोड में नहीं बदला गया है या वह Content-Encoding हेडर में बताए गए एन्कोडिंग से मेल नहीं खाता. |
Edge के सार्वजनिक और निजी क्लाउड के उपयोगकर्ता |
निदान के सामान्य चरण
इस गड़बड़ी का पता लगाने के लिए, नीचे दिए गए किसी टूल/तकनीक का इस्तेमाल करें:
एपीआई मॉनिटरिंग
एपीआई मॉनिटरिंग का इस्तेमाल करके, गड़बड़ी का पता लगाने के लिए:
- सही भूमिका वाले उपयोगकर्ता के तौर पर, Apigee Edge के यूज़र इंटरफ़ेस (यूआई) में साइन इन करें.
उस संगठन पर जाएं जिसमें आपको समस्या की जांच करनी है.
- विश्लेषण करें > एपीआई की निगरानी करना > जांच करें पेज पर जाएं.
- वह खास समयसीमा चुनें जिसमें आपने गड़बड़ियां देखी थीं.
- पक्का करें कि प्रॉक्सी फ़िल्टर सभी पर सेट है.
- समय के हिसाब से गलत कोड प्लॉट करें.
वह सेल चुनें जिसमें गड़बड़ी कोड
messaging.adaptors.http.flow.DecompressionFailureAtRequest
है, जैसा कि नीचे दिखाया गया है:गड़बड़ी कोड
messaging.adaptors.http.flow.DecompressionFailureAtRequest
के बारे में जानकारी नीचे दिखाई गई है:लॉग देखें पर क्लिक करें. इसके बाद,
400
गड़बड़ी की वजह से काम न करने वाली लाइन को बड़ा करें.- लॉग विंडो से, नीचे दी गई जानकारी पर ध्यान दें:
- स्थिति कोड:
400
- गलत इस्तेमाल का सोर्स:
proxy
- गलत कोड:
messaging.adaptors.http.flow.DecompressionFailureAtRequest
.
- स्थिति कोड:
- अगर गलत सोर्स की वैल्यू
proxy
है, तो इससे पता चलता है कि अनुरोध पेलोड फ़ॉर्मैट,Content-Encoding
हेडर में बताए गए कोड में बदलने के तरीके से मेल नहीं खाता.
ट्रेस टूल
ट्रेस टूल का इस्तेमाल करके गड़बड़ी का पता लगाने के लिए:
- ट्रेस सेशन को चालू करें
और इनमें से कोई एक:
400 Bad Request
गड़बड़ी आने तक इंतज़ार करें या- अगर समस्या को फिर से देखा जा सकता है, तो एपीआई कॉल करें और
400 Bad Request
को फिर से दोहराएं.
पक्का करें कि FlowInfos दिखाएं चालू है:
- सफल न होने वाले अनुरोधों में से किसी एक को चुनें और ट्रेस की जांच करें.
- ट्रेस के अलग-अलग फ़ेज़ में नेविगेट करें और पता लगाएं कि गड़बड़ी कहां हुई थी.
आम तौर पर, क्लाइंट से अनुरोध मिला फ़ेज़ के ठीक बाद फ़्लो में गड़बड़ी दिखेगी, जैसा कि यहां दिखाया गया है:
-
ट्रेस से प्रॉपर्टी की वैल्यू नोट करें:
- गड़बड़ी:
Decompression failure at request
- error.class:
com.apigee.rest.framework.BadRequestException
- error.cause:
Not in GZIP format
error.cause में बताया गया है कि अनुरोध पेलोड, GZIP फ़ॉर्मैट में नहीं है. इसका मतलब है कि Apigee Edge को अनुरोध पेलोड को GZIP फ़ॉर्मैट में होने की उम्मीद थी. इसकी जानकारी,
Content-Encoding
हेडर में दी गई होती. - गड़बड़ी:
अनुरोध के हेडर
Content-Encoding
की वैल्यू तय करें. इसके लिए, क्लाइंट से मिला अनुरोध फ़ेज़ पर जाएं. इसका तरीका नीचे बताया गया है:ध्यान दें कि अनुरोध के हेडर
Content-Encoding
की वैल्यू असल मेंgzip
है.ऊपर दिया गया सैंपल ट्रेस दिखाता है कि अनुरोध के हेडर
Content-Encoding
में बताई गई एन्कोडिंगgzip
है; हालांकि, अनुरोध पेलोड GZIP फ़ॉर्मैट में नहीं है. इसलिए, Apigee, gzip का इस्तेमाल करके पेलोड को डीकंप्रेस नहीं कर सकता है औरDecompression failure at request
गड़बड़ी दिखाता है.- नेविगेट करके, Apigee Edge से मिले स्टेटस कोड और गड़बड़ी के मैसेज को नोट करें
ट्रेस में क्लाइंट को भेजा गया जवाब चरण में जोड़ने के लिए, जैसा कि यहां दिखाया गया है:
ट्रेस में से नीचे दी गई जानकारी को नोट करें:
- स्टेटस कोड:
400 Bad Request
. - गड़बड़ी वाला कॉन्टेंट:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- स्टेटस कोड:
ट्रेस में, AX (Analytics डेटा रिकॉर्ड किया गया) फ़ेज़ पर जाएं और उस पर क्लिक करें.
- नीचे की ओर स्क्रोल करके, फ़ेज़ की जानकारी, गड़बड़ी वाले हेडर सेक्शन पर जाएं. इसके बाद, X-Apigee-fault-code और X-Apigee-fault-source की वैल्यू तय करें, जैसा कि यहां दिखाया गया है:
- आपको X-Apigee-fault-code और X-Apigee-fault-source की वैल्यू,
messaging.adaptors.http.flow.DecompressionFailureAtRequest
औरpolicy
के तौर पर दिखेंगी. इससे पता चलता है कि अनुरोध किए गए पेलोड का फ़ॉर्मैट,Content-Encoding
हेडर में बताए गए एन्कोडिंग से मेल नहीं खाता.रिस्पॉन्स हेडर वैल्यू X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
X-Apigee-fault-source policy
NGINX
NGINX ऐक्सेस लॉग का इस्तेमाल करके, गड़बड़ी का पता लगाने के लिए:
- अगर आप प्राइवेट क्लाउड उपयोगकर्ता हैं, तो आपके पास NGINX ऐक्सेस लॉग
का इस्तेमाल करके, एचटीटीपी
400
की गड़बड़ियों के बारे में अहम जानकारी तय करने का विकल्प है. NGINX ऐक्सेस लॉग देखें:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
कहां: ORG, ENV, और PORT# को असल वैल्यू से बदल दिया जाता है.
- यह देखने के लिए खोजें कि किसी खास अवधि के दौरान
400
में कोई गड़बड़ी तो नहीं है (अगर समस्या पहले हुई है) या क्या ऐसे अनुरोध हैं जो अब भी400
में नहीं दिख रहे हैं. अगर आपको X-Apigee-fault-code में,
messaging.adaptors.http.flow.DecompressionFailureAtRequest
की वैल्यू से मेल खाने वाली कोई400
गड़बड़ी दिखती है, तो X-Apigee-fault-source की वैल्यू तय करें.NGINX ऐक्सेस लॉग से 400 कोड वाली गड़बड़ी का नमूना:
NGINX ऐक्सेस लॉग की ऊपर दी गई सैंपल एंट्री में X-Apigee-fault-code और X-Apigee-fault-code के लिए ये वैल्यू दी गई हैं:
रिस्पॉन्स हेडर वैल्यू X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
X-Apigee-fault-source policy
वजह: अनुरोध वाले पेलोड का फ़ॉर्मैट, Content-एन्कोडिंग हेडर में बताए गए एन्कोडिंग से मेल नहीं खाता
डिफ़ॉल्ट रूप से, अगर अनुरोध के हेडर
Content-Encoding
में मान्य और
काम करने वाली एन्कोडिंग होती है, तो Apigee Edge हमेशा पेलोड को डीकंप्रेस करता है. इसलिए, यह उम्मीद की जाती है कि अनुरोध पेलोड का फ़ॉर्मैट, अनुरोध के हेडर Content-Encoding
में दिए गए एन्कोडिंग से मिलता-जुलता हो.
अगर कुछ मेल नहीं खाता, तो आपको यह गड़बड़ी दिखेगी.
संक्रमण की जांच
- एपीआई मॉनिटरिंग, ट्रेस टूल या NGINX ऐक्सेस लॉग का इस्तेमाल करके मिली गड़बड़ी के लिए, गलत कोड और गलत सोर्स का पता लगाएं. डाइग्नोस्टिक के सामान्य तरीके में बताया गया है.
- अगर गलत कोड
messaging.adaptors.http.flow.DecompressionFailureAtRequest
है और गलत सोर्स की वैल्यूpolicy
याproxy
है, तो इससे पता चलता है कि क्लाइंट ऐप्लिकेशन के भेजे गए अनुरोध में पेलोड है, जोContent-Encoding
अनुरोध के हेडर में दिए गए कोड में बदलने के तरीके से मेल नहीं खाता. एचटीटीपी अनुरोध के हिस्से के तौर पर, यह पता लगाया जा सकता है कि मेल न खाने वाले नतीजे किस तरह के हैं. इसके लिए, इनमें से किसी एक तरीके का इस्तेमाल किया जा सकता है:
गड़बड़ी का मैसेज
गड़बड़ी के मैसेज का इस्तेमाल करके पुष्टि करने के लिए:
-
अगर आपके पास Apigee Edge से मिले गड़बड़ी के पूरे मैसेज का ऐक्सेस है, तो
faultstring
देखें.गड़बड़ी के मैसेज का सैंपल:
"faultstring":"Decompression failure at request"
- ऊपर दिए गए गड़बड़ी के मैसेज में, यह
"Decompression failure at request"
दिखाता है. इसका मतलब है कि अनुरोध कोContent-Encoding
हेडर में बताए गए एन्कोडिंग का इस्तेमाल करके डीकंप्रेस नहीं किया जा सका.
ट्रेस
ट्रेस की मदद से पुष्टि करने के लिए:
- गड़बड़ी की जानकारी पाने के सामान्य तरीके में बताए गए तरीके के मुताबिक, ट्रेस का इस्तेमाल करके, अनुरोध के हेडर कॉन्टेंट-कोड में बदलने का तरीका और प्रॉपर्टी error.cause की वैल्यू तय करें.
सैंपल ट्रेस में से वैल्यू इस तरह हैं:
- कॉन्टेंट को कोड में बदलने का तरीका:
gzip
- error.cause:
Not in GZIP format
Content-एन्कोडिंग अनुरोध के हेडर में मौजूद वैल्यू gzip, हालांकि, अनुरोध पेलोड GZIP फ़ॉर्मैट में नहीं है (जैसा कि error.cause से बताया गया है). इसलिए, Apigee Edge,
400 Bad Request
और गड़बड़ी कोडmessaging.adaptors.http.flow.DecompressionFailureAtRequest
के साथ जवाब देता है.- कॉन्टेंट को कोड में बदलने का तरीका:
वास्तविक अनुरोध
वास्तविक अनुरोध का इस्तेमाल करके पुष्टि करने के लिए:
अगर आपके पास क्लाइंट ऐप्लिकेशन के किए गए असल अनुरोध का ऐक्सेस है, तो यह तरीका अपनाएं:
- अनुरोध के हेडर
Content-Encoding
में भेजी गई वैल्यू तय करें. - अनुरोध के हिस्से के तौर पर भेजे गए पेलोड का फ़ॉर्मैट तय करें.
अगर
Content-Encoding
हेडर की वैल्यू काम करने वाले एन्कोडिंग की सूची में है, लेकिन अनुरोध पेलोड का फ़ॉर्मैट,Content-Encoding
हेडर में दी गई एन्कोडिंग से मेल नहीं खाता है, तो यही समस्या की वजह है.अनुरोध का उदाहरण:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"
-X POST -d @request_payload.zipअनुरोध का ऊपर दिया गया उदाहरण,
Content-Encoding
हेडर मेंgzip
वैल्यू भेजता है. यह Apigee Edge में कोड में बदलने के तरीके के तौर पर काम करता है. हालांकि, अनुरोध पेलोडrequest_payload.zip
ZIP फ़ॉर्मैट में है. इसलिए, यह अनुरोध400 Bad Request
स्टेटस कोड और गड़बड़ी कोड:messaging.adaptors.http.flow.DecompressionFailureAtRequest
के साथ काम नहीं करता.
मैसेज प्रोसेसर के लॉग
Message प्रोसेसर लॉग का इस्तेमाल करके पुष्टि करने के लिए:
अगर आप प्राइवेट क्लाउड उपयोगकर्ता हैं, तो आपके पास मैसेज प्रोसेसर लॉग का इस्तेमाल करके, एचटीटीपी
400
की गड़बड़ियों के बारे में अहम जानकारी तय करने का विकल्प होता है.- एपीआई मॉनिटरिंग, ट्रेस टूल या NGINX के ऐक्सेस लॉग का इस्तेमाल करके, पूरे न हो पाने वाले अनुरोध का मैसेज आईडी पता करें. इसके बारे में सामान्य तरीके से जानकारी पाने के तरीके में बताया गया है.
मैसेज प्रोसेसर लॉग में मैसेज आईडी खोजें:
/opt/apigee/var/log/edge-message-processor/logs/system.log
आपको इनमें से कोई एक अपवाद दिखेगा:
स्थिति #1
स्थिति #1: जब एपीआई अनुरोध में हेडर Content-Encrypt: gzip
2021-07-28 10:21:16,861 NIOThread@0 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-57-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739893ms lastIO=0ms isOpen=true.onExceptionRead exception: {} java.util.zip.ZipException: Not in GZIP format 2021-07-28 10:21:16,862 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rt-57-1, exception:java.util.zip.ZipException: Not in GZIP format, context:Context@71ea5ac input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739894ms lastIO=0ms isOpen=true) 2021-07-28 10:21:16,862 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception
java.util.zip.ZipException: Not in GZIP format
occurred while writing to channel null 2021-07-28 10:21:16,863 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: Not in GZIP formatऊपर दिए गए गड़बड़ी के मैसेज की लाइन
java.util.zip.ZipException: Not in GZIP format
बताती है कि अनुरोध पेलोड को GZIP फ़ॉर्मैट में नहीं भेजा गया है. हालांकि,Content-Encoding
को gzip के तौर पर बताया गया है. इसलिए, Apigee Edge, अपवाद को दिखाता है और क्लाइंट ऐप्लिकेशन को, गड़बड़ी के कोड के साथ400
स्टेटस कोडmessaging.adaptors.http.flow.DecompressionFailureAtRequest
दिखाता है.स्थिति #2
स्थिति #2: जब एपीआई अनुरोध में हेडर का कॉन्टेंट-कोड में बदलने का तरीका हो: deflate
2021-07-28 15:26:31,893 NIOThread@1 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-47875-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 bytesRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true.onExceptionRead exception: {}
java.util.zip.ZipException: incorrect header check
….Caused by: java.util.zip.DataFormatException: incorrect header check
.. 2021-07-28 15:26:31,894 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rrt-47875-1, exception:java.util.zip.ZipException: incorrect header check, context:Context@69b3ac45 input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 byt esRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true)ऊपर दिए गए गड़बड़ी के मैसेज की लाइनें
java.util.zip.ZipException: incorrect header check
औरCaused by: java.util.zip.DataFormatException: incorrect header check
से पता चलता है कि अनुरोध पेलोड को डिलेट फ़ॉर्मैट में नहीं भेजा गया है. साथ ही, यह डिफ़्लेट केContent-Encoding
हेडर में बताए गए कोड में बदलने के तरीके से मेल नहीं खाता है. इसलिए, Apigee Edge, अपवाद को दिखाता है और क्लाइंट ऐप्लिकेशन को गड़बड़ी कोडmessaging.adaptors.http.flow.DecompressionFailureAtRequest
के साथ,400
स्टेटस कोड दिखाता है.
-
रिज़ॉल्यूशन
- अगर Apigee Edge और बैकएंड सर्वर में, एपीआई प्रॉक्सी फ़्लो में, कंप्रेस किए गए अनुरोध पेलोड की ज़रूरत नहीं है, तो हेडर
Content-Encoding
को पास न करें. अगर अनुरोध पेलोड को कंप्रेस करने की ज़रूरत है, तो दूसरे चरण पर जाएं. - पक्का करें कि क्लाइंट ऐप्लिकेशन हमेशा यह जानकारी भेजे:
- अनुरोध में
Content-Encoding
हेडर की वैल्यू के तौर पर, कोई भी कोड में बदलने का तरीका - Apigee Edge के साथ काम करने वाले फ़ॉर्मैट में अनुरोध पेलोड,
Content-Encoding
हेडर में बताए गए कोड में बदलने के फ़ॉर्मैट से मेल खाता है
- अनुरोध में
- ऊपर दिए गए उदाहरण में, अनुरोध पेलोड ZIP फ़ॉर्मैट में है, लेकिन अनुरोध के हेडर में
Content-Encoding: gzip
के बारे में बताया गया है. अनुरोध के हेडर कोContent-Encoding: gzip
और अनुरोध पेलोड कोgzip
फ़ॉर्मैट में भेजकर, समस्या को ठीक किया जा सकता है:curl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
खास जानकारी
आरएफ़सी के इन निर्देशों के मुताबिक, Apigee Edge गड़बड़ी कोड messaging.adaptors.http.flow.DecompressionFailureAtRequest
के साथ स्टेटस कोड 400 Bad Request
के साथ जवाब देता है:
खास जानकारी |
---|
आरएफ़सी 7231, सेक्शन 6.5.1 |
आरएफ़सी 7231, सेक्शन 3.1.2.2 |
अगर आपको अब भी Apigee सहायता से कोई मदद चाहिए, तो गड़बड़ी की जानकारी इकट्ठा करना ज़रूरी है पर जाएं.
ऐप्लिकेशन की परफ़ॉर्मेंस से जुड़ी जानकारी इकट्ठा करनी होगी
ऐप्लिकेशन की परफ़ॉर्मेंस से जुड़ी यह जानकारी इकट्ठा करें और Apigee Edge की सहायता टीम से संपर्क करें:
अगर आप Public Cloud उपयोगकर्ता हैं, तो यह जानकारी दें:
- संगठन का नाम
- परिवेश का नाम
- एपीआई प्रॉक्सी का नाम
400
गड़बड़ी को फिर से दिखाने के लिए, पूरेcurl
निर्देश का इस्तेमाल किया गया- एपीआई अनुरोधों के लिए ट्रेस फ़ाइल
अगर आप प्राइवेट क्लाउड उपयोगकर्ता हैं, तो यह जानकारी दें:
- असफल अनुरोधों के लिए देखा गया पूरा गड़बड़ी का मैसेज
- परिवेश का नाम
- एपीआई प्रॉक्सी बंडल
- एपीआई अनुरोधों के लिए ट्रेस फ़ाइल
NGINX के ऐक्सेस लॉग
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
कहां: ORG, ENV, और PORT# को असल वैल्यू से बदल दिया जाता है.
- मैसेज प्रोसेसर के सिस्टम लॉग
/opt/apigee/var/log/edge-message-processor/logs/system.log