├── webapp ├── graphite │ ├── cli │ │ ├── __init__.py │ │ ├── urls.py │ │ └── completer.py │ ├── account │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── urls.py │ │ ├── models.py │ │ ├── ldapBackend.py │ │ └── views.py │ ├── browser │ │ ├── __init__.py │ │ └── urls.py │ ├── composer │ │ ├── __init__.py │ │ └── urls.py │ ├── dashboard │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── models.py │ │ ├── urls.py │ │ └── send_graph.py │ ├── graphlot │ │ ├── __init__.py │ │ └── urls.py │ ├── metrics │ │ ├── __init__.py │ │ └── urls.py │ ├── render │ │ ├── __init__.py │ │ ├── urls.py │ │ └── evaluator.py │ ├── version │ │ ├── __init__.py │ │ ├── views.py │ │ └── urls.py │ ├── whitelist │ │ ├── __init__.py │ │ ├── urls.py │ │ └── views.py │ ├── .gitignore │ ├── templates │ │ ├── version.html │ │ ├── 500.html │ │ ├── event.html │ │ ├── editProfile.html │ │ ├── browser.html │ │ ├── dashboardHelp.html │ │ ├── events.html │ │ └── login.html │ ├── __init__.py │ ├── events │ │ ├── __init__.py │ │ ├── admin.py │ │ ├── urls.py │ │ └── models.py │ ├── views.py │ ├── wsgi.py │ ├── node.py │ ├── finders │ │ ├── ceres.py │ │ └── __init__.py │ ├── urls.py │ └── app_settings.py ├── content │ ├── img │ │ ├── I.gif │ │ ├── L.gif │ │ ├── T.gif │ │ ├── Lplus.gif │ │ ├── Tplus.gif │ │ ├── blank.gif │ │ ├── calBt.gif │ │ ├── error.png │ │ ├── leaf.gif │ │ ├── link.png │ │ ├── save.gif │ │ ├── Lminus.gif │ │ ├── Tminus.gif │ │ ├── arrow1.gif │ │ ├── delete.gif │ │ ├── favicon.ico │ │ ├── folder.png │ │ ├── clock_16.png │ │ ├── graphite.png │ │ ├── indicator.png │ │ ├── line_chart.png │ │ ├── mini-top2.gif │ │ ├── searching.gif │ │ ├── carbon-fiber.png │ │ ├── mini-bottom2.gif │ │ ├── updateGraph.gif │ │ └── graphite_short.png │ ├── css │ │ ├── default │ │ │ ├── clear.gif │ │ │ ├── close.gif │ │ │ ├── inspect.gif │ │ │ ├── overlay.png │ │ │ ├── resize.gif │ │ │ ├── sizer.gif │ │ │ ├── top_mid.gif │ │ │ ├── maximize.gif │ │ │ ├── minimize.gif │ │ │ ├── top_left.gif │ │ │ ├── top_right.gif │ │ │ ├── bottom_left.gif │ │ │ ├── bottom_mid.gif │ │ │ ├── bottom_right.gif │ │ │ ├── center_left.gif │ │ │ ├── center_right.gif │ │ │ └── bottom_right_resize.gif │ │ ├── darkX │ │ │ ├── frame-left-focused.png │ │ │ ├── frame-right-focused.png │ │ │ ├── button-close-focused.png │ │ │ ├── titlebar-left-focused.png │ │ │ ├── titlebar-mid-focused.png │ │ │ ├── button-maximize-focused.png │ │ │ ├── button-minimize-focused.png │ │ │ ├── frame-bottom-mid-focused.png │ │ │ ├── titlebar-right-focused.png │ │ │ ├── frame-bottom-left-focused.png │ │ │ └── frame-bottom-right-focused.png │ │ ├── dashboard-white.css │ │ ├── dashboard-default.css │ │ ├── jquery.autocomplete.css │ │ ├── cli.css │ │ └── table.css │ ├── js │ │ ├── ext │ │ │ └── resources │ │ │ │ ├── icons │ │ │ │ └── fam │ │ │ │ │ ├── add.gif │ │ │ │ │ ├── add.png │ │ │ │ │ ├── book.png │ │ │ │ │ ├── cog.png │ │ │ │ │ ├── grid.png │ │ │ │ │ ├── user.gif │ │ │ │ │ ├── user.png │ │ │ │ │ ├── accept.png │ │ │ │ │ ├── connect.gif │ │ │ │ │ ├── connect.png │ │ │ │ │ ├── cross.gif │ │ │ │ │ ├── delete.gif │ │ │ │ │ ├── error.png │ │ │ │ │ ├── plugin.gif │ │ │ │ │ ├── rss_go.png │ │ │ │ │ ├── cog_edit.png │ │ │ │ │ ├── feed_add.png │ │ │ │ │ ├── folder_go.png │ │ │ │ │ ├── image_add.png │ │ │ │ │ ├── user_add.gif │ │ │ │ │ ├── user_add.png │ │ │ │ │ ├── user_edit.png │ │ │ │ │ ├── user_gray.png │ │ │ │ │ ├── user_red.png │ │ │ │ │ ├── user_suit.gif │ │ │ │ │ ├── user_suit.png │ │ │ │ │ ├── feed_delete.png │ │ │ │ │ ├── feed_error.png │ │ │ │ │ ├── information.png │ │ │ │ │ ├── plugin_add.gif │ │ │ │ │ ├── user_comment.png │ │ │ │ │ ├── user_delete.gif │ │ │ │ │ ├── user_delete.png │ │ │ │ │ ├── user_female.gif │ │ │ │ │ ├── user_female.png │ │ │ │ │ ├── user_green.gif │ │ │ │ │ ├── user_green.png │ │ │ │ │ ├── user_orange.png │ │ │ │ │ ├── application_go.png │ │ │ │ │ ├── control_rewind.png │ │ │ │ │ ├── folder_wrench.png │ │ │ │ │ ├── table_refresh.png │ │ │ │ │ ├── application_view_list.png │ │ │ │ │ └── SILK.txt │ │ │ │ └── images │ │ │ │ └── default │ │ │ │ ├── s.gif │ │ │ │ ├── box │ │ │ │ ├── l.gif │ │ │ │ ├── r.gif │ │ │ │ ├── tb.gif │ │ │ │ ├── corners.gif │ │ │ │ ├── l-blue.gif │ │ │ │ ├── r-blue.gif │ │ │ │ ├── tb-blue.gif │ │ │ │ └── corners-blue.gif │ │ │ │ ├── qtip │ │ │ │ ├── bg.gif │ │ │ │ ├── close.gif │ │ │ │ ├── tip-sprite.gif │ │ │ │ └── tip-anchor-sprite.gif │ │ │ │ ├── shadow.png │ │ │ │ ├── tree │ │ │ │ ├── s.gif │ │ │ │ ├── leaf.gif │ │ │ │ ├── arrows.gif │ │ │ │ ├── drop-no.gif │ │ │ │ ├── elbow.gif │ │ │ │ ├── folder.gif │ │ │ │ ├── loading.gif │ │ │ │ ├── drop-add.gif │ │ │ │ ├── drop-over.gif │ │ │ │ ├── drop-yes.gif │ │ │ │ ├── elbow-end.gif │ │ │ │ ├── drop-between.gif │ │ │ │ ├── drop-under.gif │ │ │ │ ├── elbow-line.gif │ │ │ │ ├── elbow-minus.gif │ │ │ │ ├── elbow-plus.gif │ │ │ │ ├── folder-open.gif │ │ │ │ ├── elbow-end-plus.gif │ │ │ │ ├── elbow-minus-nl.gif │ │ │ │ ├── elbow-plus-nl.gif │ │ │ │ ├── elbow-end-minus.gif │ │ │ │ ├── elbow-end-plus-nl.gif │ │ │ │ └── elbow-end-minus-nl.gif │ │ │ │ ├── grid │ │ │ │ ├── done.gif │ │ │ │ ├── wait.gif │ │ │ │ ├── columns.gif │ │ │ │ ├── dirty.gif │ │ │ │ ├── drop-no.gif │ │ │ │ ├── hd-pop.gif │ │ │ │ ├── loading.gif │ │ │ │ ├── mso-hd.gif │ │ │ │ ├── nowait.gif │ │ │ │ ├── refresh.gif │ │ │ │ ├── row-sel.gif │ │ │ │ ├── sort-hd.gif │ │ │ │ ├── drop-yes.gif │ │ │ │ ├── footer-bg.gif │ │ │ │ ├── grid-hrow.gif │ │ │ │ ├── group-by.gif │ │ │ │ ├── hmenu-asc.gif │ │ │ │ ├── page-last.gif │ │ │ │ ├── page-next.gif │ │ │ │ ├── page-prev.gif │ │ │ │ ├── row-over.gif │ │ │ │ ├── sort_asc.gif │ │ │ │ ├── sort_desc.gif │ │ │ │ ├── col-move-top.gif │ │ │ │ ├── grid-blue-hd.gif │ │ │ │ ├── grid-loading.gif │ │ │ │ ├── grid-split.gif │ │ │ │ ├── grid3-hd-btn.gif │ │ │ │ ├── grid3-hrow.gif │ │ │ │ ├── group-expand.gif │ │ │ │ ├── hmenu-desc.gif │ │ │ │ ├── hmenu-lock.gif │ │ │ │ ├── hmenu-lock.png │ │ │ │ ├── hmenu-unlock.gif │ │ │ │ ├── hmenu-unlock.png │ │ │ │ ├── invalid_line.gif │ │ │ │ ├── page-first.gif │ │ │ │ ├── pick-button.gif │ │ │ │ ├── grid-vista-hd.gif │ │ │ │ ├── group-collapse.gif │ │ │ │ ├── arrow-left-white.gif │ │ │ │ ├── arrow-right-white.gif │ │ │ │ ├── col-move-bottom.gif │ │ │ │ ├── grid-blue-split.gif │ │ │ │ ├── grid3-hrow-over.gif │ │ │ │ ├── grid3-rowheader.gif │ │ │ │ ├── refresh-disabled.gif │ │ │ │ ├── row-check-sprite.gif │ │ │ │ ├── row-expand-sprite.gif │ │ │ │ ├── group-expand-sprite.gif │ │ │ │ ├── page-first-disabled.gif │ │ │ │ ├── page-last-disabled.gif │ │ │ │ ├── page-next-disabled.gif │ │ │ │ ├── page-prev-disabled.gif │ │ │ │ ├── grid3-special-col-bg.gif │ │ │ │ └── grid3-special-col-sel-bg.gif │ │ │ │ ├── menu │ │ │ │ ├── menu.gif │ │ │ │ ├── checked.gif │ │ │ │ ├── item-over.gif │ │ │ │ ├── unchecked.gif │ │ │ │ ├── menu-parent.gif │ │ │ │ └── group-checked.gif │ │ │ │ ├── shadow-c.png │ │ │ │ ├── shadow-lr.png │ │ │ │ ├── button │ │ │ │ ├── arrow.gif │ │ │ │ ├── btn.gif │ │ │ │ ├── s-arrow.gif │ │ │ │ ├── group-cs.gif │ │ │ │ ├── group-lr.gif │ │ │ │ ├── group-tb.gif │ │ │ │ ├── s-arrow-b.gif │ │ │ │ ├── s-arrow-bo.gif │ │ │ │ ├── s-arrow-o.gif │ │ │ │ ├── s-arrow-noline.gif │ │ │ │ └── s-arrow-b-noline.gif │ │ │ │ ├── dd │ │ │ │ ├── drop-add.gif │ │ │ │ ├── drop-no.gif │ │ │ │ └── drop-yes.gif │ │ │ │ ├── form │ │ │ │ ├── radio.gif │ │ │ │ ├── text-bg.gif │ │ │ │ ├── trigger.gif │ │ │ │ ├── trigger.psd │ │ │ │ ├── checkbox.gif │ │ │ │ ├── date-trigger.gif │ │ │ │ ├── date-trigger.psd │ │ │ │ ├── exclamation.gif │ │ │ │ ├── trigger-tpl.gif │ │ │ │ ├── clear-trigger.gif │ │ │ │ ├── clear-trigger.psd │ │ │ │ ├── search-trigger.gif │ │ │ │ ├── search-trigger.psd │ │ │ │ ├── trigger-square.gif │ │ │ │ ├── trigger-square.psd │ │ │ │ └── error-tip-corners.gif │ │ │ │ ├── gradient-bg.gif │ │ │ │ ├── layout │ │ │ │ ├── stick.gif │ │ │ │ ├── stuck.gif │ │ │ │ ├── expand.gif │ │ │ │ ├── collapse.gif │ │ │ │ ├── mini-left.gif │ │ │ │ ├── mini-right.gif │ │ │ │ ├── mini-top.gif │ │ │ │ ├── ns-expand.gif │ │ │ │ ├── tab-close.gif │ │ │ │ ├── gradient-bg.gif │ │ │ │ ├── mini-bottom.gif │ │ │ │ ├── ns-collapse.gif │ │ │ │ ├── panel-close.gif │ │ │ │ ├── tab-close-on.gif │ │ │ │ ├── panel-title-bg.gif │ │ │ │ └── panel-title-light-bg.gif │ │ │ │ ├── sizer │ │ │ │ ├── square.gif │ │ │ │ ├── e-handle.gif │ │ │ │ ├── s-handle.gif │ │ │ │ ├── ne-handle.gif │ │ │ │ ├── nw-handle.gif │ │ │ │ ├── se-handle.gif │ │ │ │ ├── sw-handle.gif │ │ │ │ ├── e-handle-dark.gif │ │ │ │ ├── s-handle-dark.gif │ │ │ │ ├── ne-handle-dark.gif │ │ │ │ ├── nw-handle-dark.gif │ │ │ │ ├── se-handle-dark.gif │ │ │ │ └── sw-handle-dark.gif │ │ │ │ ├── toolbar │ │ │ │ ├── bg.gif │ │ │ │ ├── more.gif │ │ │ │ ├── tb-bg.gif │ │ │ │ ├── btn-arrow.gif │ │ │ │ ├── gray-bg.gif │ │ │ │ ├── tb-xl-sep.gif │ │ │ │ ├── btn-over-bg.gif │ │ │ │ ├── tb-btn-sprite.gif │ │ │ │ ├── btn-arrow-light.gif │ │ │ │ └── tb-xl-btn-sprite.gif │ │ │ │ ├── panel │ │ │ │ ├── light-hd.gif │ │ │ │ ├── left-right.gif │ │ │ │ ├── top-bottom.gif │ │ │ │ ├── top-bottom.png │ │ │ │ ├── tool-sprites.gif │ │ │ │ ├── corners-sprite.gif │ │ │ │ ├── tool-sprite-tpl.gif │ │ │ │ ├── white-left-right.gif │ │ │ │ ├── white-top-bottom.gif │ │ │ │ ├── tools-sprites-trans.gif │ │ │ │ └── white-corners-sprite.gif │ │ │ │ ├── shared │ │ │ │ ├── warning.gif │ │ │ │ ├── calendar.gif │ │ │ │ ├── glass-bg.gif │ │ │ │ ├── hd-sprite.gif │ │ │ │ ├── left-btn.gif │ │ │ │ ├── right-btn.gif │ │ │ │ ├── blue-loading.gif │ │ │ │ ├── large-loading.gif │ │ │ │ └── loading-balls.gif │ │ │ │ ├── tabs │ │ │ │ ├── tab-close.gif │ │ │ │ ├── scroll-left.gif │ │ │ │ ├── scroll-right.gif │ │ │ │ ├── scroller-bg.gif │ │ │ │ ├── tab-strip-bg.gif │ │ │ │ ├── tab-strip-bg.png │ │ │ │ ├── tabs-sprite.gif │ │ │ │ ├── tab-btm-left-bg.gif │ │ │ │ ├── tab-btm-right-bg.gif │ │ │ │ ├── tab-strip-btm-bg.gif │ │ │ │ ├── tab-btm-over-left-bg.gif │ │ │ │ ├── tab-btm-over-right-bg.gif │ │ │ │ ├── tab-btm-inactive-left-bg.gif │ │ │ │ └── tab-btm-inactive-right-bg.gif │ │ │ │ ├── editor │ │ │ │ └── tb-sprite.gif │ │ │ │ ├── slider │ │ │ │ ├── slider-bg.png │ │ │ │ ├── slider-thumb.png │ │ │ │ ├── slider-v-bg.png │ │ │ │ └── slider-v-thumb.png │ │ │ │ ├── window │ │ │ │ ├── icon-error.gif │ │ │ │ ├── icon-info.gif │ │ │ │ ├── left-right.png │ │ │ │ ├── left-right.psd │ │ │ │ ├── top-bottom.png │ │ │ │ ├── top-bottom.psd │ │ │ │ ├── icon-warning.gif │ │ │ │ ├── left-corners.png │ │ │ │ ├── left-corners.psd │ │ │ │ ├── icon-question.gif │ │ │ │ ├── right-corners.png │ │ │ │ └── right-corners.psd │ │ │ │ └── progress │ │ │ │ └── progress-bg.gif │ │ ├── completer.js │ │ ├── scriptaculous │ │ │ └── scriptaculous.js │ │ └── ace │ │ │ ├── theme-textmate.js │ │ │ └── keybinding-vim.js │ └── html │ │ ├── completerHelp.html │ │ └── searchHelp.html ├── tests │ ├── __init__.py │ ├── test_util.py │ ├── test_versions.py │ ├── data │ │ └── index │ ├── settings.py │ ├── test_render.py │ ├── test_finders.py │ └── test_browser.py └── manage.py ├── docs ├── composer.rst ├── config-webapp.rst ├── admin-webapp.rst ├── requirements.txt ├── releases │ ├── 0_9_2.rst │ ├── 0_9_4.rst │ ├── 0_9_3.rst │ ├── 0_9_12.rst │ ├── 0_9_5.rst │ ├── 0_9_6.rst │ ├── 0_10_0.rst │ └── 0_9_8.rst ├── releases.rst ├── admin-carbon.rst ├── index.rst ├── functions.rst ├── who-is-using.rst ├── client-apis.rst └── overview.rst ├── bin ├── build-index.sh ├── build-index └── run-graphite-devel-server.py ├── .bzrignore ├── conf ├── graphite.wsgi.example ├── graphTemplates.conf.example └── dashboard.conf.example ├── .gitignore ├── misc └── virtualenvwrapper │ ├── postdeactivate │ └── postactivate ├── MANIFEST.in ├── setup.cfg ├── .travis.yml ├── contrib ├── perl_pickle_client.pl ├── test_aggregator_rules.py └── munin-graphite.rb ├── distro └── redhat │ └── misc │ └── postinstall ├── setup.py ├── README.md ├── requirements.txt └── examples ├── example-client.py └── example-graphite-vhost.conf /webapp/graphite/cli/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webapp/graphite/account/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webapp/graphite/browser/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webapp/graphite/composer/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webapp/graphite/dashboard/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webapp/graphite/graphlot/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webapp/graphite/metrics/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webapp/graphite/render/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webapp/graphite/version/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webapp/graphite/whitelist/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /webapp/graphite/.gitignore: -------------------------------------------------------------------------------- 1 | /local_settings.py 2 | -------------------------------------------------------------------------------- /webapp/graphite/templates/version.html: -------------------------------------------------------------------------------- 1 | {{version}} 2 | -------------------------------------------------------------------------------- /docs/composer.rst: -------------------------------------------------------------------------------- 1 | Using The Composer 2 | ================== 3 | ... 4 | -------------------------------------------------------------------------------- /docs/config-webapp.rst: -------------------------------------------------------------------------------- 1 | Configuring The Webapp 2 | ====================== 3 | -------------------------------------------------------------------------------- /docs/admin-webapp.rst: -------------------------------------------------------------------------------- 1 | Administering The Webapp 2 | ======================== 3 | -------------------------------------------------------------------------------- /webapp/graphite/__init__.py: -------------------------------------------------------------------------------- 1 | # Two wrongs don't make a right, but three lefts do. 2 | -------------------------------------------------------------------------------- /webapp/graphite/events/__init__.py: -------------------------------------------------------------------------------- 1 | # Two wrongs don't make a right, but three lefts do. 2 | -------------------------------------------------------------------------------- /webapp/content/img/I.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/I.gif -------------------------------------------------------------------------------- /webapp/content/img/L.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/L.gif -------------------------------------------------------------------------------- /webapp/content/img/T.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/T.gif -------------------------------------------------------------------------------- /bin/build-index.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | export PYTHONPATH="/opt/graphite/webapp/:$PYTHONPATH" 3 | ./build-index 4 | -------------------------------------------------------------------------------- /webapp/content/img/Lplus.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/Lplus.gif -------------------------------------------------------------------------------- /webapp/content/img/Tplus.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/Tplus.gif -------------------------------------------------------------------------------- /webapp/content/img/blank.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/blank.gif -------------------------------------------------------------------------------- /webapp/content/img/calBt.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/calBt.gif -------------------------------------------------------------------------------- /webapp/content/img/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/error.png -------------------------------------------------------------------------------- /webapp/content/img/leaf.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/leaf.gif -------------------------------------------------------------------------------- /webapp/content/img/link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/link.png -------------------------------------------------------------------------------- /webapp/content/img/save.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/save.gif -------------------------------------------------------------------------------- /webapp/content/img/Lminus.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/Lminus.gif -------------------------------------------------------------------------------- /webapp/content/img/Tminus.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/Tminus.gif -------------------------------------------------------------------------------- /webapp/content/img/arrow1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/arrow1.gif -------------------------------------------------------------------------------- /webapp/content/img/delete.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/delete.gif -------------------------------------------------------------------------------- /webapp/content/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/favicon.ico -------------------------------------------------------------------------------- /webapp/content/img/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/folder.png -------------------------------------------------------------------------------- /.bzrignore: -------------------------------------------------------------------------------- 1 | MANIFEST 2 | _trial_temp 3 | build 4 | dist 5 | graphite.db 6 | .bzrignore 7 | dropin.cache 8 | *.egg-info 9 | -------------------------------------------------------------------------------- /webapp/content/img/clock_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/clock_16.png -------------------------------------------------------------------------------- /webapp/content/img/graphite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/graphite.png -------------------------------------------------------------------------------- /webapp/content/img/indicator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/indicator.png -------------------------------------------------------------------------------- /webapp/content/img/line_chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/line_chart.png -------------------------------------------------------------------------------- /webapp/content/img/mini-top2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/mini-top2.gif -------------------------------------------------------------------------------- /webapp/content/img/searching.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/searching.gif -------------------------------------------------------------------------------- /webapp/tests/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | DATA_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), 'data')) 4 | -------------------------------------------------------------------------------- /webapp/content/img/carbon-fiber.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/carbon-fiber.png -------------------------------------------------------------------------------- /webapp/content/img/mini-bottom2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/mini-bottom2.gif -------------------------------------------------------------------------------- /webapp/content/img/updateGraph.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/updateGraph.gif -------------------------------------------------------------------------------- /conf/graphite.wsgi.example: -------------------------------------------------------------------------------- 1 | import sys 2 | sys.path.append('/opt/graphite/webapp') 3 | 4 | from graphite.wsgi import application 5 | -------------------------------------------------------------------------------- /webapp/content/css/default/clear.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/clear.gif -------------------------------------------------------------------------------- /webapp/content/css/default/close.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/close.gif -------------------------------------------------------------------------------- /webapp/content/css/default/inspect.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/inspect.gif -------------------------------------------------------------------------------- /webapp/content/css/default/overlay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/overlay.png -------------------------------------------------------------------------------- /webapp/content/css/default/resize.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/resize.gif -------------------------------------------------------------------------------- /webapp/content/css/default/sizer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/sizer.gif -------------------------------------------------------------------------------- /webapp/content/css/default/top_mid.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/top_mid.gif -------------------------------------------------------------------------------- /webapp/content/img/graphite_short.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/img/graphite_short.png -------------------------------------------------------------------------------- /webapp/content/css/default/maximize.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/maximize.gif -------------------------------------------------------------------------------- /webapp/content/css/default/minimize.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/minimize.gif -------------------------------------------------------------------------------- /webapp/content/css/default/top_left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/top_left.gif -------------------------------------------------------------------------------- /webapp/content/css/default/top_right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/top_right.gif -------------------------------------------------------------------------------- /webapp/content/css/default/bottom_left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/bottom_left.gif -------------------------------------------------------------------------------- /webapp/content/css/default/bottom_mid.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/bottom_mid.gif -------------------------------------------------------------------------------- /webapp/content/css/default/bottom_right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/bottom_right.gif -------------------------------------------------------------------------------- /webapp/content/css/default/center_left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/center_left.gif -------------------------------------------------------------------------------- /webapp/content/css/default/center_right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/center_right.gif -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | MANIFEST 2 | _trial_temp 3 | build 4 | dist 5 | graphite.db 6 | dropin.cache 7 | *.egg-info 8 | docs/_build 9 | *.log 10 | *.pyc 11 | -------------------------------------------------------------------------------- /webapp/content/css/darkX/frame-left-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/darkX/frame-left-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/frame-right-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/darkX/frame-right-focused.png -------------------------------------------------------------------------------- /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/content/css/darkX/button-close-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/darkX/button-close-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/titlebar-left-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/darkX/titlebar-left-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/titlebar-mid-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/darkX/titlebar-mid-focused.png -------------------------------------------------------------------------------- /webapp/content/css/default/bottom_right_resize.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/default/bottom_right_resize.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/add.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/add.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/add.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/book.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/book.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/cog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/cog.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/grid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/grid.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/button-maximize-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/darkX/button-maximize-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/button-minimize-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/darkX/button-minimize-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/frame-bottom-mid-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/darkX/frame-bottom-mid-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/titlebar-right-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/darkX/titlebar-right-focused.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/accept.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/accept.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/connect.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/connect.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/connect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/connect.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/cross.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/cross.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/delete.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/delete.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/error.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/plugin.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/plugin.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/rss_go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/rss_go.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/s.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/s.gif -------------------------------------------------------------------------------- /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/content/css/darkX/frame-bottom-left-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/darkX/frame-bottom-left-focused.png -------------------------------------------------------------------------------- /webapp/content/css/darkX/frame-bottom-right-focused.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/css/darkX/frame-bottom-right-focused.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/cog_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/cog_edit.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/feed_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/feed_add.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/folder_go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/folder_go.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/image_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/image_add.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_add.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user_add.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user_add.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user_edit.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_gray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user_gray.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user_red.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_suit.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user_suit.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_suit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user_suit.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/feed_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/feed_delete.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/feed_error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/feed_error.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/information.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/plugin_add.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/plugin_add.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user_comment.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_delete.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user_delete.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user_delete.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_female.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user_female.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_female.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user_female.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_green.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user_green.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user_green.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/user_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/user_orange.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/box/l.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/box/l.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/box/r.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/box/r.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/box/tb.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/box/tb.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/qtip/bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/qtip/bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/shadow.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/s.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/s.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/application_go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/application_go.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/control_rewind.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/control_rewind.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/folder_wrench.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/folder_wrench.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/table_refresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/table_refresh.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/done.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/done.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/wait.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/wait.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/menu/menu.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/menu/menu.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shadow-c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/shadow-c.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shadow-lr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/shadow-lr.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/leaf.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/leaf.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/box/corners.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/box/l-blue.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/box/r-blue.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/box/r-blue.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/box/tb-blue.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/box/tb-blue.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/arrow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/button/arrow.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/btn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/button/btn.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/dd/drop-add.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/dd/drop-yes.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/radio.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/form/radio.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/text-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/form/text-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/trigger.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/form/trigger.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/trigger.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/form/trigger.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/gradient-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/gradient-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/columns.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/columns.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/dirty.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/dirty.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/drop-no.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/drop-no.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/hd-pop.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/hd-pop.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/nowait.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/refresh.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/refresh.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/row-sel.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/sort-hd.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/stick.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/layout/stick.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/stuck.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/layout/stuck.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/menu/checked.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/menu/checked.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/qtip/close.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/qtip/close.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/square.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/sizer/square.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/toolbar/bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/more.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/toolbar/more.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/arrows.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/arrows.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/drop-no.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/drop-no.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/elbow.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/folder.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/folder.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/loading.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/s-arrow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/button/s-arrow.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/checkbox.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/form/checkbox.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/drop-yes.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/footer-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid-hrow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/grid-hrow.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/group-by.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/group-by.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/hmenu-asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/hmenu-asc.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-last.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/page-last.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-next.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/page-next.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-prev.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/page-prev.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/row-over.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/row-over.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/sort_asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/sort_desc.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/expand.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/layout/expand.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/menu/item-over.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/menu/item-over.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/menu/unchecked.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/menu/unchecked.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/light-hd.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/panel/light-hd.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/warning.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/shared/warning.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/e-handle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/sizer/e-handle.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/s-handle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/sizer/s-handle.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-close.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tabs/tab-close.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/tb-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/toolbar/tb-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/drop-add.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/drop-add.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/drop-over.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/drop-over.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/drop-yes.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/drop-yes.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-end.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/elbow-end.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/icons/fam/application_view_list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/icons/fam/application_view_list.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/box/corners-blue.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/box/corners-blue.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/group-cs.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/button/group-tb.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/s-arrow-b.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/button/s-arrow-bo.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/s-arrow-o.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/button/s-arrow-o.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/editor/tb-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/editor/tb-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/date-trigger.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/form/date-trigger.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/exclamation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/form/exclamation.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/trigger-tpl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/form/trigger-tpl.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/col-move-top.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/col-move-top.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid-blue-hd.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/grid-blue-hd.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid-loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/grid-split.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid3-hd-btn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/grid3-hd-btn.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid3-hrow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/grid3-hrow.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/group-expand.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/group-expand.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/hmenu-desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/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/ramiro/graphite-web/master/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/ramiro/graphite-web/master/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/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/invalid_line.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-first.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/page-first.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/pick-button.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/pick-button.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/collapse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/layout/collapse.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/mini-left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/layout/mini-top.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/ns-expand.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/layout/ns-expand.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/tab-close.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/layout/tab-close.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/menu/menu-parent.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/menu/menu-parent.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/left-right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/panel/left-right.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/top-bottom.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/panel/top-bottom.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/qtip/tip-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/qtip/tip-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/calendar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/shared/hd-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/left-btn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/shared/left-btn.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/right-btn.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/shared/right-btn.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/ne-handle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/sizer/ne-handle.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/nw-handle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/sizer/nw-handle.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/se-handle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/sizer/se-handle.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/sw-handle.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/slider/slider-bg.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/scroll-left.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tabs/scroller-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-strip-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tabs/tab-strip-bg.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tabs-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tabs/tabs-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/btn-arrow.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/toolbar/btn-arrow.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/gray-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/toolbar/gray-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/tb-xl-sep.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/toolbar/tb-xl-sep.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/drop-between.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/drop-between.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/drop-under.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/drop-under.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-line.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/elbow-line.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-minus.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/elbow-minus.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-plus.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/elbow-plus.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/folder-open.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/folder-open.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/icon-error.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/window/icon-info.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/left-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/window/left-right.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/top-bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/window/top-bottom.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/clear-trigger.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/form/clear-trigger.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/search-trigger.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/form/search-trigger.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/trigger-square.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/form/trigger-square.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid-vista-hd.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/grid-vista-hd.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/group-collapse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/group-collapse.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/gradient-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/layout/mini-bottom.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/ns-collapse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/layout/ns-collapse.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/panel-close.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/layout/panel-close.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/tab-close-on.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/layout/tab-close-on.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/menu/group-checked.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/menu/group-checked.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/tool-sprites.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/panel/tool-sprites.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/blue-loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/shared/blue-loading.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/e-handle-dark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/sizer/e-handle-dark.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/s-handle-dark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/sizer/s-handle-dark.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/slider/slider-thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/slider/slider-v-bg.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/btn-over-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/toolbar/btn-over-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-end-plus.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/elbow-end-plus.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-minus-nl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/elbow-minus-nl.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-plus-nl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/elbow-plus-nl.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/icon-warning.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/window/left-corners.psd -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/s-arrow-noline.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/button/s-arrow-noline.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/form/error-tip-corners.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/form/error-tip-corners.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/arrow-left-white.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/col-move-bottom.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid-blue-split.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/grid-blue-split.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid3-hrow-over.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/grid3-hrow-over.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid3-rowheader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/grid3-rowheader.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/refresh-disabled.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/refresh-disabled.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/row-check-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/row-expand-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/panel-title-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/layout/panel-title-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/corners-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/panel/corners-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/tool-sprite-tpl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/panel/tool-sprite-tpl.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/white-left-right.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/progress/progress-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/qtip/tip-anchor-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/qtip/tip-anchor-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/large-loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/shared/large-loading.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/shared/loading-balls.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/shared/loading-balls.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/ne-handle-dark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/sizer/ne-handle-dark.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/nw-handle-dark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/sizer/nw-handle-dark.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/se-handle-dark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/sizer/se-handle-dark.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/sizer/sw-handle-dark.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/sizer/sw-handle-dark.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/slider/slider-v-thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/slider/slider-v-thumb.png -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-btm-left-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tabs/tab-btm-left-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-btm-right-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tabs/tab-btm-right-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-strip-btm-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tabs/tab-strip-btm-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/tb-btn-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/toolbar/tb-btn-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-end-minus.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/elbow-end-plus-nl.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/icon-question.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/window/icon-question.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/window/right-corners.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/window/right-corners.psd -------------------------------------------------------------------------------- /docs/requirements.txt: -------------------------------------------------------------------------------- 1 | ## Requirements for documentation 2 | Django>=1.4 3 | django-tagging==0.3.1 4 | sphinx 5 | sphinx_rtd_theme 6 | pytz 7 | git+git://github.com/graphite-project/whisper.git#egg=whisper 8 | -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/button/s-arrow-b-noline.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/button/s-arrow-b-noline.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/group-expand-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/group-expand-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-first-disabled.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/page-first-disabled.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-last-disabled.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/page-last-disabled.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-next-disabled.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/page-next-disabled.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/page-prev-disabled.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/page-prev-disabled.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/btn-arrow-light.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/toolbar/btn-arrow-light.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/toolbar/tb-xl-btn-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/toolbar/tb-xl-btn-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tree/elbow-end-minus-nl.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tree/elbow-end-minus-nl.gif -------------------------------------------------------------------------------- /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/images/default/grid/grid3-special-col-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/grid3-special-col-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/layout/panel-title-light-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/layout/panel-title-light-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/tools-sprites-trans.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/panel/tools-sprites-trans.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/panel/white-corners-sprite.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/panel/white-corners-sprite.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-btm-over-left-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tabs/tab-btm-over-right-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/grid/grid3-special-col-sel-bg.gif -------------------------------------------------------------------------------- /webapp/content/js/ext/resources/images/default/tabs/tab-btm-inactive-left-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ramiro/graphite-web/master/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/ramiro/graphite-web/master/webapp/content/js/ext/resources/images/default/tabs/tab-btm-inactive-right-bg.gif -------------------------------------------------------------------------------- /webapp/graphite/version/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render_to_response 2 | from graphite import settings 3 | 4 | 5 | def index(request): 6 | context = { 7 | 'version' : settings.WEBAPP_VERSION, 8 | } 9 | return render_to_response('version.html', context) 10 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | 9 | from django.core.management import execute_from_command_line 10 | 11 | execute_from_command_line(sys.argv) 12 | -------------------------------------------------------------------------------- /webapp/graphite/account/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from graphite.account.models import Profile,MyGraph 3 | 4 | class MyGraphAdmin(admin.ModelAdmin): 5 | list_display = ('profile','name') 6 | list_filter = ('profile',) 7 | 8 | admin.site.register(Profile) 9 | admin.site.register(MyGraph, MyGraphAdmin) 10 | -------------------------------------------------------------------------------- /misc/virtualenvwrapper/postdeactivate: -------------------------------------------------------------------------------- 1 | # postdeactivate hook for virtualenvwrapper (http://virtualenvwrapper.readthedocs.org/) 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 -------------------------------------------------------------------------------- /webapp/tests/test_util.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | from graphite import util 4 | 5 | 6 | class UtilTest(TestCase): 7 | def test_is_local_interface(self): 8 | addresses = ['127.0.0.1', '127.0.0.1:8080', '8.8.8.8'] 9 | results = [ util.is_local_interface(a) for a in addresses ] 10 | self.assertEqual( results, [True, True, False] ) 11 | -------------------------------------------------------------------------------- /docs/releases.rst: -------------------------------------------------------------------------------- 1 | Release Notes 2 | ============= 3 | 4 | .. toctree:: 5 | :maxdepth: 1 6 | :glob: 7 | 8 | releases/0_10_0 9 | releases/0_9_12 10 | releases/0_9_11 11 | releases/0_9_10 12 | releases/0_9_9 13 | releases/0_9_8 14 | releases/0_9_7 15 | releases/0_9_6 16 | releases/0_9_5 17 | releases/0_9_4 18 | releases/0_9_3 19 | releases/0_9_2 20 | -------------------------------------------------------------------------------- /webapp/tests/test_versions.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django.core.urlresolvers import reverse 3 | from django.test import TestCase 4 | 5 | 6 | class VersionTest(TestCase): 7 | def test_version(self): 8 | url = reverse('graphite.version.views.index') 9 | response = self.client.get(url) 10 | self.assertContains(response, settings.WEBAPP_VERSION) 11 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include INSTALL 2 | include LICENSE 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 | exclude webapp/graphite/local_settings.py 12 | exclude conf/*.conf 13 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /webapp/graphite/dashboard/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth import models as auth_models 3 | from graphite.account.models import Profile 4 | 5 | 6 | class Dashboard(models.Model): 7 | name = models.CharField(primary_key=True, max_length=128) 8 | owners = models.ManyToManyField(Profile, related_name='dashboards') 9 | state = models.TextField() 10 | __str__ = lambda self: "Dashboard [%s]" % self.name 11 | -------------------------------------------------------------------------------- /webapp/graphite/views.py: -------------------------------------------------------------------------------- 1 | import traceback 2 | from django.conf import settings 3 | from django.http import HttpResponseServerError 4 | from django.template import Context, loader 5 | 6 | 7 | def server_error(request, template_name='500.html'): 8 | template = loader.get_template(template_name) 9 | context = Context({ 10 | 'stacktrace' : traceback.format_exc() 11 | }) 12 | return HttpResponseServerError( template.render(context) ) 13 | -------------------------------------------------------------------------------- /webapp/graphite/dashboard/urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls import * 2 | 3 | urlpatterns = patterns('graphite.dashboard.views', 4 | ('^save/(?P[^/]+)', 'save'), 5 | ('^load/(?P[^/]+)', 'load'), 6 | ('^delete/(?P[^/]+)', 'delete'), 7 | ('^create-temporary/?', 'create_temporary'), 8 | ('^email', 'email'), 9 | ('^find/', 'find'), 10 | ('^login/?', 'user_login'), 11 | ('^logout/?', 'user_logout'), 12 | ('^help/', 'help'), 13 | ('^(?P[^/]+)', 'dashboard'), 14 | ('', 'dashboard'), 15 | ) 16 | -------------------------------------------------------------------------------- /webapp/graphite/wsgi.py: -------------------------------------------------------------------------------- 1 | import os 2 | from django.core.handlers.wsgi import WSGIHandler 3 | 4 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'graphite.settings') 5 | 6 | application = WSGIHandler() 7 | 8 | # Initializing the search index can be very expensive. The import below 9 | # ensures the index is preloaded before any requests are handed to the 10 | # process. 11 | 12 | from graphite.logger import log 13 | log.info("graphite.wsgi - pid %d - reloading search index" % os.getpid()) 14 | import graphite.metrics.search 15 | -------------------------------------------------------------------------------- /webapp/tests/settings.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings, global_settings 2 | 3 | # Silence the warning about an insecure SECRET_KEY 4 | global_settings.SECRET_KEY = 'SUPER_SAFE_TESTING_KEY' 5 | 6 | settings.configure(default_settings=global_settings) 7 | from graphite.settings import * # noqa 8 | 9 | from django import VERSION 10 | 11 | if VERSION < (1, 6): 12 | TEST_RUNNER = 'discover_runner.DiscoverRunner' 13 | 14 | CACHES = { 15 | 'default': { 16 | 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', 17 | }, 18 | } 19 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [install] 2 | prefix = /opt/graphite 3 | install-lib = %(prefix)s/webapp 4 | 5 | [bdist_rpm] 6 | requires = Django => 1.4 7 | django-tagging 8 | carbon 9 | whisper 10 | ceres 11 | mod_wsgi 12 | pycairo 13 | pycairo-devel 14 | python-simplejson 15 | python-sqlite2 16 | python-hashlib 17 | pytz 18 | pyparsing 19 | 20 | post-install = distro/redhat/misc/postinstall 21 | 22 | provides = graphite 23 | obsoletes = graphite <= 0.9.9 24 | -------------------------------------------------------------------------------- /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/index.rst: -------------------------------------------------------------------------------- 1 | 2 | Graphite Documentation 3 | ====================== 4 | 5 | .. toctree:: 6 | :maxdepth: 1 7 | 8 | overview 9 | install 10 | carbon-daemons 11 | config-carbon 12 | feeding-carbon 13 | admin-carbon 14 | config-local-settings 15 | config-webapp 16 | admin-webapp 17 | composer 18 | render_api 19 | functions 20 | dashboard 21 | whisper 22 | storage-backends 23 | terminology 24 | tools 25 | client-apis 26 | who-is-using 27 | releases 28 | 29 | 30 | Indices and tables 31 | ================== 32 | 33 | * :ref:`genindex` 34 | * :ref:`modindex` 35 | * :ref:`search` 36 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /docs/functions.rst: -------------------------------------------------------------------------------- 1 | Functions 2 | ========= 3 | Functions are used to transform, combine, and perform computations on :term:`series` data. Functions are 4 | applied using the Composer interface or by manipulating the ``target`` parameters in the 5 | :doc:`Render API `. 6 | 7 | Usage 8 | ----- 9 | Most functions are applied to one :term:`series list`. Functions with the parameter 10 | ``*seriesLists`` can take an arbitrary number of series lists. To pass multiple series lists 11 | to a function which only takes one, use the :py:func:`group` function. 12 | 13 | .. _list-of-functions : 14 | 15 | List of functions 16 | ----------------- 17 | .. automodule:: graphite.render.functions 18 | :members: 19 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 3 | - "2.6" 4 | - "2.7" 5 | 6 | env: 7 | - REQUIREMENTS="Django<1.5 django-discover-runner" 8 | - REQUIREMENTS="Django<1.6 django-discover-runner" 9 | - REQUIREMENTS="Django<1.7" 10 | 11 | before_install: 12 | - sudo apt-get -y install libcairo2-dev 13 | - mkdir -p storage/log/webapp 14 | - mkdir -p storage/ceres 15 | - mkdir -p storage/whisper 16 | - cd webapp 17 | 18 | install: 19 | - pip install https://github.com/graphite-project/ceres/tarball/master 20 | - pip install $REQUIREMENTS 21 | - pip install whisper django-tagging pytz pyparsing==1.5.7 mock http://cairographics.org/releases/py2cairo-1.8.10.tar.gz 22 | 23 | script: 24 | - PYTHONPATH=. python manage.py test --settings=tests.settings 25 | -------------------------------------------------------------------------------- /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.conf.urls import * 16 | 17 | urlpatterns = patterns('graphite.version.views', 18 | ('', 'index'), 19 | ) 20 | -------------------------------------------------------------------------------- /docs/who-is-using.rst: -------------------------------------------------------------------------------- 1 | Who is using Graphite? 2 | ====================== 3 | 4 | Here are some organizations that use Graphite: 5 | 6 | * `Orbitz `_ 7 | * `Sears Holdings `_ 8 | * `Etsy `_ (see http://codeascraft.etsy.com/2010/12/08/track-every-release/) 9 | * `Google `_ (opensource Rocksteady project) 10 | * `Media Temple `_ 11 | * `Canonical `_ 12 | * `Brightcove `_ (see http://opensource.brightcove.com/project/Diamond/) 13 | * `Vimeo `_ 14 | * `SocialTwist `_ 15 | * `Douban `_ 16 | 17 | And many more 18 | -------------------------------------------------------------------------------- /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/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.conf.urls import * 16 | 17 | urlpatterns = patterns('graphite.whitelist.views', 18 | ('add','add'), 19 | ('remove','remove'), 20 | ('', 'show'), 21 | ) 22 | -------------------------------------------------------------------------------- /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.conf.urls import * 16 | 17 | urlpatterns = patterns('graphite.composer.views', 18 | ('send_email','send_email'), 19 | ('mygraph', 'mygraph'), 20 | ('', 'composer'), 21 | ) 22 | -------------------------------------------------------------------------------- /webapp/graphite/cli/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.conf.urls import * 16 | 17 | urlpatterns = patterns('graphite.cli.views', 18 | (r'^autocomplete/?$', 'autocomplete'), 19 | (r'^eval/?$', 'evaluate'), 20 | (r'', 'cli'), 21 | ) 22 | -------------------------------------------------------------------------------- /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.conf.urls import * 16 | 17 | urlpatterns = patterns('graphite.events.views', 18 | ('^get_data?$', 'get_data'), 19 | (r'(?P\d+)/$', 'detail'), 20 | ('^$', 'view_events'), 21 | ) 22 | -------------------------------------------------------------------------------- /webapp/graphite/graphlot/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.conf.urls import * 16 | 17 | urlpatterns = patterns('graphite.graphlot.views', 18 | ('^rawdata/?$', 'get_data'), 19 | ('^findmetric/?$', 'find_metric'), 20 | ('', 'graphlot_render'), 21 | ) 22 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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.conf.urls import * 16 | 17 | urlpatterns = patterns('graphite.render.views', 18 | ('local/?$','renderLocalView'), 19 | ('~(?P[^/]+)/(?P[^/]+)/?','renderMyGraphView'), 20 | ('', 'renderView'), 21 | ) 22 | -------------------------------------------------------------------------------- /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.conf.urls import * 16 | 17 | urlpatterns = patterns('graphite.account.views', 18 | ('^login/?$', 'loginView'), 19 | ('^logout/?$', 'logoutView'), 20 | ('^edit/?$', 'editProfile'), 21 | ('^update/?$','updateProfile'), 22 | ) 23 | -------------------------------------------------------------------------------- /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', 'intervals') 22 | 23 | def __init__(self, path, reader): 24 | Node.__init__(self, path) 25 | self.reader = reader 26 | self.intervals = reader.get_intervals() 27 | self.is_leaf = True 28 | 29 | def fetch(self, startTime, endTime): 30 | return self.reader.fetch(startTime, endTime) 31 | 32 | def __repr__(self): 33 | return '' % (id(self), self.path, self.reader) 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 | -------------------------------------------------------------------------------- /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/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/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.conf.urls import * 16 | 17 | urlpatterns = patterns('graphite.browser.views', 18 | ('^header/?$', 'header'), 19 | ('^search/?$', 'search'), 20 | ('^mygraph/?$', 'myGraphLookup'), 21 | ('^usergraph/?$', 'userGraphLookup'), 22 | ('^$', 'browser'), 23 | ) 24 | -------------------------------------------------------------------------------- /misc/virtualenvwrapper/postactivate: -------------------------------------------------------------------------------- 1 | # postactivate hook for virtualenvwrapper (http://virtualenvwrapper.readthedocs.org/) 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 -------------------------------------------------------------------------------- /webapp/graphite/templates/event.html: -------------------------------------------------------------------------------- 1 | 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/content/html/completerHelp.html: -------------------------------------------------------------------------------- 1 | 14 |

