ideonate / cdsdashboards

JupyterHub extension for ContainDS Dashboards
https://cdsdashboards.readthedocs.io/
Other
200 stars 38 forks source link

Panel dashboard does not render #54

Closed matthiasdv closed 3 years ago

matthiasdv commented 3 years ago

Describe the bug My Panel dashboard does not render (blank page) when published as a dashboard. console shows bokeh scripts are loaded. No errors in the browser.

The Kubernetes logs for the dashboard server pod show this log:

+ '[' '' ']'
+ '[' -e /opt/app/environment.yml ']'
+ echo 'no environment.yml'
+ '[' '' ']'
+ '[' '' ']'
+ exec start.sh python3 -m jhsingle_native_proxy.main --destport=0 python3 '{-}m' bokeh_root_cmd.main '{presentation_path}' '{--}port={port}' '{--}allow-websocket-origin={origin_host}' --ready-check-path=/ready-check --presentation-path=./panel_test.py --ip=0.0.0.0 --port=8888
no environment.yml
Executing the command: python3 -m jhsingle_native_proxy.main --destport=0 python3 {-}m bokeh_root_cmd.main {presentation_path} {--}port={port} {--}allow-websocket-origin={origin_host} --ready-check-path=/ready-check --presentation-path=./panel_test.py --ip=0.0.0.0 --port=8888
INFO:tornado.application:SuperviseAndProxyHandler http_get 37007 
ERROR:tornado.application:Uncaught exception GET /user/matthiasdv/dash-pane/ (10.0.57.3)
HTTPServerRequest(protocol='http', host='10.0.57.17:8888', method='GET', uri='/user/matthiasdv/dash-pane/', version='HTTP/1.1', remote_ip='10.0.57.3')
Traceback (most recent call last):
  File "/home/jovyan/.local/lib/python3.8/site-packages/tornado/web.py", line 1704, in _execute
    result = await result
  File "/opt/conda/lib/python3.8/site-packages/jhsingle_native_proxy/websocket.py", line 103, in get
    return await self.http_get(*args, **kwargs)
  File "/opt/conda/lib/python3.8/site-packages/jhsingle_native_proxy/proxyhandlers.py", line 724, in http_get
    return await self.proxy(self.port, path)
  File "/opt/conda/lib/python3.8/site-packages/jhsingle_native_proxy/proxyhandlers.py", line 718, in proxy
    return await self.oauth_proxy(port, path)
TypeError: object NoneType can't be used in 'await' expression
INFO:tornado.application:SuperviseAndProxyHandler http_get 37007 
ERROR:tornado.application:Uncaught exception GET /user/matthiasdv/dash-pane/ (10.132.0.46)
HTTPServerRequest(protocol='https', host='nest-dev.kondensator.io', method='GET', uri='/user/matthiasdv/dash-pane/', version='HTTP/1.1', remote_ip='10.132.0.46')
Traceback (most recent call last):
  File "/home/jovyan/.local/lib/python3.8/site-packages/tornado/web.py", line 1704, in _execute
    result = await result
  File "/opt/conda/lib/python3.8/site-packages/jhsingle_native_proxy/websocket.py", line 103, in get
    return await self.http_get(*args, **kwargs)
  File "/opt/conda/lib/python3.8/site-packages/jhsingle_native_proxy/proxyhandlers.py", line 724, in http_get
    return await self.proxy(self.port, path)
  File "/opt/conda/lib/python3.8/site-packages/jhsingle_native_proxy/proxyhandlers.py", line 718, in proxy
    return await self.oauth_proxy(port, path)
