mirror of
https://github.com/vale981/ray
synced 2025-03-09 21:06:39 -04:00
70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
![]() |
import logging
|
||
|
|
||
|
import mimetypes
|
||
|
|
||
|
import aiohttp.web
|
||
|
import ray.new_dashboard.utils as dashboard_utils
|
||
|
from ray.new_dashboard.datacenter import DataSource, GlobalSignals
|
||
|
|
||
|
logger = logging.getLogger(__name__)
|
||
|
routes = dashboard_utils.ClassMethodRouteTable
|
||
|
|
||
|
|
||
|
class LogHead(dashboard_utils.DashboardHeadModule):
|
||
|
LOG_URL_TEMPLATE = "http://{ip}:{port}/logs"
|
||
|
|
||
|
def __init__(self, dashboard_head):
|
||
|
super().__init__(dashboard_head)
|
||
|
mimetypes.add_type("text/plain", ".err")
|
||
|
mimetypes.add_type("text/plain", ".out")
|
||
|
routes.static("/logs", self._dashboard_head.log_dir, show_index=True)
|
||
|
GlobalSignals.node_info_fetched.append(
|
||
|
self.insert_log_url_to_node_info)
|
||
|
|
||
|
async def insert_log_url_to_node_info(self, node_info):
|
||
|
ip = node_info.get("ip")
|
||
|
if ip is None:
|
||
|
return
|
||
|
agent_port = DataSource.agents.get(ip)
|
||
|
if agent_port is None:
|
||
|
return
|
||
|
agent_http_port, _ = agent_port
|
||
|
log_url = self.LOG_URL_TEMPLATE.format(ip=ip, port=agent_http_port)
|
||
|
node_info["logUrl"] = log_url
|
||
|
|
||
|
@routes.get("/log_index")
|
||
|
async def get_log_index(self, req) -> aiohttp.web.Response:
|
||
|
url_list = []
|
||
|
for ip, ports in DataSource.agents.items():
|
||
|
url_list.append(
|
||
|
self.LOG_URL_TEMPLATE.format(ip=ip, port=str(ports[0])))
|
||
|
if self._dashboard_head.ip not in DataSource.agents:
|
||
|
url_list.append(
|
||
|
self.LOG_URL_TEMPLATE.format(
|
||
|
ip=self._dashboard_head.ip,
|
||
|
port=self._dashboard_head.http_port))
|
||
|
return aiohttp.web.Response(
|
||
|
text=self._directory_as_html(url_list), content_type="text/html")
|
||
|
|
||
|
@staticmethod
|
||
|
def _directory_as_html(url_list) -> str:
|
||
|
# returns directory's index as html
|
||
|
|
||
|
index_of = "Index of logs"
|
||
|
h1 = f"<h1>{index_of}</h1>"
|
||
|
|
||
|
index_list = []
|
||
|
for url in sorted(url_list):
|
||
|
index_list.append(f'<li><a href="{url}">{url}</a></li>')
|
||
|
index_list = "\n".join(index_list)
|
||
|
ul = f"<ul>\n{index_list}\n</ul>"
|
||
|
body = f"<body>\n{h1}\n{ul}\n</body>"
|
||
|
|
||
|
head_str = f"<head>\n<title>{index_of}</title>\n</head>"
|
||
|
html = f"<html>\n{head_str}\n{body}\n</html>"
|
||
|
|
||
|
return html
|
||
|
|
||
|
async def run(self, server):
|
||
|
pass
|