এই নির্দেশিকা থেকে জানা যায় যে Data Manager API কীভাবে সমস্যা ম্যানেজ করে এবং সেই সম্পর্কে জানায়। API সংক্রান্ত সমস্যার গঠন ও অর্থ বোঝা, ভুল ইনপুট থেকে শুরু করে সাময়িকভাবে পরিষেবা উপলভ্য না থাকার মতো সমস্যাগুলি সহজে সমাধান করতে পারে এমন শক্তিশালী অ্যাপ্লিকেশন তৈরি করার জন্য অত্যন্ত গুরুত্বপূর্ণ।
ডেটা ম্যানেজার API স্ট্যান্ডার্ড Google API ত্রুটি মডেল অনুসরণ করে, যা gRPC স্ট্যাটাস কোড-এর উপর ভিত্তি করে
তৈরি। প্রতিটি API রেসপন্স যার ফলে কোনও সমস্যা হয়,
তাতে Status অবজেক্ট থাকে, যার মধ্যে এগুলি অন্তর্ভুক্ত:
- একটি সংখ্যাসূচক ত্রুটি কোড।
- একটি সমস্যার মেসেজ।
- ঐচ্ছিক, সমস্যা সংক্রান্ত অতিরিক্ত বিবরণ।
ক্যানোনিকাল ত্রুটি কোড
ডেটা ম্যানেজার API, gRPC ও HTTP দ্বারা সংজ্ঞায়িত ক্যানোনিকাল ত্রুটি কোড-এর সেট ব্যবহার করে। এইসব কোড সমস্যার ধরন সম্পর্কে উচ্চ-স্তরের ইঙ্গিত প্রদান করে। সমস্যার মূল কারণ বুঝতে আপনাকে সবসময় প্রথমে এই কোড চেক করতে হবে।
এইসব কোড সম্পর্কে আরও জানতে, API ডিজাইন গাইড - ত্রুটি কোড দেখুন।
ফাস্ট-ফেল মডেল
ডেটা ম্যানেজার API একটি ফাস্ট-ফেল মডেল ব্যবহার করে। কোনও অনুরোধে স্ট্রাকচারাল সমস্যা থাকলে অথবা কোনও রেকর্ড প্রয়োজনীয় ফিল্ডের জন্য যাচাইকরণে ব্যর্থ হলে, সম্পূর্ণ অনুরোধটি ব্যর্থ হয় এবং API সেই অনুরোধের কোনও ডেটা প্রসেস করে না।
আংশিক ব্যর্থতা মডেলের সাথে তুলনা
ফাস্ট-ফেল মডেলটি অন্যান্য কিছু Google API-এর আংশিক ব্যর্থতার মডেল থেকে আলাদা, যেমন Google Ads API এবং Campaign Manager 360 API। আংশিক ব্যর্থতার মডেলে, কিছু রেকর্ডে ত্রুটি থাকলেও একটি অনুরোধ সফল হয় এবং প্রতিক্রিয়াতে ব্যর্থ রেকর্ডের জন্য ত্রুটির বিবরণ থাকে।
আংশিক ব্যর্থতা সুবিধাজনক হলেও, এতে উল্লেখযোগ্য ঝুঁকি থাকে কারণ আংশিক ব্যর্থতার মডেল আপনাকে ত্রুটি সম্পর্কে প্রোঅ্যাক্টিভভাবে সতর্ক করে না—আপনাকে প্রতিটি উত্তরে স্পষ্টভাবে ত্রুটি চেক করতে হবে। এটি গুরুত্বপূর্ণ সমস্যাগুলি আড়াল করতে পারে কারণ API অনুরোধের অনেক বা এমনকি সমস্ত রেকর্ড প্রত্যাখ্যান করলেও একটি অনুরোধ সফল হয়। কোনও অনুরোধের রেকর্ডের একটি উল্লেখযোগ্য অংশে ত্রুটি থাকলে, কিন্তু আপনি যদি রেসপন্সটি পরীক্ষা না করেন, তাহলে আপনার ডেটার সাথে সম্পর্কিত ব্যাপক সমস্যাগুলি সম্পর্কে আপনি সম্পূর্ণভাবে অসচেতন থাকতে পারেন এবং শুধুমাত্র কয়েক দিন বা সপ্তাহ পরে সেই সমস্যাগুলি আবিষ্কার করতে পারেন যখন ক্রমবর্ধমান ফলাফল আপনার প্রত্যাশার সাথে মেলে না।
ফাস্ট-ফেল মডেল আপনার ডেটা বা ইন্টিগ্রেশনের সমস্যা সম্পর্কে অবিলম্বে আপনাকে সতর্ক করে এই সমস্যাগুলি এড়ায় যাতে আপনি উপযুক্ত ব্যবস্থা নিতে পারেন।
validateOnly-এর মাধ্যমে ফাস্ট-ফেল সমস্যা চেক করুন
বেশিরভাগ ইনজেশন ও সরানোর অনুরোধে validateOnly ফিল্ড কাজ করে। আপনি
validateOnly-কে true হিসেবে সেট করলে, ডেটা ম্যানেজার API সাধারণ অনুরোধের মতোই একই প্রাথমিক যাচাইকরণ
চেক করে, তবে কোনও ডেটা ইনজেস্ট বা সরিয়ে দেয় না।
- অনুরোধে কোনও সমস্যা থাকলে, সাধারণ অনুরোধের ক্ষেত্রে আপনি যে সমস্যার উত্তর পেতেন, এক্ষেত্রেও তাই পাবেন।
- অনুরোধ যাচাই করা গেলে, এটি সফল হয়। উত্তরে ঐচ্ছিক ফিল্ডের জন্য যেকোনও
fieldWarningsঅন্তর্ভুক্ত থাকে, ঠিক যেমন একটি নিয়মিত অনুরোধে থাকে।
এইগুলি করতে validateOnly ব্যবহার করুন:
- আপনার লাইভ ডেটা প্রভাবিত না করে নতুন বা আপডেট করা ইন্টিগ্রেশন পরীক্ষা করুন।
- অনুরোধ আবার পাঠানোর আগে, কোনও সমস্যার সমাধান হয়েছে কিনা তা কনফার্ম করুন।
সমস্যা ম্যানেজ করা
কোনও অনুরোধ সম্পূর্ণ না হলে এইসব ধাপ অনুসরণ করুন:
সমস্যার ধরন জানতে সমস্যার কোড চেক করুন।
- আপনি gRPC ব্যবহার করলে, ত্রুটি কোডটি
Status-এরcodeফিল্ডে থাকে। আপনি ক্লায়েন্ট লাইব্রেরি ব্যবহার করলে, এটি নির্দিষ্ট ধরনের ব্যতিক্রম দেখাতে পারে যা ত্রুটি কোডের সাথে সম্পর্কিত। যেমন, Java-র ক্লায়েন্ট লাইব্রেরিcom.google.api.gax.rpc.InvalidArgumentExceptionথ্রো করে যদি ত্রুটি কোডINVALID_ARGUMENTহয়। - আপনি REST ব্যবহার করলে,
error.status-এ এরর রেসপন্সে এরর কোড থাকে, এবং সংশ্লিষ্ট HTTP স্ট্যাটাসerror.code-এ থাকে।
- আপনি gRPC ব্যবহার করলে, ত্রুটি কোডটি
ত্রুটি কোডের জন্য স্ট্যান্ডার্ড ডিটেল পেলোড চেক করুন। স্ট্যান্ডার্ড ডিটেল পেলোড হল Google API থেকে পাওয়া সমস্যার জন্য মেসেজের সেট। এগুলি আপনাকে পদ্ধতিগত ও সামঞ্জস্যপূর্ণ উপায়ে সমস্যার বিবরণ দেয়। ডেটা ম্যানেজার API থেকে প্রতিটি সমস্যার জন্য একাধিক স্ট্যান্ডার্ড বিবরণ পেলোড মেসেজ থাকতে পারে। ডেটা ম্যানেজার API ক্লায়েন্ট লাইব্রেরিতে সহায়ক পদ্ধতি আছে যার মাধ্যমে কোনও সমস্যা থেকে স্ট্যান্ডার্ড বিবরণ পেলোড পাওয়া যায়।
ত্রুটি কোড যাই হোক না কেন, আমরা আপনাকে
ErrorInfo,RequestInfo,Help, এবংLocalizedMessageপেলোড চেক ও লগ করার সাজেশন দিই।ErrorInfo-এ এমন তথ্য আছে যা অন্যান্য পেলোডে নাও থাকতে পারে।RequestInfo-এ অনুরোধ আইডি আছে, যা সহায়তা টিমের সাথে যোগাযোগ করার সময় কাজে লাগতে পারে।HelpএবংLocalizedMessage-এ লিঙ্ক এবং অন্যান্য বিবরণ রয়েছে যা আপনাকে সমস্যার সমাধান করতে সাহায্য করবে।
এছাড়াও,
BadRequestপেলোডINVALID_ARGUMENTসমস্যার জন্য উপযোগী কারণ এটি কোন ফিল্ডের কারণে সমস্যা হয়েছে সে সম্পর্কে তথ্য প্রদান করে।
ইনজেশন সংক্রান্ত সতর্কতা
ডেটা ম্যানেজার API যতটা সম্ভব ইনজেশন অনুরোধ গ্রহণ করে। আপনি যদি এমন ডেটা অন্তর্ভুক্ত করেন যা প্রয়োজন নেই, তাহলে সেই ফিল্ডগুলির জন্য যাচাইকরণ ব্যর্থ হলে অনুরোধটি ব্যর্থ হবে না। যেমন, কার্টের কোনও আইটেমে মার্চেন্ট প্রোডাক্ট আইডি না থাকলে, API অনুরোধের বাকি অংশ প্রসেস করে এবং একটি সতর্কতা দেখায়।
সফল ইনজেশন রেসপন্সে (HTTP স্ট্যাটাস কোড 200) fieldWarnings তালিকায়
এইসব সতর্কতা অন্তর্ভুক্ত থাকে। প্রতিটি এন্ট্রি হল একটি FieldWarning অবজেক্ট, যাতে
নিম্নলিখিত ফিল্ডগুলি থাকে:
fieldস্নেক কেস পাথ সিনট্যাক্সে, অনুরোধে ফিল্ডের লোকেশন।
কোনও পাথ যদি তালিকার কোনও আইটেমকে (একটি
repeatedফিল্ড) নির্দেশ করে, তাহলে তালিকার নামের পরে থার্ড ব্র্যাকেটে ([...]) এর ইন্ডেক্স দেখানো হয়।যেমন,
events.events[0].cart_data.items[0].merchant_product_idঅনুরোধের প্রথম ইভেন্টের কার্ট ডেটার প্রথম আইটেম সম্পর্কিত একটি সতর্কতা শনাক্ত করে।descriptionপ্রদান করা ভ্যালুর কারণে কেন সতর্কতা দেখানো হয়েছে তার ব্যাখ্যা।
reasonWarningReasonenum ভ্যালু যা সতর্কতার ধরন শনাক্ত করে।
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
INVALID_ARGUMENT (HTTP স্ট্যাটাস কোড 400) সহ কোনও অনুরোধ ব্যর্থ হলে
BadRequest পেলোড চেক করুন।
BadRequest মেসেজ থেকে বোঝা যায় যে অনুরোধে ভুল ভ্যালু সহ ফিল্ড ছিল অথবা
প্রয়োজনীয় ফিল্ডে কোনও ভ্যালু ছিল না। কোন ফিল্ডে সমস্যা আছে তা জানতে
BadRequest-এর field_violations তালিকা চেক করুন। প্রতিটি field_violations এন্ট্রিতে
সমস্যার সমাধান করার জন্য তথ্য থাকে:
fieldস্নেক কেস পাথ সিনট্যাক্সে, অনুরোধে ফিল্ডের লোকেশন।
কোনও পাথ যদি তালিকার কোনও আইটেমকে (একটি
repeatedফিল্ড) নির্দেশ করে, তাহলে তালিকার নামের পরে থার্ড ব্র্যাকেটে ([...]) এর ইন্ডেক্স দেখানো হয়।যেমন,
destinations[0].operating_account.account_idহলdestinationsতালিকার প্রথম আইটেমেরoperating_account-এরaccount_id।descriptionভ্যালুর কারণে কেন সমস্যা হয়েছে তার ব্যাখ্যা।
reasonErrorReasonenum, যেমন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- যে লোকেশনে কোটা এনফোর্স করা হয়। ডেটা ম্যানেজার 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 পেলোড চেক করে ডকুমেন্টেশন ও লোকালাইজ করা সমস্যার মেসেজের লিঙ্ক পান, যা আপনাকে সমস্যা বুঝতে ও সমাধান করতে সাহায্য করবে।
যেমন, এখানে Help এবং LocalizedMessage দেওয়া হল PERMISSION_DENIED-এর জন্য
যা Google Cloud প্রোজেক্টের জন্য ক্রেডেনশিয়াল ব্যবহার করার কারণে ব্যর্থ হয়েছে
যেখানে ডেটা ম্যানেজার 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...
}
...
}
gRPC-এর জন্য হেডার সাইজ সংক্রান্ত সমস্যা ম্যানেজ করা
ইনজেশন বা সরানোর অনুরোধে বিপুল সংখ্যক রেকর্ড যাচাইকরণে ব্যর্থ হলে, ডেটা ম্যানেজার API উত্তরের BadRequest পেলোডে সব ত্রুটি দেখায়।
gRPC-তে, HTTP/2 রেসপন্স হেডারে (মেটাডেটা) পরিষেবাটি এই সমস্যার বিবরণ প্রদান করে। ডিফল্ট হিসেবে, gRPC ক্লায়েন্ট লাইব্রেরি ইনকামিং হেডারের সাইজ সীমিত করে সর্বাধিক সাইজ (সাধারণত ৮–১০ কেবি) করে দেয়। সমস্যার বিবরণ এই সীমা অতিক্রম করলে, সমস্যার উত্তর পার্স করার আগে ক্লায়েন্ট-সাইড HTTP/2 ট্রান্সপোর্ট ব্যর্থ হয়, এই ধরনের ব্যতিক্রম দেখায়:
Http2Exception: Header size exceeded max allowed size (10240)
ক্লায়েন্ট রেসপন্স হেডার প্রসেস করতে পারে না বলে এটি স্ট্রিম বাতিল করে দেয়
(যা সার্ভার-সাইড লগে HTTP স্ট্যাটাস 499 Client Closed Request হিসেবে দেখা যায়),
এবং আপনার অ্যাপ্লিকেশন BadRequest সমস্যার
বিবরণ অ্যাক্সেস করতে পারে না।
এই সমস্যার সমাধান করতে এবং সমস্যার সম্পূর্ণ তালিকা দেখতে, আপনার gRPC ক্লায়েন্টকে ইনকামিং মেটাডেটার সর্বাধিক সাইজ (যেমন ১৬ এমবি) বাড়িয়ে কনফিগার করুন:
.NET
// Creates a client for the ingestion service. Increases the maximum metadata size to // 16MB to prevent RESOURCE_EXHAUSTED errors when responses contain large error // details. IngestionServiceClient ingestionServiceClient = new IngestionServiceClientBuilder { GrpcChannelOptions = GrpcChannelOptions.Empty.WithCustomOption( "grpc.max_metadata_size", 16 * 1024 * 1024 ), }.Build();
Java
// Creates a client for the ingestion service. Increases the maximum metadata size to 16MB to // prevent RESOURCE_EXHAUSTED errors when responses contain large error details. InstantiatingGrpcChannelProvider provider = IngestionServiceSettings.defaultGrpcTransportProviderBuilder() .setMaxInboundMetadataSize(16 * 1024 * 1024) .build(); IngestionServiceSettings settings = IngestionServiceSettings.newBuilder().setTransportChannelProvider(provider).build(); try (IngestionServiceClient ingestionServiceClient = IngestionServiceClient.create(settings)) { // ... }
নোড
// Creates a client for the ingestion service. Increases the maximum metadata // size to 16MB to prevent RESOURCE_EXHAUSTED errors when responses contain // large error details. const client = new IngestionServiceClient({ 'grpc.max_metadata_size': 16 * 1024 * 1024, });
PHP
// Creates a client for the ingestion service. Increases the maximum metadata size to 16MB to // prevent RESOURCE_EXHAUSTED errors when responses contain large error details. $client = new IngestionServiceClient([ 'transportConfig' => [ 'grpc' => [ 'stubOpts' => [ 'grpc.max_metadata_size' => 16 * 1024 * 1024, ], ], ], ]);
Python
# Creates a client for the ingestion service. Increases the maximum # metadata size to 16MB to prevent RESOURCE_EXHAUSTED errors when responses # contain large error details. channel = datamanager_v1.services.ingestion_service.transports.IngestionServiceGrpcTransport.create_channel( options=[("grpc.max_metadata_size", 16 * 1024 * 1024)] ) transport = datamanager_v1.services.ingestion_service.transports.IngestionServiceGrpcTransport( channel=channel ) client: datamanager_v1.IngestionServiceClient = ( datamanager_v1.IngestionServiceClient(transport=transport) )
সমস্যা সমাধানের পেশাদার পদ্ধতি
রেজিলিয়েন্ট অ্যাপ্লিকেশন তৈরি করতে, নিম্নলিখিত পেশাদার পদ্ধতি প্রয়োগ করুন।
- পাঠানোর আগে যাচাই করুন
- আপনি যখন কোনও ইন্টিগ্রেশন তৈরি বা পরিবর্তন করেন, তখন ডেটা ইনজেস্ট করার আগে
ফাস্ট-ফেল ত্রুটি ধরতে
true-এ সেট করাvalidateOnly-এর সাথে অনুরোধ পাঠান। - সমস্যার বিবরণ পরীক্ষা করুন
- সবসময় স্ট্যান্ডার্ড বিবরণ
পেলোড-এর মধ্যে একটি খুঁজুন, যেমন
BadRequest। প্রতিটি স্ট্যান্ডার্ড বিস্তারিত পেলোডে এমন তথ্য থাকে যা আপনাকে সমস্যার কারণ বুঝতে সাহায্য করে। - ক্লায়েন্ট ও সার্ভারের সমস্যা আলাদা করা
আপনার ইমপ্লিমেন্টেশন (ক্লায়েন্ট) নাকি API (সার্ভার)-এর সমস্যার কারণে এই সমস্যা হয়েছে তা নির্ধারণ করুন।
- ক্লায়েন্ট সংক্রান্ত সমস্যা:
INVALID_ARGUMENT,NOT_FOUND,PERMISSION_DENIED,FAILED_PRECONDITION,UNAUTHENTICATED-এর মতো কোড। এগুলির জন্য অনুরোধ বা আপনার অ্যাপ্লিকেশনের অবস্থা/ক্রেডেনশিয়াল পরিবর্তন করতে হবে। সমস্যার সমাধান না করে অনুরোধটি আবার করবেন না। - সার্ভার সংক্রান্ত সমস্যা:
UNAVAILABLE,INTERNAL,DEADLINE_EXCEEDED,UNKNOWN-এর মতো কোড। এগুলি থেকে বোঝা যায় যে API পরিষেবায় সাময়িক সমস্যা হয়েছে।
- ক্লায়েন্ট সংক্রান্ত সমস্যা:
- আবার চেষ্টা করার স্ট্র্যাটেজি প্রয়োগ করুন
সমস্যাটি আবার চেষ্টা করা যাবে কিনা তা নির্ধারণ করুন এবং আবার চেষ্টা করার কৌশল ব্যবহার করুন।
ট্রানজিয়েন্ট সার্ভার সংক্রান্ত সমস্যার (যেমন
UNAVAILABLE,DEADLINE_EXCEEDED,INTERNAL,UNKNOWNএবংABORTED) এবং প্রতি-মিনিট রেট লিমিটের (RATE_LIMIT_EXCEEDED-এর সাথেRESOURCE_EXHAUSTED) জন্য শুধুমাত্র আবার চেষ্টা করুন।রেট লিমিটের জন্য,
quota_limit-এErrorInfoচেক করুন:সীমা যদি প্রতি-মিনিট (যেমন
IngestionMutateRequestsPerMinutePerProject) হয়, তাহলে অনুরোধ পজ করুন এবং জিটার সহ এক্সপোনেনশিয়াল ব্যাকঅফ ব্যবহার করে আবার চেষ্টা করুন।সীমা দৈনিক হলে (যেমন
IngestionMutateRequestsPerDayPerProject), অবিলম্বে আবার চেষ্টা করবেন না। প্রশান্ত মহাসাগরীয় সময় অনুযায়ী মধ্যরাতে দৈনিক কোটা রিসেট না হওয়া পর্যন্ত প্রসেসিং পজ করুন।
আবার চেষ্টা করার মধ্যে ক্রমবর্ধমান সময়সীমার জন্য অপেক্ষা করতে এক্সপোনেনশিয়াল ব্যাকঅফ অ্যালগরিদম ব্যবহার করুন। এটি আগে থেকেই চাপে থাকা পরিষেবার উপর অতিরিক্ত চাপ এড়াতে সাহায্য করে। যেমন, ১ সেকেন্ড অপেক্ষা করুন, তারপর ২ সেকেন্ড, তারপর ৪ সেকেন্ড, এইভাবে সর্বাধিক সংখ্যক বার চেষ্টা করা বা মোট অপেক্ষা করার সময় পর্যন্ত চালিয়ে যান।
ব্যাকঅফ বিলম্বের সাথে অল্প পরিমাণে "জিটার" যোগ করুন যাতে "থান্ডারিং হার্ড" সমস্যা এড়ানো যায়, যেখানে অনেক ক্লায়েন্ট একসাথে আবার চেষ্টা করে।
- বিস্তারিতভাবে লগ করুন
সব স্ট্যান্ডার্ড বিবরণ পেলোড সহ সম্পূর্ণ সমস্যা সংক্রান্ত উত্তর লগ করুন, বিশেষ করে অনুরোধ আইডি। প্রয়োজন হলে, ডিবাগিং এবং Google সহায়তা টিমের কাছে সমস্যা রিপোর্ট করার জন্য এই তথ্য অত্যন্ত গুরুত্বপূর্ণ।
- ব্যবহারকারীর মতামত দিন
স্ট্যান্ডার্ড ডিটেল পেলোড-এ থাকা কোড ও মেসেজের উপর ভিত্তি করে, আপনার অ্যাপ্লিকেশনের ব্যবহারকারীদের স্পষ্ট ও সহায়ক মতামত প্রদান করুন। যেমন, শুধু "একটি সমস্যা হয়েছে" বলার পরিবর্তে আপনি বলতে পারেন "ট্রানজ্যাকশন আইডি পাওয়া যায়নি" অথবা "গন্তব্যের অ্যাকাউন্ট আইডি খুঁজে পাওয়া যায়নি।"
এইসব নির্দেশিকা অনুসরণ করে, আপনি Data Manager API-এর মাধ্যমে রিটার্ন করা সমস্যা কার্যকরভাবে ডায়াগনসিস ও ম্যানেজ করতে পারবেন, যার ফলে আরও স্থিতিশীল ও ব্যবহারকারীর পক্ষে উপযোগী অ্যাপ্লিকেশন তৈরি করা যাবে।