TypeError: object NoneType can't be used in 'await' expression
INFO:tornado.application:Logged-in user {'kind': 'user', 'name': 'matthiasdv', 'admin': True, 'groups': [], 'server': '/user/matthiasdv/', 'pending': None, 'created': '2020-07-15T18:18:39.366713Z', 'last_activity': '2021-01-15T20:06:45.256425Z', 'servers': None}
INFO:tornado.application:SuperviseAndProxyHandler http_get 37007 
INFO:tornado.application:['python3', '-m', 'bokeh_root_cmd.main', '/home/jovyan/./panel_test.py', '--port=37007', '--allow-websocket-origin=nest-dev.kondensator.io']
INFO:tornado.application:SuperviseAndProxyHandler http_get 37007 static/js/bokeh.min.js
INFO:tornado.application:SuperviseAndProxyHandler http_get 37007 static/js/bokeh-tables.min.js
INFO:tornado.application:SuperviseAndProxyHandler http_get 37007 static/js/bokeh-widgets.min.js
INFO:tornado.application:SuperviseAndProxyHandler http_get 37007 static/extensions/panel/panel.min.js
INFO:tornado.application:Trying to establish websocket connection to ws://localhost:37007/ws
INFO:tornado.application:Websocket connection established to ws://localhost:37007/ws
INFO:tornado.application:Client sent subprotocols: ['bokeh', 'eyJzZXNzaW9uX2lkIjogIjVLZ1Z2WERudWNlNmc1Q2MxSXdOc0RNb3NjWVJmUWxKeXp1eUoyT2lmVWhlIiwgInNlc3Npb25fZXhwaXJ5IjogMTYxMDc0MTUwNiwgImhlYWRlcnMiOiB7IlgtU2NoZW1lIjogImh0dHBzIiwgIlgtUmVhbC1JcCI6ICIxMC4xMzIuMC40NiIsICJYLUZvcndhcmRlZC1TZXJ2ZXIiOiAiYXV0b2h0dHBzLTU1OWJjZjRmODctbDZ2eG4iLCAiWC1Gb3J3YXJkZWQtUHJvdG8iOiAiaHR0cHMsaHR0cCIsICJYLUZvcndhcmRlZC1Qb3J0IjogIjQ0Myw4MCIsICJYLUZvcndhcmRlZC1Ib3N0IjogIm5lc3QtZGV2LmtvbmRlbnNhdG9yLmlvIiwgIlgtRm9yd2FyZGVkLUZvciI6ICIxMC4xMzIuMC40NiwxMC4wLjQ3LjIiLCAiVXBncmFkZS1JbnNlY3VyZS1SZXF1ZXN0cyI6ICIxIiwgIlNlYy1GZXRjaC1Vc2VyIjogIj8xIiwgIlNlYy1GZXRjaC1TaXRlIjogInNhbWUtb3JpZ2luIiwgIlNlYy1GZXRjaC1Nb2RlIjogIm5hdmlnYXRlIiwgIlNlYy1GZXRjaC1EZXN0IjogImRvY3VtZW50IiwgIlNlYy1DaC1VYS1Nb2JpbGUiOiAiPzAiLCAiU2VjLUNoLVVhIjogIlwiR29vZ2xlIENocm9tZVwiO3Y9XCI4N1wiLCBcIiBOb3Q7QSBCcmFuZFwiO3Y9XCI5OVwiLCBcIkNocm9taXVtXCI7dj1cIjg3XCIiLCAiUmVmZXJlciI6ICJodHRwczovL25lc3QtZGV2LmtvbmRlbnNhdG9yLmlvL2h1Yi9kYXNoYm9hcmRzL3BhbmUiLCAiQ29va2llIjogImp1cHl0ZXJodWItdXNlci1tYXR0aGlhc2R2LWRhc2gtcGFuZT0yfDE6MHwxMDoxNjEwNzQxMjA1fDM2Omp1cHl0ZXJodWItdXNlci1tYXR0aGlhc2R2LWRhc2gtcGFuZXw0MDpXakJNWmxOVWEzcHZSWGRzUjNWRGFFRkxURFJxV1dOdFpYaFFXRTVvfDAyYmU4MjEwODAwNjViNDU5YzcxNjA0ZjBlNWQzOGU1YTE5MTk1MmZiOGI5NzExZTFhOGZjMTQ4ZGM4MTE2ZGQ7IGp1cHl0ZXJodWItdXNlci1tYXR0aGlhc2R2PVwiMnwxOjB8MTA6MTYxMDc0MTE4NnwyNjpqdXB5dGVyaHViLXVzZXItbWF0dGhpYXNkdnw0NDpOamd3TVdFNU9XWXpNelk0TkRGaVpqaGxaV0pqWlRoaVptVTNZVEkyWW1ZPXw1Y2M1MDRlZDIyYjM5ZTYyMGM1YmI1N2EzMzdjYzU1MmZlOTYyYTkyZGY0MWUxZWE4MDQ4MTAzYzU5NTcwYTBjXCI7IGp1cHl0ZXJodWItc2Vzc2lvbi1pZD1mMjEyNDg1NWRiZjc0NzEwYjI3NTgzZDBhZGI3NzQ5ODsgX3hzcmY9Mnw5NzRiOTMwN3w0Y2Y5ZWYxN2EzOTA3MmUwY2EyNWFiZmU5NjQ5MjRhOHwxNjEwMzgyMDgxIiwgIkFjY2VwdC1MYW5ndWFnZSI6ICJlbi1HQixlbi1VUztxPTAuOSxlbjtxPTAuOCIsICJBY2NlcHQtRW5jb2RpbmciOiAiZ3ppcCIsICJBY2NlcHQiOiAidGV4dC9odG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCxhcHBsaWNhdGlvbi94bWw7cT0wLjksaW1hZ2UvYXZpZixpbWFnZS93ZWJwLGltYWdlL2FwbmcsKi8qO3E9MC44LGFwcGxpY2F0aW9uL3NpZ25lZC1leGNoYW5nZTt2PWIzO3E9MC45IiwgIlVzZXItQWdlbnQiOiAiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg3LjAuNDI4MC44OCBTYWZhcmkvNTM3LjM2IiwgIkhvc3QiOiAibmVzdC1kZXYua29uZGVuc2F0b3IuaW8iLCAiQ29ubmVjdGlvbiI6ICJjbG9zZSIsICJYLUZvcndhcmRlZC1Db250ZXh0IjogIi91c2VyL21hdHRoaWFzZHYvZGFzaC1wYW5lL21haW5wcm9jZXNzIiwgIlgtUHJveHljb250ZXh0cGF0aCI6ICIvdXNlci9tYXR0aGlhc2R2L2Rhc2gtcGFuZS9tYWlucHJvY2VzcyJ9LCAiY29va2llcyI6IHsianVweXRlcmh1Yi11c2VyLW1hdHRoaWFzZHYtZGFzaC1wYW5lIjogIjJ8MTowfDEwOjE2MTA3NDEyMDV8MzY6anVweXRlcmh1Yi11c2VyLW1hdHRoaWFzZHYtZGFzaC1wYW5lfDQwOldqQk1abE5VYTNwdlJYZHNSM1ZEYUVGTFREUnFXV050WlhoUVdFNW98MDJiZTgyMTA4MDA2NWI0NTljNzE2MDRmMGU1ZDM4ZTVhMTkxOTUyZmI4Yjk3MTFlMWE4ZmMxNDhkYzgxMTZkZCIsICJqdXB5dGVyaHViLXVzZXItbWF0dGhpYXNkdiI6ICIyfDE6MHwxMDoxNjEwNzQxMTg2fDI2Omp1cHl0ZXJodWItdXNlci1tYXR0aGlhc2R2fDQ0Ok5qZ3dNV0U1T1dZek16WTROREZpWmpobFpXSmpaVGhpWm1VM1lUSTJZbVk9fDVjYzUwNGVkMjJiMzllNjIwYzViYjU3YTMzN2NjNTUyZmU5NjJhOTJkZjQxZTFlYTgwNDgxMDNjNTk1NzBhMGMiLCAianVweXRlcmh1Yi1zZXNzaW9uLWlkIjogImYyMTI0ODU1ZGJmNzQ3MTBiMjc1ODNkMGFkYjc3NDk4IiwgIl94c3JmIjogIjJ8OTc0YjkzMDd8NGNmOWVmMTdhMzkwNzJlMGNhMjVhYmZlOTY0OTI0YTh8MTYxMDM4MjA4MSJ9fQ']
INFO:tornado.application:SuperviseAndProxyHandler http_get 37007 
INFO:tornado.application:Trying to establish websocket connection to ws://localhost:37007/ws
INFO:tornado.application:Websocket connection established to ws://localhost:37007/ws