Using the AutoCompleter


15 | 16 | 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. 17 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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.conf.urls import * 16 | 17 | urlpatterns = patterns('graphite.metrics.views', 18 | ('^index\.json$', 'index_json'), 19 | ('^search/?$', 'search_view'), 20 | ('^find/?$', 'find_view'), 21 | ('^expand/?$', 'expand_view'), 22 | ('^get-metadata/?$', 'get_metadata_view'), 23 | ('^set-metadata/?$', 'set_metadata_view'), 24 | ('', 'find_view'), 25 | ) 26 | -------------------------------------------------------------------------------- /webapp/content/css/jquery.autocomplete.css: -------------------------------------------------------------------------------- 1 | .ac_results { 2 | padding: 0px; 3 | border: 1px solid black; 4 | background-color: white; 5 | overflow: hidden; 6 | z-index: 99999; 7 | } 8 | 9 | .ac_results ul { 10 | width: 100%; 11 | list-style-position: outside; 12 | list-style: none; 13 | padding: 0; 14 | margin: 0; 15 | } 16 | 17 | .ac_results li { 18 | margin: 0px; 19 | padding: 2px 5px; 20 | cursor: default; 21 | display: block; 22 | /* 23 | if width will be 100% horizontal scrollbar will apear 24 | when scroll mode will be used 25 | */ 26 | /*width: 100%;*/ 27 | font: menu; 28 | font-size: 12px; 29 | /* 30 | it is very important, if line-height not setted or setted 31 | in relative units scroll will be broken in firefox 32 | */ 33 | line-height: 16px; 34 | overflow: hidden; 35 | } 36 | 37 | .ac_loading { 38 | background: white url('../img/indicator.png') right center no-repeat; 39 | } 40 | 41 | .ac_odd { 42 | background-color: #eee; 43 | } 44 | 45 | .ac_over { 46 | background-color: #0A246A; 47 | color: white; 48 | } 49 | -------------------------------------------------------------------------------- /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 pre-existing $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 | -------------------------------------------------------------------------------- /webapp/content/html/searchHelp.html: -------------------------------------------------------------------------------- 1 | 14 |

Searching Graphite


15 | 16 | The search box may contain multiple search strings separated by spaces. To match your search, a graphite name must match all of the search strings you provide. For example,
17 | 18 |
19 | lfs busy
20 | 
21 |
22 | 23 | Will only match names that contain the word "lfs" and the word "busy".
24 | 25 | Advanced users may note that every search string can be a regular expression. 26 | -------------------------------------------------------------------------------- /webapp/content/css/cli.css: -------------------------------------------------------------------------------- 1 | .mybody { 2 | background-color: black; 3 | color: 11ff11; 4 | font-family: monospace; 5 | font-weight: bold; 6 | } 7 | 8 | .commandEntry { 9 | background-color: black; 10 | color: 11ff11; 11 | font-family: monospace; 12 | font-weight: bold; 13 | border: none; 14 | } 15 | 16 | .gWindow { 17 | background-color: #CCCCCC; 18 | border: groove green; 19 | } 20 | 21 | .gHeader { 22 | background-color: #999999; 23 | color: #333333; 24 | } 25 | 26 | div.autocomplete { 27 | position:absolute; 28 | width: 250px; 29 | background-color: black; 30 | margin: 0px; 31 | padding: 0px; 32 | } 33 | div.autocomplete ul { 34 | list-style-type: none; 35 | margin: 0px; 36 | padding: 0px; 37 | } 38 | div.autocomplete ul li.selected { background-color: #666666;} 39 | div.autocomplete ul li { 40 | list-style-type: none; 41 | display: block; 42 | margin: 0; 43 | padding: 2px; 44 | height: 16px; 45 | cursor: pointer; 46 | } 47 | -------------------------------------------------------------------------------- /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/finders/ceres.py: -------------------------------------------------------------------------------- 1 | from __future__ import absolute_import 2 | 3 | import os.path 4 | 5 | from glob import glob 6 | from ceres import CeresTree, CeresNode 7 | from django.conf import settings 8 | from graphite.node import BranchNode, LeafNode 9 | from graphite.readers import CeresReader 10 | 11 | from . import get_real_metric_path 12 | 13 | 14 | class CeresFinder: 15 | def __init__(self, directory=None): 16 | directory = directory or settings.CERES_DIR 17 | self.directory = directory 18 | self.tree = CeresTree(directory) 19 | 20 | def find_nodes(self, query): 21 | for fs_path in glob( self.tree.getFilesystemPath(query.pattern) ): 22 | metric_path = self.tree.getNodePath(fs_path) 23 | 24 | if CeresNode.isNodeDir(fs_path): 25 | ceres_node = self.tree.getNode(metric_path) 26 | 27 | if ceres_node.hasDataForInterval(query.startTime, query.endTime): 28 | real_metric_path = get_real_metric_path(fs_path, metric_path) 29 | reader = CeresReader(ceres_node, real_metric_path) 30 | yield LeafNode(metric_path, reader) 31 | 32 | elif os.path.isdir(fs_path): 33 | yield BranchNode(metric_path) 34 | -------------------------------------------------------------------------------- /bin/build-index: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from graphite import settings 3 | from optparse import OptionParser 4 | import os 5 | 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "graphite.settings") 7 | from graphite.util import write_index 8 | 9 | 10 | if __name__ == "__main__": 11 | description = "A tool to generate the search index file used by"\ 12 | " graphite-web." 13 | prog = "build-index" 14 | version = "1.0" 15 | epilog = "Defaults are read from graphite.settings, it is unlikely"\ 16 | " that you would want to run this program with anything except the"\ 17 | " defaults." 18 | parser = OptionParser(description=description, prog=prog, version=version, 19 | epilog=epilog) 20 | parser.add_option("-c", "--ceres_dir", default=settings.CERES_DIR, 21 | help="default: %default") 22 | parser.add_option("-w", "--whisper_dir", default=settings.WHISPER_DIR, 23 | help="default: %default") 24 | parser.add_option("-i", "--index", default=settings.INDEX_FILE, 25 | help="default: %default") 26 | (options, args) = parser.parse_args() 27 | write_index(options.whisper_dir, options.ceres_dir, options.index) 28 | -------------------------------------------------------------------------------- /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/structured_metrics 31 | .. _txCarbonClient: https://github.com/fdChasm/txCarbonClient 32 | -------------------------------------------------------------------------------- /webapp/graphite/templates/browser.html: -------------------------------------------------------------------------------- 1 | 14 | 15 | {% autoescape off %} 16 | 17 | 18 | 19 | Graphite Browser 20 | 21 | 22 | 23 | 24 | 25 | {% if target %} 26 | 27 | {% else %} 28 | 29 | {% endif %} 30 | 31 | 32 | 33 | {% endautoescape %} 34 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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 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__, "'...sum.all (10) = sum ..<>.sum.'", 'stats.prod.js.ktime_sum.sum.host2' ) 18 | sys.exit(42) 19 | 20 | ### cli arguments 21 | me, raw_rule, raw_metric = sys.argv 22 | 23 | 24 | ### XXX rather whitebox, by reading the source ;( 25 | rm = RuleManager 26 | rule = rm.parse_definition( raw_rule ) 27 | 28 | ### rule/parsed rule 29 | print "Raw rule: %s" % raw_rule 30 | print "Parsed rule: %s" % rule.regex.pattern 31 | 32 | print "\n======\n" 33 | 34 | ### run the parse 35 | match = rule.regex.match( raw_metric ) 36 | 37 | print "Raw metric: %s" % raw_metric 38 | if match: 39 | print "Match dict: %s" % match.groupdict() 40 | print "Result: %s" % rule.output_template % match.groupdict() 41 | 42 | else: 43 | print "ERROR: NO MATCH" 44 | -------------------------------------------------------------------------------- /webapp/graphite/templates/dashboardHelp.html: -------------------------------------------------------------------------------- 1 | {% autoescape off %} 2 | 3 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 25 | 26 | 27 | 28 | 29 |
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
23 | The following shortcuts are for the Completer UI mode only 24 |
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
30 |
31 | 32 | {% endautoescape %} 33 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /webapp/graphite/templates/events.html: -------------------------------------------------------------------------------- 1 | 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 http://localhost:8000{{slash}}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}}
39 |
40 |
41 | 42 | 43 | -------------------------------------------------------------------------------- /webapp/graphite/render/evaluator.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | import time 3 | from django.conf import settings 4 | from graphite.render.grammar import grammar 5 | from graphite.render.datalib import fetchData, TimeSeries 6 | 7 | 8 | def evaluateTarget(requestContext, target): 9 | tokens = grammar.parseString(target) 10 | result = evaluateTokens(requestContext, tokens) 11 | 12 | if type(result) is TimeSeries: 13 | return [result] #we have to return a list of TimeSeries objects 14 | 15 | else: 16 | return result 17 | 18 | 19 | def evaluateTokens(requestContext, tokens): 20 | if tokens.expression: 21 | return evaluateTokens(requestContext, tokens.expression) 22 | 23 | elif tokens.pathExpression: 24 | return fetchData(requestContext, tokens.pathExpression) 25 | 26 | elif tokens.call: 27 | func = SeriesFunctions[tokens.call.funcname] 28 | args = [evaluateTokens(requestContext, arg) for arg in tokens.call.args] 29 | kwargs = dict([(kwarg.argname, evaluateTokens(requestContext, kwarg.args[0])) 30 | for kwarg in tokens.call.kwargs]) 31 | return func(requestContext, *args, **kwargs) 32 | 33 | elif tokens.number: 34 | if tokens.number.integer: 35 | return int(tokens.number.integer) 36 | elif tokens.number.float: 37 | return float(tokens.number.float) 38 | elif tokens.number.scientific: 39 | return float(tokens.number.scientific[0]) 40 | 41 | elif tokens.string: 42 | return tokens.string[1:-1] 43 | 44 | elif tokens.boolean: 45 | return tokens.boolean[0] == 'true' 46 | 47 | 48 | #Avoid import circularities 49 | from graphite.render.functions import SeriesFunctions 50 | -------------------------------------------------------------------------------- /webapp/tests/test_render.py: -------------------------------------------------------------------------------- 1 | import json 2 | import os 3 | import time 4 | import logging 5 | 6 | import whisper 7 | 8 | from django.conf import settings 9 | from django.core.urlresolvers import reverse 10 | from django.test import TestCase 11 | 12 | # Silence logging during tests 13 | LOGGER = logging.getLogger() 14 | 15 | # logging.NullHandler is a python 2.7ism 16 | if hasattr(logging, "NullHandler"): 17 | LOGGER.addHandler(logging.NullHandler()) 18 | 19 | 20 | class RenderTest(TestCase): 21 | db = os.path.join(settings.WHISPER_DIR, 'test.wsp') 22 | 23 | def wipe_whisper(self): 24 | try: 25 | os.remove(self.db) 26 | except OSError: 27 | pass 28 | 29 | def test_render_view(self): 30 | url = reverse('graphite.render.views.renderView') 31 | 32 | response = self.client.get(url, {'target': 'test', 'format': 'json'}) 33 | self.assertEqual(json.loads(response.content), []) 34 | 35 | response = self.client.get(url, {'target': 'test'}) 36 | self.assertEqual(response['Content-Type'], 'image/png') 37 | 38 | self.addCleanup(self.wipe_whisper) 39 | whisper.create(self.db, [(1, 60)]) 40 | 41 | ts = int(time.time()) 42 | whisper.update(self.db, 0.5, ts - 2) 43 | whisper.update(self.db, 0.4, ts - 1) 44 | whisper.update(self.db, 0.6, ts) 45 | 46 | response = self.client.get(url, {'target': 'test', 'format': 'json'}) 47 | data = json.loads(response.content) 48 | end = data[0]['datapoints'][-4:] 49 | self.assertEqual( 50 | end, [[None, ts - 3], [0.5, ts - 2], [0.4, ts - 1], [0.6, ts]]) 51 | -------------------------------------------------------------------------------- /webapp/graphite/finders/__init__.py: -------------------------------------------------------------------------------- 1 | import fnmatch 2 | import os.path 3 | 4 | 5 | def get_real_metric_path(absolute_path, metric_path): 6 | # Support symbolic links (real_metric_path ensures proper cache queries) 7 | if os.path.islink(absolute_path): 8 | real_fs_path = os.path.realpath(absolute_path) 9 | relative_fs_path = metric_path.replace('.', '/') 10 | base_fs_path = absolute_path[:-len(relative_fs_path)] 11 | relative_real_fs_path = real_fs_path[len(base_fs_path):] 12 | return fs_to_metric(relative_real_fs_path) 13 | 14 | return metric_path 15 | 16 | 17 | def fs_to_metric(path): 18 | dirpath = os.path.dirname(path) 19 | filename = os.path.basename(path) 20 | return os.path.join(dirpath, filename.split('.')[0]).replace('/','.') 21 | 22 | 23 | def _deduplicate(entries): 24 | yielded = set() 25 | for entry in entries: 26 | if entry not in yielded: 27 | yielded.add(entry) 28 | yield entry 29 | 30 | 31 | def match_entries(entries, pattern): 32 | """A drop-in replacement for fnmatch.filter that supports pattern 33 | variants (ie. {foo,bar}baz = foobaz or barbaz).""" 34 | v1, v2 = pattern.find('{'), pattern.find('}') 35 | 36 | if v1 > -1 and v2 > v1: 37 | variations = pattern[v1+1:v2].split(',') 38 | variants = [ pattern[:v1] + v + pattern[v2+1:] for v in variations ] 39 | matching = [] 40 | 41 | for variant in variants: 42 | matching.extend( fnmatch.filter(entries, variant) ) 43 | 44 | return list( _deduplicate(matching) ) #remove dupes without changing order 45 | 46 | else: 47 | matching = fnmatch.filter(entries, pattern) 48 | matching.sort() 49 | return matching 50 | -------------------------------------------------------------------------------- /webapp/graphite/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.conf.urls import * 16 | from django.conf import settings 17 | from django.contrib import admin 18 | 19 | admin.autodiscover() 20 | 21 | urlpatterns = patterns('', 22 | ('^admin/', include(admin.site.urls)), 23 | ('^render/?', include('graphite.render.urls')), 24 | ('^cli/?', include('graphite.cli.urls')), 25 | ('^composer/?', include('graphite.composer.urls')), 26 | ('^metrics/?', include('graphite.metrics.urls')), 27 | ('^browser/?', include('graphite.browser.urls')), 28 | ('^account/?', include('graphite.account.urls')), 29 | ('^dashboard/?', include('graphite.dashboard.urls')), 30 | ('^whitelist/?', include('graphite.whitelist.urls')), 31 | ('^content/(?P.*)$', 'django.views.static.serve', {'document_root' : settings.CONTENT_DIR}), 32 | ('graphlot/', include('graphite.graphlot.urls')), 33 | ('^version/', include('graphite.version.urls')), 34 | ('^events/', include('graphite.events.urls')), 35 | ('', 'graphite.browser.views.browser'), 36 | ) 37 | 38 | handler500 = 'graphite.views.server_error' 39 | -------------------------------------------------------------------------------- /webapp/graphite/events/models.py: -------------------------------------------------------------------------------- 1 | import time 2 | import os 3 | 4 | from django.db import models 5 | from django.contrib import admin 6 | from tagging.managers import ModelTaggedItemManager 7 | from tagging.models import Tag 8 | 9 | if os.environ.get('READTHEDOCS'): 10 | TagField = lambda *args, **kwargs: None 11 | else: 12 | from tagging.fields import TagField 13 | 14 | class Event(models.Model): 15 | when = models.DateTimeField() 16 | what = models.CharField(max_length=255) 17 | data = models.TextField(blank=True) 18 | tags = TagField(default="") 19 | 20 | def get_tags(self): 21 | return Tag.objects.get_for_object(self) 22 | 23 | def __str__(self): 24 | return "%s: %s" % (self.when, self.what) 25 | 26 | @staticmethod 27 | def find_events(time_from=None, time_until=None, tags=None): 28 | 29 | if tags is not None: 30 | query = Event.tagged.with_all(tags) 31 | else: 32 | query = Event.objects.all() 33 | 34 | if time_from is not None: 35 | query = query.filter(when__gte=time_from) 36 | 37 | if time_until is not None: 38 | query = query.filter(when__lte=time_until) 39 | 40 | 41 | result = list(query.order_by("when")) 42 | return result 43 | 44 | def as_dict(self): 45 | return dict( 46 | when=self.when, 47 | what=self.what, 48 | data=self.data, 49 | tags=self.tags, 50 | id=self.id, 51 | ) 52 | 53 | # We use this rather than tagging.register() so that tags can be exposed 54 | # in the admin UI 55 | ModelTaggedItemManager().contribute_to_class(Event, 'tagged') 56 | -------------------------------------------------------------------------------- /conf/graphTemplates.conf.example: -------------------------------------------------------------------------------- 1 | [default] 2 | background = white 3 | foreground = black 4 | minorLine = grey 5 | majorLine = rose 6 | lineColors = blue,green,red,purple,brown,yellow,aqua,grey,magenta,pink,gold,rose 7 | fontName = Sans 8 | fontSize = 10 9 | fontBold = False 10 | fontItalic = False 11 | 12 | [solarized-light] 13 | background = #fdf6e3 14 | foreground = #657b83 15 | majorLine = #073642 16 | minorLine = #586e75 17 | lineColors = 268bd2aa,859900aa,dc322faa,d33682aa,db4b16aa,b58900aa,2aa198aa,6c71c4aa 18 | fontName = Sans 19 | fontSize = 10 20 | fontBold = False 21 | fontItalic = False 22 | 23 | [solarized-dark] 24 | background = #002b36 25 | foreground = #839496 26 | majorLine = #fdf6e3 27 | minorLine = #eee8d5 28 | lineColors = 268bd2aa,859900aa,dc322faa,d33682aa,db4b16aa,b58900aa,2aa198aa,6c71c4aa 29 | fontName = Sans 30 | fontSize = 10 31 | fontBold = False 32 | fontItalic = False 33 | 34 | [classic] 35 | background = black 36 | foreground = white 37 | majorLine = white 38 | minorLine = grey 39 | lineColors = blue,green,red,purple,brown,yellow,aqua,grey,magenta,pink,gold,rose 40 | fontName = Sans 41 | fontSize = 10 42 | fontBold = False 43 | fontItalic = False 44 | 45 | [noc] 46 | background = black 47 | foreground = white 48 | majorLine = white 49 | minorLine = grey 50 | lineColors = blue,green,red,yellow,purple,brown,aqua,grey,magenta,pink,gold,rose 51 | fontName = Sans 52 | fontSize = 10 53 | fontBold = False 54 | fontItalic = False 55 | 56 | [summary] 57 | background = black 58 | lineColors = #6666ff, #66ff66, #ff6666 59 | 60 | [alphas] 61 | background = white 62 | foreground = black 63 | majorLine = grey 64 | minorLine = rose 65 | lineColors = 00ff00aa,ff000077,00337799 66 | -------------------------------------------------------------------------------- /webapp/content/js/completer.js: -------------------------------------------------------------------------------- 1 | var MetricCompleter; 2 | 3 | MetricCompleter = Ext.extend(Ext.form.ComboBox, { 4 | displayField: "path", 5 | listEmptyText: "No matching metrics", 6 | mode: 'remote', 7 | hideTrigger: true, 8 | queryDelay: 100, 9 | queryParam: 'query', 10 | typeAhead: false, 11 | minChars: 1, 12 | 13 | initComponent: function () { 14 | var _this = this; 15 | 16 | var store = new Ext.data.JsonStore({ 17 | url: "../metrics/find/", 18 | root: 'metrics', 19 | fields: ['path', 'name'], 20 | baseParams: {format: 'completer'} 21 | }); 22 | 23 | var config = {store: store}; 24 | 25 | Ext.apply(this, config); 26 | Ext.apply(this.initialConfig, config); 27 | 28 | MetricCompleter.superclass.initComponent.call(this); 29 | 30 | this.addListener('beforequery', this.prepareQuery.createDelegate(this)); 31 | this.addListener('specialkey', this.onSpecialKey.createDelegate(this)); 32 | this.addListener('afterrender', 33 | function () { 34 | _this.getEl().addListener('specialkey', 35 | function (el, e) { 36 | _this.onSpecialKey(_this.getEl(), e); 37 | } 38 | ); 39 | } 40 | ); 41 | }, 42 | 43 | prepareQuery: function (queryEvent) { 44 | queryEvent.query += '*'; 45 | }, 46 | 47 | onSpecialKey: function (field, e) { 48 | if (e.getKey() == e.TAB) { // This was a pain in the ass to actually get it working right 49 | field.getEl().blur(); 50 | field.getEl().focus(50); 51 | field.doQuery( field.getValue() ); 52 | e.stopEvent(); 53 | return false; 54 | } 55 | } 56 | }); 57 | 58 | Ext.reg('metriccompleter', MetricCompleter); 59 | -------------------------------------------------------------------------------- /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/tests/test_finders.py: -------------------------------------------------------------------------------- 1 | import random 2 | import time 3 | 4 | from django.test import TestCase 5 | 6 | from graphite.intervals import Interval, IntervalSet 7 | from graphite.node import LeafNode, BranchNode 8 | from graphite.storage import Store, get_finder 9 | 10 | 11 | class FinderTest(TestCase): 12 | def test_custom_finder(self): 13 | store = Store(finders=[get_finder('tests.test_finders.DummyFinder')]) 14 | nodes = list(store.find("foo")) 15 | self.assertEqual(len(nodes), 1) 16 | self.assertEqual(nodes[0].path, 'foo') 17 | 18 | nodes = list(store.find('bar.*')) 19 | self.assertEqual(len(nodes), 10) 20 | node = nodes[0] 21 | self.assertEqual(node.path.split('.')[0], 'bar') 22 | 23 | time_info, series = node.fetch(100, 200) 24 | self.assertEqual(time_info, (100, 200, 10)) 25 | self.assertEqual(len(series), 10) 26 | 27 | 28 | class DummyReader(object): 29 | __slots__ = ('path',) 30 | 31 | def __init__(self, path): 32 | self.path = path 33 | 34 | def fetch(self, start_time, end_time): 35 | npoints = (end_time - start_time) / 10 36 | return (start_time, end_time, 10), [ 37 | random.choice([None, 1, 2, 3]) for i in range(npoints) 38 | ] 39 | 40 | def get_intervals(self): 41 | return IntervalSet([Interval(time.time() - 3600, time.time())]) 42 | 43 | 44 | class DummyFinder(object): 45 | def find_nodes(self, query): 46 | if query.pattern == 'foo': 47 | yield BranchNode('foo') 48 | 49 | elif query.pattern == 'bar.*': 50 | for i in xrange(10): 51 | path = 'bar.{0}'.format(i) 52 | yield LeafNode(path, DummyReader(path)) 53 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import os 4 | from glob import glob 5 | from collections import defaultdict 6 | 7 | if os.environ.get('USE_SETUPTOOLS'): 8 | from setuptools import setup 9 | setup_kwargs = dict(zip_safe=0) 10 | 11 | else: 12 | from distutils.core import setup 13 | setup_kwargs = dict() 14 | 15 | 16 | storage_dirs = [] 17 | 18 | for subdir in ('whisper', 'ceres', 'rrd', 'log', 'log/webapp'): 19 | storage_dirs.append( ('storage/%s' % subdir, []) ) 20 | 21 | webapp_content = defaultdict(list) 22 | 23 | for root, dirs, files in os.walk('webapp/content'): 24 | for filename in files: 25 | filepath = os.path.join(root, filename) 26 | webapp_content[root].append(filepath) 27 | 28 | conf_files = [ ('conf', glob('conf/*.example')) ] 29 | examples = [ ('examples', glob('examples/example-*')) ] 30 | 31 | setup( 32 | name='graphite-web', 33 | version='0.10.0-alpha', 34 | url='https://launchpad.net/graphite', 35 | author='Chris Davis', 36 | author_email='chrismd@gmail.com', 37 | license='Apache Software License 2.0', 38 | description='Enterprise scalable realtime graphing', 39 | package_dir={'' : 'webapp'}, 40 | packages=[ 41 | 'graphite', 42 | 'graphite.account', 43 | 'graphite.browser', 44 | 'graphite.cli', 45 | 'graphite.composer', 46 | 'graphite.dashboard', 47 | 'graphite.events', 48 | 'graphite.finders', 49 | 'graphite.graphlot', 50 | 'graphite.metrics', 51 | 'graphite.render', 52 | 'graphite.version', 53 | 'graphite.whitelist', 54 | ], 55 | package_data={'graphite' : 56 | ['templates/*', 'local_settings.py.example']}, 57 | scripts=glob('bin/*'), 58 | data_files=webapp_content.items() + storage_dirs + conf_files + examples, 59 | **setup_kwargs 60 | ) 61 | -------------------------------------------------------------------------------- /bin/run-graphite-devel-server.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import sys, os 4 | import subprocess 5 | from optparse import OptionParser 6 | 7 | option_parser = OptionParser(usage=''' 8 | %prog [options] GRAPHITE_ROOT 9 | ''') 10 | option_parser.add_option('--port', default=8080, action='store', type=int, help='Port to listen on') 11 | option_parser.add_option('--libs', default=None, help='Path to the directory containing the graphite python package') 12 | option_parser.add_option('--noreload', action='store_true', help='Disable monitoring for changes') 13 | 14 | (options, args) = option_parser.parse_args() 15 | 16 | if not args: 17 | option_parser.print_usage() 18 | sys.exit(1) 19 | 20 | graphite_root = args[0] 21 | 22 | django_admin = None 23 | for name in ('django-admin', 'django-admin.py'): 24 | process = subprocess.Popen(['which', name], stdout=subprocess.PIPE) 25 | output = process.stdout.read().strip() 26 | if process.wait() == 0: 27 | django_admin = output 28 | break 29 | 30 | if not django_admin: 31 | print "Could not find a django-admin script!" 32 | sys.exit(1) 33 | 34 | python_path = os.path.join(graphite_root, 'webapp') 35 | 36 | if options.libs: 37 | libdir = os.path.expanduser(options.libs) 38 | print 'Adding %s to your PYTHONPATH' % libdir 39 | os.environ['PYTHONPATH'] = libdir + ':' + os.environ.get('PYTHONPATH','') 40 | 41 | print "Running Graphite from %s under django development server\n" % graphite_root 42 | 43 | command = [ 44 | django_admin, 45 | 'runserver', 46 | '--pythonpath', python_path, 47 | '--settings', 'graphite.settings', 48 | '0.0.0.0:%d' % options.port 49 | ] 50 | 51 | if options.noreload: 52 | command.append('--noreload') 53 | 54 | print ' '.join(command) 55 | os.execvp(django_admin, command) 56 | -------------------------------------------------------------------------------- /docs/releases/0_10_0.rst: -------------------------------------------------------------------------------- 1 | 0.10.0 -- UNDER DEVELOPMENT 2 | =========================== 3 | 4 | .. add the release date below when making a release. 5 | 6 | *no release date* 7 | 8 | Changes 9 | ------- 10 | 11 | * Metrics can be reordered via the composer. 12 | 13 | * A WSGI file has been added to ``graphite-web``. This is especially useful for 14 | people running graphite-web with a standalone WSGI sever such as Gunicorn as 15 | they can directly run ``gunicorn graphite.wsgi`` instead of managing their own 16 | WSGI file. 17 | 18 | * ``manage.py`` is no longer available. The alternative is to use the 19 | ``django-admin.py`` command provided by Django. ``python manage.py 20 | `` can be replaced with ``django-admin.py 21 | --settings=graphite.settings``. 22 | 23 | * The metrics node in the graphite tree has been renamed from "Graphite" to 24 | "Metrics". 25 | 26 | * Pluggable storage finders have been added. This allows graphite to fetch 27 | data from other datastores than Whisper or Ceres. See the :doc:`storage 28 | finder docs <../storage-backends>` for more information. 29 | 30 | * Documentation and settings have been updated to use the up-to-date syntax 31 | for configuring graphite-web's SQL database. Check your config for 32 | ``DATABASE_*`` entries and update them to the new ``DATABASES`` syntax. 33 | 34 | * The search index file is now generated with the ``build-index`` command that 35 | has been rewritten in Python. ``build-index.sh`` is still available but is 36 | just an alias to ``build-index``. 37 | 38 | New functions 39 | ------------- 40 | 41 | See the :doc:`functions documentation <../functions>` for more information. 42 | 43 | * ``aggregateLine`` 44 | * ``isNonNull`` 45 | * ``mapSeries`` 46 | * ``reduceSeries`` 47 | -------------------------------------------------------------------------------- /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) 21 | history = models.TextField(default="") 22 | advancedUI = models.BooleanField(default=False) 23 | __str__ = lambda self: "Profile for %s" % self.user 24 | 25 | class Variable(models.Model): 26 | profile = models.ForeignKey(Profile) 27 | name = models.CharField(max_length=64) 28 | value = models.CharField(max_length=64) 29 | 30 | class View(models.Model): 31 | profile = models.ForeignKey(Profile) 32 | name = models.CharField(max_length=64) 33 | 34 | class Window(models.Model): 35 | view = models.ForeignKey(View) 36 | name = models.CharField(max_length=64) 37 | top = models.IntegerField() 38 | left = models.IntegerField() 39 | width = models.IntegerField() 40 | height = models.IntegerField() 41 | url = models.TextField() 42 | interval = models.IntegerField(null=True) 43 | 44 | class MyGraph(models.Model): 45 | profile = models.ForeignKey(Profile) 46 | name = models.CharField(max_length=64) 47 | url = models.TextField() 48 | -------------------------------------------------------------------------------- /webapp/tests/test_browser.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from django.contrib.auth.models import User 4 | from django.core.urlresolvers import reverse 5 | from django.test import TestCase 6 | from django.test.utils import override_settings 7 | 8 | from . import DATA_DIR 9 | 10 | 11 | class BrowserTest(TestCase): 12 | def test_browser(self): 13 | url = reverse('graphite.browser.views.browser') 14 | response = self.client.get(url) 15 | self.assertContains(response, 'Graphite Browser') 16 | 17 | def test_header(self): 18 | self.assertEqual(User.objects.count(), 0) 19 | url = reverse('graphite.browser.views.header') 20 | response = self.client.get(url) 21 | self.assertContains(response, 'Graphite Browser Header') 22 | 23 | # Graphite has created a default user 24 | self.assertEqual(User.objects.get().username, 'default') 25 | 26 | @override_settings(INDEX_FILE=os.path.join(DATA_DIR, 'index')) 27 | def test_search(self): 28 | url = reverse('graphite.browser.views.search') 29 | 30 | response = self.client.post(url) 31 | self.assertEqual(response.content, '') 32 | 33 | # simple query 34 | response = self.client.post(url, {'query': 'collectd'}) 35 | self.assertEqual(response.content.split(',')[0], 36 | 'collectd.test.df-root.df_complex-free') 37 | 38 | # No match 39 | response = self.client.post(url, {'query': 'other'}) 40 | self.assertEqual(response.content, '') 41 | 42 | # Multiple terms (OR) 43 | response = self.client.post(url, {'query': 'midterm shortterm'}) 44 | self.assertEqual(response.content.split(','), 45 | ['collectd.test.load.load.midterm', 46 | 'collectd.test.load.load.shortterm']) 47 | -------------------------------------------------------------------------------- /webapp/graphite/cli/completer.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 | import sys, os, re 16 | from django.conf import settings 17 | from graphite.util import getProfile 18 | from graphite.logger import log 19 | from graphite.storage import STORE 20 | 21 | 22 | def completeHistory(path, profile): 23 | html = '' 24 | if path[:1] == '!': path = path[1:] 25 | html += "
    " 26 | history = profile.history.split('\n') 27 | for line in history: 28 | line = line.strip() 29 | if not line: continue 30 | if line.startswith(path): 31 | html += "
  • " + line + "
  • " 32 | html += "
" 33 | return html 34 | 35 | def completePath(path, shortnames=False): 36 | # Have to extract the path expression from the command 37 | for prefix in ('draw ','add ','remove '): 38 | if path.startswith(prefix): 39 | path = path[len(prefix):] 40 | break 41 | 42 | pattern = re.sub('\w+\(','',path).replace(')','') + '*' 43 | 44 | results = [] 45 | 46 | for node in STORE.find(pattern): 47 | if shortnames: 48 | results.append(node.name) 49 | else: 50 | results.append(node.path) 51 | 52 | list_items = ["
  • %s
  • " % r for r in results] 53 | list_element = "
      " + '\n'.join(list_items) + "
    " 54 | return list_element 55 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Overview 2 | 3 | Graphite consists of two major components: 4 | 5 | 1. the frontend Django webapp that runs under Apache/mod_wsgi 6 | 2. the backend carbon-cache.py daemon 7 | 8 | Client applications connect to the running carbon-cache.py daemon on port 2003 and send it 9 | lines of text of the following format: 10 | 11 | my.metric.name value unix_timestamp 12 | 13 | For example: 14 | 15 | performance.servers.www01.cpuUsage 42.5 1208815315 16 | 17 | The metric name is like a filesystem path that uses `.` as a separator instead of `/`. 18 | The value is some scalar integer or floating point value. 19 | The unix_timestamp is unix epoch time, as an integer. 20 | 21 | Each line like this corresponds to one data point for one metric. 22 | 23 | Once you've got some clients sending data to carbon-cache, you can view 24 | graphs of that data in the frontend webapp. 25 | 26 | 27 | ## Webapp Installation 28 | 29 | Use the instructions in the INSTALL file. 30 | 31 | 32 | ## Running carbon-cache.py 33 | 34 | First you must tell carbon-cache what user it should run as. 35 | This must be a user with write privileges to `$GRAPHITE_ROOT/storage/whisper/` 36 | Specify the user account in `$GRAPHITE_ROOT/carbon/conf/carbon.conf` 37 | 38 | This user must also have write privileges to `$GRAPHITE_ROOT/storage/log/carbon-cache/` 39 | 40 | 41 | ## Writing a client 42 | 43 | First you obviously need to decide what data it is you want to graph with 44 | graphite. The script `examples/example-client.py` demonstrates a simple client 45 | that sends loadavg data for your local machine to carbon on a minutely basis. 46 | 47 | The default storage schema stores data in one-minute intervals for 2 hours. 48 | This is probably not what you want so you should create a custom storage schema 49 | according to the docs on the graphite wiki (http://graphite.wikidot.com). 50 | -------------------------------------------------------------------------------- /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) " .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 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>=1.4 39 | Twisted==11.1.0 40 | python-memcached==1.47 41 | txAMQP==0.4 42 | simplejson==2.1.6 43 | django-tagging==0.3.1 44 | gunicorn 45 | pytz 46 | pyparsing==1.5.7 47 | http://cairographics.org/releases/py2cairo-1.8.10.tar.gz 48 | git+git://github.com/graphite-project/whisper.git#egg=whisper 49 | git+git://github.com/graphite-project/ceres.git#egg=ceres 50 | -------------------------------------------------------------------------------- /conf/dashboard.conf.example: -------------------------------------------------------------------------------- 1 | # This configuration file controls the behavior of the Dashboard UI, available 2 | # at http://my-graphite-server/dashboard/. 3 | # 4 | # This file must contain a [ui] section that defines values for all of the 5 | # following settings. 6 | [ui] 7 | default_graph_width = 400 8 | default_graph_height = 250 9 | automatic_variants = true 10 | refresh_interval = 60 11 | autocomplete_delay = 375 12 | merge_hover_delay = 750 13 | 14 | # You can set this 'default', 'white', or a custom theme name. 15 | # To create a custom theme, copy the dashboard-default.css file 16 | # to dashboard-myThemeName.css in the content/css directory and 17 | # modify it to your liking. 18 | theme = default 19 | 20 | [keyboard-shortcuts] 21 | toggle_toolbar = ctrl-z 22 | toggle_metrics_panel = ctrl-space 23 | erase_all_graphs = alt-x 24 | save_dashboard = alt-s 25 | completer_add_metrics = alt-enter 26 | completer_del_metrics = alt-backspace 27 | give_completer_focus = shift-space 28 | 29 | # These settings apply to the UI as a whole, all other sections in this file 30 | # pertain only to specific metric types. 31 | # 32 | # The dashboard presents only metrics that fall into specified naming schemes 33 | # defined in this file. This creates a simpler, more targetted view of the 34 | # data. The general form for defining a naming scheme is as follows: 35 | # 36 | #[Metric Type] 37 | #scheme = basis.path... 38 | #field1.label = Foo 39 | #field2.label = Bar 40 | # 41 | # 42 | # Where each will be displayed as a dropdown box 43 | # in the UI and the remaining portion of the namespace 44 | # shown in the Metric Selector panel. The .label options set the labels 45 | # displayed for each dropdown. 46 | # 47 | # For example: 48 | # 49 | #[Sales] 50 | #scheme = sales... 51 | #channel.label = Channel 52 | #type.label = Product Type 53 | #brand.label = Brand 54 | # 55 | # This defines a 'Sales' metric type that uses 3 dropdowns in the Context Selector 56 | # (the upper-left panel) while any deeper metrics (per-product counts or revenue, etc) 57 | # will be available in the Metric Selector (upper-right panel). 58 | -------------------------------------------------------------------------------- /examples/example-client.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | """Copyright 2008 Orbitz WorldWide 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License.""" 15 | 16 | import sys 17 | import time 18 | import os 19 | import platform 20 | import subprocess 21 | from socket import socket 22 | 23 | CARBON_SERVER = '127.0.0.1' 24 | CARBON_PORT = 2003 25 | 26 | delay = 60 27 | if len(sys.argv) > 1: 28 | delay = int( sys.argv[1] ) 29 | 30 | def get_loadavg(): 31 | # For more details, "man proc" and "man uptime" 32 | if platform.system() == "Linux": 33 | return open('/proc/loadavg').read().strip().split()[:3] 34 | else: 35 | command = "uptime" 36 | process = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True) 37 | os.waitpid(process.pid, 0) 38 | output = process.stdout.read().replace(',', ' ').strip().split() 39 | length = len(output) 40 | return output[length - 3:length] 41 | 42 | sock = socket() 43 | try: 44 | sock.connect( (CARBON_SERVER,CARBON_PORT) ) 45 | except: 46 | print "Couldn't connect to %(server)s on port %(port)d, is carbon-agent.py running?" % { 'server':CARBON_SERVER, 'port':CARBON_PORT } 47 | sys.exit(1) 48 | 49 | while True: 50 | now = int( time.time() ) 51 | lines = [] 52 | #We're gonna report all three loadavg values 53 | loadavg = get_loadavg() 54 | lines.append("system.loadavg_1min %s %d" % (loadavg[0],now)) 55 | lines.append("system.loadavg_5min %s %d" % (loadavg[1],now)) 56 | lines.append("system.loadavg_15min %s %d" % (loadavg[2],now)) 57 | message = '\n'.join(lines) + '\n' #all lines must end in a newline 58 | print "sending message\n" 59 | print '-' * 80 60 | print message 61 | print 62 | sock.sendall(message) 63 | time.sleep(delay) 64 | -------------------------------------------------------------------------------- /webapp/graphite/whitelist/views.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 | import os 16 | import pickle 17 | from random import randint 18 | from django.http import HttpResponse 19 | from django.conf import settings 20 | 21 | from graphite.util import unpickle 22 | 23 | 24 | def add(request): 25 | metrics = set( request.POST['metrics'].split() ) 26 | whitelist = load_whitelist() 27 | new_whitelist = whitelist | metrics 28 | save_whitelist(new_whitelist) 29 | return HttpResponse(mimetype="text/plain", content="OK") 30 | 31 | def remove(request): 32 | metrics = set( request.POST['metrics'].split() ) 33 | whitelist = load_whitelist() 34 | new_whitelist = whitelist - metrics 35 | save_whitelist(new_whitelist) 36 | return HttpResponse(mimetype="text/plain", content="OK") 37 | 38 | def show(request): 39 | whitelist = load_whitelist() 40 | members = '\n'.join( sorted(whitelist) ) 41 | return HttpResponse(mimetype="text/plain", content=members) 42 | 43 | def load_whitelist(): 44 | fh = open(settings.WHITELIST_FILE, 'rb') 45 | whitelist = unpickle.load(fh) 46 | fh.close() 47 | return whitelist 48 | 49 | def save_whitelist(whitelist): 50 | serialized = pickle.dumps(whitelist, protocol=-1) #do this instead of dump() to raise potential exceptions before open() 51 | tmpfile = '%s-%d' % (settings.WHITELIST_FILE, randint(0, 100000)) 52 | try: 53 | fh = open(tmpfile, 'wb') 54 | fh.write(serialized) 55 | fh.close() 56 | if os.path.exists(settings.WHITELIST_FILE): 57 | os.unlink(settings.WHITELIST_FILE) 58 | os.rename(tmpfile, settings.WHITELIST_FILE) 59 | finally: 60 | if os.path.exists(tmpfile): 61 | os.unlink(tmpfile) 62 | -------------------------------------------------------------------------------- /docs/overview.rst: -------------------------------------------------------------------------------- 1 | Overview 2 | ================= 3 | 4 | What Graphite is and is not 5 | --------------------------- 6 | Graphite does two things: 7 | 8 | 1. Store numeric time-series data 9 | 2. Render graphs of this data on demand 10 | 11 | What Graphite does not do is collect data for you, however there are some :doc:`tools ` out 12 | there that know how to send data to graphite. Even though it often requires a little code, 13 | :doc:`sending data ` to Graphite is very simple. 14 | 15 | 16 | About the project 17 | ----------------- 18 | Graphite is an enterprise-scale monitoring tool that runs well on cheap hardware. It was 19 | originally designed and written by `Chris Davis`_ at `Orbitz`_ in 2006 as side project that 20 | ultimately grew to be a foundational monitoring tool. In 2008, Orbitz allowed Graphite to be 21 | released under the open source Apache 2.0 license. Since then Chris has continued to work on 22 | Graphite and has deployed it at other companies including `Sears`_, where it serves as a pillar 23 | of the e-commerce monitoring system. Today many large :doc:`companies ` use it. 24 | 25 | 26 | The architecture in a nutshell 27 | ------------------------------ 28 | Graphite consists of 3 software components: 29 | 30 | 1. **carbon** - a `Twisted`_ daemon that listens for time-series data 31 | 2. **whisper** - a simple database library for storing time-series data (similar in design to `RRD`_) 32 | 3. **graphite webapp** - A `Django`_ webapp that renders graphs on-demand using `Cairo`_ 33 | 34 | 35 | :doc:`Feeding in your data ` is pretty easy, typically most 36 | of the effort is in collecting the data to begin with. As you send datapoints 37 | to Carbon, they become immediately available for graphing in the webapp. The 38 | webapp offers several ways to create and display graphs including a simple 39 | :doc:`URL API
    ` for rendering that makes it easy to embed graphs in other 40 | webpages. 41 | 42 | 43 | .. _Django: http://www.djangoproject.com/ 44 | .. _Twisted: http://www.twistedmatrix.com/ 45 | .. _Cairo: http://www.cairographics.org/ 46 | .. _RRD: http://oss.oetiker.ch/rrdtool/ 47 | .. _Chris Davis: mailto:chrismd@gmail.com 48 | .. _Orbitz: http://www.orbitz.com/ 49 | .. _Sears: http://www.sears.com/ 50 | -------------------------------------------------------------------------------- /contrib/munin-graphite.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # 3 | # Written by Adam Jacob 4 | # 5 | # The latest version is available at: 6 | # 7 | # http://github.com/adamhjk/munin-graphite/tree/master/munin-graphite.rb 8 | 9 | require 'socket' 10 | 11 | class Munin 12 | def initialize(host='localhost', port=4949) 13 | @munin = TCPSocket.new(host, port) 14 | @munin.gets 15 | end 16 | 17 | def get_response(cmd) 18 | @munin.puts(cmd) 19 | stop = false 20 | response = Array.new 21 | while stop == false 22 | line = @munin.gets 23 | line.chomp! 24 | if line == '.' 25 | stop = true 26 | else 27 | response << line 28 | stop = true if cmd == "list" 29 | end 30 | end 31 | response 32 | end 33 | 34 | def close 35 | @munin.close 36 | end 37 | end 38 | 39 | class Carbon 40 | def initialize(host='localhost', port=2003) 41 | @carbon = TCPSocket.new(host, port) 42 | end 43 | 44 | def send(msg) 45 | @carbon.puts(msg) 46 | end 47 | 48 | def close 49 | @carbon.close 50 | end 51 | end 52 | 53 | while true 54 | metric_base = "servers." 55 | all_metrics = Array.new 56 | 57 | munin = Munin.new(ARGV[0]) 58 | munin.get_response("nodes").each do |node| 59 | metric_base << node.split(".").reverse.join(".") 60 | puts "Doing #{metric_base}" 61 | munin.get_response("list")[0].split(" ").each do |metric| 62 | puts "Grabbing #{metric}" 63 | mname = "#{metric_base}" 64 | has_category = false 65 | base = false 66 | munin.get_response("config #{metric}").each do |configline| 67 | if configline =~ /graph_category (.+)/ 68 | mname << ".#{$1}" 69 | has_category = true 70 | end 71 | if configline =~ /graph_args.+--base (\d+)/ 72 | base = $1 73 | end 74 | end 75 | mname << ".other" unless has_category 76 | munin.get_response("fetch #{metric}").each do |line| 77 | line =~ /^(.+)\.value\s+(.+)$/ 78 | field = $1 79 | value = $2 80 | all_metrics << "#{mname}.#{metric}.#{field} #{value} #{Time.now.to_i}" 81 | end 82 | end 83 | end 84 | 85 | carbon = Carbon.new(ARGV[1]) 86 | all_metrics.each do |m| 87 | puts "Sending #{m}" 88 | carbon.send(m) 89 | end 90 | sleep 60 91 | end 92 | 93 | -------------------------------------------------------------------------------- /webapp/graphite/account/ldapBackend.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 | import ldap, traceback 16 | from django.conf import settings 17 | from django.contrib.auth.models import User 18 | 19 | 20 | class LDAPBackend: 21 | def authenticate(self, username=None, password=None): 22 | try: 23 | conn = ldap.initialize(settings.LDAP_URI) 24 | conn.protocol_version = ldap.VERSION3 25 | if settings.LDAP_USE_TLS: 26 | conn.start_tls_s() 27 | conn.simple_bind_s( settings.LDAP_BASE_USER, settings.LDAP_BASE_PASS ) 28 | except ldap.LDAPError: 29 | traceback.print_exc() 30 | return None 31 | 32 | scope = ldap.SCOPE_SUBTREE 33 | filter = settings.LDAP_USER_QUERY % username 34 | returnFields = ['dn','mail'] 35 | try: 36 | resultID = conn.search( settings.LDAP_SEARCH_BASE, scope, filter, returnFields ) 37 | resultType, resultData = conn.result( resultID, 0 ) 38 | if len(resultData) != 1: #User does not exist 39 | return None 40 | 41 | userDN = resultData[0][0] 42 | try: 43 | userMail = resultData[0][1]['mail'][0] 44 | except: 45 | userMail = "Unknown" 46 | 47 | conn.simple_bind_s(userDN,password) 48 | try: 49 | user = User.objects.get(username=username) 50 | except: #First time login, not in django's database 51 | randomPasswd = User.objects.make_random_password(length=16) #To prevent login from django db user 52 | user = User.objects.create_user(username, userMail, randomPasswd) 53 | user.save() 54 | 55 | return user 56 | 57 | except ldap.INVALID_CREDENTIALS: 58 | traceback.print_exc() 59 | return None 60 | 61 | def get_user(self,user_id): 62 | try: 63 | return User.objects.get(pk=user_id) 64 | except User.DoesNotExist: 65 | return None 66 | -------------------------------------------------------------------------------- /webapp/graphite/account/views.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.shortcuts import render_to_response 16 | from django.http import HttpResponseRedirect 17 | from django.contrib.auth import authenticate, login, logout 18 | from graphite.util import getProfile 19 | from graphite.logger import log 20 | from graphite.account.models import Profile 21 | 22 | 23 | def loginView(request): 24 | username = request.POST.get('username') 25 | password = request.POST.get('password') 26 | if request.method == 'GET': 27 | nextPage = request.GET.get('nextPage','/') 28 | else: 29 | nextPage = request.POST.get('nextPage','/') 30 | if username and password: 31 | user = authenticate(username=username,password=password) 32 | if user is None: 33 | return render_to_response("login.html",{'authenticationFailed' : True, 'nextPage' : nextPage}) 34 | elif not user.is_active: 35 | return render_to_response("login.html",{'accountDisabled' : True, 'nextPage' : nextPage}) 36 | else: 37 | login(request,user) 38 | return HttpResponseRedirect(nextPage) 39 | else: 40 | return render_to_response("login.html",{'nextPage' : nextPage}) 41 | 42 | def logoutView(request): 43 | nextPage = request.GET.get('nextPage','/') 44 | logout(request) 45 | return HttpResponseRedirect(nextPage) 46 | 47 | def editProfile(request): 48 | if not request.user.is_authenticated(): 49 | return HttpResponseRedirect('../..') 50 | context = { 'profile' : getProfile(request) } 51 | return render_to_response("editProfile.html",context) 52 | 53 | def updateProfile(request): 54 | profile = getProfile(request,allowDefault=False) 55 | if profile: 56 | profile.advancedUI = request.POST.get('advancedUI','off') == 'on' 57 | profile.save() 58 | nextPage = request.POST.get('nextPage','/') 59 | return HttpResponseRedirect(nextPage) 60 | -------------------------------------------------------------------------------- /webapp/content/js/scriptaculous/scriptaculous.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) 2 | // 3 | // Permission is hereby granted, free of charge, to any person obtaining 4 | // a copy of this software and associated documentation files (the 5 | // "Software"), to deal in the Software without restriction, including 6 | // without limitation the rights to use, copy, modify, merge, publish, 7 | // distribute, sublicense, and/or sell copies of the Software, and to 8 | // permit persons to whom the Software is furnished to do so, subject to 9 | // the following conditions: 10 | // 11 | // The above copyright notice and this permission notice shall be 12 | // included in all copies or substantial portions of the Software. 13 | // 14 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 15 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 16 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 17 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 18 | // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 19 | // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 20 | // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | 22 | var Scriptaculous = { 23 | Version: '1.6.2', 24 | require: function(libraryName) { 25 | // inserting via DOM fails in Safari 2.0, so brute force approach 26 | document.write(''); 27 | }, 28 | load: function() { 29 | if((typeof Prototype=='undefined') || 30 | (typeof Element == 'undefined') || 31 | (typeof Element.Methods=='undefined') || 32 | parseFloat(Prototype.Version.split(".")[0] + "." + 33 | Prototype.Version.split(".")[1]) < 1.5) 34 | throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0"); 35 | 36 | $A(document.getElementsByTagName("script")).findAll( function(s) { 37 | return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/)) 38 | }).each( function(s) { 39 | var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,''); 40 | var includes = s.src.match(/\?.*load=([a-z,]*)/); 41 | (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each( 42 | function(include) { Scriptaculous.require(path+include+'.js') }); 43 | }); 44 | } 45 | } 46 | 47 | Scriptaculous.load(); -------------------------------------------------------------------------------- /examples/example-graphite-vhost.conf: -------------------------------------------------------------------------------- 1 | # This needs to be in your server's config somewhere, probably 2 | # the main httpd.conf 3 | # NameVirtualHost *:80 4 | 5 | # This line also needs to be in your server's config. 6 | # LoadModule wsgi_module modules/mod_wsgi.so 7 | 8 | # You need to manually edit this file to fit your needs. 9 | # This configuration assumes the default installation prefix 10 | # of /opt/graphite/, if you installed graphite somewhere else 11 | # you will need to change all the occurances of /opt/graphite/ 12 | # in this file to your chosen install location. 13 | 14 | 15 | LoadModule wsgi_module modules/mod_wsgi.so 16 | 17 | 18 | # XXX You need to set this up! 19 | # Read http://code.google.com/p/modwsgi/wiki/ConfigurationDirectives#WSGISocketPrefix 20 | WSGISocketPrefix run/wsgi 21 | 22 | 23 | ServerName graphite 24 | DocumentRoot "/opt/graphite/webapp" 25 | ErrorLog /opt/graphite/storage/log/webapp/error.log 26 | CustomLog /opt/graphite/storage/log/webapp/access.log common 27 | 28 | # I've found that an equal number of processes & threads tends 29 | # to show the best performance for Graphite (ymmv). 30 | WSGIDaemonProcess graphite processes=5 threads=5 display-name='%{GROUP}' inactivity-timeout=120 31 | WSGIProcessGroup graphite 32 | WSGIApplicationGroup %{GLOBAL} 33 | WSGIImportScript /opt/graphite/conf/graphite.wsgi process-group=graphite application-group=%{GLOBAL} 34 | 35 | # XXX You will need to create this file! There is a graphite.wsgi.example 36 | # file in this directory that you can safely use, just copy it to graphite.wgsi 37 | WSGIScriptAlias / /opt/graphite/conf/graphite.wsgi 38 | 39 | Alias /content/ /opt/graphite/webapp/content/ 40 | 41 | SetHandler None 42 | 43 | 44 | # XXX In order for the django admin site media to work you 45 | # must change @DJANGO_ROOT@ to be the path to your django 46 | # installation, which is probably something like: 47 | # /usr/lib/python2.6/site-packages/django 48 | Alias /media/ "@DJANGO_ROOT@/contrib/admin/media/" 49 | 50 | SetHandler None 51 | 52 | 53 | # The graphite.wsgi file has to be accessible by apache. It won't 54 | # be visible to clients because of the DocumentRoot though. 55 | 56 | Order deny,allow 57 | Allow from all 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /docs/releases/0_9_8.rst: -------------------------------------------------------------------------------- 1 | 0.9.8 2 | ===== 3 | *4/3/11* 4 | 5 | Graphite 0.9.8 is now out and available for download. It available through PyPI 6 | (http://pypi.python.org/pypi) and the Launchpad project page (https://launchpad.net/graphite). 7 | 8 | This release is a major step forward for Graphite, with a long list of substantive enhancements only 9 | 3 months after the last release. One of the highlights is the move of our documentation to 10 | readthedocs.org, the docs are now built using Sphinx and they live in trunk under the 'docs' 11 | folder. Just commit any changes and readthedocs.org will automatically update by pulling changes 12 | from launchpad nightly. 13 | 14 | A special thanks goes out to AppNexus (http://appnexus.com/), who sponsored the development of two 15 | awesome new features. First is the new carbon-aggregator daemon. This new daemon lets you configure 16 | the calculation of aggregate metrics at storage time instead of using a heavy-weight sumSeries or 17 | averageSeries at rendering time. This daemon can also rewrite metric names. You manage it like the 18 | other two carbon daemons, via carbon.conf. Documentation on configuring carbon-aggregator will be 19 | coming soon. 20 | 21 | AppNexus also sponsored the development of the new Dashboard UI. This new interface allows you to 22 | put together dashboards containing many graphs quickly and easily. You can save a dashboard and 23 | view it later. Note that this is a basic implementation for now 24 | 25 | Beyond that, there are many other new features so please read through the changelog carefully. 26 | 27 | Changes 28 | ------- 29 | * New carbon-aggregator daemon can compute your aggregate metrics 30 | * New Dashboard UI 31 | * Upgraded to ExtJS 3.3 32 | * All Documentation is moving to Sphinx in our bzr branch, HTML builds of it are hosted by readthedocs.org (http://graphite.readthedocs.org/) 33 | * The recommended Apache setup is now officially mod_wsgi and not mod_python. 34 | * New metric pattern syntax, eg. {{example.{foo,bar}.metric}}, matches both {{example.foo.metric}} and {{example.bar.metric}} 35 | * Y-axis now draws much more useful labels for values much less 1 36 | * The YAxis=left|right parameter has been renamed to yAxisSide=left|right 37 | * Rewrote webapp/render/grammar.py to be much more readable 38 | * Added new json api call /metrics/expand/?query=foo.* -> \["foo.bar", "foo.baz", ...\] 39 | * Added debugging manhole in carbon-cache.py (ssh-accessible python intepreter interface into carbon at runtime) 40 | * Added new hitcount function (thanks to Shane Hathaway) 41 | * The "User Graphs" tree now works properly for usernames that contain dots 42 | * Fixed data roll-up bug in whisper 43 | * Added AUTOFLUSH option in whisper/carbon for synchronous I/O 44 | * and as always, many more smaller bug fixes 45 | 46 | \- ChrisMD 47 | -------------------------------------------------------------------------------- /webapp/content/js/ace/theme-textmate.js: -------------------------------------------------------------------------------- 1 | define("ace/theme/textmate",["require","exports","module"],function(a,b,c){var d=a("pilot/dom"),e=".ace-tm .ace_editor { border: 2px solid rgb(159, 159, 159);}.ace-tm .ace_editor.ace_focus { border: 2px solid #327fbd;}.ace-tm .ace_gutter { width: 50px; background: #e8e8e8; color: #333; overflow : hidden;}.ace-tm .ace_gutter-layer { width: 100%; text-align: right;}.ace-tm .ace_gutter-layer .ace_gutter-cell { padding-right: 6px;}.ace-tm .ace_print_margin { width: 1px; background: #e8e8e8;}.ace-tm .ace_text-layer { cursor: text;}.ace-tm .ace_cursor { border-left: 2px solid black;}.ace-tm .ace_cursor.ace_overwrite { border-left: 0px; border-bottom: 1px solid black;} .ace-tm .ace_line .ace_invisible { color: rgb(191, 191, 191);}.ace-tm .ace_line .ace_keyword { color: blue;}.ace-tm .ace_line .ace_constant.ace_buildin { color: rgb(88, 72, 246);}.ace-tm .ace_line .ace_constant.ace_language { color: rgb(88, 92, 246);}.ace-tm .ace_line .ace_constant.ace_library { color: rgb(6, 150, 14);}.ace-tm .ace_line .ace_invalid { background-color: rgb(153, 0, 0); color: white;}.ace-tm .ace_line .ace_fold { background-color: #E4E4E4; border-radius: 3px;}.ace-tm .ace_line .ace_support.ace_function { color: rgb(60, 76, 114);}.ace-tm .ace_line .ace_support.ace_constant { color: rgb(6, 150, 14);}.ace-tm .ace_line .ace_support.ace_type,.ace-tm .ace_line .ace_support.ace_class { color: rgb(109, 121, 222);}.ace-tm .ace_line .ace_keyword.ace_operator { color: rgb(104, 118, 135);}.ace-tm .ace_line .ace_string { color: rgb(3, 106, 7);}.ace-tm .ace_line .ace_comment { color: rgb(76, 136, 107);}.ace-tm .ace_line .ace_comment.ace_doc { color: rgb(0, 102, 255);}.ace-tm .ace_line .ace_comment.ace_doc.ace_tag { color: rgb(128, 159, 191);}.ace-tm .ace_line .ace_constant.ace_numeric { color: rgb(0, 0, 205);}.ace-tm .ace_line .ace_variable { color: rgb(49, 132, 149);}.ace-tm .ace_line .ace_xml_pe { color: rgb(104, 104, 91);}.ace-tm .ace_entity.ace_name.ace_function { color: #0000A2;}.ace-tm .ace_markup.ace_markupine { text-decoration:underline;}.ace-tm .ace_markup.ace_heading { color: rgb(12, 7, 255);}.ace-tm .ace_markup.ace_list { color:rgb(185, 6, 144);}.ace-tm .ace_marker-layer .ace_selection { background: rgb(181, 213, 255);}.ace-tm .ace_marker-layer .ace_step { background: rgb(252, 255, 0);}.ace-tm .ace_marker-layer .ace_stack { background: rgb(164, 229, 101);}.ace-tm .ace_marker-layer .ace_bracket { margin: -1px 0 0 -1px; border: 1px solid rgb(192, 192, 192);}.ace-tm .ace_marker-layer .ace_active_line { background: rgba(0, 0, 0, 0.07);}.ace-tm .ace_marker-layer .ace_selected_word { background: rgb(250, 250, 255); border: 1px solid rgb(200, 200, 250);}.ace-tm .ace_meta.ace_tag { color:rgb(28, 2, 255);}.ace-tm .ace_string.ace_regex { color: rgb(255, 0, 0)}";d.importCssString(e),b.cssClass="ace-tm"}) 2 | -------------------------------------------------------------------------------- /webapp/graphite/app_settings.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 | # Django settings for graphite project. 15 | # DO NOT MODIFY THIS FILE DIRECTLY - use local_settings.py instead 16 | from os.path import dirname, join, abspath 17 | 18 | ADMINS = () 19 | MANAGERS = ADMINS 20 | 21 | TEMPLATE_DIRS = ( 22 | join(dirname( abspath(__file__) ), 'templates'), 23 | ) 24 | 25 | #Django settings below, do not touch! 26 | APPEND_SLASH = False 27 | TEMPLATE_DEBUG = False 28 | CACHE_BACKEND = "dummy:///" 29 | 30 | # Language code for this installation. All choices can be found here: 31 | # http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes 32 | # http://blogs.law.harvard.edu/tech/stories/storyReader$15 33 | LANGUAGE_CODE = 'en-us' 34 | 35 | SITE_ID = 1 36 | 37 | # Absolute path to the directory that holds media. 38 | 39 | MEDIA_ROOT = '' 40 | 41 | # URL that handles the media served from MEDIA_ROOT. 42 | # Example: "http://media.lawrence.com" 43 | MEDIA_URL = '' 44 | 45 | # URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a 46 | # trailing slash. 47 | # Examples: "http://foo.com/media/", "/media/". 48 | ADMIN_MEDIA_PREFIX = '/media/' 49 | 50 | # List of callables that know how to import templates from various sources. 51 | TEMPLATE_LOADERS = ( 52 | 'django.template.loaders.filesystem.Loader', 53 | 'django.template.loaders.app_directories.Loader', 54 | ) 55 | 56 | MIDDLEWARE_CLASSES = ( 57 | 'django.middleware.common.CommonMiddleware', 58 | 'django.middleware.gzip.GZipMiddleware', 59 | 'django.contrib.sessions.middleware.SessionMiddleware', 60 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 61 | 'django.contrib.messages.middleware.MessageMiddleware', 62 | ) 63 | 64 | ROOT_URLCONF = 'graphite.urls' 65 | 66 | INSTALLED_APPS = ( 67 | 'graphite.metrics', 68 | 'graphite.render', 69 | 'graphite.cli', 70 | 'graphite.browser', 71 | 'graphite.composer', 72 | 'graphite.account', 73 | 'graphite.dashboard', 74 | 'graphite.whitelist', 75 | 'graphite.events', 76 | 'django.contrib.auth', 77 | 'django.contrib.sessions', 78 | 'django.contrib.admin', 79 | 'django.contrib.contenttypes', 80 | 'tagging', 81 | ) 82 | 83 | AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend'] 84 | 85 | GRAPHITE_WEB_APP_SETTINGS_LOADED = True 86 | -------------------------------------------------------------------------------- /webapp/content/js/ace/keybinding-vim.js: -------------------------------------------------------------------------------- 1 | define("ace/keyboard/keybinding/vim",["require","exports","module","ace/keyboard/state_handler"],function(a,b,c){var d=a("ace/keyboard/state_handler").StateHandler,e=a("ace/keyboard/state_handler").matchCharacterOnly,f=function(a,b,c){return{regex:["([0-9]*)",a],exec:b,params:[{name:"times",match:1,type:"number",defaultValue:1}],then:c}},g={start:[{key:"i",then:"insertMode"},{key:"d",then:"deleteMode"},{key:"a",exec:"gotoright",then:"insertMode"},{key:"shift-i",exec:"gotolinestart",then:"insertMode"},{key:"shift-a",exec:"gotolineend",then:"insertMode"},{key:"shift-c",exec:"removetolineend",then:"insertMode"},{key:"shift-r",exec:"overwrite",then:"replaceMode"},f("(k|up)","golineup"),f("(j|down)","golinedown"),f("(l|right)","golineright"),f("(h|left)","golineleft"),{key:"shift-g",exec:"gotoend"},f("b","gotowordleft"),f("e","gotowordright"),f("x","del"),f("shift-x","backspace"),f("shift-d","removetolineend"),f("u","undo"),{comment:"Catch some keyboard input to stop it here",match:e}],insertMode:[{key:"esc",then:"start"}],replaceMode:[{key:"esc",exec:"overwrite",then:"start"}],deleteMode:[{key:"d",exec:"removeline",then:"start"}]};b.Vim=new d(g)}),define("ace/keyboard/state_handler",["require","exports","module"],function(a,b,c){function e(a){this.keymapping=this.$buildKeymappingRegex(a)}var d=!1;e.prototype={$buildKeymappingRegex:function(a){for(state in a)this.$buildBindingsRegex(a[state]);return a},$buildBindingsRegex:function(a){a.forEach(function(a){a.key?a.key=new RegExp("^"+a.key+"$"):Array.isArray(a.regex)?("key"in a||(a.key=new RegExp("^"+a.regex[1]+"$")),a.regex=new RegExp(a.regex.join("")+"$")):a.regex&&(a.regex=new RegExp(a.regex+"$"))})},$composeBuffer:function(a,b,c){if(a.state==null||a.buffer==null)a.state="start",a.buffer="";var d=[];b&1&&d.push("ctrl"),b&8&&d.push("command"),b&2&&d.push("option"),b&4&&d.push("shift"),c&&d.push(c);var e=d.join("-"),f=a.buffer+e;return b!=2&&(a.buffer=f),{bufferToUse:f,symbolicName:e}},$find:function(a,b,c,e,f){var g={};return this.keymapping[a.state].some(function(h){var i;if(h.key&&!h.key.test(c))return!1;if(h.regex&&!(i=h.regex.exec(b)))return!1;if(h.match&&!h.match(b,e,f,c))return!1;if(h.disallowMatches)for(var j=0;j