If I go to view fuzzer statistics or crash statistics on the main page, I get a nice error message saying this isn't supported on the local development environment.
However, if I have go to the testcases page, view a test case, and click the "CLICK TO SEE THE STATS" button it will spin for a while (10-20 secs) and then eventually fail with this credential related error message (at the end).
I assume this is because the feature is not supported on the local dev environment. If so, can we show that as a more explicit error message, or perhaps not show the button at all? This would be a minor UX improvement.
| WARNING 2019-02-14 04:19:12,446 urlfetch_stub.py:575] Stripped prohibited headers from URLFetch request: ['content-length']
| INFO 2019-02-14 04:19:12,610 google_auth_httplib2.py:211] Refreshing credentials due to a 401 response. Attempt 1/2.
| ERROR 2019-02-14 04:19:12,621 logs.py:327] Retrying on google_cloud_utils.big_query.Client.raw_query failed with Anonymous credentials cannot be refreshed.. Raise.
| Traceback (most recent call last):
| File "/usr/lib/python2.7/threading.py", line 774, in __bootstrap
| self.__bootstrap_inner()
| File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
| self.run()
| File "/usr/lib/python2.7/threading.py", line 754, in run
| self.__target(*self.__args, **self.__kwargs)
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/thread_executor.py", line 41, in _worker
| result = fn(*args, **kwargs)
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/wsgi_server.py", line 116, in _handle
| obj.communicate()
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/lib/cherrypy/cherrypy/wsgiserver/wsgiserver2.py", line 1302, in communicate
| req.respond()
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/lib/cherrypy/cherrypy/wsgiserver/wsgiserver2.py", line 831, in respond
| self.server.gateway(self).respond()
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/lib/cherrypy/cherrypy/wsgiserver/wsgiserver2.py", line 2115, in respond
| response = self.req.server.wsgi_app(self.env, self.start_response)
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/wsgi_server.py", line 292, in __call__
| return app(environ, start_response)
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/request_rewriter.py", line 314, in _rewriter_middleware
| response_body = iter(application(environ, wrapped_start_response))
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/python/runtime/request_handler.py", line 160, in __call__
| response = self.handle_normal_request(environ)
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/tools/devappserver2/python/runtime/request_handler.py", line 195, in handle_normal_request
| self._PYTHON_LIB_DIR)
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/runtime.py", line 159, in HandleRequest
| error)
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 329, in HandleRequest
| return WsgiRequest(environ, handler_name, url, post_data, error).Handle()
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/google/appengine/runtime/wsgi.py", line 267, in Handle
| result = handler(dict(self._environ), self._StartResponse)
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.3/webapp2.py", line 1505, in __call__
| rv = self.router.dispatch(request, response)
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.3/webapp2.py", line 1253, in default_dispatcher
| return route.handler_adapter(request, response)
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.3/webapp2.py", line 1077, in __call__
| return handler.dispatch()
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.3/webapp2.py", line 545, in dispatch
| return method(*args, **kwargs)
| File "/home/mhl/clusterfuzz/src/appengine/libs/handler.py", line 362, in wrapper
| return func(self)
| File "/home/mhl/clusterfuzz/src/appengine/libs/handler.py", line 310, in wrapper
| return func(self, testcase)
| File "/home/mhl/clusterfuzz/src/appengine/handlers/testcase_detail/crash_stats.py", line 54, in post
| self.render_json(get_result(testcase, end, block, days, group_by))
| File "/home/mhl/clusterfuzz/src/appengine/handlers/testcase_detail/crash_stats.py", line 33, in get_result
| _, rows = crash_stats.get(query, crash_stats.Query(), 0, 1)
| File "/home/mhl/clusterfuzz/src/appengine/libs/crash_stats.py", line 63, in get
| limit=limit)
| File "/home/mhl/clusterfuzz/src/appengine/python/metrics/crash_stats.py", line 163, in get
| result = client.query(query=sql, offset=offset, limit=limit)
| File "/home/mhl/clusterfuzz/src/appengine/python/google_cloud_utils/big_query.py", line 241, in query
| result = self.raw_query(query, max_results=0)
| File "/home/mhl/clusterfuzz/src/appengine/python/base/retry.py", line 101, in _wrapper
| if not handle_retry(num_try, exception=e):
| File "/home/mhl/clusterfuzz/src/appengine/python/base/retry.py", line 78, in handle_retry
| total=tries)
| LogError: Retrying on google_cloud_utils.big_query.Client.raw_query failed with Anonymous credentials cannot be refreshed.. Raise.
| Traceback (most recent call last):
| File "/home/mhl/clusterfuzz/src/appengine/python/base/retry.py", line 88, in _wrapper
| result = func(*args, **kwargs)
| File "/home/mhl/clusterfuzz/src/appengine/python/google_cloud_utils/big_query.py", line 184, in raw_query
| projectId=self.project_id, body=body).execute()
| File "/home/mhl/clusterfuzz/src/appengine/third_party/googleapiclient/_helpers.py", line 130, in positional_wrapper
| return wrapped(*args, **kwargs)
| File "/home/mhl/clusterfuzz/src/appengine/third_party/googleapiclient/http.py", line 837, in execute
| method=str(self.method), body=self.body, headers=self.headers)
| File "/home/mhl/clusterfuzz/src/appengine/third_party/googleapiclient/http.py", line 162, in _retry_request
| resp, content = http.request(uri, method, *args, **kwargs)
| File "/home/mhl/clusterfuzz/src/appengine/third_party/google_auth_httplib2.py", line 213, in request
| self.credentials.refresh(self._request)
| File "/home/mhl/clusterfuzz/src/appengine/third_party/google/auth/credentials.py", line 146, in refresh
| raise ValueError("Anonymous credentials cannot be refreshed.")
| ValueError: Anonymous credentials cannot be refreshed.
| ERROR 2019-02-14 04:19:12,686 base_handler.py:198] Anonymous credentials cannot be refreshed.
| Traceback (most recent call last):
| File "/usr/lib/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.3/webapp2.py", line 545, in dispatch
| return method(*args, **kwargs)
| File "/home/mhl/clusterfuzz/src/appengine/libs/handler.py", line 362, in wrapper
| return func(self)
| File "/home/mhl/clusterfuzz/src/appengine/libs/handler.py", line 310, in wrapper
| return func(self, testcase)
| File "/home/mhl/clusterfuzz/src/appengine/handlers/testcase_detail/crash_stats.py", line 54, in post
| self.render_json(get_result(testcase, end, block, days, group_by))
| File "/home/mhl/clusterfuzz/src/appengine/handlers/testcase_detail/crash_stats.py", line 33, in get_result
| _, rows = crash_stats.get(query, crash_stats.Query(), 0, 1)
| File "/home/mhl/clusterfuzz/src/appengine/libs/crash_stats.py", line 63, in get
| limit=limit)
| File "/home/mhl/clusterfuzz/src/appengine/python/metrics/crash_stats.py", line 163, in get
| result = client.query(query=sql, offset=offset, limit=limit)
| File "/home/mhl/clusterfuzz/src/appengine/python/google_cloud_utils/big_query.py", line 241, in query
| result = self.raw_query(query, max_results=0)
| File "/home/mhl/clusterfuzz/src/appengine/python/base/retry.py", line 88, in _wrapper
| result = func(*args, **kwargs)
| File "/home/mhl/clusterfuzz/src/appengine/python/google_cloud_utils/big_query.py", line 184, in raw_query
| projectId=self.project_id, body=body).execute()
| File "/home/mhl/clusterfuzz/src/appengine/third_party/googleapiclient/_helpers.py", line 130, in positional_wrapper
| return wrapped(*args, **kwargs)
| File "/home/mhl/clusterfuzz/src/appengine/third_party/googleapiclient/http.py", line 837, in execute
| method=str(self.method), body=self.body, headers=self.headers)
| File "/home/mhl/clusterfuzz/src/appengine/third_party/googleapiclient/http.py", line 162, in _retry_request
| resp, content = http.request(uri, method, *args, **kwargs)
| File "/home/mhl/clusterfuzz/src/appengine/third_party/google_auth_httplib2.py", line 213, in request
| self.credentials.refresh(self._request)
| File "/home/mhl/clusterfuzz/src/appengine/third_party/google/auth/credentials.py", line 146, in refresh
| raise ValueError("Anonymous credentials cannot be refreshed.")
| ValueError: Anonymous credentials cannot be refreshed.