Skip to content

Commit

Permalink
Experiment logs (CrayLabs#37)
Browse files Browse the repository at this point in the history
Add experiment logs to the dashboard.
  • Loading branch information
AlyssaCote authored Jan 18, 2024
1 parent b3b028d commit 6482628
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 24 deletions.
9 changes: 8 additions & 1 deletion smartdashboard/Experiment_Overview.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
from smartdashboard.utils.ManifestReader import load_manifest
from smartdashboard.utils.pageSetup import local_css, set_streamlit_page_config
from smartdashboard.view_builders import error_builder, overview_builder
from smartdashboard.views import EntityView


def build_app(manifest_path: str) -> None:
Expand All @@ -55,9 +56,15 @@ def build_app(manifest_path: str) -> None:
error_builder(ex)
else:
views = overview_builder(manifest)
to_update: t.Iterable[EntityView[t.Any]] = (
views.exp_view,
views.app_view,
views.orc_view,
views.ens_view,
)

while True:
for v in [views.exp_view, views.app_view, views.orc_view, views.ens_view]:
for v in to_update:
v.update()

time.sleep(1)
Expand Down
2 changes: 1 addition & 1 deletion smartdashboard/schemas/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ class HasTelemetryMetaData(BaseModel):
telemetry_metadata: t.Dict[str, t.Any]


class EntitiyWithOnlyNameAndOutErrFiles(
class EntityWithOnlyNameAndOutErrFiles(
HasName,
HasOutErrFiles,
BaseModel,
Expand Down
4 changes: 2 additions & 2 deletions smartdashboard/schemas/experiment.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

from smartdashboard.schemas.base import HasName
from smartdashboard.schemas.base import EntityWithOnlyNameAndOutErrFiles


class Experiment(HasName):
class Experiment(EntityWithOnlyNameAndOutErrFiles):
path: str = ""
launcher: str = ""
24 changes: 17 additions & 7 deletions smartdashboard/view_builders.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ def error_builder(error: SSDashboardError) -> ErrorView:
)

with st.expander(label="Traceback"):
st.code(traceback.format_exc(), language=None)
st.code(traceback.format_exc(), language="log")

return view

Expand All @@ -87,6 +87,16 @@ def exp_builder(manifest: Manifest) -> ExperimentView:
st.write("Path: " + manifest.experiment.path)
st.write("Launcher: " + manifest.experiment.launcher)

with st.expander(label="Logs"):
col1, col2 = st.columns([6, 6])
with col1:
st.write("Output")
view.out_logs_element = st.code(view.out_logs, language="log")

with col2:
st.write("Error")
view.err_logs_element = st.code(view.err_logs, language="log")

return view


Expand Down Expand Up @@ -196,11 +206,11 @@ def app_builder(manifest: Manifest) -> ApplicationView:
col1, col2 = st.columns([6, 6])
with col1:
st.write("Output")
view.out_logs_element = st.code(view.out_logs, language=None)
view.out_logs_element = st.code(view.out_logs, language="log")

with col2:
st.write("Error")
view.err_logs_element = st.code(view.err_logs, language=None)
view.err_logs_element = st.code(view.err_logs, language="log")

return view

Expand Down Expand Up @@ -266,12 +276,12 @@ def orc_builder(manifest: Manifest) -> OrchestratorView:

st.write("")
st.write("Output")
view.out_logs_element = st.code(view.out_logs, language=None)
view.out_logs_element = st.code(view.out_logs, language="log")

with col2:
shard_log_spacing()
st.write("Error")
view.err_logs_element = st.code(view.err_logs, language=None)
view.err_logs_element = st.code(view.err_logs, language="log")

return view

Expand Down Expand Up @@ -412,11 +422,11 @@ def ens_builder(manifest: Manifest) -> EnsembleView:
col1, col2 = st.columns([6, 6])
with col1:
st.write("Output")
view.out_logs_element = st.code(view.out_logs, language=None)
view.out_logs_element = st.code(view.out_logs, language="log")

with col2:
st.write("Error")
view.err_logs_element = st.code(view.err_logs, language=None)
view.err_logs_element = st.code(view.err_logs, language="log")

return view

Expand Down
27 changes: 14 additions & 13 deletions smartdashboard/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
from streamlit.delta_generator import DeltaGenerator

from smartdashboard.schemas.application import Application
from smartdashboard.schemas.base import EntityWithNameTelemetryMetaDataErrOut
from smartdashboard.schemas.base import HasOutErrFiles
from smartdashboard.schemas.ensemble import Ensemble
from smartdashboard.schemas.experiment import Experiment
from smartdashboard.schemas.orchestrator import Orchestrator
Expand All @@ -47,7 +47,7 @@
get_status,
)

_T = t.TypeVar("_T", bound=EntityWithNameTelemetryMetaDataErrOut)
_T = t.TypeVar("_T", bound=HasOutErrFiles)


class ViewBase(ABC):
Expand Down Expand Up @@ -107,15 +107,15 @@ def out_logs(self) -> str:
def update(self) -> None:
"""Update logs and status elements in the selected entity view"""
self.update_logs()
self.update_status()
self._update_status()

def update_logs(self) -> None:
"""Update error and output log elements in the selected entity view"""
self.out_logs_element.code(self.out_logs, language=None)
self.err_logs_element.code(self.err_logs, language=None)
self.out_logs_element.code(self.out_logs, language="log")
self.err_logs_element.code(self.err_logs, language="log")

@abstractmethod
def update_status(self) -> None:
def _update_status(self) -> None:
"""Abstract method to update an entity's status"""

def update_view_model(self, new_view_model: t.Optional[_T]) -> None:
Expand All @@ -131,7 +131,7 @@ def update_view_model(self, new_view_model: t.Optional[_T]) -> None:
self.view_model = new_view_model


class ExperimentView(ViewBase):
class ExperimentView(EntityView[Experiment]):
"""View class for experiments"""

def __init__(
Expand All @@ -147,8 +147,8 @@ def __init__(
:type runs: List[Run]
"""
self.status_element = DeltaGenerator()
self.experiment = experiment
self.runs = runs
super().__init__(view_model=experiment)

@property
def status(self) -> str:
Expand All @@ -159,7 +159,7 @@ def status(self) -> str:
"""
return get_experiment_status_summary(self.runs)

def update(self) -> None:
def _update_status(self) -> None:
"""Update status element in ExperimentView"""
self.status_element.write(self.status)

Expand Down Expand Up @@ -200,7 +200,7 @@ def status(self) -> str:
return format_status(status)
return "Status: "

def update_status(self) -> None:
def _update_status(self) -> None:
"""Update status element in ApplicationView"""
self.status_element.write(self.status)

Expand Down Expand Up @@ -242,7 +242,7 @@ def status(self) -> str:
"""
return get_orchestrator_status_summary(self.orchestrator)

def update_status(self) -> None:
def _update_status(self) -> None:
"""Update status element in OrchestratorView"""
self.status_element.write(self.status)

Expand Down Expand Up @@ -300,7 +300,7 @@ def member_status(self) -> str:
return format_status(status)
return "Status: "

def update_status(self) -> None:
def _update_status(self) -> None:
"""Update ensemble and member status elements in EnsembleView"""
self.status_element.write(self.status)
self.member_status_element.write(self.member_status)
Expand All @@ -313,7 +313,8 @@ class ErrorView(ViewBase):
information.
"""

def update(self) -> None: ...
def update(self) -> None:
...


class OverviewView:
Expand Down

0 comments on commit 6482628

Please sign in to comment.