{"id":21395652,"url":"https://github.com/point72/raydar","last_synced_at":"2025-08-13T06:06:06.535Z","repository":{"id":233393925,"uuid":"749969285","full_name":"Point72/raydar","owner":"Point72","description":"A perspective powered, user editable ray dashboard via ray serve","archived":false,"fork":false,"pushed_at":"2025-07-07T13:58:23.000Z","size":9334,"stargazers_count":46,"open_issues_count":7,"forks_count":6,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-07-14T09:45:23.181Z","etag":null,"topics":["dashboard","observability","python","ray","scheduler","tracing"],"latest_commit_sha":null,"homepage":"https://github.com/Point72/raydar/wiki","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Point72.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-01-29T18:35:58.000Z","updated_at":"2025-07-07T13:58:25.000Z","dependencies_parsed_at":"2024-04-17T02:57:59.427Z","dependency_job_id":"37aab1e9-1a23-4cbd-a1d0-0dff745ebf29","html_url":"https://github.com/Point72/raydar","commit_stats":{"total_commits":59,"total_committers":3,"mean_commits":"19.666666666666668","dds":0.423728813559322,"last_synced_commit":"8b92b7bb0960048e8f13ff9fdfb1f0fc1326d1a2"},"previous_names":["point72/raydar"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/Point72/raydar","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Point72%2Fraydar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Point72%2Fraydar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Point72%2Fraydar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Point72%2Fraydar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Point72","download_url":"https://codeload.github.com/Point72/raydar/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Point72%2Fraydar/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270191416,"owners_count":24542268,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-13T02:00:09.904Z","response_time":66,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dashboard","observability","python","ray","scheduler","tracing"],"created_at":"2024-11-22T14:22:17.880Z","updated_at":"2025-08-13T06:06:06.439Z","avatar_url":"https://github.com/Point72.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ca href=\"https://github.com/point72/raydar\"\u003e\n  \u003cimg src=\"https://github.com/point72/raydar/raw/main/docs/img/logo.png?raw=true\" alt=\"raydar\" width=\"400\"\u003e\u003c/a\u003e\n\u003c/a\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n\n[![Build Status](https://github.com/Point72/raydar/actions/workflows/build.yaml/badge.svg?branch=main\u0026event=push)](https://github.com/Point72/raydar/actions/workflows/build.yaml)\n[![codecov](https://codecov.io/gh/point72/raydar/branch/main/graph/badge.svg)](https://codecov.io/gh/point72/raydar)\n[![GitHub issues](https://img.shields.io/github/issues/point72/raydar.svg)](https://github.com/point72/raydar/issues)\n[![PyPI Version](https://img.shields.io/pypi/v/raydar.svg)](https://pypi.python.org/pypi/raydar)\n[![License](https://img.shields.io/pypi/l/raydar.svg)](https://github.com/Point72/raydar/blob/main/LICENSE)\n\nA [perspective](https://perspective.finos.org/) powered, user editable ray dashboard via ray serve.\n\nRay offers powerful metrics visualizations powered by graphana and prometheus. Although useful, the setup can take time - and customizations can be challenging.\n\nRaydar, enables out-of-the-box live cluster metrics and user visualizations for Ray workflows with just a simple pip install. It helps unlock distributed machine learning visualizations on Anyscale clusters, runs live and at scale, is easily customizable, and enables all the in-browser aggregations that [perspective](https://perspective.finos.org/) has to offer.\n\n![Example](https://media.githubusercontent.com/media/Point72/raydar/refs/heads/main/docs/img/ml_example.gif)\n\n## Features\n\n- Convenience wrappers for the tracking and persistence of ray GCS task metdata. Can scale beyond the existing ray dashboard / GCS task tracking limitations.\n- Serves a UI through [ray serve](https://docs.ray.io/en/latest/serve/index.html) for the vizualization of [perspective](https://github.com/finos/perspective) tables.\n- A python interface to create and update perspective tables from within ray tasks.\n\n[More information is available in our wiki](https://github.com/Point72/raydar/wiki)\n\n## Installation\n\n`raydar` can be installed via [pip](https://pip.pypa.io) or [conda](https://docs.conda.io/en/latest/), the two primary package managers for the Python ecosystem. See [our wiki](https://github.com/Point72/raydar/wiki/Installation) for more information.\n\n## Launching The UI, Tracking Tasks, Creating/Updating Custom Tables\n\nThe raydar module provides an actor which can process collections of ray object references on your behalf, and can serve a perspective dashboard in which to visualize that data.\n\n```python\nfrom raydar import RayTaskTracker\ntask_tracker = RayTaskTracker(enable_perspective_dashboard=True)\n```\n\nPassing collections of object references to this actor's process method causes those references to be tracked in an internal polars dataframe, as they finish running.\n\n```python\n@ray.remote\ndef example_remote_function():\n    import time\n    import random\n    time.sleep(1)\n    if random.randint(1,100) \u003e 90:\n        raise Exception(\"This task should sometimes fail!\")\n    return True\n\nrefs = [example_remote_function.remote() for _ in range(100)]\ntask_tracker.process(refs)\n```\n\nThe perspective UI is served on port 8000 by default.\n\n![Example](https://media.githubusercontent.com/media/Point72/raydar/refs/heads/main/docs/img/example_perspective_dashboard.gif)\n\nPassing a `name` and `namespace` arguments allows the RayTaskTracker to skip construction when an actor already exists. This also means we can access the correct ray actor handle from arbitrary ray code, once the correct name and namespace are provided.\n\n```python\nfrom raydar import RayTaskTracker\n\ntask_tracker = RayTaskTracker(\n    enable_perspective_dashboard=True,\n    name=\"my_actor_name\",\n    namespace=\"my_actor_namespace”\n)\n\ntask_tracker.create_table(\n    table_name=\"demo_table\",\n    table_schema=dict(\n        worker_id=\"str\",\n        metric_value=\"int\",\n        other_metric_value=\"float\",\n        timestamp=\"datetime”\n    )\n)\n```\n\nNow, from an arbitrary remote function:\n\n```python\n@ray.remote\ndef add_data_to_demo_table(i):\n    task_tracker = RayTaskTracker(name=\"my_actor_name\", namespace=\"my_actor_namespace\")\n\n    import datetime\n    import random\n    data = dict(\n        worker_id=\"worker_1\",\n        metric_value=i,\n        other_metric_value=i * random.uniform(1.5, 1.8),\n        timestamp = datetime.datetime.now()\n    )\n    task_tracker.update_table(\"demo_table\", [data])\n```\n\n![Example](https://media.githubusercontent.com/media/Point72/raydar/refs/heads/main/docs/img/custom_user_table.gif)\n\n## FAQ\n\n- _Where is the perspective data stored?_\n\nCurrently, in memory. There are plans to integrate alternatives to this configuration, but currently the data is stored in machine memory on the ray head.\n\n- _How can I save and restore my perspective layouts?_\n\nThe `Save Layout` button saves a json file containing layout information. Dragging and dropping this file into the UI browser window restores that layout.\n\n![Example](https://media.githubusercontent.com/media/Point72/raydar/refs/heads/main/docs/img/layout_restoration.gif)\n\n## License\n\nThis software is licensed under the Apache 2.0 license. See the [LICENSE](LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpoint72%2Fraydar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpoint72%2Fraydar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpoint72%2Fraydar/lists"}