এই নির্দেশিকা থেকে জানা যায়, কীভাবে Data Manager API সমস্যা ম্যানেজ করে ও সেগুলির ব্যাপারে জানায়। API সমস্যার গঠন ও অর্থ বোঝা, শক্তিশালী অ্যাপ্লিকেশন তৈরি করার জন্য অত্যন্ত গুরুত্বপূর্ণ। এইসব অ্যাপ্লিকেশন ভুল ইনপুট থেকে শুরু করে সাময়িকভাবে পরিষেবা উপলভ্য না থাকা পর্যন্ত যেকোনও সমস্যা সহজেই ম্যানেজ করতে পারে।
Data Manager API, স্ট্যান্ডার্ড Google API সমস্যার মডেল অনুসরণ করে, যা gRPC স্ট্যাটাস কোডের
উপর ভিত্তি করে তৈরি করা হয়। প্রতিটি API উত্তর যার ফলে
কোনও সমস্যা হয় তাতে Status অবজেক্ট থাকে যার মধ্যে:
- একটি সংখ্যাসূচক সমস্যার কোড।
- সমস্যার মেসেজ।
- ঐচ্ছিক, সমস্যার অতিরিক্ত বিবরণ।
ক্যানোনিকাল সমস্যার কোড
Data Manager API, gRPC এবং HTTP-এর দ্বারা সংজ্ঞায়িত প্রামাণিক সমস্যা কোডের একটি সেট ব্যবহার করে। এইসব কোড থেকে সমস্যার ধরন সম্পর্কে একটি প্রাথমিক ধারণা পাওয়া যায়। সমস্যার মূল কারণ বুঝতে আপনাকে সবসময় প্রথমে এই কোডটি চেক করে দেখতে হবে।
এইসব কোডের ব্যাপারে আরও বিবরণের জন্য, API ডিজাইন গাইড - Error কোড দেখুন।
দ্রুত-ব্যর্থ হওয়া মডেল
Data Manager API একটি দ্রুত-ফেল মডেল ব্যবহার করে। কোনও অনুরোধে স্ট্রাকচারাল সমস্যা থাকলে অথবা কোনও রেকর্ড প্রয়োজনীয় ফিল্ডের জন্য যাচাইকরণে ব্যর্থ হলে, সম্পূর্ণ অনুরোধটি ব্যর্থ হয় এবং API সেই অনুরোধের কোনও ডেটা প্রসেস করে না।
আংশিক ব্যর্থতা মডেলের সাথে তুলনা
দ্রুত-ব্যর্থ মডেলটি আংশিক ব্যর্থ মডেলের থেকে কিছু Google API-তে আলাদা, যেমন Google Ads API এবং Campaign Manager 360 API। আংশিক ব্যর্থতা মডেলে, কিছু রেকর্ড ভুল থাকলেও অনুরোধ সফল হয় এবং উত্তরে ব্যর্থ হওয়া রেকর্ডগুলির জন্য সমস্যার বিবরণ থাকে।
আংশিক ব্যর্থতা সুবিধাজনক হলেও, এটিতে অনেক ঝুঁকি থাকে কারণ আংশিক ব্যর্থতা মডেল আপনাকে ভুল সম্পর্কে আগাম সতর্ক করে না—আপনাকে প্রতিটি উত্তরে ভুল আছে কিনা তা স্পষ্টভাবে চেক করতে হবে। এর ফলে গুরুত্বপূর্ণ সমস্যা আড়াল হয়ে যেতে পারে, কারণ অনুরোধে থাকা অনেক বা এমনকি সব রেকর্ড API বাতিল করে দিলেও অনুরোধটি সফল হয়। অনুরোধে থাকা রেকর্ডের একটি বড় অংশ ভুল থাকলে এবং আপনি উত্তরটি না দেখলে, আপনার ডেটা সংক্রান্ত ব্যাপক সমস্যা সম্পর্কে আপনি সম্পূর্ণ অজ্ঞ থাকতে পারেন এবং শুধুমাত্র তখনই সেইসব সমস্যা খুঁজে পাবেন যখন কয়েক দিন বা সপ্তাহ পরে সামগ্রিক ফলাফল আপনার প্রত্যাশার সাথে মেলে না।
আপনার ডেটা বা ইন্টিগ্রেশন সংক্রান্ত সমস্যা সম্পর্কে আপনাকে অবিলম্বে সতর্ক করে, ফাস্ট-ফেল মডেল এই ধরনের সমস্যা এড়ায়, যাতে আপনি উপযুক্ত ব্যবস্থা নিতে পারেন।
validateOnly-এর মাধ্যমে দ্রুত-ব্যর্থ হওয়া সংক্রান্ত সমস্যা চেক করুন
বেশিরভাগ ইনজেশন ও সরিয়ে দেওয়ার অনুরোধে একটি validateOnly ফিল্ড থাকে। আপনি validateOnly-এর মান true হিসেবে সেট করলে, Data Manager API সাধারণ অনুরোধের ক্ষেত্রে
যেসব প্রাথমিক যাচাইকরণ চেক করে, সেগুলিই করে, তবে কোনও ডেটা ইনজেস্ট বা সরিয়ে দেয় না।
- অনুরোধে কোনও সমস্যা থাকলে, সাধারণ অনুরোধের ক্ষেত্রে আপনি যে সমস্যার উত্তর পান, একই উত্তর সহ এটি ব্যর্থ হয়।
- অনুরোধটি যাচাইকরণে উত্তীর্ণ হলে, সেটি সফল হয়। উত্তরে ঐচ্ছিক ফিল্ডের জন্য
fieldWarningsঅন্তর্ভুক্ত থাকে, ঠিক সাধারণ অনুরোধের মতো।
এইগুলি করতে validateOnly ব্যবহার করুন:
- আপনার লাইভ ডেটার উপর প্রভাব না ফেলে নতুন বা আপডেট করা ইন্টিগ্রেশন পরীক্ষা করুন।
- আবার অনুরোধ পাঠানোর আগে নিশ্চিত করুন যে সমাধানটি কোনও সমস্যার সমাধান করেছে।
সমস্যা ম্যানেজ করা
অনুরোধ সম্পূর্ণ না হলে এইসব ধাপ অনুসরণ করুন:
সমস্যার ধরন জানতে সমস্যার কোড চেক করুন।
- আপনি gRPC ব্যবহার করলে,
Status-এরcodeফিল্ডে সমস্যার কোড থাকে। আপনি ক্লায়েন্ট লাইব্রেরি ব্যবহার করলে, এটি নির্দিষ্ট ধরনের ব্যতিক্রম দেখাতে পারে যা এরর কোডের সাথে সম্পর্কিত। যেমন, Java-এর ক্লায়েন্ট লাইব্রেরিcom.google.api.gax.rpc.InvalidArgumentExceptionদেখায় যদি সমস্যার কোডINVALID_ARGUMENTহয়। - আপনি REST ব্যবহার করলে,
error.status-এ সমস্যার উত্তরে সমস্যা কোড থাকে এবংerror.code-এ সংশ্লিষ্ট HTTP স্ট্যাটাস থাকে।
- আপনি gRPC ব্যবহার করলে,
সাধারণ বিবরণের পেলোড চেক করুন ভুল কোডের জন্য। স্ট্যান্ডার্ড বিবরণ পেলোড হল Google API থেকে পাওয়া সমস্যার মেসেজের সেট। এগুলি আপনাকে একটি সুসংহত ও সুবিন্যস্ত উপায়ে সমস্যার বিবরণ দেয়। Data Manager API থেকে পাওয়া প্রতিটি সমস্যার জন্য একাধিক স্ট্যান্ডার্ড বিবরণ পেলোড মেসেজ থাকতে পারে। সমস্যা থেকে স্ট্যান্ডার্ড বিবরণ পে-লোড পেতে Data Manager API ক্লায়েন্ট লাইব্রেরিতে সহায়ক পদ্ধতি আছে।
সমস্যার কোড যাই হোক না কেন, আমরা সাজেস্ট করি যে আপনি
ErrorInfo,RequestInfo,Help, এবংLocalizedMessageপেলোড চেক করে লগ করুন।ErrorInfo-এ এমন তথ্য আছে যা অন্যান্য পেলোডে নাও থাকতে পারে।RequestInfo-এর কাছে অনুরোধ আইডি আছে, যা আপনার সহায়তা টিমের সাথে যোগাযোগ করার প্রয়োজন হলে কাজে লাগবে।HelpওLocalizedMessage-এ লিঙ্ক ও অন্যান্য বিবরণ আছে যা আপনাকে সমস্যার সমাধান করতে সাহায্য করবে।
এছাড়াও,
BadRequestপে-লোডINVALID_ARGUMENTসমস্যার ক্ষেত্রে সহায়ক কারণ এটি কোন ফিল্ডের কারণে সমস্যা হয়েছে সেই সম্পর্কে তথ্য প্রদান করে।
খাবার উপযুক্ত নয় এমন জিনিস খাওয়া সংক্রান্ত সতর্কতা
Data Manager API, ইনজেশন সংক্রান্ত অনুরোধের যতটা সম্ভব অংশ গ্রহণ করে। আপনি যদি এমন ডেটা অন্তর্ভুক্ত করেন যা প্রয়োজন নেই, তাহলে সেইসব ফিল্ডের জন্য যাচাইকরণ ব্যর্থতা অনুরোধ ব্যর্থতার কারণ হবে না। যেমন, কোনও কার্ট আইটেমে মার্চেন্ট প্রোডাক্ট আইডি না থাকলে, API অনুরোধের বাকি অংশ প্রসেস করে এবং একটি সতর্কতা রিটার্ন করে।
সঠিকভাবে ইনজেশন রেসপন্স (HTTP স্ট্যাটাস কোড 200) হলে, fieldWarnings তালিকায় এইসব সতর্কতা
দেখানো হয়। প্রতিটি এন্ট্রি হল FieldWarning অবজেক্ট যার মধ্যে
নিম্নলিখিত ফিল্ড রয়েছে:
fieldঅনুরোধে ফিল্ডের লোকেশন, স্নেক কেস পাথ সিনট্যাক্সে।
কোনও পাথ যদি তালিকার কোনও আইটেমকে (
repeatedফিল্ড) পয়েন্ট করে, তাহলে তালিকার নামের পরে স্কয়ার ব্র্যাকেটে ([...]) সেটির ইন্ডেক্স দেখানো হয়।যেমন,
events.events[0].cart_data.items[0].merchant_product_idঅনুরোধের প্রথম ইভেন্টের কার্ট ডেটার প্রথম আইটেম সম্পর্কিত সতর্কতা শনাক্ত করে।descriptionপ্রদত্ত ভ্যালুর কারণে কেন সতর্কতা দেখানো হয়েছে তার ব্যাখ্যা।
reasonWarningReasonএনুম ভ্যালু যা সতর্কতার ধরন শনাক্ত করে।
FieldWarning সহ উদাহরণ
সফল ইনজেশন অনুরোধের নমুনা উত্তর এখানে দেওয়া হল, এতে একটি সতর্কতা রয়েছে কারণ একটি কার্ট আইটেমের জন্য মার্চেন্ট প্রোডাক্ট আইডি অনুপস্থিত ছিল।
{
"requestId": "126365e1-16d0-4c81-9de9-f362711e250a",
"fieldWarnings": [
{
"field": "events.events[0].cart_data.items[0].merchant_product_id",
"description": "The merchant product ID is missing in the cart item.",
"reason": "WARNING_REASON_CART_DATA_ITEM_MERCHANT_PRODUCT_ID_MISSING"
}
]
}
স্ট্যান্ডার্ড বিবরণ পেলোড
Data Manager API-এর জন্য সবচেয়ে সাধারণ স্ট্যান্ডার্ড বিবরণ পেলোড হল:
BadRequest
কোনও অনুরোধ ব্যর্থ হলে, BadRequest পেলোড চেক করুন
INVALID_ARGUMENT (HTTP স্ট্যাটাস কোড 400)।
BadRequest মেসেজ থেকে বোঝা যায় যে অনুরোধে ভুল ভ্যালু সহ ফিল্ড ছিল অথবা
প্রয়োজনীয় ফিল্ডের ভ্যালু উল্লেখ করা হয়নি। কোন ফিল্ডে সমস্যা আছে তা জানতে
BadRequest-এ field_violations তালিকা চেক করুন। প্রতিটি field_violations এন্ট্রিতে
সমস্যার সমাধান করতে সাহায্যকারী তথ্য থাকে:
fieldঅনুরোধে ফিল্ডের লোকেশন, স্নেক কেস পাথ সিনট্যাক্সে।
কোনও পাথ যদি তালিকার কোনও আইটেমকে (
repeatedফিল্ড) পয়েন্ট করে, তাহলে তালিকার নামের পরে স্কয়ার ব্র্যাকেটে ([...]) সেটির ইন্ডেক্স দেখানো হয়।যেমন,
destinations[0].operating_account.account_idহলaccount_idতালিকারoperating_account-এর মধ্যে প্রথম আইটেমেরdestinations।descriptionভ্যালুটির কারণে কেন সমস্যা হয়েছে তার ব্যাখ্যা।
reasonErrorReasonএনুম, যেমনINVALID_HEX_ENCODINGবাINVALID_CURRENCY_CODE।
BadRequest-এর উদাহরণ
BadRequest
মেসেজ সহ INVALID_ARGUMENT সমস্যার জন্য এখানে একটি নমুনা উত্তর দেওয়া হল। field_violations-এ দেখানো সমস্যাটি হল accountId যা কোনও
সংখ্যা নয়। field ভ্যালু destinations[0].login_account.account_id দেখায় যে
accountId ফিল্ড লঙ্ঘন সহ login_account প্রথম আইটেমের মধ্যে আছে
destinations তালিকায়।
{
"error": {
"code": 400,
"message": "There was a problem with the request.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "INVALID_ARGUMENT",
"domain": "datamanager.googleapis.com",
"metadata": {
"requestId": "t-a8896317-069f-4198-afed-182a3872a660"
}
},
{
"@type": "type.googleapis.com/google.rpc.RequestInfo",
"requestId": "t-a8896317-069f-4198-afed-182a3872a660"
},
{
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
{
"field": "destinations[0].login_account.account_id",
"description": "String is not a valid number.",
"reason": "INVALID_NUMBER_FORMAT"
}
]
}
]
}
}
INVALID_ARGUMENT সমস্যার আরেকটি নমুনা উত্তর এখানে দেওয়া হল, যার সাথে
BadRequest মেসেজ রয়েছে। এই ক্ষেত্রে, field_violations তালিকায় দুটি
সমস্যা দেখা যাচ্ছে:
প্রথম
event-এর এমন একটি ভ্যালু আছে যা ইভেন্টের দ্বিতীয় ব্যবহারকারীর শনাক্তকারীতে হেক্স-এনকোড করা নেই।দ্বিতীয়
event-এর এমন একটি ভ্যালু আছে যা ইভেন্টের থার্ড ব্যবহারকারীর শনাক্তকারী-এ হেক্স-এনকোড করা নেই।
{
"error": {
"code": 400,
"message": "There was a problem with the request.",
"status": "INVALID_ARGUMENT",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "INVALID_ARGUMENT",
"domain": "datamanager.googleapis.com",
"metadata": {
"requestId": "t-6bc8fb83-d648-4942-9c49-2604276638d8"
}
},
{
"@type": "type.googleapis.com/google.rpc.RequestInfo",
"requestId": "t-6bc8fb83-d648-4942-9c49-2604276638d8"
},
{
"@type": "type.googleapis.com/google.rpc.BadRequest",
"fieldViolations": [
{
"field": "events.events[0].user_data.user_identifiers[1]",
"description": "The HEX encoded value is malformed.",
"reason": "INVALID_HEX_ENCODING"
},
{
"field": "events.events[1].user_data.user_identifiers[2]",
"description": "The HEX encoded value is malformed.",
"reason": "INVALID_HEX_ENCODING"
}
]
}
]
}
}
RequestInfo
কোনও অনুরোধ ব্যর্থ হলে, RequestInfo পেলোড চেক করুন। RequestInfo
তে request_id থাকে যা আপনার API অনুরোধকে অনন্যভাবে শনাক্ত করে।
{
"@type": "type.googleapis.com/google.rpc.RequestInfo",
"requestId": "t-4490c640-dc5d-4c28-91c1-04a1cae0f49f"
}
সমস্যার লগ তৈরি করার সময় বা সহায়তা টিমের সাথে যোগাযোগ করার সময়, সমস্যা নির্ণয় করার জন্য অনুরোধ আইডি অন্তর্ভুক্ত করতে ভুলবেন না।
ErrorInfo
অন্যান্য সাধারণ বিবরণ পেলোডে ক্যাপচার করা নাও হতে পারে এমন অতিরিক্ত তথ্য পেতে ErrorInfo মেসেজ চেক করুন।
ErrorInfo
পে-লোডে সমস্যার ব্যাপারে তথ্য সহ metadata ম্যাপ থাকে।
যেমন, এখানে ErrorInfo দেওয়া হল যা PERMISSION_DENIED ব্যর্থ হওয়ার কারণে হয়েছে।
এর কারণ হল, এমন Google Cloud প্রোজেক্টের জন্য ক্রেডেনশিয়াল ব্যবহার করা হয়েছে যেখানে
Data Manager API চালু করা নেই। ErrorInfo-এ সমস্যার ব্যাপারে অতিরিক্ত তথ্য
দেওয়া আছে, যেমন:
metadata.consumer-এর অধীনে অনুরোধের সাথে যুক্ত প্রোজেক্ট।metadata.serviceTitle-এর অধীনে পরিষেবার নাম।metadata.activationUrl-এর অধীনে যে URL-এ পরিষেবা চালু করা যাবে।
{
"error": {
"code": 403,
"message": "Data Manager API has not been used in project PROJECT_NUMBER before or it is disabled. Enable it by visiting https://console.cloud.google.com/apis/api/datamanager.googleapis.com/overview?project=PROJECT_NUMBER then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.",
"status": "PERMISSION_DENIED",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "SERVICE_DISABLED",
"domain": "googleapis.com",
"metadata": {
"consumer": "projects/PROJECT_NUMBER",
"service": "datamanager.googleapis.com",
"containerInfo": "PROJECT_NUMBER",
"serviceTitle": "Data Manager API",
"activationUrl": "https://console.cloud.google.com/apis/api/datamanager.googleapis.com/overview?project=PROJECT_NUMBER"
}
},
...
]
}
}
কোটা ও রেট সীমা সংক্রান্ত সমস্যা
কোনও অনুরোধ প্রজেক্টের সীমা অতিক্রম করলে, API একটি RESOURCE_EXHAUSTED
সমস্যা (HTTP স্ট্যাটাস কোড 429) রিটার্ন করে। ErrorInfo পে-লোডটি metadata ম্যাপে
কোন সীমা অতিক্রম করা হয়েছে সেই সম্পর্কে বিবরণ প্রদান করে:
consumer- অনুরোধের সাথে যুক্ত Google Cloud প্রোজেক্ট,
এইভাবে ফর্ম্যাট করা হয়েছে
projects/PROJECT_NUMBER। quota_limit- কোটা সীমার নাম যা অতিক্রম করা হয়েছে, যেমন
IngestionMutateRequestsPerMinutePerProjectবাIngestionMutateRequestsPerDayPerProject। অ্যাপ্লিকেশন প্রতি-মিনিট সীমা বা দৈনিক সীমা অতিক্রম করেছে কিনা তা নির্ধারণ করতে আপনি এই মানটি ব্যবহার করতে পারেন। সীমার নামের সম্পূর্ণ তালিকা দেখতে, প্রোজেক্টের সীমা দেখুন। quota_location- যে লোকেশনে কোটা প্রয়োগ করা হয়। Data Manager API-এর ক্ষেত্রে, এটি সবসময়
globalহয়। quota_metric- সীমার সাথে যুক্ত মেট্রিক, যেমন
datamanager.googleapis.com/ingestion_mutate_requests। service- পরিষেবার নাম,
datamanager.googleapis.com.
ইনজেশন মিউটেট অনুরোধের ক্ষেত্রে প্রতি মিনিটের সীমা
অতিক্রম করলে RESOURCE_EXHAUSTED সমস্যার উত্তরের একটি উদাহরণ এখানে দেওয়া হল:
{
"error": {
"code": 429,
"message": "Quota exceeded for quota metric 'Ingestion mutate requests' and limit 'Ingestion mutate requests per minute' of service 'datamanager.googleapis.com' for consumer 'project_number:PROJECT_NUMBER'.",
"status": "RESOURCE_EXHAUSTED",
"details": [
{
"@type": "type.googleapis.com/google.rpc.ErrorInfo",
"reason": "RATE_LIMIT_EXCEEDED",
"domain": "googleapis.com",
"metadata": {
"consumer": "projects/PROJECT_NUMBER",
"quota_limit": "IngestionMutateRequestsPerMinutePerProject",
"quota_location": "global",
"quota_metric": "datamanager.googleapis.com/ingestion_mutate_requests",
"service": "datamanager.googleapis.com"
}
}
]
}
}
Help ও LocalizedMessage
সমস্যা বুঝতে ও সমাধান করতে সাহায্যকারী
ডকুমেন্টেশন ও স্থানীয় ভাষায় সমস্যার মেসেজের লিঙ্ক পেতে Help ও LocalizedMessage পেলোড চেক করুন।
যেমন, এখানে PERMISSION_DENIED
Google Cloud প্রোজেক্টের ক্রেডেনশিয়াল ব্যবহার করার ফলে হওয়া ব্যর্থতারHelp এবং LocalizedMessage দেওয়া হল
যেখানে Data Manager API চালু করা নেই। Help পেলোড সেই URL দেখায় যেখানে পরিষেবা চালু করা
যায় এবং LocalizedMessage-এ ত্রুটির বিবরণ
থাকে।
{
"error": {
"code": 403,
"message": "Data Manager API has not been used in project PROJECT_NUMBER before or it is disabled. Enable it by visiting https://console.cloud.google.com/apis/api/datamanager.googleapis.com/overview?project=PROJECT_NUMBER then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.",
"status": "PERMISSION_DENIED",
"details": [
{
"@type": "type.googleapis.com/google.rpc.LocalizedMessage",
"locale": "en-US",
"message": "Data Manager API has not been used in project PROJECT_NUMBER before or it is disabled. Enable it by visiting https://console.cloud.google.com/apis/api/datamanager.googleapis.com/overview?project=PROJECT_NUMBER then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry."
},
{
"@type": "type.googleapis.com/google.rpc.Help",
"links": [
{
"description": "Google API Console API activation",
"url": "https://console.cloud.google.com/apis/api/datamanager.googleapis.com/overview?project=PROJECT_NUMBER"
}
]
},
...
]
}
}
সমস্যার বিবরণ অ্যাক্সেস করা
আপনি কোনও ক্লায়েন্ট লাইব্রেরি ব্যবহার করলে, স্ট্যান্ডার্ড বিবরণ পেলোড পেতে সহায়ক পদ্ধতি ব্যবহার করুন।
.NET
try {
// Send API request
}
catch (Grpc.Core.RpcException rpcException)
{
Console.WriteLine($"Exception encountered: {rpcException.Message}");
var statusDetails =
Google.Api.Gax.Grpc.RpcExceptionExtensions.GetAllStatusDetails(
rpcException
);
foreach (var detail in statusDetails)
{
if (detail is Google.Rpc.BadRequest)
{
Google.Rpc.BadRequest badRequest = (Google.Rpc.BadRequest)detail;
foreach (
BadRequest.Types.FieldViolation? fieldViolation in badRequest.FieldViolations
)
{
// Access attributes such as fieldViolation!.Reason and fieldViolation!.Field
}
}
else if (detail is Google.Rpc.RequestInfo)
{
Google.Rpc.RequestInfo requestInfo = (Google.Rpc.RequestInfo)detail;
string requestId = requestInfo.RequestId;
// Log the requestId...
}
else if (detail is Google.Rpc.ErrorInfo)
{
Google.Rpc.ErrorInfo errorInfo = (Google.Rpc.ErrorInfo)detail;
// Log the errorInfo.Reason and errorInfo.Metadata...
// If handling a rate limit error, check the exceeded quota limit:
if (errorInfo.Reason == "RATE_LIMIT_EXCEEDED" &&
errorInfo.Metadata.TryGetValue("quota_limit", out string quotaLimit))
{
// Inspect quotaLimit to determine whether it is a per-minute
// or daily limit (for example,
// IngestionMutateRequestsPerMinutePerProject).
}
// Log the details in the 'Metadata' map...
foreach (
KeyValuePair<String, String> metadataEntry in errorInfo.Metadata
)
{
// Log the metadataEntry.Key and metadataEntry.Value...
}
}
else
{
// ...
}
}
}
Java
try {
// Send API request
} catch (com.google.api.gax.rpc.InvalidArgumentException invalidArgumentException) {
// Gets the standard BadRequest payload from the exception.
BadRequest badRequest = invalidArgumentException.getErrorDetails().getBadRequest();
for (int i = 0; i < badRequest.getFieldViolationsCount(); i++) {
FieldViolation fieldViolation = badRequest.getFieldViolations(i);
// Access attributes such as fieldViolation.getField() and fieldViolation.getReason()
}
// Gets the standard RequestInfo payload from the exception.
RequestInfo requestInfo = invalidArgumentException.getErrorDetails().getRequestInfo();
if (requestInfo != null) {
String requestId = requestInfo.getRequestId();
// Log the requestId...
}
} catch (com.google.api.gax.rpc.ApiException apiException) {
// Fallback exception handler for other types of ApiException.
// Gets the standard ErrorInfo payload from the exception.
ErrorInfo errorInfo = apiException.getErrorDetails().getErrorInfo();
// Log the 'reason' and 'domain'...
// If handling a rate limit error, check the exceeded quota limit:
if (errorInfo != null && "RATE_LIMIT_EXCEEDED".equals(errorInfo.getReason())) {
String quotaLimit = errorInfo.getMetadataMap().get("quota_limit");
// Inspect quotaLimit to determine whether it is a per-minute
// or daily limit (for example,
// IngestionMutateRequestsPerMinutePerProject).
}
// Log the details in the 'metadata' map...
for (Entry<String, String> metadataEntry : errorInfo.getMetadataMap().entrySet()) {
// Log the metadataEntry key and value...
}
// Gets the standard RequestInfo payload from the exception.
RequestInfo requestInfo = apiException.getErrorDetails().getRequestInfo();
if (requestInfo != null) {
String requestId = requestInfo.getRequestId();
// Log the requestId...
}
...
}
সমস্যা সমাধানের পেশাদার পদ্ধতি
শক্তিশালী অ্যাপ্লিকেশন তৈরি করতে, নিম্নলিখিত পেশাদার পদ্ধতি প্রয়োগ করুন।
- পাঠানোর আগে যাচাই করুন
- আপনি কোনও ইন্টিগ্রেশন তৈরি বা পরিবর্তন করার সময়, ডেটা ইনজেস্ট করার আগে
validateOnly-এর মানtrueসেট করে দ্রুত-ফেল হওয়া সংক্রান্ত সমস্যা ক্যাচ করার জন্য অনুরোধ পাঠান। - সমস্যার বিবরণ পরীক্ষা করে দেখা
- সবসময় স্ট্যান্ডার্ড বিবরণ
পে-লোড যেমন
BadRequestখুঁজুন। প্রতিটি স্ট্যান্ডার্ড বিবরণ পেলোডে এমন তথ্য থাকে যা আপনাকে সমস্যার কারণ বুঝতে সাহায্য করে। - ক্লায়েন্ট ও সার্ভার সংক্রান্ত সমস্যার মধ্যে পার্থক্য করা
আপনার প্রয়োগ (ক্লায়েন্ট) সংক্রান্ত সমস্যা নাকি API (সার্ভার) সংক্রান্ত সমস্যার জন্য এই সমস্যা হয়েছে তা নির্ধারণ করুন।
- ক্লায়েন্ট সংক্রান্ত সমস্যা:
INVALID_ARGUMENT,NOT_FOUND,PERMISSION_DENIED,FAILED_PRECONDITION,UNAUTHENTICATED-এর মতো কোড। এগুলির জন্য অনুরোধে বা আপনার আবেদনের স্ট্যাটাস/ক্রেডেনশিয়ালে পরিবর্তন করতে হবে। সমস্যার সমাধান না করে আবার অনুরোধ করবেন না। - সার্ভার সংক্রান্ত সমস্যা:
UNAVAILABLE,INTERNAL,DEADLINE_EXCEEDED,UNKNOWN-এর মতো কোড। এগুলি থেকে বোঝা যায় যে API পরিষেবায় সাময়িক সমস্যা হয়েছে।
- ক্লায়েন্ট সংক্রান্ত সমস্যা:
- আবার চেষ্টা করার স্ট্র্যাটেজি প্রয়োগ করা
সমস্যাটি আবার চেষ্টা করে দেখা যাবে কিনা তা নির্ধারণ করুন এবং আবার চেষ্টা করার কৌশল ব্যবহার করুন।
শুধুমাত্র ক্ষণস্থায়ী সার্ভার সংক্রান্ত সমস্যার (যেমন
UNAVAILABLE,DEADLINE_EXCEEDED,INTERNAL,UNKNOWNওABORTED) জন্য এবং প্রতি মিনিটের রেট সীমা (RESOURCE_EXHAUSTEDসহRATE_LIMIT_EXCEEDED) সংক্রান্ত সমস্যার জন্য আবার চেষ্টা করুন।রেট লিমিটের জন্য,
quota_limit-এর মধ্যেErrorInfoদেখুন:সীমা প্রতি মিনিট (যেমন
IngestionMutateRequestsPerMinutePerProject) হলে, অনুরোধ পজ করুন এবং জিটার সহ এক্সপোনেনশিয়াল ব্যাকঅফ ব্যবহার করে আবার চেষ্টা করুন।সীমা প্রতিদিন (যেমন
IngestionMutateRequestsPerDayPerProject) হলে, সঙ্গে সঙ্গে আবার চেষ্টা করবেন না। প্যাসিফিক সময় অনুযায়ী মধ্যরাতে দৈনিক কোটা রিসেট না হওয়া পর্যন্ত প্রসেসিং পজ করুন।
আবার চেষ্টা করার মধ্যে ক্রমবর্ধমান সময়সীমার জন্য অপেক্ষা করতে, এক্সপোনেনশিয়াল ব্যাকঅফ অ্যালগরিদম ব্যবহার করুন। এটি আগে থেকেই স্ট্রেসড পরিষেবাতে অতিরিক্ত চাপ দেওয়া এড়াতে সাহায্য করে। যেমন, ১ সেকেন্ড, তারপর ২ সেকেন্ড, তারপর ৪ সেকেন্ড অপেক্ষা করুন এবং এটি সর্বাধিক বার আবার চেষ্টা করা বা মোট অপেক্ষা করার সময় পর্যন্ত চালিয়ে যান।
ব্যাকঅফ ডিলেতে অল্প পরিমাণে র্যান্ডম "জিটার" যোগ করুন যাতে অনেক ক্লায়েন্ট একসাথে আবার চেষ্টা করলে "থান্ডারিং হার্ড" সমস্যা এড়ানো যায়।
- পুঙ্খানুপুঙ্খভাবে লগ করা
সমস্ত স্ট্যান্ডার্ড বিবরণ পেলোড সহ সম্পূর্ণ সমস্যার উত্তর লগ করুন, বিশেষ করে অনুরোধ আইডি। প্রয়োজন হলে Google সহায়তা টিমের কাছে সমস্যা ডিব্যাগ ও রিপোর্ট করার জন্য এই তথ্য অপরিহার্য।
- ব্যবহারকারীর মতামত প্রদান করা
স্ট্যান্ডার্ড বিস্তারিত পেলোড-এ থাকা কোড ও মেসেজের ভিত্তিতে, আপনার অ্যাপ্লিকেশনের ব্যবহারকারীদের স্পষ্ট ও সহায়ক মতামত দিন। যেমন, শুধু "একটি সমস্যা হয়েছে" বলার পরিবর্তে, আপনি বলতে পারেন "ট্রানজ্যাকশন আইডি পাওয়া যায়নি" অথবা "গন্তব্যের অ্যাকাউন্ট আইডি পাওয়া যায়নি।"
এইসব নির্দেশিকা অনুসরণ করে, আপনি Data Manager API-এর মাধ্যমে ফেরত পাঠানো এরর কার্যকরভাবে ডায়াগনসিস ও হ্যান্ডেল করতে পারবেন, যার ফলে আরও স্থিতিশীল ও ব্যবহারকারীর পক্ষে উপযোগী অ্যাপ্লিকেশন তৈরি করা যাবে।