All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.rocketmq.shaded.io.opentelemetry.exporter.internal.retry.RetryUtil Maven / Gradle / Ivy

There is a newer version: 5.0.7
Show newest version
/*
 * Copyright The OpenTelemetry Authors
 * SPDX-License-Identifier: Apache-2.0
 */

package org.apache.rocketmq.shaded.io.opentelemetry.exporter.internal.retry;

import org.apache.rocketmq.shaded.io.opentelemetry.exporter.internal.grpc.DefaultGrpcExporterBuilder;
import org.apache.rocketmq.shaded.io.opentelemetry.exporter.internal.grpc.GrpcStatusUtil;
import org.apache.rocketmq.shaded.io.opentelemetry.exporter.internal.grpc.OkHttpGrpcExporterBuilder;
import org.apache.rocketmq.shaded.io.opentelemetry.exporter.internal.okhttp.OkHttpExporterBuilder;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
 * This class is internal and is hence not for public use. Its APIs are unstable and can change at
 * any time.
 */
public class RetryUtil {

  private static final Set RETRYABLE_GRPC_STATUS_CODES;
  private static final Set RETRYABLE_HTTP_STATUS_CODES =
      Collections.unmodifiableSet(new HashSet<>(Arrays.asList(429, 502, 503, 504)));

  static {
    Set retryableGrpcStatusCodes = new HashSet<>();
    retryableGrpcStatusCodes.add(GrpcStatusUtil.GRPC_STATUS_CANCELLED);
    retryableGrpcStatusCodes.add(GrpcStatusUtil.GRPC_STATUS_DEADLINE_EXCEEDED);
    retryableGrpcStatusCodes.add(GrpcStatusUtil.GRPC_STATUS_RESOURCE_EXHAUSTED);
    retryableGrpcStatusCodes.add(GrpcStatusUtil.GRPC_STATUS_ABORTED);
    retryableGrpcStatusCodes.add(GrpcStatusUtil.GRPC_STATUS_OUT_OF_RANGE);
    retryableGrpcStatusCodes.add(GrpcStatusUtil.GRPC_STATUS_UNAVAILABLE);
    retryableGrpcStatusCodes.add(GrpcStatusUtil.GRPC_STATUS_DATA_LOSS);
    RETRYABLE_GRPC_STATUS_CODES = Collections.unmodifiableSet(retryableGrpcStatusCodes);
  }

  private RetryUtil() {}

  /** Returns the retryable gRPC status codes. */
  public static Set retryableGrpcStatusCodes() {
    return RETRYABLE_GRPC_STATUS_CODES;
  }

  /** Returns the retryable HTTP status codes. */
  public static Set retryableHttpResponseCodes() {
    return RETRYABLE_HTTP_STATUS_CODES;
  }

  /**
   * Reflectively access a {@link DefaultGrpcExporterBuilder}, {@link OkHttpGrpcExporterBuilder}, or
   * {@link OkHttpExporterBuilder} instance in field called "delegate" of the instance, and set the
   * {@link RetryPolicy}.
   *
   * @throws IllegalArgumentException if the instance does not contain a field called "delegate" of
   *     type {@link DefaultGrpcExporterBuilder}
   */
  public static void setRetryPolicyOnDelegate(Object instance, RetryPolicy retryPolicy) {
    try {
      Field field = instance.getClass().getDeclaredField("delegate");
      field.setAccessible(true);
      Object value = field.get(instance);
      if (value instanceof DefaultGrpcExporterBuilder) {
        ((DefaultGrpcExporterBuilder) value).setRetryPolicy(retryPolicy);
      } else if (value instanceof OkHttpGrpcExporterBuilder) {
        ((OkHttpGrpcExporterBuilder) value).setRetryPolicy(retryPolicy);
      } else if (value instanceof OkHttpExporterBuilder) {
        ((OkHttpExporterBuilder) value).setRetryPolicy(retryPolicy);
      } else {
        throw new IllegalArgumentException(
            "delegate field is not type DefaultGrpcExporterBuilder or OkHttpGrpcExporterBuilder");
      }
    } catch (NoSuchFieldException | IllegalAccessException e) {
      throw new IllegalArgumentException("Unable to access delegate reflectively.", e);
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy