├── .backportrc.json ├── .bzrignore ├── .deepsource.toml ├── .eslintrc.js ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── general-support-question.md ├── dependabot.yml ├── stale.yml └── workflows │ ├── codeql-analysis.yml │ └── tests.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .pre-commit-hooks.yaml ├── .readthedocs.yaml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── CONTRIBUTING_FOR_COMMITTERS.md ├── LICENSE ├── MANIFEST.in ├── README.md ├── bin ├── build-index ├── build-index.sh └── run-graphite-devel-server.py ├── check-dependencies.py ├── conf ├── dashboard.conf.example ├── graphTemplates.conf.example └── graphite.wsgi.example ├── contrib ├── demo-collector.py ├── memcache_whisper.py ├── munin-graphite.rb ├── perl_pickle_client.pl ├── test_aggregator_rules.py └── virtualenvwrapper │ ├── postactivate │ └── postdeactivate ├── distro └── redhat │ └── misc │ └── postinstall ├── docs ├── Makefile ├── _static │ └── default.css ├── admin-carbon.rst ├── admin-webapp.rst ├── carbon-daemons.rst ├── ceres.rst ├── client-apis.rst ├── composer.rst ├── conf.py ├── config-carbon.rst ├── config-database-setup.rst ├── config-local-settings.rst ├── config-webapp.rst ├── dashboard.rst ├── development.rst ├── events.rst ├── faq.rst ├── feeding-carbon.rst ├── functions.rst ├── img │ ├── arch_overview.png │ └── arch_overview.xml ├── index.rst ├── install-pip.rst ├── install-source.rst ├── install-synthesize.rst ├── install-virtualenv.rst ├── install.rst ├── metrics_api.rst ├── overview.rst ├── releases.rst ├── releases │ ├── 0_9_10.rst │ ├── 0_9_11.rst │ ├── 0_9_12.rst │ ├── 0_9_14.rst │ ├── 0_9_15.rst │ ├── 0_9_16.rst │ ├── 0_9_2.rst │ ├── 0_9_3.rst │ ├── 0_9_4.rst │ ├── 0_9_5.rst │ ├── 0_9_6.rst │ ├── 0_9_7.rst │ ├── 0_9_8.rst │ ├── 0_9_9.rst │ ├── 1_0_0.rst │ ├── 1_0_1.rst │ ├── 1_0_2.rst │ ├── 1_1_1.rst │ ├── 1_1_10.rst │ ├── 1_1_2.rst │ ├── 1_1_3.rst │ ├── 1_1_4.rst │ ├── 1_1_5.rst │ ├── 1_1_6.rst │ ├── 1_1_7.rst │ └── 1_1_8.rst ├── render_api.rst ├── requirements.txt ├── storage-backends.rst ├── tags.rst ├── terminology.rst ├── tools.rst ├── whisper.rst └── who-is-using.rst ├── examples ├── example-client.py └── example-graphite-vhost.conf ├── requirements.txt ├── setup.cfg ├── setup.py ├── tox.ini └── webapp ├── content ├── css │ ├── darkX.css │ ├── darkX │ │ ├── button-close-focused.png │ │ ├── button-maximize-focused.png │ │ ├── button-minimize-focused.png │ │ ├── frame-bottom-left-focused.png │ │ ├── frame-bottom-mid-focused.png │ │ ├── frame-bottom-right-focused.png │ │ ├── frame-left-focused.png │ │ ├── frame-right-focused.png │ │ ├── titlebar-left-focused.png │ │ ├── titlebar-mid-focused.png │ │ └── titlebar-right-focused.png │ ├── dashboard-default.css │ ├── dashboard-white.css │ ├── dashboard.css │ ├── default.css │ ├── default │ │ ├── bottom_left.gif │ │ ├── bottom_mid.gif │ │ ├── bottom_right.gif │ │ ├── bottom_right_resize.gif │ │ ├── center_left.gif │ │ ├── center_right.gif │ │ ├── clear.gif │ │ ├── close.gif │ │ ├── inspect.gif │ │ ├── maximize.gif │ │ ├── minimize.gif │ │ ├── overlay.png │ │ ├── resize.gif │ │ ├── sizer.gif │ │ ├── top_left.gif │ │ ├── top_mid.gif │ │ └── top_right.gif │ └── table.css ├── html │ ├── completerHelp.html │ └── searchHelp.html ├── img │ ├── blank.gif │ ├── calendar.png │ ├── carbon-fiber.png │ ├── clock.png │ ├── clock_16.png │ ├── favicon.ico │ ├── graphite-logo.png │ ├── graphite.png │ ├── graphite_short.png │ ├── leaf.gif │ ├── mini-bottom2.gif │ ├── mini-top2.gif │ ├── move_down.png │ ├── move_up.png │ ├── overview.png │ ├── refresh.png │ ├── save.png │ ├── share.png │ ├── trash.png │ └── upload.png └── js │ ├── ace │ ├── ace.js │ ├── keybinding-vim.js │ ├── mode-c_cpp.js │ ├── mode-clojure.js │ ├── mode-coffee.js │ ├── mode-csharp.js │ ├── mode-css.js │ ├── mode-groovy.js │ ├── mode-html.js │ ├── mode-java.js │ ├── mode-javascript.js │ ├── mode-json.js │ ├── theme-textmate.js │ └── worker-javascript.js │ ├── browser.js │ ├── completer.js │ ├── composer.js │ ├── composer_widgets.js │ ├── dashboard.js │ └── ext │ ├── adapter │ └── ext │ │ ├── ext-base-debug.js │ │ └── ext-base.js │ ├── ext-all-debug.js │ ├── ext-all.js │ ├── resources │ ├── css │ │ └── ext-all.css │ ├── icons │ │ └── fam │ │ │ ├── SILK.txt │ │ │ ├── accept.png │ │ │ ├── add.gif │ │ │ ├── add.png │ │ │ ├── application_go.png │ │ │ ├── application_view_list.png │ │ │ ├── book.png │ │ │ ├── cog.png │ │ │ ├── cog_edit.png │ │ │ ├── connect.gif │ │ │ ├── connect.png │ │ │ ├── control_rewind.png │ │ │ ├── cross.gif │ │ │ ├── delete.gif │ │ │ ├── error.png │ │ │ ├── feed_add.png │ │ │ ├── feed_delete.png │ │ │ ├── feed_error.png │ │ │ ├── folder_go.png │ │ │ ├── folder_wrench.png │ │ │ ├── grid.png │ │ │ ├── image_add.png │ │ │ ├── information.png │ │ │ ├── plugin.gif │ │ │ ├── plugin_add.gif │ │ │ ├── rss_go.png │ │ │ ├── table_refresh.png │ │ │ ├── user.gif │ │ │ ├── user.png │ │ │ ├── user_add.gif │ │ │ ├── user_add.png │ │ │ ├── user_comment.png │ │ │ ├── user_delete.gif │ │ │ ├── user_delete.png │ │ │ ├── user_edit.png │ │ │ ├── user_female.gif │ │ │ ├── user_female.png │ │ │ ├── user_gray.png │ │ │ ├── user_green.gif │ │ │ ├── user_green.png │ │ │ ├── user_orange.png │ │ │ ├── user_red.png │ │ │ ├── user_suit.gif │ │ │ └── user_suit.png │ └── images │ │ └── default │ │ ├── box │ │ ├── corners-blue.gif │ │ ├── corners.gif │ │ ├── l-blue.gif │ │ ├── l.gif │ │ ├── r-blue.gif │ │ ├── r.gif │ │ ├── tb-blue.gif │ │ └── tb.gif │ │ ├── button │ │ ├── arrow.gif │ │ ├── btn.gif │ │ ├── group-cs.gif │ │ ├── group-lr.gif │ │ ├── group-tb.gif │ │ ├── s-arrow-b-noline.gif │ │ ├── s-arrow-b.gif │ │ ├── s-arrow-bo.gif │ │ ├── s-arrow-noline.gif │ │ ├── s-arrow-o.gif │ │ └── s-arrow.gif │ │ ├── dd │ │ ├── drop-add.gif │ │ ├── drop-no.gif │ │ └── drop-yes.gif │ │ ├── editor │ │ └── tb-sprite.gif │ │ ├── form │ │ ├── checkbox.gif │ │ ├── clear-trigger.gif │ │ ├── clear-trigger.psd │ │ ├── date-trigger.gif │ │ ├── date-trigger.psd │ │ ├── error-tip-corners.gif │ │ ├── exclamation.gif │ │ ├── radio.gif │ │ ├── search-trigger.gif │ │ ├── search-trigger.psd │ │ ├── text-bg.gif │ │ ├── trigger-square.gif │ │ ├── trigger-square.psd │ │ ├── trigger-tpl.gif │ │ ├── trigger.gif │ │ └── trigger.psd │ │ ├── gradient-bg.gif │ │ ├── grid │ │ ├── arrow-left-white.gif │ │ ├── arrow-right-white.gif │ │ ├── col-move-bottom.gif │ │ ├── col-move-top.gif │ │ ├── columns.gif │ │ ├── dirty.gif │ │ ├── done.gif │ │ ├── drop-no.gif │ │ ├── drop-yes.gif │ │ ├── footer-bg.gif │ │ ├── grid-blue-hd.gif │ │ ├── grid-blue-split.gif │ │ ├── grid-hrow.gif │ │ ├── grid-loading.gif │ │ ├── grid-split.gif │ │ ├── grid-vista-hd.gif │ │ ├── grid3-hd-btn.gif │ │ ├── grid3-hrow-over.gif │ │ ├── grid3-hrow.gif │ │ ├── grid3-rowheader.gif │ │ ├── grid3-special-col-bg.gif │ │ ├── grid3-special-col-sel-bg.gif │ │ ├── group-by.gif │ │ ├── group-collapse.gif │ │ ├── group-expand-sprite.gif │ │ ├── group-expand.gif │ │ ├── hd-pop.gif │ │ ├── hmenu-asc.gif │ │ ├── hmenu-desc.gif │ │ ├── hmenu-lock.gif │ │ ├── hmenu-lock.png │ │ ├── hmenu-unlock.gif │ │ ├── hmenu-unlock.png │ │ ├── invalid_line.gif │ │ ├── loading.gif │ │ ├── mso-hd.gif │ │ ├── nowait.gif │ │ ├── page-first-disabled.gif │ │ ├── page-first.gif │ │ ├── page-last-disabled.gif │ │ ├── page-last.gif │ │ ├── page-next-disabled.gif │ │ ├── page-next.gif │ │ ├── page-prev-disabled.gif │ │ ├── page-prev.gif │ │ ├── pick-button.gif │ │ ├── refresh-disabled.gif │ │ ├── refresh.gif │ │ ├── row-check-sprite.gif │ │ ├── row-expand-sprite.gif │ │ ├── row-over.gif │ │ ├── row-sel.gif │ │ ├── sort-hd.gif │ │ ├── sort_asc.gif │ │ ├── sort_desc.gif │ │ └── wait.gif │ │ ├── layout │ │ ├── collapse.gif │ │ ├── expand.gif │ │ ├── gradient-bg.gif │ │ ├── mini-bottom.gif │ │ ├── mini-left.gif │ │ ├── mini-right.gif │ │ ├── mini-top.gif │ │ ├── ns-collapse.gif │ │ ├── ns-expand.gif │ │ ├── panel-close.gif │ │ ├── panel-title-bg.gif │ │ ├── panel-title-light-bg.gif │ │ ├── stick.gif │ │ ├── stuck.gif │ │ ├── tab-close-on.gif │ │ └── tab-close.gif │ │ ├── menu │ │ ├── checked.gif │ │ ├── group-checked.gif │ │ ├── item-over.gif │ │ ├── menu-parent.gif │ │ ├── menu.gif │ │ └── unchecked.gif │ │ ├── panel │ │ ├── corners-sprite.gif │ │ ├── left-right.gif │ │ ├── light-hd.gif │ │ ├── tool-sprite-tpl.gif │ │ ├── tool-sprites.gif │ │ ├── tools-sprites-trans.gif │ │ ├── top-bottom.gif │ │ ├── top-bottom.png │ │ ├── white-corners-sprite.gif │ │ ├── white-left-right.gif │ │ └── white-top-bottom.gif │ │ ├── progress │ │ └── progress-bg.gif │ │ ├── qtip │ │ ├── bg.gif │ │ ├── close.gif │ │ ├── tip-anchor-sprite.gif │ │ └── tip-sprite.gif │ │ ├── s.gif │ │ ├── shadow-c.png │ │ ├── shadow-lr.png │ │ ├── shadow.png │ │ ├── shared │ │ ├── blue-loading.gif │ │ ├── calendar.gif │ │ ├── glass-bg.gif │ │ ├── hd-sprite.gif │ │ ├── large-loading.gif │ │ ├── left-btn.gif │ │ ├── loading-balls.gif │ │ ├── right-btn.gif │ │ └── warning.gif │ │ ├── sizer │ │ ├── e-handle-dark.gif │ │ ├── e-handle.gif │ │ ├── ne-handle-dark.gif │ │ ├── ne-handle.gif │ │ ├── nw-handle-dark.gif │ │ ├── nw-handle.gif │ │ ├── s-handle-dark.gif │ │ ├── s-handle.gif │ │ ├── se-handle-dark.gif │ │ ├── se-handle.gif │ │ ├── square.gif │ │ ├── sw-handle-dark.gif │ │ └── sw-handle.gif │ │ ├── slider │ │ ├── slider-bg.png │ │ ├── slider-thumb.png │ │ ├── slider-v-bg.png │ │ └── slider-v-thumb.png │ │ ├── tabs │ │ ├── scroll-left.gif │ │ ├── scroll-right.gif │ │ ├── scroller-bg.gif │ │ ├── tab-btm-inactive-left-bg.gif │ │ ├── tab-btm-inactive-right-bg.gif │ │ ├── tab-btm-left-bg.gif │ │ ├── tab-btm-over-left-bg.gif │ │ ├── tab-btm-over-right-bg.gif │ │ ├── tab-btm-right-bg.gif │ │ ├── tab-close.gif │ │ ├── tab-strip-bg.gif │ │ ├── tab-strip-bg.png │ │ ├── tab-strip-btm-bg.gif │ │ └── tabs-sprite.gif │ │ ├── toolbar │ │ ├── bg.gif │ │ ├── btn-arrow-light.gif │ │ ├── btn-arrow.gif │ │ ├── btn-over-bg.gif │ │ ├── gray-bg.gif │ │ ├── more.gif │ │ ├── tb-bg.gif │ │ ├── tb-btn-sprite.gif │ │ ├── tb-xl-btn-sprite.gif │ │ └── tb-xl-sep.gif │ │ ├── tree │ │ ├── arrows.gif │ │ ├── drop-add.gif │ │ ├── drop-between.gif │ │ ├── drop-no.gif │ │ ├── drop-over.gif │ │ ├── drop-under.gif │ │ ├── drop-yes.gif │ │ ├── elbow-end-minus-nl.gif │ │ ├── elbow-end-minus.gif │ │ ├── elbow-end-plus-nl.gif │ │ ├── elbow-end-plus.gif │ │ ├── elbow-end.gif │ │ ├── elbow-line.gif │ │ ├── elbow-minus-nl.gif │ │ ├── elbow-minus.gif │ │ ├── elbow-plus-nl.gif │ │ ├── elbow-plus.gif │ │ ├── elbow.gif │ │ ├── folder-open.gif │ │ ├── folder.gif │ │ ├── leaf.gif │ │ ├── loading.gif │ │ └── s.gif │ │ └── window │ │ ├── icon-error.gif │ │ ├── icon-info.gif │ │ ├── icon-question.gif │ │ ├── icon-warning.gif │ │ ├── left-corners.png │ │ ├── left-corners.psd │ │ ├── left-right.png │ │ ├── left-right.psd │ │ ├── right-corners.png │ │ ├── right-corners.psd │ │ ├── top-bottom.png │ │ └── top-bottom.psd │ └── ux │ └── DataViewTransition.js ├── graphite ├── .gitignore ├── __init__.py ├── account │ ├── __init__.py │ ├── admin.py │ ├── ldapBackend.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── urls.py │ └── views.py ├── app_settings.py ├── browser │ ├── __init__.py │ ├── urls.py │ └── views.py ├── carbonlink.py ├── compat.py ├── composer │ ├── __init__.py │ ├── urls.py │ └── views.py ├── dashboard │ ├── __init__.py │ ├── admin.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── send_graph.py │ ├── urls.py │ └── views.py ├── errors.py ├── events │ ├── __init__.py │ ├── admin.py │ ├── compat.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── urls.py │ └── views.py ├── finders │ ├── __init__.py │ ├── ceres.py │ ├── remote.py │ ├── standard.py │ └── utils.py ├── functions │ ├── __init__.py │ ├── aggfuncs.py │ ├── custom │ │ ├── .gitignore │ │ └── __init__.py │ ├── params.py │ ├── safe.py │ ├── urls.py │ └── views.py ├── http_pool.py ├── intervals.py ├── local_settings.py.example ├── logger.py ├── metrics │ ├── __init__.py │ ├── urls.py │ └── views.py ├── middleware.py ├── node.py ├── readers │ ├── __init__.py │ ├── ceres.py │ ├── multi.py │ ├── remote.py │ ├── rrd.py │ ├── utils.py │ └── whisper.py ├── render │ ├── __init__.py │ ├── attime.py │ ├── datalib.py │ ├── evaluator.py │ ├── functions.py │ ├── glyph.py │ ├── grammar.py │ ├── grammar_unsafe.py │ ├── hashing.py │ ├── urls.py │ └── views.py ├── settings.py ├── singleton.py ├── storage.py ├── tags │ ├── __init__.py │ ├── base.py │ ├── http.py │ ├── localdatabase.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ ├── redis.py │ ├── urls.py │ ├── utils.py │ └── views.py ├── templates │ ├── 500.html │ ├── browser.html │ ├── browserHeader.html │ ├── composer.html │ ├── dashboard.html │ ├── dashboardHelp.html │ ├── editProfile.html │ ├── event.html │ ├── events.html │ ├── login.html │ └── version.html ├── umsgpack.py ├── url_shortener │ ├── __init__.py │ ├── baseconv.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── __init__.py │ ├── models.py │ └── views.py ├── urls.py ├── user_util.py ├── util.py ├── version │ ├── __init__.py │ ├── urls.py │ └── views.py ├── views.py ├── whitelist │ ├── __init__.py │ ├── urls.py │ └── views.py ├── worker_pool │ ├── __init__.py │ └── pool.py └── wsgi.py ├── manage.py └── tests ├── README.md ├── __init__.py ├── base.py ├── conf ├── dashboard.conf ├── dashboard.conf.invalid_theme ├── dashboard.conf.missing_keyboard-shortcuts └── dashboard.conf.missing_ui ├── data └── index ├── funcplugins ├── __init__.py ├── plugin.py ├── plugin_bad_param.py ├── plugin_bad_paramtype.py ├── plugin_no_group.py ├── plugin_no_params.py └── plugin_string_paramtype.py ├── settings.py ├── test_attime.py ├── test_browser.py ├── test_dashboard.py ├── test_errors.py ├── test_events.py ├── test_finders.py ├── test_finders_remote.py ├── test_functions.py ├── test_logger.py ├── test_metrics.py ├── test_params.py ├── test_readers_ceres.py ├── test_readers_multi.py ├── test_readers_remote.py ├── test_readers_rrd.py ├── test_readers_util.py ├── test_readers_whisper.py ├── test_render.py ├── test_render_datalib.py ├── test_render_glyph.py ├── test_singleton.py ├── test_storage.py ├── test_tags.py ├── test_user_util.py ├── test_util.py ├── test_versions.py ├── test_whitelist.py ├── test_worker_pool.py └── test_xss.py /.backportrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "upstream": "graphite-project/graphite-web", 3 | 4 | // You can pre-select branches you use often 5 | "branches": [ 6 | { "name": "1.1.x", "checked": true }, 7 | { "name": "1.0.x", "checked": false }, 8 | { "name": "0.9.x", "checked": false } 9 | ], 10 | 11 | // Backport multiple commits 12 | "multipleCommits": true, 13 | 14 | // Backport to multiple branches 15 | "multipleBranches": true, 16 | 17 | // Labels will be added to the PR 18 | "labels": ["backport"] 19 | } 20 | -------------------------------------------------------------------------------- /.bzrignore: -------------------------------------------------------------------------------- 1 | MANIFEST 2 | _trial_temp 3 | build 4 | dist 5 | graphite.db 6 | .bzrignore 7 | dropin.cache 8 | *.egg-info 9 | -------------------------------------------------------------------------------- /.deepsource.toml: -------------------------------------------------------------------------------- 1 | version = 1 2 | 3 | test_patterns = ["*/test/**"] 4 | 5 | [[analyzers]] 6 | name = "python" 7 | enabled = true 8 | 9 | [analyzers.meta] 10 | runtime_version = "3.x.x" 11 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "env": { 3 | "browser": true, 4 | "es6": true, 5 | }, 6 | "parserOptions": { "ecmaVersion": 8 }, 7 | "extends": "eslint:recommended", 8 | "rules": { 9 | "linebreak-style": [ 10 | "error", 11 | "unix" 12 | ], 13 | "quotes": [ 14 | "error", 15 | "single" 16 | ], 17 | "semi": [ 18 | "error", 19 | "always" 20 | ], 21 | "no-use-before-define": [ 22 | "error", 23 | { "functions": true, "classes": true } 24 | ], 25 | "camelcase": [ 26 | "error", 27 | { "properties": "always" } 28 | ], 29 | "eqeqeq": [ 30 | "error", 31 | "always" 32 | ], 33 | } 34 | }; 35 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: "[BUG]" 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 16 | **Expected behavior** 17 | A clear and concise description of what you expected to happen. 18 | 19 | **Screenshots** 20 | If applicable, add screenshots to help explain your problem. 21 | 22 | **Environment (please complete the following information):** 23 | - OS flavor: [e.g. Ubuntu, CentOS, Debian etc] 24 | - Graphite-web version [e.g. 1.1.2, 1.0.1, etc] 25 | - Django/Python version [e.g. 1.11/2.7, 2.1/3.8 etc] 26 | - Setup type [e.g. pip, from sources, from OS packages etc] 27 | 28 | **Additional context** 29 | Add any other context about the problem here. 30 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/general-support-question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: General support question 3 | about: General support question 4 | title: "[Q]" 5 | labels: question 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: monthly 7 | - package-ecosystem: pip 8 | directory: "/" 9 | schedule: 10 | interval: weekly 11 | time: '10:00' 12 | open-pull-requests-limit: 10 -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 60 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 7 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - pinned 8 | - security 9 | # Label to use when marking an issue as stale 10 | staleLabel: stale 11 | # Comment to post when marking an issue as stale. Set to `false` to disable 12 | markComment: > 13 | This issue has been automatically marked as stale because it has not had 14 | recent activity. It will be closed if no further activity occurs. Thank you 15 | for your contributions. 16 | # Comment to post when closing a stale issue. Set to `false` to disable 17 | closeComment: false 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | MANIFEST 2 | .vagrant/ 3 | .venv/ 4 | _trial_temp 5 | build 6 | dist 7 | graphite.db 8 | dropin.cache 9 | *.egg-info 10 | docs/_build 11 | *.log 12 | *.pyc 13 | .tox 14 | *.swp 15 | .idea 16 | *.iml 17 | storage 18 | webapp/coverage.xml 19 | webapp/.coverage 20 | webapp/htmlcov 21 | webapp/static 22 | webapp/static/**/* 23 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | default_language_version: 2 | python: python3.12 3 | 4 | repos: 5 | - repo: https://github.com/adamchainz/django-upgrade 6 | rev: "1.20.0" 7 | hooks: 8 | - id: django-upgrade 9 | args: [ --target-version, "4.2" ] 10 | -------------------------------------------------------------------------------- /.pre-commit-hooks.yaml: -------------------------------------------------------------------------------- 1 | - id: django-upgrade 2 | name: django-upgrade 3 | description: Automatically upgrade your Django project code. 4 | entry: django-upgrade 5 | language: python 6 | types: [python] 7 | # for backward compatibility 8 | files: '' 9 | minimum_pre_commit_version: 0.15.0 -------------------------------------------------------------------------------- /.readthedocs.yaml: -------------------------------------------------------------------------------- 1 | # .readthedocs.yaml 2 | # Read the Docs configuration file 3 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details 4 | 5 | # Required 6 | version: 2 7 | 8 | # Set the version of Python and other tools you might need 9 | build: 10 | os: ubuntu-22.04 11 | tools: 12 | python: "3.11" 13 | 14 | # Build documentation in the docs/ directory with Sphinx 15 | sphinx: 16 | configuration: docs/conf.py 17 | 18 | # We recommend specifying your dependencies to enable reproducible builds: 19 | # https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html 20 | python: 21 | install: 22 | - requirements: docs/requirements.txt -------------------------------------------------------------------------------- /CONTRIBUTING_FOR_COMMITTERS.md: -------------------------------------------------------------------------------- 1 | First of all, Welcome, and Thank You! 2 | 3 | I don't know about you, but I'm in it for all of the glory that @obfuscurity promised... 4 | 5 | The team has grown some in the last year or so, so let's get some ground rules: 6 | 7 | * Be polite to the community. 8 | * We are part of the community. 9 | * Don't commit directly to the public repo. Please Fork and PR. 10 | * Unless things are publicly broken and nobody else is around to validate, don't merge your own PR. 11 | * If you're going to do something directly on the main repo, or something Meta (tags, releases, etc), other people should probably know about it. When in doubt, check with @deniszh, @DanCech or @piotr1212. 12 | * Please update global CHANGELOG.md with your changes 13 | * Be polite to the community. 14 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE 2 | include README.md 3 | include MANIFEST.in 4 | include check-dependencies.py 5 | include examples/* 6 | include conf/*.example 7 | include webapp/graphite/local_settings.py.example 8 | recursive-include distro/ * 9 | recursive-include webapp/graphite/ *.html 10 | recursive-include webapp/content/ * 11 | recursive-include webapp/tests/ * 12 | exclude webapp/graphite/local_settings.py 13 | exclude conf/*.conf 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Graphite-Web 2 | 3 | [![Codacy Badge](https://api.codacy.com/project/badge/Grade/5e94ef79c2ea441aaf209cfb2851849e)](https://www.codacy.com/app/graphite-project/graphite-web?utm_source=github.com&utm_medium=referral&utm_content=graphite-project/graphite-web&utm_campaign=badger) 4 | [![Build Status](https://travis-ci.org/graphite-project/graphite-web.png?branch=master)](https://travis-ci.org/graphite-project/graphite-web) 5 | [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fgraphite-project%2Fgraphite-web.svg?type=shield)](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Fgraphite-project%2Fgraphite-web?ref=badge_shield) 6 | [![codecov](https://codecov.io/gh/graphite-project/graphite-web/branch/master/graph/badge.svg)](https://codecov.io/gh/graphite-project/graphite-web) 7 | 8 | ## Overview 9 | 10 | Graphite consists of three major components: 11 | 12 | 1. Graphite-Web, a Django-based web application that renders graphs and dashboards 13 | 2. The [Carbon](https://github.com/graphite-project/carbon) metric processing daemons 14 | 3. The [Whisper](https://github.com/graphite-project/whisper) time-series database library 15 | 16 | ![Graphite Components](https://github.com/graphite-project/graphite-web/raw/master/webapp/content/img/overview.png "Graphite Components") 17 | 18 | ## Installation, Configuration and Usage 19 | 20 | Please refer to the instructions at [readthedocs](http://graphite.readthedocs.io/). 21 | 22 | ## License 23 | 24 | Graphite-Web is licensed under version 2.0 of the Apache License. See the [LICENSE](https://github.com/graphite-project/graphite-web/blob/master/LICENSE) file for details. 25 | -------------------------------------------------------------------------------- /bin/build-index: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from graphite import settings 3 | from optparse import OptionParser 4 | import os 5 | import django 6 | 7 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "graphite.settings") 8 | django.setup() 9 | 10 | from graphite.storage import write_index 11 | 12 | 13 | if __name__ == "__main__": 14 | description = "A tool to generate the search index file used by"\ 15 | " graphite-web." 16 | prog = "build-index" 17 | version = "1.0" 18 | epilog = "Defaults are read from graphite.settings, it is unlikely"\ 19 | " that you would want to run this program with anything except the"\ 20 | " defaults." 21 | parser = OptionParser(description=description, prog=prog, version=version, 22 | epilog=epilog) 23 | parser.add_option("-i", "--index", default=settings.INDEX_FILE, 24 | help="default: %default") 25 | (options, args) = parser.parse_args() 26 | write_index(options.index) 27 | -------------------------------------------------------------------------------- /bin/build-index.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | export PYTHONPATH="/opt/graphite/webapp/:$PYTHONPATH" 3 | BINDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 4 | 5 | ${BINDIR}/build-index 6 | -------------------------------------------------------------------------------- /bin/run-graphite-devel-server.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import os 4 | import sys 5 | from optparse import OptionParser 6 | 7 | from django.core import management 8 | 9 | option_parser = OptionParser(usage=''' 10 | %prog [options] GRAPHITE_ROOT 11 | ''') 12 | option_parser.add_option('--port', default=8080, action='store', type=int, help='Port to listen on') 13 | option_parser.add_option('--interface', default='0.0.0.0', action='store', help='Interface to listen on') 14 | option_parser.add_option('--libs', default=None, help='Path to the directory containing the graphite python package') 15 | option_parser.add_option('--noreload', action='store_true', help='Disable monitoring for changes') 16 | option_parser.add_option('--settings', default='graphite.settings', help='configure alternative settings module') 17 | 18 | (options, args) = option_parser.parse_args() 19 | 20 | if not args: 21 | option_parser.print_usage() 22 | sys.exit(1) 23 | 24 | graphite_root = args[0] 25 | 26 | python_path = os.path.join(graphite_root, 'webapp') 27 | 28 | if options.libs: 29 | libdir = os.path.expanduser(options.libs) 30 | print('Adding %s to your PYTHONPATH' % libdir) 31 | os.environ['PYTHONPATH'] = libdir + ':' + os.environ.get('PYTHONPATH','') 32 | 33 | print("Running Graphite from %s under django development server\n" % graphite_root) 34 | 35 | command = [ 36 | 'django-admin.py', 37 | 'runserver', 38 | '--pythonpath', python_path, 39 | '--settings', options.settings, 40 | '%s:%d' % (options.interface, options.port) 41 | ] 42 | 43 | if options.noreload: 44 | command.append('--noreload') 45 | 46 | print(' '.join(command)) 47 | 48 | management.execute_from_command_line(command) 49 | -------------------------------------------------------------------------------- /conf/graphite.wsgi.example: -------------------------------------------------------------------------------- 1 | import sys 2 | # In case of multi-instance graphite, uncomment and set appropriate name 3 | # import os 4 | # os.environ['GRAPHITE_SETTINGS_MODULE'] = 'graphite.local_settings' 5 | sys.path.append('/opt/graphite/webapp') 6 | 7 | from graphite.wsgi import application 8 | -------------------------------------------------------------------------------- /contrib/perl_pickle_client.pl: -------------------------------------------------------------------------------- 1 | #!/usr/bin/perl 2 | 3 | use IO::Socket::INET; 4 | use Python::Serialise::Pickle qw(); 5 | 6 | my($carbon_server) = '127.0.0.1'; 7 | my($carbon_port) = 2004; 8 | 9 | my($data) = [ 10 | ["path.mytest", [1332444075,27893687]], 11 | ["path.mytest", [1332444076,938.435]], 12 | ]; 13 | 14 | my($message) = pack("N/a*", pickle_dumps($data)); 15 | 16 | my($sock) = IO::Socket::INET->new ( 17 | PeerAddr => $carbon_server, 18 | PeerPort => $carbon_port, 19 | Proto => 'tcp' 20 | ); 21 | die "Unable to connect: $!\n" unless ($sock->connected); 22 | 23 | $sock->send($message); 24 | $sock->shutdown(2); 25 | 26 | # Work around P::S::Pickle 0.01's extremely limiting interface. 27 | sub pickle_dumps { 28 | open(my $fh, '>', \my $s) or die $!; 29 | my $pickle = bless({ _fh => $fh }, 'Python::Serialise::Pickle'); 30 | $pickle->dump($_[0]); 31 | $pickle->close(); 32 | return $s; 33 | } 34 | -------------------------------------------------------------------------------- /contrib/test_aggregator_rules.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from os.path import dirname, join, abspath 3 | 4 | # Figure out where we're installed 5 | ROOT_DIR = dirname(dirname(abspath(__file__))) 6 | 7 | # Make sure that carbon's 'lib' dir is in the $PYTHONPATH if we're running from source. 8 | LIB_DIR = join(ROOT_DIR, 'graphite', 'lib') 9 | sys.path.insert(0, LIB_DIR) 10 | 11 | from carbon.aggregator.rules import RuleManager # noqa: E402 12 | 13 | ### Basic usage 14 | if len(sys.argv) != 3: 15 | print("Usage: %s 'aggregator rule' 'line item'" % (__file__)) 16 | print("\nSample invocation: %s %s %s" % ( 17 | __file__, 18 | "'...sum.all (10) = sum ..<>.sum.'", 19 | 'stats.prod.js.ktime_sum.sum.host2' 20 | )) 21 | sys.exit(42) 22 | 23 | ### cli arguments 24 | me, raw_rule, raw_metric = sys.argv 25 | 26 | 27 | ### XXX rather whitebox, by reading the source ;( 28 | rm = RuleManager 29 | rule = rm.parse_definition( raw_rule ) 30 | 31 | ### rule/parsed rule 32 | print("Raw rule: %s" % raw_rule) 33 | print("Parsed rule: %s" % rule.regex.pattern) 34 | 35 | print("\n======\n") 36 | 37 | ### run the parse 38 | match = rule.regex.match( raw_metric ) 39 | 40 | print("Raw metric: %s" % raw_metric) 41 | if match: 42 | print("Match dict: %s" % match.groupdict()) 43 | print("Result: %s" % rule.output_template % match.groupdict()) 44 | 45 | else: 46 | print("ERROR: NO MATCH") 47 | -------------------------------------------------------------------------------- /contrib/virtualenvwrapper/postactivate: -------------------------------------------------------------------------------- 1 | # postactivate hook for virtualenvwrapper (http://virtualenvwrapper.readthedocs.io/) 2 | # Put this file on $WORKON_HOME//bin/postactivate 3 | # This file is sourced after the virtualenv is activated 4 | 5 | PROJECT_DIR=$(cat $VIRTUAL_ENV/$VIRTUALENVWRAPPER_PROJECT_FILENAME) 6 | 7 | cd $PROJECT_DIR 8 | 9 | pip install -r requirements.txt 10 | 11 | mkdir -p $VIRTUAL_ENV/storage/log/webapp $VIRTUAL_ENV/conf 12 | touch $VIRTUAL_ENV/conf/carbon.conf $VIRTUAL_ENV/conf/storage-schemas.conf 13 | [[ ! -f $VIRTUAL_ENV/conf/graphTemplates.conf ]] && cp conf/graphTemplates.conf.example $VIRTUAL_ENV/conf/graphTemplates.conf 14 | 15 | export GRAPHITE_ROOT=$PROJECT_DIR 16 | export GRAPHITE_STORAGE_DIR=$VIRTUAL_ENV/storage/ 17 | export GRAPHITE_CONF_DIR=$VIRTUAL_ENV/conf/ 18 | 19 | unset PROJECT_DIR 20 | 21 | $VIRTUAL_ENV/bin/django-admin.py syncdb --settings=graphite.settings --pythonpath=webapp 22 | -------------------------------------------------------------------------------- /contrib/virtualenvwrapper/postdeactivate: -------------------------------------------------------------------------------- 1 | # postdeactivate hook for virtualenvwrapper (http://virtualenvwrapper.readthedocs.io/) 2 | # Put this file on $WORKON_HOME//bin/postdeactivate 3 | # This file is sourced after the virtualenv is deactivated 4 | 5 | unset GRAPHITE_ROOT GRAPHITE_STORAGE_DIR GRAPHITE_CONF_DIR 6 | -------------------------------------------------------------------------------- /distro/redhat/misc/postinstall: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:$PATH 3 | GRAPHITE_PATH=/opt/graphite 4 | 5 | CONFFILES="graphite.wsgi" 6 | for i in $CONFFILES; do 7 | if [ ! -f ${GRAPHITE_PATH}/conf/$i ]; then 8 | echo "No preexisting $i - creating from example." 9 | cp ${GRAPHITE_PATH}/conf/$i.example ${GRAPHITE_PATH}/conf/$i 10 | fi 11 | done 12 | 13 | if [ ! -f /etc/httpd/conf.d/graphite.conf ]; then 14 | cat <<-EOF 15 | --IMPORTANT-- 16 | Graphite VirtualHost configuration not found in default 17 | location. Graphite won't work without it. See sources for 18 | an example vhost configuration for WSGI! 19 | This script will now attempt to install the vHost file needed. 20 | --IMPORTANT-- 21 | EOF 22 | cp ${GRAPHITE_PATH}/examples/example-graphite-vhost.conf /etc/httpd/conf.d/graphite.conf 23 | fi 24 | 25 | PYTHONPATH=${GRAPHITE_PATH}/webapp/ django-admin.py syncdb --noinput --settings=graphite.settings 26 | 27 | chown -R apache.apache ${GRAPHITE_PATH}/storage 28 | chown -R apache.apache ${GRAPHITE_PATH}/webapp 29 | -------------------------------------------------------------------------------- /docs/admin-carbon.rst: -------------------------------------------------------------------------------- 1 | Administering Carbon 2 | ==================== 3 | 4 | 5 | Starting Carbon 6 | --------------- 7 | Carbon can be started with the ``carbon-cache.py`` script:: 8 | 9 | /opt/graphite/bin/carbon-cache.py start 10 | 11 | This starts the main Carbon daemon in the background. Now is a good time 12 | to check the logs, located in ``/opt/graphite/storage/log/carbon-cache/`` 13 | for any errors. 14 | -------------------------------------------------------------------------------- /docs/admin-webapp.rst: -------------------------------------------------------------------------------- 1 | Administering The Webapp 2 | ======================== 3 | 4 | Depending on the stack you choose to expose the Graphite webapp, its usage varies slightly. 5 | 6 | nginx + gunicorn 7 | ---------------- 8 | 9 | As nginx is already ready to proxy requests, we just need to start Gunicorn. 10 | 11 | The following will do: 12 | 13 | .. code-block:: none 14 | 15 | PYTHONPATH=/opt/graphite/webapp gunicorn wsgi --workers=4 --bind=127.0.0.1:8080 --log-file=/var/log/gunicorn.log --preload --pythonpath=/opt/graphite/webapp/graphite & 16 | 17 | It will start Gunicorn and listen on ``localhost:8080``, log to ``/var/log/gunicorn.log`` and use ``/opt/graphite/webapp/graphite`` as the webapp path. 18 | 19 | Naturally, you can change these settings so that it fits your setup. 20 | -------------------------------------------------------------------------------- /docs/client-apis.rst: -------------------------------------------------------------------------------- 1 | Client APIs 2 | ============================= 3 | 4 | Cubism.js 5 | --------- 6 | `Cubism.js`_ is a D3 plugin for visualizing time series data in real time, and can pull data from Graphite. 7 | 8 | Graphitejs 9 | ---------- 10 | `Graphitejs`_ is a jQuery plugin for easily making and displaying graphs and updating them on 11 | the fly using the Graphite URL api. 12 | 13 | Scales 14 | ------ 15 | `Scales`_ is a Python server state and statistics library that can output its data to Graphite. 16 | 17 | Structured Metrics 18 | ------------------ 19 | `structured_metrics`_ is a lightweight python library that uses plugins to read in 20 | Graphite's list of metric names and convert it into a multi-dimensional tag space of clear, sanitized targets. 21 | 22 | txCarbonClient 23 | -------------- 24 | `txCarbonClient`_ is a simple Twisted API for reporting metrics to Carbon. 25 | 26 | 27 | .. _Cubism.js: http://square.github.io/cubism/ 28 | .. _Graphitejs: https://github.com/prestontimmons/graphitejs 29 | .. _Scales: https://github.com/Cue/scales 30 | .. _structured_metrics: https://github.com/vimeo/graph-explorer/tree/master/graph_explorer/structured_metrics 31 | .. _txCarbonClient: https://github.com/fdChasm/txCarbonClient 32 | -------------------------------------------------------------------------------- /docs/composer.rst: -------------------------------------------------------------------------------- 1 | Using The Composer 2 | ================== 3 | ... 4 | -------------------------------------------------------------------------------- /docs/img/arch_overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/docs/img/arch_overview.png -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | 2 | Graphite Documentation 3 | ====================== 4 | 5 | .. toctree:: 6 | :maxdepth: 1 7 | 8 | overview 9 | faq 10 | install 11 | carbon-daemons 12 | config-carbon 13 | feeding-carbon 14 | admin-carbon 15 | config-local-settings 16 | config-webapp 17 | admin-webapp 18 | composer 19 | render_api 20 | metrics_api 21 | functions 22 | dashboard 23 | whisper 24 | ceres 25 | storage-backends 26 | events 27 | tags 28 | terminology 29 | tools 30 | development 31 | client-apis 32 | who-is-using 33 | releases 34 | 35 | 36 | Indices and tables 37 | ================== 38 | 39 | * :ref:`genindex` 40 | * :ref:`modindex` 41 | * :ref:`search` 42 | -------------------------------------------------------------------------------- /docs/install-synthesize.rst: -------------------------------------------------------------------------------- 1 | Installing From Synthesize 2 | ========================== 3 | 4 | `Synthesize `_ is a script dedicated to making Graphite easy to install. As of this writing, the default installation provides Graphite 1.1.7 for Ubuntu Linux 18.04 LTS with an experimental release candidate for tracking Graphite ``HEAD``. Users may run the installation script manually, or they can choose to use the provided Vagrantfile. 5 | 6 | For detailed instructions, please refer to the official project documentation on the `Synthesize `_ website. 7 | 8 | Installing From RESynthesize 9 | ============================ 10 | 11 | `REsynthesize `_ is a script forked from Synthesize to making Graphite easy to install in CentOS distributions. At the moment just working on CentOS 8.2. It provides Graphite 1.1.7 and Grafana 7.1.3. Users can run the installation script manually, executing: 12 | 13 | `./resynthesize -i` 14 | 15 | For more information, refer to `REsynthesize `_ 16 | -------------------------------------------------------------------------------- /docs/releases.rst: -------------------------------------------------------------------------------- 1 | Release Notes 2 | ============= 3 | 4 | .. toctree:: 5 | :maxdepth: 1 6 | :glob: 7 | 8 | releases/1_1_10 9 | releases/1_1_8 10 | releases/1_1_7 11 | releases/1_1_6 12 | releases/1_1_5 13 | releases/1_1_4 14 | releases/1_1_3 15 | releases/1_1_2 16 | releases/1_1_1 17 | releases/1_0_2 18 | releases/1_0_1 19 | releases/1_0_0 20 | releases/0_9_16 21 | releases/0_9_15 22 | releases/0_9_14 23 | releases/0_9_12 24 | releases/0_9_11 25 | releases/0_9_10 26 | releases/0_9_9 27 | releases/0_9_8 28 | releases/0_9_7 29 | releases/0_9_6 30 | releases/0_9_5 31 | releases/0_9_4 32 | releases/0_9_3 33 | releases/0_9_2 34 | -------------------------------------------------------------------------------- /docs/releases/0_9_12.rst: -------------------------------------------------------------------------------- 1 | .. _0-9-12: 2 | 3 | 0.9.12 4 | ====== 5 | *8/22/2013* 6 | 7 | This is a patch release to fix a couple of critical regressions that made it into :ref:`0.9.11 <0-9-11>`: 8 | 9 | * Usage of django.utils.timezone breaks Django 1.3 compatibility 10 | * Missing import in graphite.util breaks cache-queries 11 | 12 | Source bundles are available from GitHub: 13 | 14 | * https://github.com/graphite-project/graphite-web/archive/0.9.12.tar.gz 15 | * https://github.com/graphite-project/carbon/archive/0.9.12.tar.gz 16 | * https://github.com/graphite-project/whisper/archive/0.9.12.tar.gz 17 | 18 | Graphite can also be installed from `Pypi `_ via 19 | `pip `_. Pypi bundles are here: 20 | 21 | * http://pypi.python.org/pypi/graphite-web/ 22 | * http://pypi.python.org/pypi/carbon/ 23 | * http://pypi.python.org/pypi/whisper/ 24 | 25 | -------------------------------------------------------------------------------- /docs/releases/0_9_2.rst: -------------------------------------------------------------------------------- 1 | 0.9.2 2 | ===== 3 | 4 | I've received a bunch of great bug reports and feedback on the 0.9 release and have resolved lots of 5 | minor issues this week as a result. So please try out the new 0.9.2 release on the downloads page 6 | and keep the bug reports coming! 7 | 8 | \- ChrisMD 9 | -------------------------------------------------------------------------------- /docs/releases/0_9_3.rst: -------------------------------------------------------------------------------- 1 | 0.9.3 2 | ===== 3 | *7/16/08* 4 | 5 | This release is an incremental improvement over 0.9.2, including lots of bug fixes, major 6 | enhancements to the installer, and several new handy scripts. Thanks to everyone who submitted bug 7 | reports and questions. The next few Graphite releases will continue to focus on quality rather than 8 | new features. In particular, 0.9.4 will include a re-write of the carbon backend, which will be much 9 | simpler and easier to administer and troubleshoot. I am also working on porting lots of internal 10 | documentation to this wiki. My goal is to have a 1.0 release by the end of the year, which must be 11 | well-documented, easy to deploy, easy to troubleshoot, and of course as bug-free as possible. If 12 | there is time a new feature or two might make it in, but this is not the primary focus. 13 | 14 | \- ChrisMD 15 | -------------------------------------------------------------------------------- /docs/releases/0_9_4.rst: -------------------------------------------------------------------------------- 1 | 0.9.4 2 | ===== 3 | *1/30/09* 4 | 5 | It's been a good 6 months since the last release. Not much has changed aside from a few minor 6 | enhancements and some good bug fixes, unfortunately I've not had nearly as much time as I'd like to 7 | dedicate to working on Graphite. Regardless, it is getting more mature slowly but surely. In the 8 | next few months I may be in a better position to get more real work done on it, but we shall see. 9 | For now I'd just like to thank everyone who has given me great questions and bug reports, your 10 | feedback is what keeps this project moving. Thanks. 11 | 12 | \- ChrisMD 13 | -------------------------------------------------------------------------------- /docs/releases/0_9_5.rst: -------------------------------------------------------------------------------- 1 | 0.9.5 2 | ===== 3 | *1/4/10* 4 | 5 | It's hard to believe it's been an entire year since the last release of Graphite. This just goes to 6 | show how good I am at procrastination. After taking a look at the old 0.9.4 release I can safely 7 | say that the new 0.9.5 release is very significant. Here are the biggest changes: 8 | 9 | # Graphite now supports [[[federated storage]]] (for better scalability) 10 | # Carbon was completely rewritten using Twisted (much cleaner, more configurable, and more fault tolerant) 11 | # The installation process now uses distutils (finally!) 12 | # Graphite, Carbon, and Whisper are now three separate packages (for more flexible deployment) 13 | # Graphite's browser UI fully migrated to pure ExtJS 3.0 (cleaner code, less bugs) 14 | # Many many bug fixes as always 15 | 16 | I'd like to thank everyone in the community who has been using graphite and contributing to the 17 | project. I don't usually do new year's resolutions, but I've got a good idea for one this year. I 18 | really want to get away from infrequent huge releases like this one and get back to very frequent 19 | small releases in the true spirit of open source. So my resolution is to release *something* once a 20 | month. It will probably usually just be bug fixes, or perhaps some much needed documentation. So 21 | look forward to something new in February! 22 | 23 | \- *ChrisMD* 24 | -------------------------------------------------------------------------------- /docs/releases/0_9_6.rst: -------------------------------------------------------------------------------- 1 | 0.9.6 2 | ===== 3 | *2/26/10* 4 | 5 | This has probably been the most active month of Graphite development since the project was open 6 | sourced. Lots of community members have contributed code and ideas to help move Graphite forward. 7 | I'm really excited about this, the project is gaining momentum and I hope we can keep that up by 8 | continuing with the new monthly release cycle. To give credit where it is due, here is a list of 9 | this month's most active users and what they've been working on (in no particular order): 10 | 11 | * Lucio Torre - AMQP support 12 | * jdugan - beautification of the Y-axis labels via the yUnitSystem option 13 | * Nick Leskiw - the YAxis=right rendering option 14 | * Kraig Amador - tons of rendering options/functions such as yLimit, timeShift(), log(), sumSeriesWithWildcard(), new filtering functions, and much more! (Kraig you're the man!) 15 | * Arthur Gautier - debian packaging 16 | * Elliot Murphy - packaging, inclusion in Ubuntu 17 | * fp - RHEL / CentOS RPM packaging 18 | * and many more... 19 | 20 | Thanks to everyone who has gotten involved with Graphite, your support helps motivate others 21 | (especially me). 22 | 23 | Many of these new features are really great but unfortunately undocumented, but the good news is 24 | that my focus for March is going to be 100% on *documentation*. There may not be an actual code 25 | release in March but I hope to get a substantial amount of documentation written right here on this 26 | wiki. Stay tuned. 27 | 28 | \- ChrisMD 29 | -------------------------------------------------------------------------------- /docs/releases/1_0_1.rst: -------------------------------------------------------------------------------- 1 | .. _1-0-1: 2 | 3 | 1.0.1 4 | =========================== 5 | *04/23/2017* 6 | 7 | Graphite 1.0.1 is now available for usage. Please note that this is a bugfix release for stable Graphite 1.0.0 branch and it's recommended for production usage. 8 | 9 | Source bundles are available from GitHub: 10 | 11 | * https://github.com/graphite-project/graphite-web/archive/1.0.1.tar.gz 12 | * https://github.com/graphite-project/carbon/archive/1.0.1.tar.gz 13 | * https://github.com/graphite-project/whisper/archive/1.0.1.tar.gz 14 | * https://github.com/graphite-project/carbonate/archive/1.0.1.tar.gz 15 | 16 | Graphite can also be installed from `PyPI `_ via 17 | `pip `_. PyPI bundles are here: 18 | 19 | * http://pypi.python.org/pypi/graphite-web/ 20 | * http://pypi.python.org/pypi/carbon/ 21 | * http://pypi.python.org/pypi/whisper/ 22 | * http://pypi.python.org/pypi/carbonate/ 23 | 24 | Upgrading 25 | --------- 26 | Graphite-web 1.0.1 is compatible with carbon 1.0.0 and whisper 1.0.0, so, you can upgrade only graphite-web package. 27 | 28 | Also, 2 of 3 patches in this release are connected with Graphite clustering, so, you can skip this update if not using it. 29 | 30 | Security Notes 31 | -------------- 32 | 33 | None 34 | 35 | 36 | Bug Fixes 37 | --------- 38 | 39 | Graphite-Web 40 | ^^^^^^^^^^^^ 41 | 42 | * Only fetch user profile when it's needed (@deejay1, PR#1906) 43 | 44 | * Use a single prefetch request for each cluster host (@DanCech, PR#1909) 45 | 46 | * Fixing duplicated results when using remote prefetch with multiple targets (@DanCech, PR#1908) 47 | 48 | 49 | Carbon 50 | ^^^^^^ 51 | 52 | No changes 53 | 54 | Whisper 55 | ^^^^^^^ 56 | 57 | No changes 58 | 59 | -------------------------------------------------------------------------------- /docs/requirements.txt: -------------------------------------------------------------------------------- 1 | ## Requirements for documentation 2 | cairocffi 3 | django-tagging 4 | pytz 5 | git+https://github.com/graphite-project/whisper.git#egg=whisper 6 | git+https://github.com/graphite-project/ceres.git#egg=ceres 7 | Django<5 8 | pyparsing>=3.0.6 9 | alabaster==1.0.0 10 | Sphinx==8.2.1 11 | jinja2<3.2.0 12 | sphinx_rtd_theme 13 | urllib3 14 | scandir;python_version<"3.5" -------------------------------------------------------------------------------- /docs/who-is-using.rst: -------------------------------------------------------------------------------- 1 | Who is using Graphite? 2 | ====================== 3 | 4 | Here are some organizations that use Graphite: 5 | 6 | * `Brightcove `_ (see http://opensource.brightcove.com/project/Diamond/) 7 | * `Canonical `_ 8 | * `Datacratic `_ 9 | * `Douban `_ 10 | * `Dyn `_ 11 | * `Etsy `_ (see http://codeascraft.etsy.com/2010/12/08/track-every-release/) 12 | * `GapLabs, a division of Gap Inc. `_ 13 | * `GitHub `_ 14 | * `Google `_ (opensource Rocksteady project) 15 | * `GOV.UK `_ 16 | * `ImmobilienScout24 `_ 17 | * `InMobi `_ 18 | * `Instagram `_ 19 | * `ITV `_ 20 | * `Maaii `_ 21 | * `Mackerel `_ 22 | * `Media Temple `_ 23 | * `Oracle `_ 24 | * `Orbitz `_ 25 | * `Outbrain `_ (see https://github.com/outbrain/gruffalo) 26 | * `Pandora `_ 27 | * `Rubicon Project `_ 28 | * `Sears Holdings `_ 29 | * `SocialTwist `_ 30 | * `Uber `_ 31 | * `Vimeo `_ 32 | * `Wikimedia Foundation `_ 33 | 34 | And many more 35 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # This is a PIP requirements file. 2 | # To setup a dev environment: 3 | # 4 | # If you use virtualenvwrapper, you can use the misc/virtualenvwrapper hook scripts to 5 | # automate most of the following commands 6 | # 7 | # easy_install virtualenv 8 | # virtualenv --distribute --no-site-packages --prompt "(graphite venv) " --python=/usr/bin/python2.7 .venv 9 | # source .venv/bin/activate 10 | # 11 | # brew install cairo && brew link cairo # on OSX 12 | # sudo apt-get install libcairo2-dev # on Ubuntu 13 | # pip install -r requirements.txt 14 | # 15 | # mkdir -p .venv/storage/ceres .venv/storage/log/carbon-cache .venv/conf 16 | # touch .venv/conf/carbon.conf .venv/conf/storage-schemas.conf 17 | # cp conf/graphTemplates.conf.example .venv/conf/graphTemplates.conf 18 | # export GRAPHITE_ROOT=`pwd` GRAPHITE_STORAGE_DIR=`pwd`/.venv/storage/ GRAPHITE_CONF_DIR=`pwd`/.venv/conf/ 19 | # 20 | # git clone https://github.com/graphite-project/carbon.git ../carbon 21 | # ../carbon/bin/carbon-cache.py start 22 | # ../carbon/bin/carbon-cache.py status 23 | # 24 | # mkdir -p .venv/storage/log/webapp /opt/graphite/storage/ 25 | # sudo chown -R $USER: /opt/graphite 26 | # .venv/bin/django-admin.py migrate --run-syncdb --settings=graphite.settings --pythonpath=webapp 27 | # bin/run-graphite-devel-server.py ./ 28 | # # or 29 | # # cd webapp/graphite && $GRAPHITE_ROOT/.venv/bin/gunicorn_django -b 127.0.0.1:8080 30 | # 31 | # To clean up: 32 | # 33 | # carbon/bin/carbon-cache.py stop 34 | # unset GRAPHITE_ROOT GRAPHITE_STORAGE_DIR GRAPHITE_CONF_DIR 35 | # deactivate 36 | # 37 | 38 | Django>=4.2,<5 39 | python-memcached>=1.58 40 | txAMQP>=0.8.2,<0.9 41 | django-tagging 42 | gunicorn 43 | pytz 44 | pyparsing>=2.3.0 45 | cairocffi 46 | git+https://github.com/graphite-project/whisper.git#egg=whisper 47 | # Ceres is optional 48 | # git+https://github.com/graphite-project/ceres.git#egg=ceres 49 | whitenoise==4.1.4 50 | urllib3 51 | six 52 | -------------------------------------------------------------------------------- /tox.ini: -------------------------------------------------------------------------------- 1 | [gh-actions] 2 | python = 3 | 3.9: py39 4 | 3.10: py310 5 | 3.11: py311 6 | 3.12: py312 7 | 3.13: py313 8 | 9 | [tox] 10 | envlist = 11 | py{39,310,311,312,313},lint,docs 12 | 13 | [testenv] 14 | whitelist_externals = 15 | mkdir 16 | setenv = 17 | DJANGO_SETTINGS_MODULE=tests.settings 18 | PYTHONPATH={toxinidir}/webapp 19 | GRAPHITE_NO_PREFIX=true 20 | mysql: TEST_MYSQL=true 21 | postgresql: TEST_POSTGRESQL=true 22 | passenv = TEST_MYSQL_* TEST_POSTGRESQL_* TEST_REDIS_* 23 | changedir = webapp 24 | commands = 25 | coverage run --branch --source=graphite manage.py test {posargs} 26 | coverage xml 27 | coverage report 28 | deps = 29 | coverage 30 | cairocffi 31 | django-tagging 32 | pytz 33 | mock 34 | msgpack-python 35 | git+https://github.com/graphite-project/whisper.git#egg=whisper 36 | git+https://github.com/graphite-project/ceres.git#egg=ceres 37 | pyparsing>=3.0.6 38 | Django>=4.2,<5 39 | urllib3 40 | redis 41 | rrdtool 42 | mysql: mysqlclient 43 | postgresql: psycopg2 44 | pyhash: pyhash 45 | 46 | [testenv:docs] 47 | basepython = python3.13 48 | changedir = docs 49 | deps = 50 | cairocffi 51 | django-tagging 52 | pytz 53 | git+https://github.com/graphite-project/whisper.git#egg=whisper 54 | git+https://github.com/graphite-project/ceres.git#egg=ceres 55 | Django<5 56 | pyparsing3: pyparsing>=3.0.6 57 | alabaster 58 | Sphinx 59 | jinja2 60 | sphinx_rtd_theme 61 | urllib3 62 | commands = 63 | mkdir -p {envsitepackagesdir}/../storage/ceres 64 | sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html 65 | 66 | [testenv:lint] 67 | basepython = python3.13 68 | changedir = {toxinidir} 69 | deps = 70 | flake8==3.7.9 71 | commands = 72 | flake8 --show-source 73 | -------------------------------------------------------------------------------- /webapp/content/css/darkX/button-close-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/darkX/button-close-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/button-maximize-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/darkX/button-maximize-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/button-minimize-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/darkX/button-minimize-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/frame-bottom-left-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/darkX/frame-bottom-left-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/frame-bottom-mid-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/darkX/frame-bottom-mid-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/frame-bottom-right-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/darkX/frame-bottom-right-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/frame-left-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/darkX/frame-left-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/frame-right-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/darkX/frame-right-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/titlebar-left-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/darkX/titlebar-left-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/titlebar-mid-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/darkX/titlebar-mid-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/titlebar-right-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/darkX/titlebar-right-focused.png -------------------------------------------------------------------------------- /webapp/content/css/dashboard-default.css: -------------------------------------------------------------------------------- 1 | /* This is the basic body style of the graph area */ 2 | .graph-area-body { 3 | color: white; 4 | background-color: black; 5 | } 6 | 7 | /* Metric Completer Settings */ 8 | .completer-input-field { 9 | font-size: 11pt; 10 | font-family: monospace; 11 | } 12 | 13 | /* This class is applied to each completer result row. */ 14 | .metric-result div { 15 | font-size: 11pt; 16 | font-family: monospace; 17 | } 18 | 19 | /* This class is applied to completer results that are already present 20 | in the graph area. */ 21 | .metric-toggled div { 22 | font-weight: bold; 23 | } 24 | 25 | /* Likewise this is applied to any metrics not in the graph area already. */ 26 | .metric-not-toggled div { 27 | } 28 | 29 | /* This applies to any results that are branch nodes, not actual metrics. */ 30 | .result-is-branch-node { 31 | background-color: rgb(240, 245, 255) !important; 32 | } 33 | -------------------------------------------------------------------------------- /webapp/content/css/dashboard-white.css: -------------------------------------------------------------------------------- 1 | /* This is the basic body style of the graph area */ 2 | .graph-area-body { 3 | color: black; 4 | background-color: white; 5 | } 6 | 7 | /* Metric Completer Settings */ 8 | .completer-input-field { 9 | font-size: 9pt; 10 | font-family: monospace; 11 | } 12 | 13 | /* This class is applied to each completer result row. */ 14 | .metric-result div { 15 | font-size: 9pt; 16 | font-family: monospace; 17 | } 18 | 19 | /* This class is applied to completer results that are already present 20 | in the graph area. */ 21 | .metric-toggled div { 22 | font-weight: bold; 23 | } 24 | 25 | /* Likewise this is applied to any metrics not in the graph area already. */ 26 | .metric-not-toggled div { 27 | } 28 | 29 | /* This applies to any results that are branch nodes, not actual metrics. */ 30 | .result-is-branch-node { 31 | background-color: rgb(240, 245, 255) !important; 32 | } 33 | -------------------------------------------------------------------------------- /webapp/content/css/default/bottom_left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/bottom_left.gif -------------------------------------------------------------------------------- /webapp/content/css/default/bottom_mid.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/bottom_mid.gif -------------------------------------------------------------------------------- /webapp/content/css/default/bottom_right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/bottom_right.gif -------------------------------------------------------------------------------- /webapp/content/css/default/bottom_right_resize.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/bottom_right_resize.gif -------------------------------------------------------------------------------- /webapp/content/css/default/center_left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/center_left.gif -------------------------------------------------------------------------------- /webapp/content/css/default/center_right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/center_right.gif -------------------------------------------------------------------------------- /webapp/content/css/default/clear.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/clear.gif -------------------------------------------------------------------------------- /webapp/content/css/default/close.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/close.gif -------------------------------------------------------------------------------- /webapp/content/css/default/inspect.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/inspect.gif -------------------------------------------------------------------------------- /webapp/content/css/default/maximize.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/maximize.gif -------------------------------------------------------------------------------- /webapp/content/css/default/minimize.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/minimize.gif -------------------------------------------------------------------------------- /webapp/content/css/default/overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/overlay.png -------------------------------------------------------------------------------- /webapp/content/css/default/resize.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/resize.gif -------------------------------------------------------------------------------- /webapp/content/css/default/sizer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/sizer.gif -------------------------------------------------------------------------------- /webapp/content/css/default/top_left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/top_left.gif -------------------------------------------------------------------------------- /webapp/content/css/default/top_mid.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/top_mid.gif -------------------------------------------------------------------------------- /webapp/content/css/default/top_right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/css/default/top_right.gif -------------------------------------------------------------------------------- /webapp/content/css/table.css: -------------------------------------------------------------------------------- 1 | body { 2 | color: #4f6b72; 3 | background: #E6EAE9; 4 | } 5 | 6 | a { 7 | color: #c75f3e; 8 | } 9 | 10 | .g_canvas { 11 | border-right: 1px solid #C1DAD7; 12 | border-bottom: 1px solid #C1DAD7; 13 | background: #fff; 14 | 15 | color: #4f6b72; 16 | } 17 | 18 | #title { 19 | font: bold 11px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif; 20 | color: #4f6b72; 21 | border-right: 1px solid #C1DAD7; 22 | border-bottom: 1px solid #C1DAD7; 23 | border-top: 1px solid #C1DAD7; 24 | letter-spacing: 2px; 25 | text-transform: uppercase; 26 | text-align: left; 27 | padding: 6px 6px 6px 12px; 28 | background: #CAE8EA; 29 | } 30 | 31 | .styledtable th { 32 | font: bold 11px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif; 33 | color: #4f6b72; 34 | border-right: 1px solid #C1DAD7; 35 | border-bottom: 1px solid #C1DAD7; 36 | border-top: 1px solid #C1DAD7; 37 | letter-spacing: 2px; 38 | text-transform: uppercase; 39 | text-align: left; 40 | padding: 6px 6px 6px 12px; 41 | background: #CAE8EA; 42 | } 43 | 44 | 45 | 46 | .styledtable td { 47 | border-right: 1px solid #C1DAD7; 48 | border-bottom: 1px solid #C1DAD7; 49 | background: #fff; 50 | padding: 6px 6px 6px 12px; 51 | color: #4f6b72; 52 | } 53 | 54 | -------------------------------------------------------------------------------- /webapp/content/html/completerHelp.html: -------------------------------------------------------------------------------- 1 | 14 | 15 |

