Repository: dask/distributed

Issue:
Link to dashboard docs on the dashboard
It's not immediately obvious from the dashboard how you'd learn more about what all the things on it mean. Now that we have more [documentation](https://docs.dask.org/en/stable/dashboard.html) about it (thanks to @ncclementi especially), we should have links to the docs from the dashboard itself.

Ideally, it could be nice to have a `?` link on each component that would take you to the appropriate section of the docs for that component. For example, the progress section could link you to https://docs.dask.org/en/stable/dashboard.html#progress.


Discussion:
I added am Info Icon / Help tool for the task stream in https://github.com/dask/distributed/pull/7478 Clicking this icon will direct you to the docs.

If somebody wants to make some progress on this, adding similar help tools for other panels should be straight forward.


![image](https://user-images.githubusercontent.com/8629629/212711868-323f8095-66b2-445b-9100-b1bcde2f0139.png)

I wonder if it's also possible to add a global help tool or smth like that

That's a great start, thanks.

> I wonder if it's also possible to add a global help tool or smth like that

I'm not sure what a global help tool would look like, but just a global "dashboard docs" link in some corner would also be a good idea, since it might be more visible than the subtle `?` symbols in the bokeh plots.
Just as a reference I wanted to have a hover tool on the title of the plots, but it was not possible, I opened this issue in bokeh a while ago but no luck https://github.com/bokeh/bokeh/issues/11389

Resolving patch:
diff --git a/distributed/dashboard/components/scheduler.py b/distributed/dashboard/components/scheduler.py
--- a/distributed/dashboard/components/scheduler.py
+++ b/distributed/dashboard/components/scheduler.py
@@ -345,7 +345,7 @@ def __init__(self, scheduler, width=600, **kwargs):
         self.root.yaxis.visible = False
         self.root.ygrid.visible = False
 
-        self.root.toolbar_location = None
+        self.root.toolbar_location = "above"
         self.root.yaxis.visible = False
 
         hover = HoverTool(
@@ -373,7 +373,11 @@ def __init__(self, scheduler, width=600, **kwargs):
                             </div>
                             """,
         )
-        self.root.add_tools(hover)
+        help_ = HelpTool(
+            redirect="https://docs.dask.org/en/stable/dashboard.html#bytes-stored-and-bytes-per-worker",
+            description="Description of bytes stored plots",
+        )
+        self.root.add_tools(hover, help_)
 
     def _cluster_memory_color(self) -> str:
         colors = {
@@ -3165,7 +3169,7 @@ def __init__(self, scheduler, **kwargs):
             name="task_progress",
             x_range=x_range,
             y_range=y_range,
-            toolbar_location=None,
+            toolbar_location="above",
             tools="",
             min_border_bottom=50,
             **kwargs,
@@ -3305,7 +3309,11 @@ def __init__(self, scheduler, **kwargs):
                 </div>
                 """,
         )
-        self.root.add_tools(hover)
+        help_ = HelpTool(
+            redirect="https://docs.dask.org/en/stable/dashboard.html#progress",
+            description="A description of the progress bars plot.",
+        )
+        self.root.add_tools(hover, help_)
 
     @without_property_validation
     @log_errors
@@ -4249,16 +4257,22 @@ def status_doc(scheduler, extra, doc):
 
     doc.add_root(workers_memory.root)
 
-    tab1 = TabPanel(child=processing_root, title="Processing")
-    tab2 = TabPanel(child=cpu_root, title="CPU")
-    tab3 = TabPanel(child=occupancy_root, title="Occupancy")
-    tab4 = TabPanel(child=workers_transfer_bytes.root, title="Data Transfer")
+    tabs = [
+        TabPanel(child=processing_root, title="Processing"),
+        TabPanel(child=cpu_root, title="CPU"),
+        TabPanel(child=occupancy_root, title="Occupancy"),
+        TabPanel(child=workers_transfer_bytes.root, title="Data Transfer"),
+    ]
 
-    proc_tabs = Tabs(
-        tabs=[tab1, tab2, tab3, tab4],
-        name="processing_tabs",
-        sizing_mode="stretch_both",
+    help_ = HelpTool(
+        redirect="https://docs.dask.org/en/stable/dashboard.html#task-processing-cpu-utilization-occupancy-data-transfer",
+        description="A description of Task Processing/CPU Utilization/Occupancy",
     )
+    for tab in tabs:
+        tab.child.toolbar_location = "above"
+        tab.child.add_tools(help_)
+
+    proc_tabs = Tabs(tabs=tabs, name="processing_tabs", sizing_mode="stretch_both")
     doc.add_root(proc_tabs)
 
     task_stream = TaskStream(


Test patch: