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

feat: 🎸 add logs when an unexpected error occurs #789

Merged
merged 4 commits into from
Feb 8, 2023
Merged
Show file tree
Hide file tree
Changes from 2 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
4 changes: 2 additions & 2 deletions services/admin/src/admin/routes/backfill.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ async def backfill_endpoint(request: Request) -> Response:
)
except AdminCustomError as e:
return get_json_admin_error_response(e, max_age=0)
except Exception:
return get_json_admin_error_response(UnexpectedError("Unexpected error."), max_age=0)
except Exception as e:
return get_json_admin_error_response(UnexpectedError("Unexpected error.", e), max_age=0)
albertvillanova marked this conversation as resolved.
Show resolved Hide resolved

return backfill_endpoint
4 changes: 2 additions & 2 deletions services/admin/src/admin/routes/cache_reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ async def cache_reports_endpoint(request: Request) -> Response:
) from e
except AdminCustomError as e:
return get_json_admin_error_response(e, max_age=max_age)
except Exception:
return get_json_admin_error_response(UnexpectedError("Unexpected error."), max_age=max_age)
except Exception as e:
return get_json_admin_error_response(UnexpectedError("Unexpected error.", e), max_age=max_age)

return cache_reports_endpoint
4 changes: 2 additions & 2 deletions services/admin/src/admin/routes/cache_reports_with_content.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ async def cache_reports_with_content_endpoint(request: Request) -> Response:
) from e
except AdminCustomError as e:
return get_json_admin_error_response(e, max_age=max_age)
except Exception:
return get_json_admin_error_response(UnexpectedError("Unexpected error."), max_age=max_age)
except Exception as e:
return get_json_admin_error_response(UnexpectedError("Unexpected error.", e), max_age=max_age)

return cache_reports_with_content_endpoint
4 changes: 2 additions & 2 deletions services/admin/src/admin/routes/cancel_jobs.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ async def cancel_jobs_endpoint(request: Request) -> Response:
)
except AdminCustomError as e:
return get_json_admin_error_response(e, max_age=0)
except Exception:
return get_json_admin_error_response(UnexpectedError("Unexpected error."), max_age=0)
except Exception as e:
return get_json_admin_error_response(UnexpectedError("Unexpected error.", e), max_age=0)

return cancel_jobs_endpoint
4 changes: 2 additions & 2 deletions services/admin/src/admin/routes/force_refresh.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ async def force_refresh_endpoint(request: Request) -> Response:
)
except (DatasetError, AdminCustomError) as e:
return get_json_admin_error_response(e, max_age=0)
except Exception:
return get_json_admin_error_response(UnexpectedError("Unexpected error."), max_age=0)
except Exception as e:
return get_json_admin_error_response(UnexpectedError("Unexpected error.", e), max_age=0)

return force_refresh_endpoint
4 changes: 2 additions & 2 deletions services/admin/src/admin/routes/jobs_duration.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ async def jobs_duration_per_dataset_endpoint(request: Request) -> Response:
)
except AdminCustomError as e:
return get_json_admin_error_response(e, max_age=max_age)
except Exception:
return get_json_admin_error_response(UnexpectedError("Unexpected error."), max_age=max_age)
except Exception as e:
return get_json_admin_error_response(UnexpectedError("Unexpected error.", e), max_age=max_age)

return jobs_duration_per_dataset_endpoint
4 changes: 2 additions & 2 deletions services/admin/src/admin/routes/pending_jobs.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ async def pending_jobs_endpoint(request: Request) -> Response:
)
except AdminCustomError as e:
return get_json_admin_error_response(e, max_age=max_age)
except Exception:
return get_json_admin_error_response(UnexpectedError("Unexpected error."), max_age=max_age)
except Exception as e:
return get_json_admin_error_response(UnexpectedError("Unexpected error.", e), max_age=max_age)

return pending_jobs_endpoint
9 changes: 7 additions & 2 deletions services/admin/src/admin/utils.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright 2022 The HuggingFace Authors.