Using the AutoCompleter

16 | 17 |

The AutoCompleter is designed to allow keyboard navigation of the Graphite name hierarchy. As you type it will show all matches at the current hierarchy level. You may hit Tab to auto-complete a name. Once you have found what you are looking for, press Enter to view it in the composer.

18 | -------------------------------------------------------------------------------- /webapp/content/html/searchHelp.html: -------------------------------------------------------------------------------- 1 | 14 | 15 |

Searching Graphite


16 | 17 |

The search box may contain multiple search strings separated by spaces. Queries with multiple strings are treated as an inclusive search, returning results that match either string. For example,

18 | 19 |

20 |

21 | lfs busy
22 | 
23 |

24 | 25 |

Will match metric names that contain either the word "lfs" or the word "busy".

26 | 27 |

Advanced users may note that every search string can be a regular expression.

28 | -------------------------------------------------------------------------------- /webapp/content/img/blank.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/blank.gif -------------------------------------------------------------------------------- /webapp/content/img/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/calendar.png -------------------------------------------------------------------------------- /webapp/content/img/carbon-fiber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/carbon-fiber.png -------------------------------------------------------------------------------- /webapp/content/img/clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/clock.png -------------------------------------------------------------------------------- /webapp/content/img/clock_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/clock_16.png -------------------------------------------------------------------------------- /webapp/content/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/favicon.ico -------------------------------------------------------------------------------- /webapp/content/img/graphite-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/graphite-logo.png -------------------------------------------------------------------------------- /webapp/content/img/graphite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/graphite.png -------------------------------------------------------------------------------- /webapp/content/img/graphite_short.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/graphite_short.png -------------------------------------------------------------------------------- /webapp/content/img/leaf.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/leaf.gif -------------------------------------------------------------------------------- /webapp/content/img/mini-bottom2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/mini-bottom2.gif -------------------------------------------------------------------------------- /webapp/content/img/mini-top2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/mini-top2.gif -------------------------------------------------------------------------------- /webapp/content/img/move_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/move_down.png -------------------------------------------------------------------------------- /webapp/content/img/move_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/move_up.png -------------------------------------------------------------------------------- /webapp/content/img/overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/overview.png -------------------------------------------------------------------------------- /webapp/content/img/refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/refresh.png -------------------------------------------------------------------------------- /webapp/content/img/save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/save.png -------------------------------------------------------------------------------- /webapp/content/img/share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/share.png -------------------------------------------------------------------------------- /webapp/content/img/trash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/trash.png -------------------------------------------------------------------------------- /webapp/content/img/upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/img/upload.png -------------------------------------------------------------------------------- /webapp/content/js/completer.js: -------------------------------------------------------------------------------- 1 | // From Ext library 2 | /*global Ext*/ 3 | 4 | var MetricCompleter; 5 | 6 | MetricCompleter = Ext.extend(Ext.form.ComboBox, { 7 | displayField: 'path', 8 | listEmptyText: 'No matching metrics', 9 | mode: 'remote', 10 | hideTrigger: true, 11 | queryDelay: 100, 12 | queryParam: 'query', 13 | typeAhead: false, 14 | minChars: 1, 15 | 16 | initComponent: function () { 17 | var _this = this; 18 | 19 | var store = new Ext.data.JsonStore({ 20 | url: document.body.dataset.baseUrl + 'metrics/find/', 21 | root: 'metrics', 22 | fields: ['path', 'name'], 23 | baseParams: {format: 'completer'} 24 | }); 25 | 26 | var config = {store: store}; 27 | 28 | Ext.apply(this, config); 29 | Ext.apply(this.initialConfig, config); 30 | 31 | MetricCompleter.superclass.initComponent.call(this); 32 | 33 | this.addListener('beforequery', this.prepareQuery.createDelegate(this)); 34 | this.addListener('specialkey', this.onSpecialKey.createDelegate(this)); 35 | this.addListener('afterrender', 36 | function () { 37 | _this.getEl().addListener('specialkey', 38 | function (el, e) { 39 | _this.onSpecialKey(_this.getEl(), e); 40 | } 41 | ); 42 | } 43 | ); 44 | }, 45 | 46 | prepareQuery: function (queryEvent) { 47 | if (queryEvent.query.substr(-1) != '*') { 48 | queryEvent.query += '*'; 49 | } 50 | }, 51 | 52 | onSpecialKey: function (field, e) { 53 | if (e.getKey() == e.TAB) { // This was a pain in the ass to actually get it working right 54 | field.getEl().blur(); 55 | field.getEl().focus(50); 56 | field.doQuery( field.getValue() ); 57 | e.stopEvent(); 58 | return false; 59 | } 60 | } 61 | }); 62 | 63 | Ext.reg('metriccompleter', MetricCompleter); 64 | -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/SILK.txt: -------------------------------------------------------------------------------- 1 | The icons in this folder are direct gif conversions of the fam fam fam silk icons. 2 | 3 | Please see http://www.famfamfam.com/lab/icons/silk/ for more details. -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/accept.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/accept.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/add.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/add.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/add.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/application_go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/application_go.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/application_view_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/application_view_list.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/book.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/cog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/cog.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/cog_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/cog_edit.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/connect.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/connect.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/connect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/connect.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/control_rewind.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/control_rewind.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/cross.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/cross.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/delete.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/delete.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/error.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/feed_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/feed_add.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/feed_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/feed_delete.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/feed_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/feed_error.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/folder_go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/folder_go.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/folder_wrench.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/folder_wrench.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/grid.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/image_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/image_add.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/information.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/plugin.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/plugin.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/plugin_add.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/plugin_add.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/rss_go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/rss_go.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/table_refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/table_refresh.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_add.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user_add.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user_add.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user_comment.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_delete.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user_delete.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user_delete.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user_edit.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_female.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user_female.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_female.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user_female.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user_gray.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_green.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user_green.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user_green.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user_orange.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user_red.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_suit.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user_suit.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_suit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/icons/fam/user_suit.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/box/corners-blue.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/box/corners-blue.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/box/corners.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/box/corners.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/box/l-blue.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/box/l-blue.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/box/l.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/box/l.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/box/r-blue.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/box/r-blue.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/box/r.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/box/r.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/box/tb-blue.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/box/tb-blue.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/box/tb.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/box/tb.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/arrow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/button/arrow.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/btn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/button/btn.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/group-cs.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/button/group-cs.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/group-lr.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/button/group-lr.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/group-tb.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/button/group-tb.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/s-arrow-b-noline.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/button/s-arrow-b-noline.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/s-arrow-b.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/button/s-arrow-b.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/s-arrow-bo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/button/s-arrow-bo.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/s-arrow-noline.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/button/s-arrow-noline.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/s-arrow-o.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/button/s-arrow-o.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/s-arrow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/button/s-arrow.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/dd/drop-add.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/dd/drop-add.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/dd/drop-no.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/dd/drop-no.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/dd/drop-yes.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/dd/drop-yes.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/editor/tb-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/editor/tb-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/checkbox.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/checkbox.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/clear-trigger.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/clear-trigger.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/clear-trigger.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/clear-trigger.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/date-trigger.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/date-trigger.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/date-trigger.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/date-trigger.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/error-tip-corners.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/error-tip-corners.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/exclamation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/exclamation.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/radio.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/radio.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/search-trigger.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/search-trigger.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/search-trigger.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/search-trigger.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/text-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/text-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/trigger-square.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/trigger-square.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/trigger-square.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/trigger-square.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/trigger-tpl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/trigger-tpl.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/trigger.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/trigger.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/trigger.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/form/trigger.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/gradient-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/gradient-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/arrow-left-white.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/arrow-left-white.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/arrow-right-white.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/arrow-right-white.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/col-move-bottom.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/col-move-bottom.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/col-move-top.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/col-move-top.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/columns.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/columns.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/dirty.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/dirty.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/done.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/done.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/drop-no.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/drop-no.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/drop-yes.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/drop-yes.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/footer-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/footer-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid-blue-hd.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/grid-blue-hd.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid-blue-split.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/grid-blue-split.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid-hrow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/grid-hrow.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid-loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/grid-loading.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid-split.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/grid-split.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid-vista-hd.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/grid-vista-hd.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid3-hd-btn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/grid3-hd-btn.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid3-hrow-over.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/grid3-hrow-over.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid3-hrow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/grid3-hrow.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid3-rowheader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/grid3-rowheader.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid3-special-col-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/grid3-special-col-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/group-by.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/group-by.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/group-collapse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/group-collapse.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/group-expand-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/group-expand-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/group-expand.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/group-expand.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/hd-pop.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/hd-pop.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/hmenu-asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/hmenu-asc.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/hmenu-desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/hmenu-desc.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/hmenu-lock.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/hmenu-lock.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/hmenu-lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/hmenu-lock.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/hmenu-unlock.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/hmenu-unlock.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/hmenu-unlock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/hmenu-unlock.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/invalid_line.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/invalid_line.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/loading.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/mso-hd.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/mso-hd.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/nowait.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/nowait.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-first-disabled.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/page-first-disabled.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-first.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/page-first.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-last-disabled.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/page-last-disabled.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-last.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/page-last.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-next-disabled.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/page-next-disabled.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-next.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/page-next.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-prev-disabled.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/page-prev-disabled.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-prev.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/page-prev.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/pick-button.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/pick-button.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/refresh-disabled.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/refresh-disabled.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/refresh.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/refresh.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/row-check-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/row-check-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/row-expand-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/row-expand-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/row-over.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/row-over.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/row-sel.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/row-sel.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/sort-hd.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/sort-hd.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/sort_asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/sort_asc.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/sort_desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/sort_desc.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/wait.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/grid/wait.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/collapse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/collapse.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/expand.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/expand.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/gradient-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/gradient-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/mini-bottom.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/mini-bottom.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/mini-left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/mini-left.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/mini-right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/mini-right.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/mini-top.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/mini-top.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/ns-collapse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/ns-collapse.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/ns-expand.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/ns-expand.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/panel-close.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/panel-close.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/panel-title-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/panel-title-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/panel-title-light-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/panel-title-light-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/stick.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/stick.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/stuck.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/stuck.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/tab-close-on.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/tab-close-on.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/tab-close.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/layout/tab-close.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/menu/checked.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/menu/checked.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/menu/group-checked.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/menu/group-checked.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/menu/item-over.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/menu/item-over.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/menu/menu-parent.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/menu/menu-parent.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/menu/menu.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/menu/menu.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/menu/unchecked.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/menu/unchecked.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/corners-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/panel/corners-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/left-right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/panel/left-right.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/light-hd.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/panel/light-hd.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/tool-sprite-tpl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/panel/tool-sprite-tpl.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/tool-sprites.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/panel/tool-sprites.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/tools-sprites-trans.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/panel/tools-sprites-trans.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/top-bottom.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/panel/top-bottom.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/top-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/panel/top-bottom.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/white-corners-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/panel/white-corners-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/white-left-right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/panel/white-left-right.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/white-top-bottom.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/panel/white-top-bottom.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/progress/progress-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/progress/progress-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/qtip/bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/qtip/bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/qtip/close.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/qtip/close.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/qtip/tip-anchor-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/qtip/tip-anchor-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/qtip/tip-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/qtip/tip-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/s.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/s.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shadow-c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/shadow-c.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shadow-lr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/shadow-lr.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/shadow.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/blue-loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/shared/blue-loading.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/calendar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/shared/calendar.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/glass-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/shared/glass-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/hd-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/shared/hd-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/large-loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/shared/large-loading.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/left-btn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/shared/left-btn.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/loading-balls.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/shared/loading-balls.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/right-btn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/shared/right-btn.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/warning.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/shared/warning.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/e-handle-dark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/sizer/e-handle-dark.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/e-handle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/sizer/e-handle.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/ne-handle-dark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/sizer/ne-handle-dark.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/ne-handle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/sizer/ne-handle.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/nw-handle-dark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/sizer/nw-handle-dark.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/nw-handle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/sizer/nw-handle.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/s-handle-dark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/sizer/s-handle-dark.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/s-handle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/sizer/s-handle.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/se-handle-dark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/sizer/se-handle-dark.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/se-handle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/sizer/se-handle.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/square.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/sizer/square.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/sw-handle-dark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/sizer/sw-handle-dark.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/sw-handle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/sizer/sw-handle.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/slider/slider-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/slider/slider-bg.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/slider/slider-thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/slider/slider-thumb.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/slider/slider-v-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/slider/slider-v-bg.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/slider/slider-v-thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/slider/slider-v-thumb.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/scroll-left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tabs/scroll-left.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/scroll-right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tabs/scroll-right.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/scroller-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tabs/scroller-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-btm-left-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tabs/tab-btm-left-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-btm-over-left-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tabs/tab-btm-over-left-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-btm-over-right-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tabs/tab-btm-over-right-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-btm-right-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tabs/tab-btm-right-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-close.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tabs/tab-close.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-strip-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tabs/tab-strip-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-strip-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tabs/tab-strip-bg.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-strip-btm-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tabs/tab-strip-btm-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tabs-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tabs/tabs-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/toolbar/bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/btn-arrow-light.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/toolbar/btn-arrow-light.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/btn-arrow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/toolbar/btn-arrow.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/btn-over-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/toolbar/btn-over-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/gray-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/toolbar/gray-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/more.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/toolbar/more.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/tb-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/toolbar/tb-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/tb-btn-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/toolbar/tb-btn-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/tb-xl-btn-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/toolbar/tb-xl-btn-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/tb-xl-sep.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/toolbar/tb-xl-sep.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/arrows.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/arrows.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/drop-add.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/drop-add.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/drop-between.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/drop-between.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/drop-no.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/drop-no.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/drop-over.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/drop-over.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/drop-under.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/drop-under.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/drop-yes.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/drop-yes.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-end-minus-nl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/elbow-end-minus-nl.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-end-minus.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/elbow-end-minus.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-end-plus-nl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/elbow-end-plus-nl.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-end-plus.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/elbow-end-plus.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-end.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/elbow-end.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-line.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/elbow-line.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-minus-nl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/elbow-minus-nl.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-minus.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/elbow-minus.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-plus-nl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/elbow-plus-nl.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-plus.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/elbow-plus.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/elbow.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/folder-open.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/folder-open.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/folder.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/folder.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/leaf.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/leaf.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/loading.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/s.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/tree/s.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/icon-error.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/window/icon-error.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/icon-info.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/window/icon-info.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/icon-question.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/window/icon-question.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/icon-warning.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/window/icon-warning.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/left-corners.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/window/left-corners.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/left-corners.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/window/left-corners.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/left-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/window/left-right.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/left-right.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/window/left-right.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/right-corners.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/window/right-corners.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/right-corners.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/window/right-corners.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/top-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/window/top-bottom.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/top-bottom.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/content/js/ext/resources/images/default/window/top-bottom.psd -------------------------------------------------------------------------------- /webapp/graphite/.gitignore: -------------------------------------------------------------------------------- 1 | /local_settings.py 2 | -------------------------------------------------------------------------------- /webapp/graphite/__init__.py: -------------------------------------------------------------------------------- 1 | # Two wrongs don't make a right, but three lefts do. 2 | -------------------------------------------------------------------------------- /webapp/graphite/account/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/account/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/account/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from graphite.account.models import Profile,MyGraph 3 | 4 | 5 | @admin.register(MyGraph) 6 | class MyGraphAdmin(admin.ModelAdmin): 7 | list_display = ('profile','name') 8 | list_filter = ('profile',) 9 | 10 | 11 | admin.site.register(Profile) 12 | -------------------------------------------------------------------------------- /webapp/graphite/account/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/account/migrations/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/account/models.py: -------------------------------------------------------------------------------- 1 | """Copyright 2008 Orbitz WorldWide 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.""" 14 | 15 | from django.db import models 16 | from django.contrib.auth import models as auth_models 17 | 18 | 19 | class Profile(models.Model): 20 | user = models.OneToOneField(auth_models.User, on_delete=models.CASCADE) 21 | history = models.TextField(default="") 22 | advancedUI = models.BooleanField(default=False) 23 | __str__ = lambda self: "Profile for %s" % self.user 24 | 25 | 26 | class Variable(models.Model): 27 | profile = models.ForeignKey(Profile, on_delete=models.CASCADE) 28 | name = models.CharField(max_length=64) 29 | value = models.CharField(max_length=64) 30 | 31 | 32 | class View(models.Model): 33 | profile = models.ForeignKey(Profile, on_delete=models.CASCADE) 34 | name = models.CharField(max_length=64) 35 | 36 | 37 | class Window(models.Model): 38 | view = models.ForeignKey(View, on_delete=models.CASCADE) 39 | name = models.CharField(max_length=64) 40 | top = models.IntegerField() 41 | left = models.IntegerField() 42 | width = models.IntegerField() 43 | height = models.IntegerField() 44 | url = models.TextField() 45 | interval = models.IntegerField(null=True) 46 | 47 | 48 | class MyGraph(models.Model): 49 | profile = models.ForeignKey(Profile, on_delete=models.CASCADE) 50 | name = models.CharField(max_length=64) 51 | url = models.TextField() 52 | -------------------------------------------------------------------------------- /webapp/graphite/account/urls.py: -------------------------------------------------------------------------------- 1 | """Copyright 2008 Orbitz WorldWide 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.""" 14 | 15 | from django.urls import re_path 16 | from . import views 17 | 18 | urlpatterns = [ 19 | re_path(r'^/login/?$', views.loginView, name='account_login'), 20 | re_path(r'^/logout/?$', views.logoutView, name='account_logout'), 21 | re_path(r'^/edit/?$', views.editProfile, name='account_edit'), 22 | re_path(r'^/update/?$', views.updateProfile, name='account_update'), 23 | ] 24 | -------------------------------------------------------------------------------- /webapp/graphite/browser/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/browser/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/browser/urls.py: -------------------------------------------------------------------------------- 1 | """Copyright 2008 Orbitz WorldWide 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.""" 14 | 15 | from django.urls import re_path 16 | from . import views 17 | 18 | urlpatterns = [ 19 | re_path(r'^/header/?$', views.header, name='browser_header'), 20 | re_path(r'^/search/?$', views.search, name='browser_search'), 21 | re_path(r'^/mygraph/?$', views.myGraphLookup, name='browser_my_graph'), 22 | re_path(r'^/usergraph/?$', views.userGraphLookup, name='browser_usergraph'), 23 | re_path(r'^/?$', views.browser, name='browser'), 24 | ] 25 | -------------------------------------------------------------------------------- /webapp/graphite/compat.py: -------------------------------------------------------------------------------- 1 | 2 | from django import VERSION 3 | from django.http import (HttpResponse as BaseHttpResponse, 4 | HttpResponseBadRequest as Base400) 5 | 6 | 7 | class ContentTypeMixin(object): 8 | def __init__(self, *args, **kwargs): 9 | if VERSION < (1, 5) and 'content_type' in kwargs: 10 | kwargs['mimetype'] = kwargs.pop('content_type') 11 | super(ContentTypeMixin, self).__init__(*args, **kwargs) 12 | 13 | 14 | class HttpResponse(ContentTypeMixin, BaseHttpResponse): 15 | pass 16 | 17 | 18 | class HttpResponseBadRequest(ContentTypeMixin, Base400): 19 | pass 20 | -------------------------------------------------------------------------------- /webapp/graphite/composer/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/composer/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/composer/urls.py: -------------------------------------------------------------------------------- 1 | """Copyright 2008 Orbitz WorldWide 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.""" 14 | 15 | from django.urls import re_path 16 | from . import views 17 | 18 | urlpatterns = [ 19 | re_path(r'^/mygraph', views.mygraph, name='composer_mygraph'), 20 | re_path(r'^/?$', views.composer, name='composer'), 21 | ] 22 | -------------------------------------------------------------------------------- /webapp/graphite/dashboard/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/dashboard/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/dashboard/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from graphite.dashboard.models import Dashboard 3 | 4 | admin.site.register(Dashboard) 5 | -------------------------------------------------------------------------------- /webapp/graphite/dashboard/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.2 on 2017-06-14 11:22 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | ('account', '0001_initial'), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Dashboard', 19 | fields=[ 20 | ('name', models.CharField(max_length=128, primary_key=True, serialize=False)), 21 | ('state', models.TextField()), 22 | ('owners', models.ManyToManyField(related_name='dashboards', to='account.Profile')), 23 | ], 24 | ), 25 | migrations.CreateModel( 26 | name='Template', 27 | fields=[ 28 | ('name', models.CharField(max_length=128, primary_key=True, serialize=False)), 29 | ('state', models.TextField()), 30 | ('owners', models.ManyToManyField(related_name='templates', to='account.Profile')), 31 | ], 32 | ), 33 | ] 34 | -------------------------------------------------------------------------------- /webapp/graphite/dashboard/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/dashboard/migrations/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/dashboard/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from graphite.account.models import Profile 3 | from graphite.util import json 4 | import six 5 | 6 | 7 | class Dashboard(models.Model): 8 | name = models.CharField(primary_key=True, max_length=128) 9 | owners = models.ManyToManyField(Profile, related_name='dashboards') 10 | state = models.TextField() 11 | __str__ = lambda self: "Dashboard [%s]" % self.name 12 | 13 | 14 | class Template(models.Model): 15 | 16 | class Admin: pass 17 | name = models.CharField(primary_key=True, max_length=128) 18 | owners = models.ManyToManyField(Profile, related_name='templates') 19 | state = models.TextField() 20 | __str__ = lambda self: "Template [%s]" % self.name 21 | 22 | def loadState(self, val): 23 | return self.state.replace('__VALUE__', val) 24 | 25 | def setState(self, state, key): 26 | #XXX Might not need this 27 | def replace_string(s): 28 | if isinstance(s, six.text_type): 29 | s = s.replace(key, '__VALUE__') 30 | return s 31 | 32 | def update_graph(graph): 33 | graph_opts = graph[1] 34 | graph_opts['target'] = [replace_string(s) for s in graph_opts['target']] 35 | return [replace_string(graph[0]), 36 | graph_opts, 37 | replace_string(graph[2])] 38 | 39 | # Parse JSON here and replace first five elements of target with __VALUE__ 40 | parsed_state = json.loads(state) 41 | for i, graph in enumerate(parsed_state['graphs']): 42 | parsed_state['graphs'][i] = update_graph(graph) 43 | self.state = json.dumps(parsed_state) 44 | -------------------------------------------------------------------------------- /webapp/graphite/dashboard/send_graph.py: -------------------------------------------------------------------------------- 1 | from django.core.mail import EmailMessage 2 | 3 | 4 | def send_graph_email(subject, sender, recipients, attachments=None, body=None): 5 | """ 6 | :param str sender: sender's email address 7 | :param list recipients: list of recipient emails 8 | :param list attachments: list of triples of the form: 9 | (filename, content, mimetype). See the django docs 10 | https://docs.djangoproject.com/en/1.3/topics/email/#django.core.mail.EmailMessage 11 | """ 12 | attachments = attachments or [] 13 | msg = EmailMessage(subject=subject, 14 | from_email=sender, 15 | to=recipients, 16 | body=body, 17 | attachments=attachments) 18 | msg.send() 19 | -------------------------------------------------------------------------------- /webapp/graphite/dashboard/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from django.urls import re_path 3 | from . import views 4 | 5 | urlpatterns = [ 6 | path('/save/', views.save, name='dashboard_save'), 7 | path('/save_template//', views.save_template, name='dashboard_save_template'), 8 | path('/load/', views.load, name='dashboard_load'), 9 | path('/load//', views.load_template, name='dashboard_load_template'), 10 | path('/load_template//', views.load_template, name='dashboard_load_template'), 11 | path('/delete/', views.delete, name='dashboard_delete'), 12 | re_path(r'^/create-temporary/?$', views.create_temporary, name='dashboard_create_temporary'), 13 | path('/email', views.email, name='dashboard_email'), 14 | re_path(r'^/find/?$', views.find, name='dashboard_find'), 15 | path('/delete_template/', views.delete_template, name='dashboard_delete_template'), 16 | re_path(r'^/find_template/?$', views.find_template, name='dashboard_find_template'), 17 | re_path(r'^/login/?$', views.user_login, name='dashboard_login'), 18 | re_path(r'^/logout/?$', views.user_logout, name='dashboard_logout'), 19 | re_path(r'^/help/?$', views.help, name='dashboard_help'), 20 | path('//', views.template, name='dashboard_template'), 21 | path('/', views.dashboard, name='dashboard'), 22 | re_path(r'^/?$', views.dashboard, name='dashboard'), 23 | ] 24 | -------------------------------------------------------------------------------- /webapp/graphite/events/__init__.py: -------------------------------------------------------------------------------- 1 | # Two wrongs don't make a right, but three lefts do. 2 | -------------------------------------------------------------------------------- /webapp/graphite/events/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from graphite.events.models import Event 3 | 4 | admin.site.register(Event) 5 | -------------------------------------------------------------------------------- /webapp/graphite/events/compat.py: -------------------------------------------------------------------------------- 1 | 2 | from tagging.managers import (ModelTaggedItemManager as BaseModelTaggedItemManager, 3 | TaggedItem) 4 | 5 | 6 | class ContentTypeMixin(object): 7 | def with_intersection(self, tags, queryset=None): 8 | if queryset is None: 9 | return TaggedItem.objects.get_intersection_by_model(self.model, tags) 10 | else: 11 | return TaggedItem.objects.get_intersection_by_model(queryset, tags) 12 | 13 | 14 | class ModelTaggedItemManager(ContentTypeMixin, BaseModelTaggedItemManager): 15 | pass 16 | -------------------------------------------------------------------------------- /webapp/graphite/events/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.2 on 2017-06-14 11:22 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | import tagging.fields 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | initial = True 12 | 13 | dependencies = [ 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Event', 19 | fields=[ 20 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('when', models.DateTimeField()), 22 | ('what', models.CharField(max_length=255)), 23 | ('data', models.TextField(blank=True)), 24 | ('tags', tagging.fields.TagField(blank=True, default=b'', max_length=255)), 25 | ], 26 | ), 27 | ] 28 | -------------------------------------------------------------------------------- /webapp/graphite/events/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/events/migrations/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/events/urls.py: -------------------------------------------------------------------------------- 1 | """Copyright 2008 Orbitz WorldWide 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.""" 14 | 15 | from django.urls import re_path 16 | from . import views 17 | 18 | urlpatterns = [ 19 | re_path(r'^/get_data?$', views.get_data, name='events_get_data'), 20 | re_path(r'^/(?P\d+)/?$', views.detail, name='events_detail'), 21 | re_path(r'^/?$', views.view_events, name='events'), 22 | ] 23 | -------------------------------------------------------------------------------- /webapp/graphite/functions/aggfuncs.py: -------------------------------------------------------------------------------- 1 | from graphite.errors import InputParameterError 2 | from graphite.functions import safe 3 | 4 | 5 | aggFuncs = { 6 | 'average': safe.safeAvg, 7 | 'avg_zero': safe.safeAvgZero, 8 | 'median': safe.safeMedian, 9 | 'sum': safe.safeSum, 10 | 'min': safe.safeMin, 11 | 'max': safe.safeMax, 12 | 'diff': safe.safeDiff, 13 | 'stddev': safe.safeStdDev, 14 | 'count': safe.safeLen, 15 | 'range': lambda row: safe.safeSubtract(safe.safeMax(row), safe.safeMin(row)), 16 | 'multiply': lambda row: safe.safeMul(*row), 17 | 'last': safe.safeLast, 18 | } 19 | 20 | 21 | aggFuncAliases = { 22 | 'rangeOf': aggFuncs['range'], 23 | 'avg': aggFuncs['average'], 24 | 'total': aggFuncs['sum'], 25 | 'current': aggFuncs['last'], 26 | } 27 | 28 | 29 | def getAggFunc(func, rawFunc=None): 30 | if func in aggFuncs: 31 | return aggFuncs[func] 32 | if func in aggFuncAliases: 33 | return aggFuncAliases[func] 34 | raise InputParameterError('Unsupported aggregation function: %s' % (rawFunc or func)) 35 | -------------------------------------------------------------------------------- /webapp/graphite/functions/custom/.gitignore: -------------------------------------------------------------------------------- 1 | *.py 2 | -------------------------------------------------------------------------------- /webapp/graphite/functions/custom/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/functions/custom/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/functions/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import re_path 2 | from graphite.functions.views import functionList, functionDetails 3 | 4 | urlpatterns = [ 5 | re_path(r'^/(.+)$', functionDetails, name='functionDetails'), 6 | re_path(r'^/?$', functionList, name='functionList'), 7 | ] 8 | -------------------------------------------------------------------------------- /webapp/graphite/http_pool.py: -------------------------------------------------------------------------------- 1 | """Shared urllib3 pool.""" 2 | import urllib3 3 | 4 | http = urllib3.PoolManager(num_pools=10, maxsize=5) 5 | -------------------------------------------------------------------------------- /webapp/graphite/metrics/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/metrics/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/metrics/urls.py: -------------------------------------------------------------------------------- 1 | """Copyright 2009 Chris Davis 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.""" 14 | 15 | from django.urls import path, re_path 16 | from . import views 17 | 18 | urlpatterns = [ 19 | path('/index.json', views.index_json, name='metrics_index'), 20 | re_path(r'^/find/?$', views.find_view, name='metrics_find'), 21 | re_path(r'^/expand/?$', views.expand_view, name='metrics_expand'), 22 | re_path(r'^/get-metadata/?$', views.get_metadata_view, 23 | name='metrics_get_metadata'), 24 | re_path(r'^/set-metadata/?$', views.set_metadata_view, 25 | name='metrics_set_metadata'), 26 | re_path(r'^/?$', views.find_view, name='metrics'), 27 | ] 28 | -------------------------------------------------------------------------------- /webapp/graphite/middleware.py: -------------------------------------------------------------------------------- 1 | from graphite.logger import log 2 | try: 3 | from django.utils.deprecation import MiddlewareMixin 4 | except ImportError: # Django < 1.10 5 | MiddlewareMixin = object 6 | 7 | 8 | class LogExceptionsMiddleware(MiddlewareMixin): 9 | def process_exception(self, request, exception): 10 | log.exception('Exception encountered in <{0} {1}>'.format(request.method, request.build_absolute_uri())) 11 | return None 12 | -------------------------------------------------------------------------------- /webapp/graphite/node.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | class Node(object): 4 | __slots__ = ('name', 'path', 'local', 'is_leaf') 5 | 6 | def __init__(self, path): 7 | self.path = path 8 | self.name = path.split('.')[-1] 9 | self.local = True 10 | self.is_leaf = False 11 | 12 | def __repr__(self): 13 | return '<%s[%x]: %s>' % (self.__class__.__name__, id(self), self.path) 14 | 15 | 16 | class BranchNode(Node): 17 | pass 18 | 19 | 20 | class LeafNode(Node): 21 | __slots__ = ('reader', ) 22 | 23 | def __init__(self, path, reader): 24 | Node.__init__(self, path) 25 | self.reader = reader 26 | self.is_leaf = True 27 | 28 | def fetch(self, startTime, endTime, now=None, requestContext=None): 29 | try: 30 | result = self.reader.fetch(startTime, endTime, now, requestContext) 31 | except TypeError: 32 | # Support for legacy 3rd party, readers. 33 | result = self.reader.fetch(startTime, endTime) 34 | 35 | return result 36 | 37 | @property 38 | def intervals(self): 39 | return self.reader.get_intervals() 40 | 41 | def __repr__(self): 42 | return '' % (id(self), self.path, self.reader) 43 | -------------------------------------------------------------------------------- /webapp/graphite/readers/__init__.py: -------------------------------------------------------------------------------- 1 | # Import some symbols to avoid breaking compatibility. 2 | from graphite.readers.utils import BaseReader, CarbonLink, merge_with_cache # noqa # pylint: disable=unused-import 3 | from graphite.readers.multi import MultiReader # noqa # pylint: disable=unused-import 4 | from graphite.readers.whisper import WhisperReader, GzippedWhisperReader # noqa # pylint: disable=unused-import 5 | from graphite.readers.ceres import CeresReader # noqa # pylint: disable=unused-import 6 | from graphite.readers.rrd import RRDReader # noqa # pylint: disable=unused-import 7 | -------------------------------------------------------------------------------- /webapp/graphite/readers/ceres.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import 2 | 3 | from graphite.intervals import Interval, IntervalSet 4 | from graphite.readers.utils import merge_with_carbonlink, BaseReader 5 | 6 | try: 7 | import ceres 8 | except ImportError: 9 | ceres = False 10 | 11 | 12 | class CeresReader(BaseReader): 13 | __slots__ = ('ceres_node', 'real_metric_path') 14 | supported = bool(ceres) 15 | 16 | def __init__(self, ceres_node, real_metric_path): 17 | self.ceres_node = ceres_node 18 | self.real_metric_path = real_metric_path 19 | 20 | def get_intervals(self): 21 | intervals = [] 22 | for info in self.ceres_node.slice_info: 23 | (start, end, step) = info 24 | intervals.append(Interval(start, end)) 25 | 26 | return IntervalSet(intervals) 27 | 28 | def fetch(self, startTime, endTime): 29 | data = self.ceres_node.read(startTime, endTime) 30 | time_info = (data.startTime, data.endTime, data.timeStep) 31 | values = list(data.values) 32 | 33 | values = merge_with_carbonlink( 34 | self.real_metric_path, data.startTime, data.timeStep, values) 35 | 36 | return time_info, values 37 | -------------------------------------------------------------------------------- /webapp/graphite/render/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/render/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/render/grammar.py: -------------------------------------------------------------------------------- 1 | from threading import Lock 2 | 3 | from graphite.render.grammar_unsafe import grammar as _grammar 4 | 5 | 6 | class ThreadSafeGrammar(object): 7 | def __init__(self): 8 | self._lock = Lock() 9 | 10 | def parseString(self, instring): 11 | with self._lock: 12 | return _grammar.parseString(instring) 13 | 14 | 15 | grammar = ThreadSafeGrammar() 16 | -------------------------------------------------------------------------------- /webapp/graphite/render/urls.py: -------------------------------------------------------------------------------- 1 | """Copyright 2008 Orbitz WorldWide 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.""" 14 | 15 | from django.urls import re_path 16 | from . import views 17 | 18 | urlpatterns = [ 19 | re_path(r'^/local/?$', views.renderLocalView, name='render_local'), 20 | re_path(r'^/~(?P[^/]+)/(?P[^/]+)/?$', views.renderMyGraphView, 21 | name='render_my_graph'), 22 | re_path(r'^/?$', views.renderView, name='render'), 23 | ] 24 | -------------------------------------------------------------------------------- /webapp/graphite/tags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/tags/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/tags/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/tags/migrations/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/tags/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Series(models.Model): 5 | hash = models.CharField(max_length=64, unique=True) 6 | path = models.TextField() 7 | __str__ = lambda self: "Series [%s]" % self.path 8 | 9 | 10 | class Tag(models.Model): 11 | tag = models.CharField(max_length=191, unique=True) 12 | __str__ = lambda self: "Tag [%s]" % self.tag 13 | 14 | 15 | class TagValue(models.Model): 16 | value = models.CharField(max_length=191, unique=True) 17 | __str__ = lambda self: "TagValue [%s]" % self.value 18 | 19 | 20 | class SeriesTag(models.Model): 21 | series = models.ForeignKey(Series, on_delete=models.CASCADE) 22 | tag = models.ForeignKey(Tag, on_delete=models.CASCADE) 23 | value = models.ForeignKey(TagValue, on_delete=models.CASCADE) 24 | 25 | class Meta: 26 | unique_together = ("series", "tag") 27 | 28 | __str__ = lambda self: "SeriesTag [%s %s %s]" % (self.series, self.tag, self.value) 29 | -------------------------------------------------------------------------------- /webapp/graphite/tags/urls.py: -------------------------------------------------------------------------------- 1 | """Copyright 2008 Orbitz WorldWide 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.""" 14 | 15 | from django.urls import path, re_path 16 | from . import views 17 | 18 | urlpatterns = [ 19 | path('/tagSeries', views.tagSeries, name='tagSeries'), 20 | path('/tagMultiSeries', views.tagMultiSeries, name='tagMultiSeries'), 21 | path('/delSeries', views.delSeries, name='delSeries'), 22 | path('/findSeries', views.findSeries, name='findSeries'), 23 | path('/autoComplete/tags', views.autoCompleteTags, name='tagAutoCompleteTags'), 24 | path('/autoComplete/values', views.autoCompleteValues, name='tagAutoCompleteValues'), 25 | re_path(r'^/(.+)$', views.tagDetails, name='tagDetails'), 26 | re_path(r'^/?$', views.tagList, name='tagList'), 27 | ] 28 | -------------------------------------------------------------------------------- /webapp/graphite/templates/500.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |

