daskgenie 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. daskgenie-0.1.0/.dockerignore +12 -0
  2. daskgenie-0.1.0/.github/workflows/ci.yml +39 -0
  3. daskgenie-0.1.0/.github/workflows/workflow-pypi.yml +86 -0
  4. daskgenie-0.1.0/.gitignore +242 -0
  5. daskgenie-0.1.0/.pre-commit-config.yaml +22 -0
  6. daskgenie-0.1.0/CHANGELOG.md +33 -0
  7. daskgenie-0.1.0/CONTRIBUTING.md +311 -0
  8. daskgenie-0.1.0/Dockerfile +19 -0
  9. daskgenie-0.1.0/LICENSE +21 -0
  10. daskgenie-0.1.0/PKG-INFO +251 -0
  11. daskgenie-0.1.0/README.md +205 -0
  12. daskgenie-0.1.0/docker-compose.yml +48 -0
  13. daskgenie-0.1.0/examples/README.md +51 -0
  14. daskgenie-0.1.0/examples/big_pipeline_oom.py +192 -0
  15. daskgenie-0.1.0/examples/dask_bag.py +55 -0
  16. daskgenie-0.1.0/examples/dask_dataframe.py +62 -0
  17. daskgenie-0.1.0/examples/dask_delayed.py +77 -0
  18. daskgenie-0.1.0/examples/deep_oom.py +72 -0
  19. daskgenie-0.1.0/examples/distributed_oom.py +59 -0
  20. daskgenie-0.1.0/examples/graph_source_map.py +31 -0
  21. daskgenie-0.1.0/examples/local_scheduler.py +45 -0
  22. daskgenie-0.1.0/examples/threaded_big.py +86 -0
  23. daskgenie-0.1.0/examples/threaded_crash.py +93 -0
  24. daskgenie-0.1.0/examples/xarray_netcdf.py +63 -0
  25. daskgenie-0.1.0/examples/xarray_zarr.py +66 -0
  26. daskgenie-0.1.0/pyproject.toml +102 -0
  27. daskgenie-0.1.0/src/daskgenie/__init__.py +25 -0
  28. daskgenie-0.1.0/src/daskgenie/client.py +55 -0
  29. daskgenie-0.1.0/src/daskgenie/collector/__init__.py +6 -0
  30. daskgenie-0.1.0/src/daskgenie/collector/__main__.py +35 -0
  31. daskgenie-0.1.0/src/daskgenie/collector/app.py +272 -0
  32. daskgenie-0.1.0/src/daskgenie/collector/hub.py +72 -0
  33. daskgenie-0.1.0/src/daskgenie/collector/store.py +857 -0
  34. daskgenie-0.1.0/src/daskgenie/collector/store_tsdb.py +781 -0
  35. daskgenie-0.1.0/src/daskgenie/common/__init__.py +34 -0
  36. daskgenie-0.1.0/src/daskgenie/common/arrays.py +38 -0
  37. daskgenie-0.1.0/src/daskgenie/common/schemas.py +230 -0
  38. daskgenie-0.1.0/src/daskgenie/deepmem/__init__.py +7 -0
  39. daskgenie-0.1.0/src/daskgenie/deepmem/tracker.py +349 -0
  40. daskgenie-0.1.0/src/daskgenie/graphcapture/__init__.py +24 -0
  41. daskgenie-0.1.0/src/daskgenie/graphcapture/capture.py +187 -0
  42. daskgenie-0.1.0/src/daskgenie/graphcapture/extract.py +80 -0
  43. daskgenie-0.1.0/src/daskgenie/local_profiler.py +272 -0
  44. daskgenie-0.1.0/src/daskgenie/report.py +93 -0
  45. daskgenie-0.1.0/src/daskgenie/scheduler_plugin/__init__.py +5 -0
  46. daskgenie-0.1.0/src/daskgenie/scheduler_plugin/plugin.py +162 -0
  47. daskgenie-0.1.0/src/daskgenie/worker_plugin/__init__.py +5 -0
  48. daskgenie-0.1.0/src/daskgenie/worker_plugin/plugin.py +358 -0
  49. daskgenie-0.1.0/tests/test_capture.py +76 -0
  50. daskgenie-0.1.0/tests/test_collector.py +331 -0
  51. daskgenie-0.1.0/tests/test_extract.py +29 -0
  52. daskgenie-0.1.0/tests/test_integration_death.py +118 -0
  53. daskgenie-0.1.0/tests/test_integration_deep.py +93 -0
  54. daskgenie-0.1.0/tests/test_integration_worker.py +88 -0
  55. daskgenie-0.1.0/tests/test_local_profiler.py +63 -0
  56. daskgenie-0.1.0/tests/test_scheduler_plugin.py +91 -0
  57. daskgenie-0.1.0/uv.lock +2182 -0
  58. daskgenie-0.1.0/web/.dockerignore +4 -0
  59. daskgenie-0.1.0/web/.eslintrc.json +3 -0
  60. daskgenie-0.1.0/web/.gitignore +5 -0
  61. daskgenie-0.1.0/web/Dockerfile +19 -0
  62. daskgenie-0.1.0/web/app/api/[...path]/route.ts +33 -0
  63. daskgenie-0.1.0/web/app/globals.css +1074 -0
  64. daskgenie-0.1.0/web/app/icon.svg +29 -0
  65. daskgenie-0.1.0/web/app/layout.tsx +21 -0
  66. daskgenie-0.1.0/web/app/page.tsx +3 -0
  67. daskgenie-0.1.0/web/app/runs/[id]/graph/page.tsx +12 -0
  68. daskgenie-0.1.0/web/app/runs/[id]/layout.tsx +148 -0
  69. daskgenie-0.1.0/web/app/runs/[id]/memory/page.tsx +12 -0
  70. daskgenie-0.1.0/web/app/runs/[id]/page.tsx +117 -0
  71. daskgenie-0.1.0/web/app/runs/[id]/postmortem/page.tsx +7 -0
  72. daskgenie-0.1.0/web/app/runs/[id]/stream/page.tsx +12 -0
  73. daskgenie-0.1.0/web/app/runs/[id]/timeline/page.tsx +18 -0
  74. daskgenie-0.1.0/web/app/runs/[id]/workers/page.tsx +12 -0
  75. daskgenie-0.1.0/web/components/AppShell.tsx +79 -0
  76. daskgenie-0.1.0/web/components/CodeLine.tsx +21 -0
  77. daskgenie-0.1.0/web/components/Flamegraph.tsx +242 -0
  78. daskgenie-0.1.0/web/components/GraphCanvas.tsx +350 -0
  79. daskgenie-0.1.0/web/components/LayerMemoryChart.tsx +336 -0
  80. daskgenie-0.1.0/web/components/MemoryChart.tsx +369 -0
  81. daskgenie-0.1.0/web/components/MemoryDeep.tsx +114 -0
  82. daskgenie-0.1.0/web/components/MemoryExplorer.tsx +39 -0
  83. daskgenie-0.1.0/web/components/PostMortem.tsx +103 -0
  84. daskgenie-0.1.0/web/components/Sidebar.tsx +76 -0
  85. daskgenie-0.1.0/web/components/SpikeInspector.tsx +147 -0
  86. daskgenie-0.1.0/web/components/TaskGraph.tsx +301 -0
  87. daskgenie-0.1.0/web/components/TaskStream.tsx +327 -0
  88. daskgenie-0.1.0/web/components/WorkersView.tsx +87 -0
  89. daskgenie-0.1.0/web/lib/api.ts +91 -0
  90. daskgenie-0.1.0/web/lib/colors.ts +29 -0
  91. daskgenie-0.1.0/web/lib/format.ts +41 -0
  92. daskgenie-0.1.0/web/lib/live.tsx +192 -0
  93. daskgenie-0.1.0/web/lib/types.ts +135 -0
  94. daskgenie-0.1.0/web/next.config.mjs +10 -0
  95. daskgenie-0.1.0/web/package-lock.json +6241 -0
  96. daskgenie-0.1.0/web/package.json +30 -0
  97. daskgenie-0.1.0/web/public/logo.svg +22 -0
  98. daskgenie-0.1.0/web/tsconfig.json +21 -0
@@ -0,0 +1,12 @@
1
+ .git
2
+ .venv
3
+ web/node_modules
4
+ web/dist
5
+ **/__pycache__
6
+ .mypy_cache
7
+ .pytest_cache
8
+ .ruff_cache
9
+ *.db
10
+ demo
11
+ tests
12
+ scratchpad
@@ -0,0 +1,39 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ jobs:
9
+ python:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - uses: actions/checkout@v4
13
+ - name: Install uv
14
+ uses: astral-sh/setup-uv@v5
15
+ - name: Sync (dev + collector + deep)
16
+ run: uv sync --group dev --extra collector --extra deep
17
+ - name: Lint
18
+ run: uv run ruff check .
19
+ - name: Format check
20
+ run: uv run ruff format --check .
21
+ - name: Type check
22
+ run: uv run mypy src/
23
+ - name: Tests (unit)
24
+ run: uv run pytest -q -m "not integration"
25
+ - name: Build package
26
+ run: uv build
27
+
28
+ web:
29
+ runs-on: ubuntu-latest
30
+ defaults:
31
+ run:
32
+ working-directory: web
33
+ steps:
34
+ - uses: actions/checkout@v4
35
+ - uses: actions/setup-node@v4
36
+ with:
37
+ node-version: "20"
38
+ - run: npm ci
39
+ - run: npm run build
@@ -0,0 +1,86 @@
1
+ name: Publish
2
+
3
+ # Cut a release by pushing a version tag (e.g. v0.1.0). This builds the Python
4
+ # distributions and publishes them to PyPI with a Trusted Publisher (OIDC, no
5
+ # stored token), builds and pushes the collector + dashboard images to GHCR, and
6
+ # creates the GitHub release.
7
+ on:
8
+ push:
9
+ tags: ["v*"]
10
+
11
+ jobs:
12
+ build:
13
+ name: Build distributions
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - name: Install uv
18
+ uses: astral-sh/setup-uv@v5
19
+ - name: Build sdist + wheel
20
+ run: uv build
21
+ - uses: actions/upload-artifact@v4
22
+ with:
23
+ name: dist
24
+ path: dist/
25
+
26
+ pypi:
27
+ name: Publish to PyPI
28
+ needs: build
29
+ runs-on: ubuntu-latest
30
+ # Trusted Publishing requires the id-token permission; no API token is stored.
31
+ permissions:
32
+ id-token: write
33
+ steps:
34
+ - uses: actions/download-artifact@v4
35
+ with:
36
+ name: dist
37
+ path: dist/
38
+ - name: Publish
39
+ uses: pypa/gh-action-pypi-publish@release/v1
40
+
41
+ images:
42
+ name: Build & push images (GHCR)
43
+ runs-on: ubuntu-latest
44
+ permissions:
45
+ contents: read
46
+ packages: write
47
+ steps:
48
+ - uses: actions/checkout@v4
49
+ - uses: docker/setup-buildx-action@v3
50
+ - name: Log in to GHCR
51
+ uses: docker/login-action@v3
52
+ with:
53
+ registry: ghcr.io
54
+ username: ${{ github.actor }}
55
+ password: ${{ secrets.GITHUB_TOKEN }}
56
+ - name: Collector image
57
+ uses: docker/build-push-action@v6
58
+ with:
59
+ context: .
60
+ file: ./Dockerfile
61
+ push: true
62
+ tags: |
63
+ ghcr.io/${{ github.repository_owner }}/daskgenie-collector:${{ github.ref_name }}
64
+ ghcr.io/${{ github.repository_owner }}/daskgenie-collector:latest
65
+ - name: Dashboard image
66
+ uses: docker/build-push-action@v6
67
+ with:
68
+ context: ./web
69
+ file: ./web/Dockerfile
70
+ push: true
71
+ tags: |
72
+ ghcr.io/${{ github.repository_owner }}/daskgenie-web:${{ github.ref_name }}
73
+ ghcr.io/${{ github.repository_owner }}/daskgenie-web:latest
74
+
75
+ release:
76
+ name: GitHub release
77
+ needs: [pypi, images]
78
+ runs-on: ubuntu-latest
79
+ permissions:
80
+ contents: write
81
+ steps:
82
+ - uses: actions/checkout@v4
83
+ - name: Create release
84
+ uses: softprops/action-gh-release@v2
85
+ with:
86
+ generate_release_notes: true
@@ -0,0 +1,242 @@
1
+ __pycache__/
2
+ *.pyc
3
+ .venv/
4
+ .mypy_cache/
5
+ .pytest_cache/
6
+ .ruff_cache/
7
+ *.egg-info/
8
+ dist/
9
+ build/
10
+ uv.lock.bak
11
+ .DS_Store
12
+ node_modules/
13
+ /dask-profiler-spec.md
14
+
15
+ # Byte-compiled / optimized / DLL files
16
+ __pycache__/
17
+ *.py[codz]
18
+ *$py.class
19
+
20
+ # C extensions
21
+ *.so
22
+
23
+ # Distribution / packaging
24
+ .Python
25
+ build/
26
+ develop-eggs/
27
+ dist/
28
+ downloads/
29
+ eggs/
30
+ .eggs/
31
+ lib/
32
+ lib64/
33
+ parts/
34
+ sdist/
35
+ var/
36
+ wheels/
37
+ share/python-wheels/
38
+ *.egg-info/
39
+ .installed.cfg
40
+ *.egg
41
+ MANIFEST
42
+
43
+ # PyInstaller
44
+ # Usually these files are written by a python script from a template
45
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
46
+ *.manifest
47
+ *.spec
48
+
49
+ # Installer logs
50
+ pip-log.txt
51
+ pip-delete-this-directory.txt
52
+
53
+ # Unit test / coverage reports
54
+ htmlcov/
55
+ .tox/
56
+ .nox/
57
+ .coverage
58
+ .coverage.*
59
+ .cache
60
+ nosetests.xml
61
+ coverage.xml
62
+ *.cover
63
+ *.py.cover
64
+ *.lcov
65
+ .hypothesis/
66
+ .pytest_cache/
67
+ cover/
68
+
69
+ # Translations
70
+ *.mo
71
+ *.pot
72
+
73
+ # Django stuff:
74
+ *.log
75
+ local_settings.py
76
+ db.sqlite3
77
+ db.sqlite3-journal
78
+
79
+ # Flask stuff:
80
+ instance/
81
+ .webassets-cache
82
+
83
+ # Scrapy stuff:
84
+ .scrapy
85
+
86
+ # Sphinx documentation
87
+ docs/_build/
88
+
89
+ # PyBuilder
90
+ .pybuilder/
91
+ target/
92
+
93
+ # Jupyter Notebook
94
+ .ipynb_checkpoints
95
+
96
+ # IPython
97
+ profile_default/
98
+ ipython_config.py
99
+
100
+ # pyenv
101
+ # For a library or package, you might want to ignore these files since the code is
102
+ # intended to run in multiple environments; otherwise, check them in:
103
+ # .python-version
104
+
105
+ # pipenv
106
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
107
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
108
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
109
+ # install all needed dependencies.
110
+ # Pipfile.lock
111
+
112
+ # UV
113
+ # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
114
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
115
+ # commonly ignored for libraries.
116
+ # uv.lock
117
+
118
+ # poetry
119
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
120
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
121
+ # commonly ignored for libraries.
122
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
123
+ # poetry.lock
124
+ # poetry.toml
125
+
126
+ # pdm
127
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
128
+ # pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
129
+ # https://pdm-project.org/en/latest/usage/project/#working-with-version-control
130
+ # pdm.lock
131
+ # pdm.toml
132
+ .pdm-python
133
+ .pdm-build/
134
+
135
+ # pixi
136
+ # Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
137
+ # pixi.lock
138
+ # Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
139
+ # in the .venv directory. It is recommended not to include this directory in version control.
140
+ .pixi/*
141
+ !.pixi/config.toml
142
+
143
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
144
+ __pypackages__/
145
+
146
+ # Celery stuff
147
+ celerybeat-schedule*
148
+ celerybeat.pid
149
+
150
+ # Redis
151
+ *.rdb
152
+ *.aof
153
+ *.pid
154
+
155
+ # RabbitMQ
156
+ mnesia/
157
+ rabbitmq/
158
+ rabbitmq-data/
159
+
160
+ # ActiveMQ
161
+ activemq-data/
162
+
163
+ # SageMath parsed files
164
+ *.sage.py
165
+
166
+ # Environments
167
+ .env
168
+ .envrc
169
+ .venv
170
+ env/
171
+ venv/
172
+ ENV/
173
+ env.bak/
174
+ venv.bak/
175
+
176
+ # Spyder project settings
177
+ .spyderproject
178
+ .spyproject
179
+
180
+ # Rope project settings
181
+ .ropeproject
182
+
183
+ # mkdocs documentation
184
+ /site
185
+
186
+ # mypy
187
+ .mypy_cache/
188
+ .dmypy.json
189
+ dmypy.json
190
+
191
+ # Pyre type checker
192
+ .pyre/
193
+
194
+ # pytype static type analyzer
195
+ .pytype/
196
+
197
+ # Cython debug symbols
198
+ cython_debug/
199
+
200
+ # PyCharm
201
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
202
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
203
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
204
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
205
+ # .idea/
206
+
207
+ # Abstra
208
+ # Abstra is an AI-powered process automation framework.
209
+ # Ignore directories containing user credentials, local state, and settings.
210
+ # Learn more at https://abstra.io/docs
211
+ .abstra/
212
+
213
+ # Visual Studio Code
214
+ # Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
215
+ # that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
216
+ # and can be added to the global gitignore or merged into this file. However, if you prefer,
217
+ # you could uncomment the following to ignore the entire vscode folder
218
+ # .vscode/
219
+ # Temporary file for partial code execution
220
+ tempCodeRunnerFile.py
221
+
222
+ # Ruff stuff:
223
+ .ruff_cache/
224
+
225
+ # PyPI configuration file
226
+ .pypirc
227
+
228
+ # Marimo
229
+ marimo/_static/
230
+ marimo/_lsp/
231
+ __marimo__/
232
+
233
+ # Streamlit
234
+ .streamlit/secrets.toml
235
+
236
+ # web build artifacts
237
+ *.tsbuildinfo
238
+ web/vite.config.js
239
+ web/vite.config.d.ts
240
+
241
+ # web/lib is source, not a Python build dir
242
+ !web/lib/
@@ -0,0 +1,22 @@
1
+ # Run `uv run pre-commit install` once, then these run on every commit.
2
+ # Local/system hooks use the project's own pinned tool versions via uv, so
3
+ # there's no drift between pre-commit and CI.
4
+ repos:
5
+ - repo: local
6
+ hooks:
7
+ - id: ruff-format
8
+ name: ruff format
9
+ entry: uv run ruff format
10
+ language: system
11
+ types: [python]
12
+ - id: ruff
13
+ name: ruff check
14
+ entry: uv run ruff check --fix
15
+ language: system
16
+ types: [python]
17
+ - id: mypy
18
+ name: mypy
19
+ entry: uv run mypy src/
20
+ language: system
21
+ types: [python]
22
+ pass_filenames: false
@@ -0,0 +1,33 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented here. The format is based on
4
+ [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project
5
+ adheres to [Semantic Versioning](https://semver.org/).
6
+
7
+ ## [Unreleased]
8
+
9
+ ## [0.1.0]
10
+
11
+ ### Added
12
+
13
+ - **Deep memory profiling** with memray driven as a library: per-source-line
14
+ high-water-mark attribution and full call stacks for a per-worker flamegraph /
15
+ memray-style tree. Opt-in `deep=True`; degrades to lightweight sampling where
16
+ memray isn't available.
17
+ - **Real-time dashboard** (Next.js) streaming over WebSocket: live Workers table,
18
+ global + per-worker task stream, whole-graph canvas DAG, memory-over-time with
19
+ a click-to-inspect spike explorer, per-layer allocations over time, and the
20
+ deep flamegraph. Collapsible sidebar, in-app modals, Dask warm palette + logo.
21
+ - **TimescaleDB** backend (hypertables) as the default collector store behind a
22
+ `StoreProtocol`, with SQLite kept for local use and tests. Prometheus
23
+ `/metrics` retained.
24
+ - **Worker-death post-mortem** joining suspect tasks with chunk metadata and the
25
+ allocation lines at the high-water mark.
26
+ - **Origin tracking** — each run records the client hostname and IP.
27
+ - **Examples** across Dask: distributed/deep OOM demos, a minutes-long pipeline,
28
+ a self-limiting crash, and one per collection type (`dask.delayed`,
29
+ `dask.dataframe`, `dask.bag`, xarray on Zarr and NetCDF).
30
+ - Packaging (PyPI metadata, MIT license), CI, and release workflows.
31
+
32
+ [Unreleased]: https://github.com/polymood/DaskGenie/compare/v0.1.0...HEAD
33
+ [0.1.0]: https://github.com/polymood/DaskGenie/releases/tag/v0.1.0