# 프로덕션이 실제로 내는 사유 전수 32: RetryDisposition.RETRY_FULL_TRANSACTION, delay, "retryable persistence failure"); 53: return RetryDecision.reconcile("transaction completion is unknown"); 56: return RetryDecision.fail("attempt performed an irreversible external side effect"); 59: return RetryDecision.fail("retry is not enabled for this transaction profile"); 63: return RetryDecision.fail("failure was classified as non-retryable"); 67: return RetryDecision.fail("non-retryable persistence failure"); 70- backoff.forAttempt(attempt.number()), "retrying whole transaction for " + category); # 같은 모듈이 저카디널리티를 이미 정의해 뒀다 * *

The check is structural: registered names already match a bounded format, so anything that * does not is rejected rather than sanitised. Sanitising would let the caller keep passing * unbounded values and never notice. */ public final class LowCardinality { /** The shape every registered operation, query, and category name already satisfies. */ private static final Pattern REGISTERED = Pattern.compile("[a-zA-Z][a-zA-Z0-9._-]{0,95}"); /** * Fails when any value is not a registered, bounded identifier. * * @throws IllegalArgumentException naming the first offending value */ public static void requireRegistered(String... values) { for (String value : values) { if (value == null || !REGISTERED.matcher(value).matches()) { throw new IllegalArgumentException( "metric tag value is not a registered low-cardinality identifier"); } # 그 사유들을 그 가드에 실제로 넣어 본다 거절 29자 retryable persistence failure 거절 33자 transaction completion is unknown 거절 54자 attempt performed an irreversible external side effect 거절 49자 retry is not enabled for this transaction profile 거절 39자 failure was classified as non-retryable 거절 33자 non-retryable persistence failure 거절 52자 retrying whole transaction for SERIALIZATION_FAILURE 생성자에 100000자를 넣었을 때: 통과, 담긴 길이 100000