4 |

Graphite encountered an unexpected error while handling your request.

5 |

Please contact your site administrator if the problem persists.

6 |

7 |
8 |
9 | {{message}} 10 |
11 | {% if stacktrace %} 12 |
13 |
14 | {{stacktrace}}
15 | 
16 |
17 | {% endif %} 18 |
19 | -------------------------------------------------------------------------------- /webapp/graphite/templates/browser.html: -------------------------------------------------------------------------------- 1 | 2 | 15 | 16 | 17 | 18 | Graphite Browser 19 | 20 | 21 | 22 | 23 | 24 | {% if target %} 25 | 26 | {% else %} 27 | 28 | {% endif %} 29 | 30 | 31 | -------------------------------------------------------------------------------- /webapp/graphite/templates/dashboardHelp.html: -------------------------------------------------------------------------------- 1 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 24 | 25 | 26 | 27 |
Shortcut Action
Ctrl-z Toggle visibility of the graph area toolbar
Ctrl-space Toggle visibility of the navigation panel
Alt-x Remove all graphs from the graph area
Alt-s Save the current dashboard
21 | The following shortcuts are for the Completer UI mode only 22 |
Alt-Enter Add all matching metrics to the graph area
Alt-Backspace Remove all matching metrics from the graph area
Shift-space Put keyboard focus in the completer field
28 |
29 | -------------------------------------------------------------------------------- /webapp/graphite/templates/editProfile.html: -------------------------------------------------------------------------------- 1 | 14 |
15 | 16 |