To Reproduce This is the .py file that produces the error:

https://gist.github.com/matthiasdv/03430b5d1609857d7b482c6e26386516

pip freeze output:

aiobotocore==1.1.2
aiohttp==3.7.3
aioitertools==0.7.1
alembic==1.4.2
appdirs==1.4.4
async-generator==1.10
async-timeout==3.0.1
attrs==20.3.0
backcall==0.2.0
bleach @ file:///home/conda/feedstock_root/build_artifacts/bleach_1588608214987/work
blinker==1.4
blosc==1.9.1
bokeh==2.2.3
bokeh-root-cmd==0.0.5
botocore==1.17.44
brotlipy==0.7.0
cachetools==4.2.0
cdsdashboards==0.4.3
certifi==2020.6.20
certipy==0.1.3
cffi==1.14.0
chardet==3.0.4
click==7.1.2
cloudpickle==1.6.0
coiled==0.0.30
conda==4.8.3
conda-package-handling==1.6.0
cryptography==2.9.2
cycler==0.10.0
cytoolz==0.10.1
dask==2020.12.0
dask-glm==0.2.0
dask-kubernetes==0.10.1
dask-labextension @ file:///home/conda/feedstock_root/build_artifacts/dask-labextension_1588177406011/work
dask-ml==1.6.0
decorator==4.4.2
defusedxml==0.6.0
distributed==2020.12.0
docutils==0.15.2
entrypoints==0.3
fastparquet==0.4.0
fsspec==0.8.4
gcsfs==0.6.2
google-auth==1.24.0
google-auth-oauthlib==0.4.2
graphviz==0.14
HeapDict==1.0.1
idna==2.10
importlib-metadata @ file:///home/conda/feedstock_root/build_artifacts/importlib-metadata_1593211370946/work
intake==0.6.0
intake-parquet==0.2.3
ipykernel @ file:///home/conda/feedstock_root/build_artifacts/ipykernel_1590020202605/work/dist/ipykernel-5.3.0-py3-none-any.whl
ipython==7.19.0
ipython-genutils==0.2.0
ipywidgets==7.5.1
jedi==0.17.2
jhsingle-native-proxy==0.6.1
Jinja2==2.11.2
jmespath==0.10.0
joblib==0.16.0
json5 @ file:///home/conda/feedstock_root/build_artifacts/json5_1591810480056/work
jsonschema==3.2.0
jupyter-client @ file:///home/conda/feedstock_root/build_artifacts/jupyter_client_1593562235049/work
jupyter-core==4.6.3
jupyter-server-proxy @ file:///home/conda/feedstock_root/build_artifacts/jupyter-server-proxy_1590048206892/work
jupyter-telemetry==0.0.5
jupyterhub==1.1.0
jupyterlab==2.1.3
jupyterlab-server @ file:///home/conda/feedstock_root/build_artifacts/jupyterlab_server_1590229434073/work
kiwisolver==1.3.1
kubernetes==12.0.1
kubernetes-asyncio==12.0.1
llvmlite==0.35.0
locket==0.2.0
lz4 @ file:///home/conda/feedstock_root/build_artifacts/lz4_1591768133689/work
Mako==1.1.0
Markdown==3.3.3
MarkupSafe==1.1.1
matplotlib==3.3.3
mistune==0.8.4
msgpack==1.0.1
multidict==5.1.0
multipledispatch==0.6.0
nbconvert==5.6.1
nbformat==5.0.6
notebook @ file:///home/conda/feedstock_root/build_artifacts/notebook_1588887220875/work
numba==0.52.0
numpy==1.19.4
oauthlib==3.0.1
olefile==0.46
packaging==20.8
pamela==1.0.0
pandas==1.1.5
pandocfilters==1.4.2
panel==0.9.7
param==1.10.1
parso==0.7.1
partd==1.1.0
pexpect==4.8.0
pickleshare==0.7.5
Pillow==8.0.1
plotlydash-tornado-cmd==0.0.6
pluggy==0.13.1
prometheus-client @ file:///home/conda/feedstock_root/build_artifacts/prometheus_client_1590412252446/work
prompt-toolkit==3.0.8
psutil==5.7.3
ptyprocess==0.6.0
py4j==0.10.9
pyarrow==0.17.1
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycosat==0.6.3
pycparser @ file:///home/conda/feedstock_root/build_artifacts/pycparser_1593275161868/work
pyct==0.4.8
pycurl==7.43.0.5
Pygments==2.7.3
PyJWT==1.7.1
pyOpenSSL==19.1.0
pyparsing==2.4.7
pyrsistent==0.16.0
PySocks==1.7.1
pyspark==3.0.0
python-dateutil==2.8.1
python-editor==1.0.4
python-json-logger==0.1.11
python-snappy==0.5.4
pytz==2020.4
pyviz-comms==2.0.1
PyYAML==5.3.1
pyzmq==19.0.1
requests @ file:///home/conda/feedstock_root/build_artifacts/requests_1592425495151/work
requests-oauthlib==1.3.0
rsa==4.7
rshiny-server-cmd==0.0.2
ruamel-yaml==0.15.80
ruamel.yaml.clib==0.2.0
s3fs==0.5.1
scikit-learn==0.23.2
scipy==1.5.2
Send2Trash==1.5.0
simpervisor==0.4
six==1.15.0
sortedcontainers==2.3.0
SQLAlchemy @ file:///home/conda/feedstock_root/build_artifacts/sqlalchemy_1593116999372/work
tblib==1.7.0
terminado==0.8.3
testpath==0.4.4
threadpoolctl==2.1.0
thrift==0.13.0
toolz==0.11.1
tornado==6.1
tqdm @ file:///home/conda/feedstock_root/build_artifacts/tqdm_1593390011681/work
traitlets==5.0.5
typing-extensions==3.7.4.3
urllib3==1.25.11
voila-materialstream==0.2.6
wcwidth==0.2.5
webencodings==0.5.1
websocket-client==0.57.0
widgetsnbextension==3.5.1
wrapt==1.12.1
yarl==1.6.3
zict==2.0.0
zipp==3.1.0

