org.apache.rocketmq.shaded.io.opentelemetry.exporter.internal.retry.RetryUtil Maven / Gradle / Ivy
/*
* 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);
}
}
}