classifyCommandError classifies an error for metrics reporting. Returns: errorType, statusCode, isInternal - errorType: A string describing the error type (e.g., "TIMEOUT", "NETWORK", "ERR") - statusCode: The Redis error prefix or error category - isInternal: true for network/timeout errors, false f
(err error)
| 895 | // - statusCode: The Redis error prefix or error category |
| 896 | // - isInternal: true for network/timeout errors, false for Redis server errors |
| 897 | func classifyCommandError(err error) (errorType, statusCode string, isInternal bool) { |
| 898 | if err == nil { |
| 899 | return "", "", false |
| 900 | } |
| 901 | |
| 902 | errStr := err.Error() |
| 903 | |
| 904 | // Check for timeout errors |
| 905 | if netErr, ok := err.(net.Error); ok && netErr.Timeout() { |
| 906 | return "TIMEOUT", "TIMEOUT", true |
| 907 | } |
| 908 | |
| 909 | // Check for network errors |
| 910 | if _, ok := err.(net.Error); ok { |
| 911 | return "NETWORK", "NETWORK", true |
| 912 | } |
| 913 | |
| 914 | // Check for context errors |
| 915 | if errors.Is(err, context.Canceled) { |
| 916 | return "CONTEXT_CANCELED", "CONTEXT_CANCELED", true |
| 917 | } |
| 918 | if errors.Is(err, context.DeadlineExceeded) { |
| 919 | return "CONTEXT_TIMEOUT", "CONTEXT_TIMEOUT", true |
| 920 | } |
| 921 | |
| 922 | // Check for Redis errors |
| 923 | // Examples: "ERR ...", "WRONGTYPE ...", "CLUSTERDOWN ..." |
| 924 | if len(errStr) > 0 { |
| 925 | // Find the first space to extract the prefix |
| 926 | spaceIdx := 0 |
| 927 | for i, c := range errStr { |
| 928 | if c == ' ' { |
| 929 | spaceIdx = i |
| 930 | break |
| 931 | } |
| 932 | } |
| 933 | if spaceIdx == 0 { |
| 934 | spaceIdx = len(errStr) |
| 935 | } |
| 936 | prefix := errStr[:spaceIdx] |
| 937 | isUppercase := true |
| 938 | for _, c := range prefix { |
| 939 | if c < 'A' || c > 'Z' { |
| 940 | isUppercase = false |
| 941 | break |
| 942 | } |
| 943 | } |
| 944 | if isUppercase && len(prefix) > 0 { |
| 945 | return prefix, prefix, false |
| 946 | } |
| 947 | } |
| 948 | |
| 949 | return "UNKNOWN", "UNKNOWN", true |
| 950 | } |
| 951 | |
| 952 | func (c *baseClient) assertUnstableCommand(cmd Cmder) (bool, error) { |
| 953 | // All search commands (FTSearchCmd, AggregateCmd, FTInfoCmd, FTSpellCheckCmd, FTSynDumpCmd) |
no test coverage detected