Configuration versions:

Jupyterhub Helm chart 0.9.0 CDS 0.4.3 Z2Hjupyterhub on Kubernetes, Google Cloud Engine Using ReadMany filesystem

jupyterhub conf:

#  serviceAccountName: default
  defaultUrl: "/lab"
  image:
    name: eu.gcr.io/calm-nation-277816/dask-notebook
    tag: latest
    pullPolicy: Always
  storage:
    type: dynamic
    capacity: 10Gi
    dynamic:
      pvcNameTemplate: claim-{username}
      volumeNameTemplate: volume-{username}
      storageAccessModes: [ ReadWriteMany ]
  cloudMetadata:
    enabled: true

hub:
  image:
    name: ideonate/cdsdashboards-jupyter-k8s-hub
    tag: 0.9.0-0.4.3
  extraConfig:
    cds-handlers: |
      from cdsdashboards.hubextension import cds_extra_handlers
      c.JupyterHub.extra_handlers = cds_extra_handlers
    cds-templates: |
      from cdsdashboards.app import CDS_TEMPLATE_PATHS
      c.JupyterHub.template_paths = CDS_TEMPLATE_PATHS
      c.JupyterHub.allow_named_servers = True
    cds-kube: |
      c.JupyterHub.spawner_class = 'cdsdashboards.hubextension.spawners.variablekube.VariableKubeSpawner'
      c.CDSDashboardsConfig.builder_class = 'cdsdashboards.builder.kubebuilder.KubeBuilder'

  resources:
    requests:
      cpu: 1000m
      memory: 2048Mi

Any directions are appreciated!

matthiasdv commented 3 years ago

was missing panel.servable()

danlester commented 3 years ago

Thank you so much for coming back to let us know you solved it!