-
Notifications
You must be signed in to change notification settings - Fork 13.8k
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
Chart cache warmup fails with 405 Method Not Allowed #28705
Comments
Hey there, @rmasters! I'm a bot designed to help you out with bugs, questions, and becoming a contributor. I'm here to assist you with the issue you've encountered while waiting for a human maintainer. Let's tackle this together! To fix the "405 Method Not Allowed" error in the chart cache warm-up task for Superset version 4.0.1, ensure that the HTTP method used for the Here is the relevant code snippet from @expose("/warm_up_cache", methods=("PUT",))
@protect()
@safe
@statsd_metrics
@event_logger.log_this_with_context(
action=lambda self, *args, **kwargs: f"{self.__class__.__name__}"
f".warm_up_cache",
log_to_statsd=False,
)
def warm_up_cache(self) -> Response:
"""Warm up the cache for the chart.
---
put:
summary: Warm up the cache for the chart
description: >-
Warms up the cache for the chart.
Note for slices a force refresh occurs.
In terms of the `extra_filters` these can be obtained from records in the JSON
encoded `logs.json` column associated with the `explore_json` action.
requestBody:
description: >-
Identifies the chart to warm up cache for, and any additional dashboard or
filter context to use.
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/ChartCacheWarmUpRequestSchema"
responses:
200:
description: Each chart's warmup status
content:
application/json:
schema:
$ref: "#/components/schemas/ChartCacheWarmUpResponseSchema"
400:
$ref: '#/components/responses/400'
404:
$ref: '#/components/responses/404'
500:
$ref: '#/components/responses/500'
"""
try:
body = ChartCacheWarmUpRequestSchema().load(request.json)
except ValidationError as error:
return self.response_400(message=error.messages)
try:
result = ChartWarmUpCacheCommand(
body["chart_id"],
body.get("dashboard_id"),
body.get("extra_filters"),
).run()
return self.response(200, result=[result])
except CommandException as ex:
return self.response(ex.status, message=ex.message) Ensure that your request to warm up the cache uses the curl -X PUT -H "Content-Type: application/json" -d '{"chart_id": 1, "dashboard_id": 2, "extra_filters": []}' http://your-superset-url/api/v1/chart/warm_up_cache Or using Python's import requests
url = "http://your-superset-url/api/v1/chart/warm_up_cache"
data = {
"chart_id": 1,
"dashboard_id": 2,
"extra_filters": []
}
headers = {
"Content-Type": "application/json"
}
response = requests.put(url, json=data, headers=headers)
print(response.status_code, response.json()) Additionally, ensure that the cache warm-up task is correctly configured in @celery_app.task(name="fetch_url")
def fetch_url(data: str, headers: dict[str, str]) -> dict[str, str]:
"""
Celery job to fetch url
"""
result = {}
try:
url = get_url_path("Superset.warm_up_cache")
logger.info("Fetching %s with payload %s", url, data)
req = request.Request(
url, data=bytes(data, "utf-8"), headers=headers, method="PUT"
)
response = request.urlopen( # pylint: disable=consider-using-with
req, timeout=600
)
logger.info(
"Fetched %s with payload %s, status code: %s", url, data, response.code
)
if response.code == 200:
result = {"success": data, "response": response.read().decode("utf-8")}
else:
result = {"error": data, "status_code": response.code}
logger.error(
"Error fetching %s with payload %s, status code: %s",
url,
data,
response.code,
)
except URLError as err:
logger.exception("Error warming up cache!")
result = {"error": data, "exception": str(err)}
return result Make sure the request method is
|
We are also experiencing this problem here after upgrading from |
While possible, it's not likely. Release managers are essentially volunteering their time, and are focusing efforts on 4.1 and 5.0 for the moment. I'd recommend upgrading :) |
Bug description
We found our chart cache warm-up task (as in the example in the Kubernetes docs) was failing with
werkzeug.exceptions.MethodNotAllowed: 405 Method Not Allowed
.I found a similar mention of this problem on Slack: https://apache-superset.slack.com/archives/C01SS4DNYG5/p1715183775388149
The root cause is that 56069b0 accidentally partially-reverted the warm-caches URL, so we have a PUT to the deprecated GET endpoint.
I have a fix for this, which I will PR shortly (#28706).
How to reproduce the bug
Screenshots/recordings
No response
Superset version
4.0.1
Python version
3.10
Node version
Not applicable
Browser
Not applicable
Additional context
Logs/stacktrace:
We run with the following CeleryConfig:
Checklist
The text was updated successfully, but these errors were encountered: