API hatalarını anlama

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 fieldWarnings iç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:

  1. Hata türünü bulmak için hata kodunu kontrol edin.

    • gRPC kullanıyorsanız hata kodu, Status öğesinin code alanı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 kodu INVALID_ARGUMENT ise com.google.api.gax.rpc.InvalidArgumentException hatası verir.
    • REST kullanıyorsanız hata kodu, error.status adresindeki hata yanıtında, ilgili HTTP durumu ise error.code adresinde bulunur.
  2. 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, Help ve LocalizedMessage yü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.
    • Help ve LocalizedMessage, hatayı gidermenize yardımcı olacak bağlantılar ve diğer ayrıntıları içerir.

    Ayrıca BadRequest yükü, hataya hangi alanların neden olduğu hakkında bilgi sağladığından INVALID_ARGUMENT hataları 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 (repeated alanı) 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.

description

Sağlanan değerin neden uyarıya neden olduğuna dair bir açıklama.

reason

Uyarının türünü tanımlayan WarningReason enum 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 (repeated alanı) işaret ediyorsa dizini, listenin adından sonra köşeli parantez içinde ([...]) gösterilir.

Örneğin, destinations[0].operating_account.account_id, destinations listesindeki ilk öğenin operating_account içindeki account_id.

description

Değerin neden hataya neden olduğuna dair bir açıklama.

reason

ErrorReason enum (ör. INVALID_HEX_ENCODING veya INVALID_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:

  1. İlk event, etkinliğin ikinci kullanıcı kimliğinde onaltılık kodlanmamış bir değere sahip.

  2. İ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.consumer altında, istekle ilişkili proje.
  • Hizmetin adı (metadata.serviceTitle altında).
  • Hizmetin etkinleştirilebileceği URL (metadata.activationUrl altı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_NUMBER olarak biçimlendirilmiş.
quota_limit
Aşılan kota sınırının adı (ör. IngestionMutateRequestsPerMinutePerProject veya IngestionMutateRequestsPerDayPerProject). 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 global olur.
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 validateOnly değeri true olarak ayarlanmış istekler gönderin.
Hata ayrıntılarını inceleme
Her zaman BadRequest gibi 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, UNAUTHENTICATED gibi 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, UNKNOWN gibi kodlar. Bu durum, API hizmetinde geçici bir sorun olduğunu gösterir.
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, UNKNOWN ve ABORTED) ve dakika başına sıklık sınırları (RATE_LIMIT_EXCEEDED ile RESOURCE_EXHAUSTED) için yeniden deneyin.

  • Sıklık sınırları için quota_limit öğesini ErrorInfo iç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.