Bu kılavuzda, Data Manager API'sinin hataları nasıl işlediği ve ilettiği açıklanmaktadır. API hatalarının yapısını ve anlamını anlamak, geçersiz girişten geçici hizmet kesintisine kadar sorunları düzgün bir şekilde ele alabilen sağlam uygulamalar oluşturmak için çok önemlidir.
Data Manager API, gRPC durum kodlarını temel alan standart Google API'leri hata modelini kullanır. Hatayla sonuçlanan her API yanıtı,
aşağıdakileri içeren bir Status nesnesi içerir:
- Sayısal bir hata kodu.
- Hata mesajı.
- İsteğe bağlı, ek hata ayrıntıları.
Standart hata kodları
Data Manager API, gRPC ve HTTP tarafından tanımlanan bir dizi standart hata kodu kullanır. Bu kodlar, hata türünün üst düzey bir göstergesini sağlar. Sorunun temel doğasını anlamak için her zaman önce bu kodu kontrol etmeniz gerekir.
Bu kodlar hakkında daha fazla bilgi için API Tasarım Kılavuzu - Hata kodları başlıklı makaleyi inceleyin.
Hızlı hata tespiti modeli
Data Manager API, hızlı başarısızlık modelini kullanır. Bir istekte yapısal hatalar varsa veya herhangi bir kayıt, zorunlu bir alan için doğrulamadan geçemezse isteğin tamamı başarısız olur ve API, bu istekteki verilerin hiçbirini işlemez.
Kısmi hata modeliyle karşılaştırma
Hızlı başarısızlık modeli, Google Ads API ve Campaign Manager 360 API gibi diğer bazı Google API'lerindeki kısmi başarısızlık modelinden farklıdır. Kısmi hata modelinde, bazı kayıtlarda hata olsa bile istek başarılı olur ve yanıt, başarısız kayıtlarla ilgili hata ayrıntılarını içerir.
Kısmi hata kullanışlı olsa da önemli riskler taşır. Kısmi hata modeli, hatalar konusunda sizi proaktif olarak uyarmaz. Her yanıttaki hataları açıkça kontrol etmeniz gerekir. API, istekteki kayıtların çoğunu, hatta tümünü reddetse bile istek başarılı olduğu için bu durum önemli sorunları gizleyebilir. Bir istekteki kayıtların önemli bir kısmında hata varsa ancak yanıtı incelemiyorsanız verilerinizle ilgili yaygın sorunlardan tamamen habersiz olabilirsiniz ve bu sorunları yalnızca günler veya haftalar sonra, kümülatif sonuçlar beklentilerinizle uyuşmadığında fark edebilirsiniz.
Hızlı başarısızlık modeli, verileriniz veya entegrasyonunuzla ilgili sorunlar hakkında sizi hemen uyararak bu sorunlardan kaçınmanızı sağlar. Böylece uygun işlemi yapabilirsiniz.
validateOnly ile hızlı başarısızlık hatalarını kontrol etme
Çoğu besleme ve kaldırma isteği validateOnly alanını destekler. validateOnly parametresini true olarak ayarladığınızda Data Manager API, normal bir istek için yaptığı temel doğrulama kontrollerini yapar ancak herhangi bir veriyi içe aktarmaz veya kaldırmaz.
- İstekte hata varsa normal bir istekten alacağınız hata yanıtıyla başarısız olur.
- İstek, doğrulama aşamasını geçerse başarılı olur. Yanıt, normal bir istekte olduğu gibi isteğe bağlı alanlar için
fieldWarningsiçerir.
validateOnly ile yapabilecekleriniz:
- Canlı verilerinizi etkilemeden yeni veya güncellenmiş bir entegrasyonu test etme
- İsteği yeniden göndermeden önce, düzeltmenin hatayı giderdiğini onaylayın.
Hataları işleme
Bir istek başarısız olduğunda aşağıdaki adımları uygulayın:
Hata türünü bulmak için hata kodunu kontrol edin.
- gRPC kullanıyorsanız hata kodu,
Statusöğesinincodealanında yer alır. İstemci kitaplığı kullanıyorsanız hata koduna karşılık gelen belirli bir istisna türü oluşturabilir. Örneğin, Java için istemci kitaplığı, hata koduINVALID_ARGUMENTisecom.google.api.gax.rpc.InvalidArgumentExceptionhatası verir. - REST kullanıyorsanız hata kodu,
error.statusadresindeki hata yanıtında, ilgili HTTP durumu iseerror.codeadresinde bulunur.
- gRPC kullanıyorsanız hata kodu,
Hata kodu için standart ayrıntı yükünü kontrol edin. Standart ayrıntı yükleri, Google API'lerinden gelen hatalar için bir mesaj kümesidir. Hata ayrıntılarını yapılandırılmış ve tutarlı bir şekilde sunarlar. Data Manager API'den gelen her hatada birden fazla standart ayrıntı yükü mesajı olabilir. Data Manager API istemci kitaplıklarında, bir hatadan standart ayrıntı yüklerini almak için yardımcı yöntemler bulunur.
Hata kodu ne olursa olsun
ErrorInfo,RequestInfo,HelpveLocalizedMessageyüklerini kontrol etmenizi ve günlüğe kaydetmenizi öneririz.ErrorInfo, diğer yüklerde bulunmayabilecek bilgiler içerir.RequestInfo, destek ekibiyle iletişime geçmeniz gerekirse yararlı olabilecek istek kimliğini içerir.HelpveLocalizedMessage, hatayı gidermenize yardımcı olacak bağlantılar ve diğer ayrıntıları içerir.
Ayrıca
BadRequestyükü, hataya hangi alanların neden olduğu hakkında bilgi sağladığındanINVALID_ARGUMENThataları için kullanışlıdır.
Besleme uyarıları
Data Manager API, veri alma isteğinin mümkün olduğunca büyük bir kısmını kabul eder. Gerekli olmayan veriler eklerseniz bu alanlardaki doğrulama hataları, isteğin başarısız olmasına neden olmaz. Örneğin, bir alışveriş sepeti öğesinde satıcı ürün kimliği eksikse API, isteğin geri kalanını işler ve bir uyarı döndürür.
Başarılı bir besleme yanıtı (HTTP durum kodu 200), bu uyarıları bir fieldWarnings listesinde içerir. Her giriş, aşağıdaki alanları içeren bir FieldWarning nesnesidir:
fieldİstekteki alanın konumu (alt çizgili yazım yolu söz diziminde).
Bir yol, listedeki bir öğeyi (
repeatedalanı) işaret ediyorsa dizini, listenin adından sonra köşeli parantez içinde ([...]) gösterilir.Örneğin,
events.events[0].cart_data.items[0].merchant_product_id, istekteki ilk etkinliğin alışveriş sepeti verilerindeki ilk öğeyle ilgili bir uyarıyı tanımlar.descriptionSağlanan değerin neden uyarıya neden olduğuna dair bir açıklama.
reasonUyarının türünü tanımlayan
WarningReasonenum değeri.
FieldWarning ile ilgili örnek
Alışveriş sepeti öğelerinden birinin satıcı ürün kimliği eksik olduğu için uyarı içeren başarılı bir besleme isteğine ait örnek yanıtı aşağıda bulabilirsiniz.
{
"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"
}
]
}
Standart ayrıntı yükleri
Data Manager API için en yaygın standart ayrıntı yükleri şunlardır:
BadRequest
Bir istek INVALID_ARGUMENT (HTTP durum kodu 400) ile başarısız olduğunda BadRequest yükünü kontrol edin.
BadRequest mesajı, istekte hatalı değerler içeren alanlar olduğunu veya zorunlu bir alanın değerinin eksik olduğunu gösterir. Hangi alanlarda hata olduğunu bulmak için BadRequest bölümündeki field_violations listesini kontrol edin. Her field_violations girişinde,
hatayı düzeltmenize yardımcı olacak bilgiler bulunur:
fieldİstekteki alanın konumu (alt çizgili yazım yolu söz diziminde).
Bir yol, listedeki bir öğeyi (
repeatedalanı) işaret ediyorsa dizini, listenin adından sonra köşeli parantez içinde ([...]) gösterilir.Örneğin,
destinations[0].operating_account.account_id,destinationslistesindeki ilk öğeninoperating_accountiçindekiaccount_id.descriptionDeğerin neden hataya neden olduğuna dair bir açıklama.
reasonErrorReasonenum (ör.INVALID_HEX_ENCODINGveyaINVALID_CURRENCY_CODE).
BadRequest örnekleri
BadRequest mesajı içeren bir INVALID_ARGUMENT hatası için örnek yanıtı aşağıda bulabilirsiniz. field_violations, hatanın sayı olmayan bir accountId olduğunu gösterir. field değeri destinations[0].login_account.account_id, alan ihlali içeren accountId öğesinin destinations listesindeki ilk öğenin login_account içinde olduğunu gösterir.
{
"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"
}
]
}
]
}
}
BadRequest mesajı içeren bir INVALID_ARGUMENT hatasından alınan başka bir örnek yanıtı aşağıda bulabilirsiniz. Bu durumda, field_violations listesinde iki hata gösterilir:
İlk
event, etkinliğin ikinci kullanıcı kimliğinde onaltılık kodlanmamış bir değere sahip.İkinci
event, etkinliğin üçüncü kullanıcı kimliğinde onaltılık kodlanmamış bir değere sahip.
{
"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
Bir istek başarısız olduğunda RequestInfo yükünü kontrol edin. RequestInfo,
API isteğinizi benzersiz şekilde tanımlayan request_id içerir.
{
"@type": "type.googleapis.com/google.rpc.RequestInfo",
"requestId": "t-4490c640-dc5d-4c28-91c1-04a1cae0f49f"
}
Hataları günlüğe kaydederken veya destek ekibiyle iletişime geçerken sorunların teşhis edilmesine yardımcı olmak için istek kimliğini eklediğinizden emin olun.
ErrorInfo
Diğer standart ayrıntı yüklerinde yakalanamayabilecek ek bilgileri almak için ErrorInfo mesajını kontrol edin. ErrorInfo yükü, hatayla ilgili bilgileri içeren bir metadata eşlemesi içerir.
Örneğin, Veri Yöneticisi API'sinin etkinleştirilmediği bir Google Cloud projesinin kimlik bilgilerinin kullanılmasından kaynaklanan PERMISSION_DENIED hatası için ErrorInfo aşağıda verilmiştir. ErrorInfo, hatayla ilgili ek bilgiler sağlar. Örneğin:
metadata.consumeraltında, istekle ilişkili proje.- Hizmetin adı (
metadata.serviceTitlealtında). - Hizmetin etkinleştirilebileceği URL (
metadata.activationUrlaltında).
{
"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"
}
},
...
]
}
}
Kota ve sıklık sınırlaması hataları
Bir istek proje sınırını aştığında API, RESOURCE_EXHAUSTED hatası (HTTP durum kodu 429) döndürür. ErrorInfo yükü, metadata eşlemesinde hangi sınırın aşıldığıyla ilgili ayrıntıları sağlar:
consumer- İstekle ilişkili Google Cloud projesi,
projects/PROJECT_NUMBERolarak biçimlendirilmiş. quota_limit- Aşılan kota sınırının adı (ör.
IngestionMutateRequestsPerMinutePerProjectveyaIngestionMutateRequestsPerDayPerProject). Uygulamanın dakika başına sınırı mı yoksa günlük sınırı mı aştığını belirlemek için bu değeri kullanabilirsiniz. Sınır adlarının tam listesi için Proje sınırları başlıklı makaleyi inceleyin. quota_location- Kotanın uygulandığı konum. Data Manager API için bu değer her zaman
globalolur. quota_metric- Sınırla ilişkili metrik (ör.
datamanager.googleapis.com/ingestion_mutate_requests). service- Hizmetin adı,
datamanager.googleapis.com.
Bir istek, besleme değişiklik istekleri için dakika başına sınırı aştığında döndürülen RESOURCE_EXHAUSTED hata yanıtına dair bir örneği aşağıda bulabilirsiniz:
{
"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 ve LocalizedMessage
Hatayı anlamanıza ve düzeltmenize yardımcı olacak dokümanların ve yerelleştirilmiş hata mesajlarının bağlantılarını almak için Help ve LocalizedMessage yüklerini kontrol edin.
Örneğin, Veri Yöneticisi API'sinin etkinleştirilmediği bir Google Cloud projesinin kimlik bilgilerinin kullanılmasından kaynaklanan PERMISSION_DENIED hatası için Help ve LocalizedMessage aşağıda verilmiştir. Help yükü, hizmetin etkinleştirilebileceği URL'yi gösterir ve LocalizedMessage, hatanın açıklamasını içerir.
{
"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"
}
]
},
...
]
}
}
Erişim hatası ayrıntıları
İstemci kitaplıklarından birini kullanıyorsanız standart ayrıntı yüklerini almak için yardımcı yöntemleri kullanın.
.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 için üstbilgi boyutu hatalarını giderme
Bir besleme veya kaldırma isteğindeki çok sayıda kaydın doğrulaması başarısız olduğunda Data Manager API, yanıttaki BadRequest yükünde tüm hataları döndürür.
gRPC'de hizmet, bu hata ayrıntılarını HTTP/2 yanıt başlıklarında (meta veriler) döndürür. Varsayılan olarak gRPC istemci kitaplıkları, gelen üstbilgileri maksimum boyutla (genellikle 8-10 KB) sınırlandırır. Hata ayrıntıları bu sınırı aşarsa istemci tarafı HTTP/2 aktarımı, hata yanıtını ayrıştırmadan önce başarısız olur ve aşağıdaki gibi bir istisna oluşturur:
Http2Exception: Header size exceeded max allowed size (10240)
İstemci, yanıt başlıklarını işleyemediği için akışı iptal eder (sunucu tarafı günlüklerinde HTTP durumu 499 Client Closed Request olarak görünür) ve uygulamanız BadRequest hata ayrıntılarına erişemez.
Bu sorunu çözmek ve hataların tam listesini incelemek için gRPC istemcinizi, maksimum gelen meta veri boyutunu artıracak şekilde (ör. 16 MB) yapılandırın:
.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)) { // ... }
Düğüm
// 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) )
Hata işleme ile ilgili en iyi uygulamalar
Esnek uygulamalar oluşturmak için aşağıdaki en iyi uygulamaları uygulayın.
- Göndermeden önce doğrulama
- Bir entegrasyon oluşturduğunuzda veya değiştirdiğinizde, verileri beslemeden önce hızlı başarısızlık hatalarını yakalamak için
validateOnlydeğeritrueolarak ayarlanmış istekler gönderin. - Hata ayrıntılarını inceleme
- Her zaman
BadRequestgibi standart ayrıntı yüklerinden birini arayın. Her standart ayrıntı yükü, hatanın nedenini anlamanıza yardımcı olacak bilgiler içerir. - İstemci hatalarını sunucu hatalarından ayırt etme
Hatanın, uygulamanızla (istemci) ilgili bir sorundan mı yoksa API (sunucu) ile ilgili bir sorundan mı kaynaklandığını belirleyin.
- İstemci hataları:
INVALID_ARGUMENT,NOT_FOUND,PERMISSION_DENIED,FAILED_PRECONDITION,UNAUTHENTICATEDgibi kodlar. Bu hatalar, istekte veya uygulamanızın durumunda/kimlik bilgilerinde değişiklik yapılmasını gerektirir. Sorunu çözmeden isteği tekrar denemeyin. - Sunucu hataları:
UNAVAILABLE,INTERNAL,DEADLINE_EXCEEDED,UNKNOWNgibi kodlar. Bu durum, API hizmetinde geçici bir sorun olduğunu gösterir.
- İstemci hataları:
- Yeniden deneme stratejisi uygulama
Hatanın yeniden denenip denenemeyeceğini belirleyin ve bir yeniden deneme stratejisi kullanın.
Yalnızca geçici sunucu hataları (ör.
UNAVAILABLE,DEADLINE_EXCEEDED,INTERNAL,UNKNOWNveABORTED) ve dakika başına sıklık sınırları (RATE_LIMIT_EXCEEDEDileRESOURCE_EXHAUSTED) için yeniden deneyin.Sıklık sınırları için
quota_limitöğesiniErrorInfoiçinde inceleyin:Sınır dakika başına ise (ör.
IngestionMutateRequestsPerMinutePerProject) istekleri duraklatın ve gecikmeli eksponansiyel geri yükleme kullanarak yeniden deneyin.Sınır günlük ise (ör.
IngestionMutateRequestsPerDayPerProject) hemen tekrar denemeyin. Günlük kota Pasifik Saati'ne göre gece yarısında sıfırlanana kadar işleme duraklatılır.
Yeniden denemeler arasında artan süreler boyunca beklemek için eksponansiyel geri yükleme algoritması kullanın. Bu sayede, zaten yoğun olan hizmetin daha da yoğunlaşması önlenir. Örneğin, 1 saniye, ardından 2 saniye, ardından 4 saniye bekleyerek maksimum yeniden deneme sayısına veya toplam bekleme süresine ulaşana kadar devam edin.
Birçok istemcinin aynı anda yeniden deneme yaptığı "gürleyen sürü" sorununu önlemek için bekleme gecikmelerine küçük ve rastgele bir "titreşim" miktarı ekleyin.
- Kapsamlı günlük kaydı
Tüm standart ayrıntı yükleri, özellikle de istek kimliği dahil olmak üzere tam hata yanıtını günlüğe kaydedin. Bu bilgiler, hata ayıklama ve gerektiğinde sorunları Google Destek Ekibi'ne bildirme açısından önemlidir.
- Kullanıcı geri bildirimi sağlama
Standart ayrıntı yüklerindeki kodlara ve mesajlara göre uygulamanızın kullanıcılarına net ve faydalı geri bildirimler sağlayın. Örneğin, yalnızca "Bir hata oluştu" yerine "İşlem kimliği eksikti" veya "Hedefin hesap kimliği bulunamadı" diyebilirsiniz.
Bu yönergeleri uygulayarak Data Manager API'si tarafından döndürülen hataları etkili bir şekilde teşhis edip işleyebilir, böylece daha kararlı ve kullanıcı dostu uygulamalar oluşturabilirsiniz.