Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Properly handle error code translation #10574

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions .chloggen/fix-http-grpc-error-code-mapping.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Use this changelog template to create an entry for release notes.

# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: bug_fix

# The name of the component, or a single word describing the area of concern, (e.g. otlpreceiver)
component: otlpreceiver

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Fixes a bug where the otlp receiver's http response was not properly translating grpc error codes to http status codes.

# One or more tracking issues or pull requests related to the change
issues: [10574]

# (Optional) One or more lines of additional information to render under the primary note.
# These lines will be padded with 2 spaces and then inserted directly into the document.
# Use pipe (|) for multiline entries.
subtext:

# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: []
12 changes: 12 additions & 0 deletions receiver/otlpreceiver/internal/errors/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,18 @@ func GetHTTPStatusCodeFromStatus(s *status.Status) int {
case codes.ResourceExhausted:
return http.StatusTooManyRequests
// Not Retryable
case codes.InvalidArgument:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@TylerHelmuth maybe we should this function and its tests to the helper i made last time? https://github.com/open-telemetry/opentelemetry-collector/blob/af33ac5acc08dbeb43426f86b526d2cfd29318ab/internal/httphelper/helper.go#L15C6-L15C33

That way the conversions are in the same place

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jaronoff97 it is all moving (and properly solved by remembering the actual http status code) via #9041, so we should stick with that PR so the permanent solution to this issue. This PR fixes the bug for now.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

cool! I have no problem with that :D

return http.StatusBadRequest
// Not Retryable
case codes.Unauthenticated:
return http.StatusUnauthorized
// Not Retryable
case codes.PermissionDenied:
return http.StatusForbidden
// Not Retryable
case codes.Unimplemented:
return http.StatusNotFound
// Not Retryable
default:
return http.StatusInternalServerError
}
Expand Down
22 changes: 21 additions & 1 deletion receiver/otlpreceiver/internal/errors/errors_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,34 @@ func Test_GetHTTPStatusCodeFromStatus(t *testing.T) {
},
{
name: "Non-retryable Status",
input: status.New(codes.InvalidArgument, "test"),
input: status.New(codes.Internal, "test"),
expected: http.StatusInternalServerError,
},
{
name: "Specifically 429",
input: status.New(codes.ResourceExhausted, "test"),
expected: http.StatusTooManyRequests,
},
{
name: "Specifically 400",
input: status.New(codes.InvalidArgument, "test"),
expected: http.StatusBadRequest,
},
{
name: "Specifically 401",
input: status.New(codes.Unauthenticated, "test"),
expected: http.StatusUnauthorized,
},
{
name: "Specifically 403",
input: status.New(codes.PermissionDenied, "test"),
expected: http.StatusForbidden,
},
{
name: "Specifically 404",
input: status.New(codes.Unimplemented, "test"),
expected: http.StatusNotFound,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
Expand Down
6 changes: 3 additions & 3 deletions receiver/otlpreceiver/otlp_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,8 @@ func TestJsonHttp(t *testing.T) {
name: "Permanent GRPCError",
encoding: "",
contentType: "application/json",
err: status.New(codes.InvalidArgument, "").Err(),
expectedStatus: &spb.Status{Code: int32(codes.InvalidArgument), Message: ""},
err: status.New(codes.Internal, "").Err(),
expectedStatus: &spb.Status{Code: int32(codes.Internal), Message: ""},
expectedStatusCode: http.StatusInternalServerError,
},
{
Expand Down Expand Up @@ -361,7 +361,7 @@ func TestProtoHttp(t *testing.T) {
encoding: "",
err: status.New(codes.InvalidArgument, "").Err(),
expectedStatus: &spb.Status{Code: int32(codes.InvalidArgument), Message: ""},
expectedStatusCode: http.StatusInternalServerError,
expectedStatusCode: http.StatusBadRequest,
},
{
name: "Retryable GRPCError",
Expand Down
Loading