Profile settings for {{profile.user.username}}

17 | 18 |
19 | {% if nextPage %} 20 | 21 | {% endif %} 22 | 23 | 24 | Enable advanced/experimental UI features
25 | 26 | 27 |
28 |
29 | -------------------------------------------------------------------------------- /webapp/graphite/templates/event.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | {{event.what}} 4 | 5 | 13 | 14 | 15 | 16 | 17 |
18 |

{{event.what}}

19 |
20 |
21 |
22 | 23 | 24 | 25 | 26 |
when{{event.when|date:"H:i:s D d M Y" }}
tags{{event.tags}}
data{{event.data}}
27 |
28 |
29 | 30 | 31 | -------------------------------------------------------------------------------- /webapp/graphite/templates/events.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 | Events 4 | 5 | 13 | 14 | 15 | 16 | 17 |
18 |

graphite events

19 |
20 |
21 |
22 | {% if events %} 23 | 24 | 25 | {% for event in events %} 26 | 27 | 28 | 29 | 30 | 31 | {% endfor %} 32 | {% else %} 33 |
No events. Add events using 34 | the admin interface or by posting 35 | (eg, curl -X POST {{ protocol }}://{{ site.domain }}{% url "events" %} -d 36 | '{"what": "Something Interesting", "tags" : "tag1"}') 37 | {% endif %} 38 |
whenwhattags
{{event.when|date:"H:i:s D d M Y" }}{{event.what}}['{{ event.tags|join:"', '"}}']
39 |
40 |
41 | 42 | 43 | -------------------------------------------------------------------------------- /webapp/graphite/templates/login.html: -------------------------------------------------------------------------------- 1 | 14 | 15 | 16 |
17 | 18 | {% if authenticationFailed %} 19 |
20 |

Authentication attempt failed, please make sure you entered your login and password correctly
21 |

22 |
23 | {% endif %} 24 | 25 | {% if accountDisabled %} 26 |
27 |

Your account is disabled, please contact your site administrator.

28 |
29 | {% endif %} 30 | 31 |
32 | {% if nextPage %} 33 | 34 | {% endif %} 35 | 36 | 37 | 38 | 39 | 40 |
login
username
password
41 |
42 |
43 | -------------------------------------------------------------------------------- /webapp/graphite/templates/version.html: -------------------------------------------------------------------------------- 1 | {{version}} 2 | -------------------------------------------------------------------------------- /webapp/graphite/url_shortener/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/url_shortener/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/url_shortener/baseconv.py: -------------------------------------------------------------------------------- 1 | """ 2 | Convert numbers from base 10 integers to base X strings and back again. 3 | 4 | Original: http://www.djangosnippets.org/snippets/1431/ 5 | 6 | Sample usage: 7 | 8 | >>> base20 = BaseConverter('0123456789abcdefghij') 9 | >>> base20.from_decimal(1234) 10 | '31e' 11 | >>> base20.to_decimal('31e') 12 | 1234 13 | """ 14 | 15 | 16 | class BaseConverter(object): 17 | decimal_digits = "0123456789" 18 | 19 | def __init__(self, digits): 20 | self.digits = digits 21 | 22 | def from_decimal(self, i): 23 | return self.convert(i, self.decimal_digits, self.digits) 24 | 25 | def to_decimal(self, s): 26 | return int(self.convert(s, self.digits, self.decimal_digits)) 27 | 28 | def convert(number, fromdigits, todigits): 29 | # Based on http://code.activestate.com/recipes/111286/ 30 | if str(number)[0] == '-': 31 | number = str(number)[1:] 32 | neg = 1 33 | else: 34 | neg = 0 35 | 36 | # make an integer out of the number 37 | x = 0 38 | for digit in str(number): 39 | x = x * len(fromdigits) + fromdigits.index(digit) 40 | 41 | # create the result in base 'len(todigits)' 42 | if x == 0: 43 | res = todigits[0] 44 | else: 45 | res = "" 46 | while x > 0: 47 | digit = x % len(todigits) 48 | res = todigits[digit] + res 49 | x = int(x / len(todigits)) 50 | if neg: 51 | res = '-' + res 52 | return res 53 | convert = staticmethod(convert) 54 | 55 | 56 | bin = BaseConverter('01') 57 | hexconv = BaseConverter('0123456789ABCDEF') 58 | base62 = BaseConverter( 59 | 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz' 60 | ) 61 | -------------------------------------------------------------------------------- /webapp/graphite/url_shortener/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.2 on 2017-06-14 11:22 3 | from __future__ import unicode_literals 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name='Link', 18 | fields=[ 19 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 20 | ('url', models.TextField()), 21 | ('date_submitted', models.DateTimeField(auto_now_add=True)), 22 | ], 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /webapp/graphite/url_shortener/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/url_shortener/migrations/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/url_shortener/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Link(models.Model): 5 | url = models.TextField() 6 | date_submitted = models.DateTimeField(auto_now_add=True) 7 | -------------------------------------------------------------------------------- /webapp/graphite/url_shortener/views.py: -------------------------------------------------------------------------------- 1 | try: 2 | from django.urls import reverse 3 | except ImportError: # Django < 1.10 4 | from django.urls import reverse 5 | from django.shortcuts import get_object_or_404 6 | from django.http import HttpResponse, HttpResponsePermanentRedirect 7 | 8 | from graphite.url_shortener.baseconv import base62 9 | from graphite.url_shortener.models import Link 10 | import re 11 | 12 | 13 | def follow(request, link_id): 14 | """Follow existing links""" 15 | key = base62.to_decimal(link_id) 16 | link = get_object_or_404(Link, pk=key) 17 | return HttpResponsePermanentRedirect(reverse('browser') + link.url) 18 | 19 | 20 | def shorten(request, path): 21 | if request.META.get('QUERY_STRING', None): 22 | path += '?' + request.META['QUERY_STRING'] 23 | # Remove _salt, _dc and _uniq to avoid creating many copies of the same URL 24 | path = re.sub('&_(uniq|salt|dc)=[0-9.]+', "", path) 25 | 26 | link, created = Link.objects.get_or_create(url=path) 27 | link_id = base62.from_decimal(link.id) 28 | url = reverse('follow', kwargs={'link_id': link_id}) 29 | return HttpResponse(url, content_type='text/plain') 30 | -------------------------------------------------------------------------------- /webapp/graphite/version/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/version/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/version/urls.py: -------------------------------------------------------------------------------- 1 | """Copyright 2008 Orbitz WorldWide 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.""" 14 | 15 | from django.urls import re_path 16 | from . import views 17 | 18 | urlpatterns = [ 19 | re_path(r'^/?$', views.index, name='version_index'), 20 | ] 21 | -------------------------------------------------------------------------------- /webapp/graphite/version/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | from graphite import settings 3 | 4 | 5 | def index(request): 6 | context = { 7 | 'version' : settings.WEBAPP_VERSION, 8 | } 9 | return render(request, 'version.html', context) 10 | -------------------------------------------------------------------------------- /webapp/graphite/views.py: -------------------------------------------------------------------------------- 1 | import traceback 2 | from django.http import HttpResponseServerError 3 | from django.template import loader 4 | 5 | 6 | def server_error(request, template_name='500.html'): 7 | template = loader.get_template(template_name) 8 | context = {'stacktrace' : traceback.format_exc()} 9 | return HttpResponseServerError(template.render(context)) 10 | -------------------------------------------------------------------------------- /webapp/graphite/whitelist/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/whitelist/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/whitelist/urls.py: -------------------------------------------------------------------------------- 1 | """Copyright 2008 Orbitz WorldWide 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License.""" 14 | 15 | from django.urls import path, re_path 16 | from . import views 17 | 18 | urlpatterns = [ 19 | path('/add', views.add, name='whitelist_add'), 20 | path('/remove', views.remove, name='whitelist_remove'), 21 | re_path(r'^/?$', views.show, name='whitelist_show'), 22 | ] 23 | -------------------------------------------------------------------------------- /webapp/graphite/worker_pool/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/graphite/worker_pool/__init__.py -------------------------------------------------------------------------------- /webapp/graphite/wsgi.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | 4 | try: 5 | from importlib import import_module 6 | except ImportError: 7 | from django.utils.importlib import import_module 8 | 9 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'graphite.settings') # noqa 10 | os.environ.setdefault('GRAPHITE_SETTINGS_MODULE', 'graphite.local_settings') # noqa 11 | 12 | from django.conf import settings 13 | from django.core.wsgi import get_wsgi_application 14 | 15 | application = get_wsgi_application() 16 | 17 | try: 18 | import whitenoise 19 | except ImportError: 20 | whitenoise = False 21 | else: 22 | whitenoise_version = tuple(map( 23 | int, getattr(whitenoise, '__version__', '0').split('.'))) 24 | # WhiteNoise < 2.0.1 does not support Python 2.6 25 | if sys.version_info[:2] < (2, 7): 26 | if whitenoise_version < (2, 0, 1): 27 | whitenoise = False 28 | # Configure WhiteNoise >= 3.2 as middleware from app_settings.py 29 | # http://whitenoise.evans.io/en/stable/changelog.html#v4-0 30 | if whitenoise_version >= (3, 2): 31 | whitenoise = False 32 | 33 | if whitenoise: 34 | from whitenoise.django import DjangoWhiteNoise 35 | application = DjangoWhiteNoise(application) 36 | prefix = "/".join((settings.URL_PREFIX.strip('/'), 'static')) 37 | for directory in settings.STATICFILES_DIRS: 38 | application.add_files(directory, prefix=prefix) 39 | for app_path in settings.INSTALLED_APPS: 40 | module = import_module(app_path) 41 | directory = os.path.join(os.path.dirname(module.__file__), 'static') 42 | if os.path.isdir(directory): 43 | application.add_files(directory, prefix=prefix) 44 | -------------------------------------------------------------------------------- /webapp/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | 6 | if __name__ == "__main__": 7 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "graphite.settings") 8 | os.environ.setdefault('GRAPHITE_SETTINGS_MODULE', 'graphite.local_settings') 9 | 10 | from django.core.management import execute_from_command_line 11 | 12 | execute_from_command_line(sys.argv) 13 | -------------------------------------------------------------------------------- /webapp/tests/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | DATA_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), 'data')) 4 | TEST_CONF_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), 'conf')) 5 | -------------------------------------------------------------------------------- /webapp/tests/base.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase as OriginalTestCase 2 | from graphite.worker_pool.pool import stop_pools 3 | 4 | 5 | def is_unsafe_str(s): 6 | for symbol in '<>': 7 | if s.find(symbol) > 0: 8 | return True 9 | return False 10 | 11 | 12 | class TestCase(OriginalTestCase): 13 | def tearDown(self): 14 | stop_pools() 15 | 16 | # Assert that a response is unsanitized (for check XSS issues) 17 | def assertXSS(self, response, status_code=200, msg_prefix=''): 18 | if status_code is not None: 19 | self.assertEqual( 20 | response.status_code, status_code, 21 | msg_prefix + "Couldn't retrieve content: Response code was %d" 22 | " (expected %d)" % (response.status_code, status_code) 23 | ) 24 | 25 | content = str(response.content) 26 | xss = is_unsafe_str(content) 27 | self.assertFalse(xss, msg=msg_prefix+content) 28 | -------------------------------------------------------------------------------- /webapp/tests/data/index: -------------------------------------------------------------------------------- 1 | collectd.test.df-root.df_complex-free 2 | collectd.test.df-root.df_complex-used.value 3 | collectd.test.df-root.df_complex-reserved 4 | collectd.test.df-root.df_complex-reserved.value 5 | collectd.test.df-root.df_complex-free.value 6 | collectd.test.df-root.df_complex-used 7 | collectd.test.load.load.midterm 8 | collectd.test.load.load.shortterm 9 | collectd.test.load.load.longterm 10 | -------------------------------------------------------------------------------- /webapp/tests/funcplugins/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/graphite-project/graphite-web/c92e8c0a15cba3092c512c6fa991f955f9c23cce/webapp/tests/funcplugins/__init__.py -------------------------------------------------------------------------------- /webapp/tests/funcplugins/plugin.py: -------------------------------------------------------------------------------- 1 | from graphite.functions.params import Param, ParamTypes 2 | 3 | 4 | def test(seriesList): 5 | """This is a test function""" 6 | return seriesList 7 | 8 | 9 | test.group = 'Test' 10 | test.params = [ 11 | Param('seriesList', ParamTypes.seriesList, required=True), 12 | ] 13 | 14 | SeriesFunctions = { 15 | 'testFunc': test, 16 | } 17 | 18 | 19 | def pieTest(series): 20 | """This is a test pie function""" 21 | return max(series) 22 | 23 | 24 | pieTest.group = 'Test' 25 | pieTest.params = [ 26 | Param('series', ParamTypes.series, required=True), 27 | ] 28 | 29 | PieFunctions = { 30 | 'testFunc': pieTest, 31 | } 32 | -------------------------------------------------------------------------------- /webapp/tests/funcplugins/plugin_bad_param.py: -------------------------------------------------------------------------------- 1 | from graphite.functions.params import Param, ParamTypes 2 | 3 | 4 | def test(seriesList): 5 | """This is a test function""" 6 | return seriesList 7 | 8 | 9 | test.group = 'Test' 10 | test.params = [ 11 | Param('seriesList', ParamTypes.seriesList, required=True), 12 | 'bad param', 13 | ] 14 | 15 | SeriesFunctions = { 16 | 'testFunc': test, 17 | } 18 | 19 | 20 | def pieTest(series): 21 | """This is a test pie function""" 22 | return max(series) 23 | 24 | 25 | pieTest.group = 'Test' 26 | pieTest.params = [ 27 | Param('series', ParamTypes.series, required=True), 28 | 'bad param', 29 | ] 30 | 31 | PieFunctions = { 32 | 'testFunc': pieTest, 33 | } 34 | -------------------------------------------------------------------------------- /webapp/tests/funcplugins/plugin_bad_paramtype.py: -------------------------------------------------------------------------------- 1 | from graphite.functions.params import Param, ParamTypes 2 | 3 | 4 | def test(seriesList): 5 | """This is a test function""" 6 | return seriesList 7 | 8 | 9 | test.group = 'Test' 10 | test.params = [ 11 | Param('seriesList', ParamTypes.bad, required=True), 12 | ] 13 | 14 | SeriesFunctions = { 15 | 'testFunc': test, 16 | } 17 | -------------------------------------------------------------------------------- /webapp/tests/funcplugins/plugin_no_group.py: -------------------------------------------------------------------------------- 1 | from graphite.functions.params import Param, ParamTypes 2 | 3 | 4 | def test(seriesList): 5 | """This is a test function""" 6 | return seriesList 7 | 8 | 9 | test.params = [ 10 | Param('seriesList', ParamTypes.seriesList, required=True), 11 | ] 12 | 13 | SeriesFunctions = { 14 | 'testFunc': test, 15 | } 16 | -------------------------------------------------------------------------------- /webapp/tests/funcplugins/plugin_no_params.py: -------------------------------------------------------------------------------- 1 | def test(seriesList): 2 | """This is a test function""" 3 | return seriesList 4 | 5 | 6 | test.group = 'Test' 7 | 8 | SeriesFunctions = { 9 | 'testFunc': test, 10 | } 11 | -------------------------------------------------------------------------------- /webapp/tests/funcplugins/plugin_string_paramtype.py: -------------------------------------------------------------------------------- 1 | from graphite.functions.params import Param 2 | 3 | 4 | def test(seriesList): 5 | """This is a test function""" 6 | return seriesList 7 | 8 | 9 | test.group = 'Test' 10 | test.params = [ 11 | Param('seriesList', 'bad', required=True), 12 | ] 13 | 14 | SeriesFunctions = { 15 | 'testFunc': test, 16 | } 17 | -------------------------------------------------------------------------------- /webapp/tests/test_logger.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | import os.path 3 | import glob 4 | import re 5 | 6 | from logging import FileHandler 7 | 8 | from django.conf import settings 9 | 10 | from graphite.logger import log, GraphiteLogger 11 | from graphite.worker_pool.pool import get_pool 12 | 13 | 14 | class TestLogger(unittest.TestCase): 15 | 16 | def test_init(self): 17 | """ Testing initialization. """ 18 | for logger in ['infoLogger', 'exceptionLogger', 'cacheLogger', 19 | 'renderingLogger']: 20 | self.assertTrue(hasattr(log, logger)) 21 | 22 | def test_config_logger(self): 23 | pass 24 | 25 | def test_info_log(self): 26 | """ Testing writing to a log file. """ 27 | message = 'Test Info Message' 28 | log.info(message) 29 | lines = [l for l in open(os.path.join(settings.LOG_DIR, 30 | 'info.log')).readlines()] 31 | self.assertEqual(message, lines[-1].split('::')[1].strip()) 32 | 33 | def test_rotate(self): 34 | """ Force rotation of the log file. """ 35 | handler = log.infoLogger.handlers[0] 36 | handler.doRollover() 37 | files = glob.glob(os.path.join(settings.LOG_DIR, 'info.log.*')) 38 | matches = [re.match('info.log.[0-9]{4}-[0-9]{2}-[0-9]{2}', 39 | os.path.basename(f)) for f in files] 40 | self.assertTrue(any(matches)) 41 | 42 | def test_no_rotate(self): 43 | """ Check that deactivating log rotation creates plain FileHandlers. 44 | """ 45 | old_val = settings.LOG_ROTATION 46 | settings.LOG_ROTATION = False 47 | log = GraphiteLogger() 48 | self.assertTrue(isinstance(log.infoLogger.handlers[0], FileHandler)) 49 | self.assertTrue(isinstance(log.exceptionLogger.handlers[0], FileHandler)) 50 | settings.LOG_ROTATION = old_val 51 | 52 | def tearDown(self): 53 | get_pool().close() 54 | -------------------------------------------------------------------------------- /webapp/tests/test_singleton.py: -------------------------------------------------------------------------------- 1 | # From https://github.com/reyoung/singleton 2 | 3 | 4 | import unittest 5 | from graphite.singleton import Singleton, ThreadSafeSingleton 6 | 7 | 8 | class TestSingleton(unittest.TestCase): 9 | 10 | def _test_singleton(self, cls): 11 | @cls 12 | class IntSingleton(object): 13 | def __init__(self, default=0): 14 | self.i = default 15 | 16 | IntSingleton.initialize(10) 17 | a = IntSingleton.instance() 18 | b = IntSingleton.instance() 19 | 20 | self.assertEqual(a, b) 21 | self.assertEqual(id(a), id(b)) 22 | self.assertTrue(IntSingleton.is_initialized()) 23 | self.assertEqual(a.i, 10) 24 | self.assertEqual(b.i, 10) 25 | a.i = 100 26 | self.assertEqual(b.i, 100) 27 | 28 | def test_singleton(self): 29 | self._test_singleton(Singleton) 30 | 31 | def test_thread_safe_singleton(self): 32 | self._test_singleton(ThreadSafeSingleton) 33 | 34 | 35 | if __name__ == '__main__': 36 | unittest.main() 37 | -------------------------------------------------------------------------------- /webapp/tests/test_user_util.py: -------------------------------------------------------------------------------- 1 | from .base import TestCase 2 | from django.http import HttpRequest 3 | 4 | #from django.contrib.auth import authenticate 5 | from django.contrib.auth.models import User 6 | 7 | from graphite import user_util 8 | from graphite.wsgi import application # NOQA makes sure we have a working WSGI app 9 | 10 | 11 | class UserUtilTest(TestCase): 12 | 13 | def test_getProfile(self): 14 | request = HttpRequest() 15 | request.user = User.objects.create_user('testuser', 'testuser@test.com', 'testuserpassword') 16 | self.assertEqual( str(user_util.getProfile(request, False)), 'Profile for testuser' ) 17 | 18 | def test_getProfileByUsername(self): 19 | request = HttpRequest() 20 | request.user = User.objects.create_user('testuser', 'testuser@test.com', 'testuserpassword') 21 | user_util.getProfile(request, False) 22 | self.assertEqual( str(user_util.getProfileByUsername('testuser')), 'Profile for testuser' ) 23 | self.assertEqual( user_util.getProfileByUsername('nonexistentuser'), None ) 24 | -------------------------------------------------------------------------------- /webapp/tests/test_versions.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | try: 3 | from django.urls import reverse 4 | except ImportError: # Django < 1.10 5 | from django.urls import reverse 6 | from .base import TestCase 7 | 8 | 9 | class VersionTest(TestCase): 10 | def test_version(self): 11 | url = reverse('version_index') 12 | response = self.client.get(url) 13 | self.assertContains(response, settings.WEBAPP_VERSION) 14 | -------------------------------------------------------------------------------- /webapp/tests/test_xss.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import sys 3 | 4 | try: 5 | from django.urls import reverse 6 | except ImportError: # Django < 1.10 7 | from django.urls import reverse 8 | 9 | from .base import TestCase 10 | 11 | # Silence logging during tests 12 | LOGGER = logging.getLogger() 13 | 14 | # logging.NullHandler is a python 2.7ism 15 | if hasattr(logging, "NullHandler"): 16 | LOGGER.addHandler(logging.NullHandler()) 17 | 18 | if sys.version_info[0] >= 3: 19 | def resp_text(r): 20 | return r.content.decode('utf-8') 21 | else: 22 | def resp_text(r): 23 | return r.content 24 | 25 | 26 | class RenderXSSTest(TestCase): 27 | def test_render_xss(self): 28 | url = reverse('render') 29 | xssStr = '