import logging
from http import HTTPStatus
from typing import Any, Callable, Coroutine, List, Literal, Optional

Expand Down Expand Up @@ -57,8 +58,12 @@ def __init__(self, message: str):
class UnexpectedError(AdminCustomError):
"""Raised when an unexpected error occurred."""

def __init__(self, message: str):
super().__init__(message, HTTPStatus.INTERNAL_SERVER_ERROR, "UnexpectedError")
def __init__(self, message: str, cause: Optional[BaseException] = None):
super().__init__(message, HTTPStatus.INTERNAL_SERVER_ERROR, "UnexpectedError", cause)
if cause:
logging.exception(message, exc_info=cause)
else:
logging.exception(message)


class ExternalUnauthenticatedError(AdminCustomError):
Expand Down
8 changes: 4 additions & 4 deletions services/api/src/api/routes/valid.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@ async def valid_endpoint(_: Request) -> Response:
logging.info("/valid")
content = {"valid": get_valid(processing_steps_for_valid=processing_steps_for_valid)}
return get_json_ok_response(content, max_age=max_age_long)
except Exception:
return get_json_api_error_response(UnexpectedError("Unexpected error."), max_age=max_age_short)
except Exception as e:
return get_json_api_error_response(UnexpectedError("Unexpected error.", e), max_age=max_age_short)

return valid_endpoint

Expand All @@ -83,7 +83,7 @@ async def is_valid_endpoint(request: Request) -> Response:
return get_json_ok_response(content=content, max_age=max_age_long)
except ApiCustomError as e:
return get_json_api_error_response(error=e, max_age=max_age_short)
except Exception:
return get_json_api_error_response(error=UnexpectedError("Unexpected error."), max_age=max_age_short)
except Exception as e:
return get_json_api_error_response(error=UnexpectedError("Unexpected error.", e), max_age=max_age_short)

return is_valid_endpoint
3 changes: 2 additions & 1 deletion services/api/src/api/routes/webhook.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,8 @@ async def webhook_endpoint(request: Request) -> Response:
except ValidationError:
content = {"status": "error", "error": "the JSON payload is invalid"}
return get_response(content, 400)
except Exception:
except Exception as e:
logging.exception("Unexpected error", exc_info=e)
content = {"status": "error", "error": "unexpected error"}
return get_response(content, 500)

Expand Down
5 changes: 5 additions & 0 deletions services/api/src/api/utils.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# SPDX-License-Identifier: Apache-2.0
# Copyright 2022 The HuggingFace Authors.

import logging
from http import HTTPStatus
from typing import Any, Callable, Coroutine, List, Literal, Optional

Expand Down Expand Up @@ -59,6 +60,10 @@ class UnexpectedError(ApiCustomError):

def __init__(self, message: str, cause: Optional[BaseException] = None):
super().__init__(message, HTTPStatus.INTERNAL_SERVER_ERROR, "UnexpectedError", cause)
if cause:
logging.exception(message, exc_info=cause)
else:
logging.exception(message)
severo marked this conversation as resolved.
Show resolved Hide resolved


class ExternalUnauthenticatedError(ApiCustomError):
Expand Down
6 changes: 5 additions & 1 deletion workers/datasets_based/src/datasets_based/worker.py
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ def __init__(self, message: str, cause: Optional[BaseException] = None):


class UnexpectedError(GeneralWorkerError):
"""Raised when the response for the split has not been found."""
"""Raised when the worker raised an unexpected error."""

def __init__(self, message: str, cause: Optional[BaseException] = None):
super().__init__(
Expand All @@ -115,6 +115,10 @@ def __init__(self, message: str, cause: Optional[BaseException] = None):
cause=cause,
disclose_cause=False,
)
if cause is not None:
logging.exception(message, exc_info=cause)
else:
logging.exception(message)
severo marked this conversation as resolved.
Show resolved Hide resolved


class Worker(ABC):
Expand Down