├── LICENSE ├── README.md ├── _site ├── assets │ ├── css │ │ ├── app.css │ │ ├── base.css │ │ ├── font-awesome.css │ │ ├── jquery.powertip.min.css │ │ ├── layout.css │ │ ├── skeleton.css │ │ └── table.css │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ └── fontawesome-webfont.woff │ ├── icon │ │ ├── apple-touch-icon-114x114.png │ │ ├── apple-touch-icon-72x72.png │ │ ├── apple-touch-icon.png │ │ └── favicon.ico │ └── js │ │ ├── app.js │ │ ├── d3.v3.min.js │ │ ├── jquery-2.1.0.min.js │ │ ├── jquery-2.1.0.min.map │ │ ├── jquery.powertip.min.js │ │ ├── underscore-min.js │ │ └── underscore-min.map └── index.html ├── plugin-descriptor.properties ├── screenshot-init.png └── screenshot-segments.png /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Xiao Yu 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Whatson — ES Consulting Detective 2 | ================================= 3 | 4 | Whatson is an [elasticsearch](http://elasticsearch.org/) plugin to visualize the state of a cluster. It's inpired by other excellent plugins: 5 | 6 | * [ES Head](https://github.com/mobz/elasticsearch-head) 7 | * [Bigdesk](https://github.com/lukas-vlcek/bigdesk) 8 | * [SegmentSpy](https://github.com/polyfractal/elasticsearch-segmentspy) 9 | 10 | And designed to give a more compact view of key cluster stats especially useful for large clusters with lots of nodes or lots of indices. 11 | 12 | "Hosted" Version 13 | ---------------- 14 | 15 | Whatson can be used directly from its GitHub Pages site without installation. Just click the icon next to "Not Connected" on the top navbar and configure the elasticsearch host Whatson should connect to. Boom. 16 | 17 | [http://whatson.xyu.io/](http://whatson.xyu.io/) 18 | 19 | Installation 20 | ------------ 21 | 22 | To install Whatson run the Elasticsearch plugin installer on any node: 23 | 24 | bin/plugin install xyu/elasticsearch-whatson/0.1.3 25 | 26 | Access the plugin by going to the Whatson plugin site. (E.g. http://localhost:9200/_plugin/whatson/) 27 | 28 | Whatson will automatically connects to the host the plugin is running on with a refresh interval of 5 seconds. To connect to a different cluster or to use another refresh interval click on the status indicator to the right of the cluster name on the topmost bar. 29 | 30 | Usage 31 | ----- 32 | 33 | When Whatson starts available data nodes, indices and their shards will be shown. 34 | 35 | ![Whatson](screenshot-init.png "Whatson") 36 | 37 | The nodes section will show a bar chart of available disk on each node. The bars are color coded as follows: 38 | 39 | * **Gray** — Free disk space on node 40 | * **Brown** — Disk used on node for everything but Elasticsearch 41 | * **Blue** — Disk used by Elasticsearch (all shards green) 42 | * **Yellow** — Disk used by Elasticsearch (some shards on node is in a relocating state) 43 | * **Orange** — Disk used by Elasticsearch (some shards on node is in a recovery / initializing state) 44 | 45 | The red line drawn across the graph shows the percentage of deleted docs on each node. 46 | 47 | The indices section will show a bar chart showing size of each index in the cluster color coded by the state of the index (green / yellow / red). The primary size is shown in a darker shade as compared to the total index size. 48 | 49 | Below each index shards contained within the index will be shown colored corresponding to the size of the primary shard. If any shard exists in an error state they will be colored as follows: 50 | 51 | * **Yellow** — Some shards are in a relocating state 52 | * **Orange** — Some shards are in a recovery or initializing state 53 | * **Red** — Some shards are unassigned 54 | 55 | The red line drawn across the graph shows the percentage of deleted docs in each index. 56 | 57 | To inspect the state of underlaying Lucene segments first select a index or shard within an index. Once selected something like the following will be shown. 58 | 59 | ![Segments Visualization](screenshot-segments.png "Segments Visualization") 60 | 61 | Segments are drawn on a logarithmic scale based on the byte size of the segment and should resemble the visualizations in the [Visualizing Lucene’s Segment Merges](http://blog.mikemccandless.com/2011/02/visualizing-lucenes-segment-merges.html) blog post by Mike McCandless. The bars are color coded as follows: 62 | 63 | * **Yellow** — Uncommitted segments, those that exist in the NRT IndexReader only 64 | * **Brown** — Segments that have been committed (Lucene committed) 65 | * **Blue** — Segments that have both been committed and are in the NRT IndexReader 66 | * **Green** — Segments that have both been committed and are in the NRT IndexReader. In addition these immutable segments are identical to those on the primary shard instance which means they can be recovered from local disk upon a node restart. 67 | 68 | The red line drawn across the graph shows the percentage of deleted docs within each segment. 69 | 70 | Release Notes 71 | ------------- 72 | 73 | 0.1.4 74 | 75 | * Elasticsearch 2.x compatablity 76 | 77 | 0.1.3 78 | 79 | * Improve shard segment graphs 80 | * Show elected master node in nodes section 81 | * Fix handling of unassigned shards and empty indices 82 | * Fix handling of relocating shards 83 | * Show shard details during reallocation and recovery 84 | * General UI improvements 85 | 86 | 0.1.2 87 | 88 | * Make it easier to select small shards 89 | * Prompt for ES host before trying to connect when running in "stand alone" mode 90 | 91 | 0.1.1 92 | 93 | * Compatibility with API changes in Elasticsearch 1.x 94 | * UI tweaks 95 | 96 | 0.1.0 97 | 98 | * Initial Release 99 | 100 | Who's Using Whatson? 101 | -------------------- 102 | 103 | * [WordPress.com](http://developer.wordpress.com/2014/02/12/like-elasticsearch-we-do-too/) 104 | * [Qbox.io](http://blog.qbox.io/monitor-multi-node-elasticsearch-cluster-with-whatson-qbox-io) 105 | -------------------------------------------------------------------------------- /_site/assets/css/app.css: -------------------------------------------------------------------------------- 1 | /** 2 | * | Color | Code | ShardRoutingState | ClusterHealthStatus | IndexShardState | Shard | Disk | Segment | 3 | * | ------ | ------- | ----------------- | ------------------- | --------------- | ------- | ------- | ---------------------------- | 4 | * | Red | #d0363e | UNASSIGNED | RED | CREATED | | Deleted | | 5 | * | Orange | #ef6642 | INITIALIZING | | RECOVERING | | | | 6 | * | Yellow | #f0c556 | RELOCATING | YELLOW | POST_RECOVERY | | | Uncommitted (search) | 7 | * | Green | #74b73f | | GREEN | STARTED (norm) | Primary | | Synced && Same as Primary | 8 | * | Blue | #179fb0 | STARTED (norm) | | | | Index | Synced (committed && search) | 9 | * | Brown | #6a493b | | | RELOCATED | | System | Committed (committed) | 10 | * | Black | #2e2e2e | | | CLOSED | Replica | | | 11 | * | Gray | #eeeeee | | | | | Free | | 12 | * | White | #ffffff | | | | | | | 13 | */ 14 | 15 | /* Top Bar */ 16 | 17 | #navbar { 18 | background: #2e2e2e; 19 | padding: 20px 0; 20 | margin-bottom: 40px; 21 | white-space: nowrap; 22 | text-overflow: ellipsis; 23 | } 24 | #navbar * { 25 | color: #ffffff; 26 | } 27 | #navbar-clustername { 28 | text-align: right; 29 | font-size: 35px; 30 | line-height: 74px; 31 | margin-bottom: 0; 32 | } 33 | #navbar-clustername.status-green * { 34 | color: #74b73f; 35 | } 36 | #navbar-clustername.status-green #navbar-clustername-statusicon:before { 37 | content: "\f058"; 38 | } 39 | #navbar-clustername.status-yellow * { 40 | color: #f0c556; 41 | } 42 | #navbar-clustername.status-yellow #navbar-clustername-statusicon:before { 43 | content: "\f06a"; 44 | } 45 | #navbar-clustername.status-red * { 46 | color: #d0363e; 47 | } 48 | #navbar-clustername.status-red #navbar-clustername-statusicon:before { 49 | content: "\f057"; 50 | } 51 | #navbar-clustername-action:hover #navbar-clustername-statusicon:before { 52 | color: #ffffff; 53 | content: "\f013"; 54 | } 55 | #navbar-clustername-action #navbar-clustername-statusicon.configure:before { 56 | color: #ffffff; 57 | content: "\f139"; 58 | } 59 | #navbar-clusterconfig input { 60 | color: #2e2e2e; 61 | width: 100%; 62 | } 63 | #navbar-clusterconfig input[type=submit] { 64 | width: auto; 65 | float: right; 66 | } 67 | 68 | /* General */ 69 | 70 | h2 small { 71 | font-size: .5em; 72 | opacity: .5; 73 | } 74 | .filter { 75 | float: right 76 | } 77 | .filter::-webkit-input-placeholder::before { 78 | font-family: fontAwesome; 79 | content: ' \f0b0 '; 80 | } 81 | .filter::-moz-placeholder::before { 82 | font-family: fontAwesome; 83 | content: ' \f0b0 '; 84 | } /* firefox 19+ */ 85 | .filter:-ms-input-placeholder::before { 86 | font-family: fontAwesome; 87 | content: ' \f0b0 '; 88 | } /* ie */ 89 | input.filter:-moz-placeholder::before { 90 | font-family: fontAwesome; 91 | content: ' \f0b0 '; 92 | } 93 | .axis path, 94 | .axis line { 95 | fill: none; 96 | stroke: #2e2e2e; 97 | shape-rendering: crispEdges; 98 | } 99 | .axis text, 100 | .shard-legend text { 101 | font-size: .75em; 102 | } 103 | .line { 104 | fill: none; 105 | stroke: #2e2e2e; 106 | stroke-width: 1.5px; 107 | } 108 | .info-footer { 109 | overflow: scroll; 110 | } 111 | .info-footer table * { 112 | white-space: nowrap; 113 | } 114 | .info-footer-value { 115 | width: 90px; 116 | } 117 | td.info-footer-value { 118 | text-align: right; 119 | } 120 | .info-footer-name strong { 121 | width: 45px; 122 | display: inline-block; 123 | } 124 | #footer { 125 | padding-top: 2em; 126 | } 127 | #madewith { 128 | float: right; 129 | } 130 | #powerTip { 131 | font-size: 11px; 132 | line-height: 14px; 133 | } 134 | #powerTip strong { 135 | color: #fff; 136 | font-weight: bold; 137 | display: block; 138 | border-bottom: 1px solid #eee; 139 | margin: 0; 140 | } 141 | #powerTip em { 142 | color: #fff; 143 | font-weight: normal; 144 | display: block; 145 | border-bottom: 1px dotted #eee; 146 | margin: 0.5em 0 0 0; 147 | } 148 | 149 | /* Nodes Section */ 150 | 151 | .node .disk { 152 | fill: rgba(0, 0, 0, 0); 153 | stroke: none; 154 | stroke-width: 1.5px; 155 | } 156 | .node .free { 157 | fill: #eeeeee; 158 | } 159 | .node .system { 160 | fill: #6a493b; 161 | } 162 | .node .index { 163 | fill: #179fb0; 164 | } 165 | .node.shard-state-relocating .disk { 166 | stroke: #f0c556; 167 | } 168 | .node.shard-state-relocating .index { 169 | fill: #f0c556; 170 | } 171 | .node.shard-state-initializing .disk { 172 | stroke: #ef6642; 173 | } 174 | .node.shard-state-initializing .index { 175 | fill: #ef6642; 176 | } 177 | .node.shard-state-unassigned .disk { 178 | stroke: #d0363e; 179 | } 180 | .node.shard-state-unassigned .index { 181 | fill: #d0363e; 182 | } 183 | .node_ratio .line { 184 | stroke: #d0363e; 185 | } 186 | .node_ratio .line-point { 187 | fill: #d0363e; 188 | } 189 | div#nodes-svg-container svg .node { 190 | cursor: pointer; 191 | } 192 | div#nodes-svg-container.hover svg .node { 193 | opacity: 0.75; 194 | } 195 | div#nodes-svg-container.selected svg .node { 196 | opacity: 0.25; 197 | } 198 | div#nodes-svg-container.hover svg .node:hover, 199 | div#nodes-svg-container.selected svg .node.selected { 200 | opacity: 1; 201 | } 202 | #nodes .info-footer tbody.totals { 203 | display: table-row-group; 204 | } 205 | #nodes .info-footer tbody.inspect { 206 | display: none; 207 | } 208 | #nodes .info-footer tbody.monitor { 209 | display: none; 210 | } 211 | #nodes.hover .info-footer tbody.totals { 212 | display: none; 213 | } 214 | #nodes.hover .info-footer tbody.inspect { 215 | display: table-row-group; 216 | } 217 | #nodes.hover .info-footer tbody.monitor { 218 | display: none; 219 | } 220 | #nodes.selected .info-footer tbody.totals { 221 | display: none; 222 | } 223 | #nodes.selected .info-footer tbody.inspect { 224 | display: none; 225 | } 226 | #nodes.selected .info-footer tbody.monitor { 227 | display: table-row-group; 228 | } 229 | 230 | /* Indices & Shards Section */ 231 | 232 | td.info-footer-value.col-status { 233 | text-align: left; 234 | width: 190px; 235 | } 236 | .index.status-green rect { 237 | fill: #74b73f; 238 | } 239 | .index.status-yellow rect { 240 | fill: #f0c556; 241 | } 242 | .index.status-red rect { 243 | fill: #d0363e; 244 | } 245 | .index rect.total { 246 | opacity: 0.5; 247 | } 248 | .index rect.hover-target { 249 | fill: rgba(0, 0, 0, 0); 250 | } 251 | .index_ratio .line { 252 | stroke: #d0363e; 253 | } 254 | .index_ratio .line-point { 255 | fill: #d0363e; 256 | } 257 | div#indices-svg-container svg .index, 258 | div#indices-svg-container svg .shard { 259 | cursor: pointer; 260 | } 261 | div#indices-svg-container.hover svg .index, 262 | div#indices-svg-container.hover svg .shard, 263 | div#indices-svg-container.hover.highlight_shards svg .shard.highlight { 264 | opacity: 0.75; 265 | } 266 | div#indices-svg-container.selected svg .shard, 267 | div#indices-svg-container.selected svg .index, 268 | div#indices-svg-container.selected.highlight_shards svg .shard.highlight { 269 | opacity: 0.25; 270 | } 271 | div#indices-svg-container.highlight_shards svg .shard { 272 | opacity: 0.1; 273 | } 274 | div#indices-svg-container.hover svg .index:hover rect.total { 275 | stroke-width: 2px; 276 | stroke: #2e2e2e; 277 | } 278 | div#indices-svg-container.hover svg .index:hover, 279 | div#indices-svg-container.hover svg .shard:hover, 280 | div#indices-svg-container.selected svg .index.selected, 281 | div#indices-svg-container.selected svg .shard.selected, 282 | div#indices-svg-container.hover.highlight_shards svg .shard.highlight:hover, 283 | div#indices-svg-container.selected.highlight_shards svg .shard.highlight.selected, 284 | div#indices-svg-container.highlight_shards svg .shard.highlight { 285 | opacity: 1; 286 | } 287 | div#indices-svg-container.highlight_shards svg .shard.highlight { 288 | stroke-width: 2px; 289 | stroke: #2e2e2e; 290 | } 291 | div#indices-svg-container.highlight_shards svg .shard.highlight-primary { 292 | stroke: #74b73f; 293 | } 294 | #indices .info-footer tbody.inspect { 295 | display: table-row-group; 296 | } 297 | #indices .info-footer tbody.monitor { 298 | display: none; 299 | } 300 | #indices.selected .info-footer tbody.inspect { 301 | display: none; 302 | } 303 | #indices.selected .info-footer tbody.monitor { 304 | display: table-row-group; 305 | } 306 | 307 | /* Segment Section */ 308 | 309 | .segment.synced-primary rect { 310 | fill: #74b73f; 311 | } 312 | .segment.synced-local rect { 313 | fill: #179fb0; 314 | } 315 | .segment.committed rect { 316 | fill: #6a493b; 317 | } 318 | .segment.uncommitted rect { 319 | fill: #f0c556; 320 | } 321 | .segment rect.hover-target { 322 | fill: #ffffff; 323 | } 324 | -------------------------------------------------------------------------------- /_site/assets/css/base.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Skeleton V1.2 3 | * Copyright 2011, Dave Gamache 4 | * www.getskeleton.com 5 | * Free to use under the MIT license. 6 | * http://www.opensource.org/licenses/mit-license.php 7 | * 6/20/2012 8 | */ 9 | 10 | 11 | /* Table of Content 12 | ================================================== 13 | #Reset & Basics 14 | #Basic Styles 15 | #Site Styles 16 | #Typography 17 | #Links 18 | #Lists 19 | #Images 20 | #Buttons 21 | #Forms 22 | #Misc */ 23 | 24 | 25 | /* #Reset & Basics (Inspired by E. Meyers) 26 | ================================================== */ 27 | html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { 28 | margin: 0; 29 | padding: 0; 30 | border: 0; 31 | font-size: 100%; 32 | font: inherit; 33 | vertical-align: baseline; } 34 | article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { 35 | display: block; } 36 | body { 37 | line-height: 1; } 38 | ol, ul { 39 | list-style: none; } 40 | blockquote, q { 41 | quotes: none; } 42 | blockquote:before, blockquote:after, 43 | q:before, q:after { 44 | content: ''; 45 | content: none; } 46 | table { 47 | border-collapse: collapse; 48 | border-spacing: 0; } 49 | 50 | 51 | /* #Basic Styles 52 | ================================================== */ 53 | body { 54 | background: #fff; 55 | font: 14px/21px "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; 56 | color: #444; 57 | -webkit-font-smoothing: antialiased; /* Fix for webkit rendering */ 58 | -webkit-text-size-adjust: 100%; 59 | } 60 | 61 | 62 | /* #Typography 63 | ================================================== */ 64 | h1, h2, h3, h4, h5, h6 { 65 | color: #181818; 66 | font-family: "Georgia", "Times New Roman", serif; 67 | font-weight: normal; } 68 | h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { font-weight: inherit; } 69 | h1 { font-size: 46px; line-height: 50px; margin-bottom: 14px;} 70 | h2 { font-size: 35px; line-height: 40px; margin-bottom: 10px; } 71 | h3 { font-size: 28px; line-height: 34px; margin-bottom: 8px; } 72 | h4 { font-size: 21px; line-height: 30px; margin-bottom: 4px; } 73 | h5 { font-size: 17px; line-height: 24px; } 74 | h6 { font-size: 14px; line-height: 21px; } 75 | .subheader { color: #777; } 76 | 77 | p { margin: 0 0 20px 0; } 78 | p img { margin: 0; } 79 | p.lead { font-size: 21px; line-height: 27px; color: #777; } 80 | 81 | em { font-style: italic; } 82 | strong { font-weight: bold; color: #333; } 83 | small { font-size: 80%; } 84 | 85 | /* Blockquotes */ 86 | blockquote, blockquote p { font-size: 17px; line-height: 24px; color: #777; font-style: italic; } 87 | blockquote { margin: 0 0 20px; padding: 9px 20px 0 19px; border-left: 1px solid #ddd; } 88 | blockquote cite { display: block; font-size: 12px; color: #555; } 89 | blockquote cite:before { content: "\2014 \0020"; } 90 | blockquote cite a, blockquote cite a:visited, blockquote cite a:visited { color: #555; } 91 | 92 | hr { border: solid #ddd; border-width: 1px 0 0; clear: both; margin: 10px 0 30px; height: 0; } 93 | 94 | 95 | /* #Links 96 | ================================================== */ 97 | a, a:visited { color: #333; text-decoration: underline; outline: 0; } 98 | a:hover, a:focus { color: #000; } 99 | p a, p a:visited { line-height: inherit; } 100 | 101 | 102 | /* #Lists 103 | ================================================== */ 104 | ul, ol { margin-bottom: 20px; } 105 | ul { list-style: none outside; } 106 | ol { list-style: decimal; } 107 | ol, ul.square, ul.circle, ul.disc { margin-left: 30px; } 108 | ul.square { list-style: square outside; } 109 | ul.circle { list-style: circle outside; } 110 | ul.disc { list-style: disc outside; } 111 | ul ul, ul ol, 112 | ol ol, ol ul { margin: 4px 0 5px 30px; font-size: 90%; } 113 | ul ul li, ul ol li, 114 | ol ol li, ol ul li { margin-bottom: 6px; } 115 | li { line-height: 18px; margin-bottom: 12px; } 116 | ul.large li { line-height: 21px; } 117 | li p { line-height: 21px; } 118 | 119 | /* #Images 120 | ================================================== */ 121 | 122 | img.scale-with-grid { 123 | max-width: 100%; 124 | height: auto; } 125 | 126 | 127 | /* #Buttons 128 | ================================================== */ 129 | 130 | .button, 131 | button, 132 | input[type="submit"], 133 | input[type="reset"], 134 | input[type="button"] { 135 | background: #eee; /* Old browsers */ 136 | background: #eee -moz-linear-gradient(top, rgba(255,255,255,.2) 0%, rgba(0,0,0,.2) 100%); /* FF3.6+ */ 137 | background: #eee -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.2)), color-stop(100%,rgba(0,0,0,.2))); /* Chrome,Safari4+ */ 138 | background: #eee -webkit-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Chrome10+,Safari5.1+ */ 139 | background: #eee -o-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Opera11.10+ */ 140 | background: #eee -ms-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* IE10+ */ 141 | background: #eee linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* W3C */ 142 | border: 1px solid #aaa; 143 | border-top: 1px solid #ccc; 144 | border-left: 1px solid #ccc; 145 | -moz-border-radius: 3px; 146 | -webkit-border-radius: 3px; 147 | border-radius: 3px; 148 | color: #444; 149 | display: inline-block; 150 | font-size: 11px; 151 | font-weight: bold; 152 | text-decoration: none; 153 | text-shadow: 0 1px rgba(255, 255, 255, .75); 154 | cursor: pointer; 155 | margin-bottom: 20px; 156 | line-height: normal; 157 | padding: 8px 10px; 158 | font-family: "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; } 159 | 160 | .button:hover, 161 | button:hover, 162 | input[type="submit"]:hover, 163 | input[type="reset"]:hover, 164 | input[type="button"]:hover { 165 | color: #222; 166 | background: #ddd; /* Old browsers */ 167 | background: #ddd -moz-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); /* FF3.6+ */ 168 | background: #ddd -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.3)), color-stop(100%,rgba(0,0,0,.3))); /* Chrome,Safari4+ */ 169 | background: #ddd -webkit-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Chrome10+,Safari5.1+ */ 170 | background: #ddd -o-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Opera11.10+ */ 171 | background: #ddd -ms-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* IE10+ */ 172 | background: #ddd linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* W3C */ 173 | border: 1px solid #888; 174 | border-top: 1px solid #aaa; 175 | border-left: 1px solid #aaa; } 176 | 177 | .button:active, 178 | button:active, 179 | input[type="submit"]:active, 180 | input[type="reset"]:active, 181 | input[type="button"]:active { 182 | border: 1px solid #666; 183 | background: #ccc; /* Old browsers */ 184 | background: #ccc -moz-linear-gradient(top, rgba(255,255,255,.35) 0%, rgba(10,10,10,.4) 100%); /* FF3.6+ */ 185 | background: #ccc -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.35)), color-stop(100%,rgba(10,10,10,.4))); /* Chrome,Safari4+ */ 186 | background: #ccc -webkit-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Chrome10+,Safari5.1+ */ 187 | background: #ccc -o-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Opera11.10+ */ 188 | background: #ccc -ms-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* IE10+ */ 189 | background: #ccc linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* W3C */ } 190 | 191 | .button.full-width, 192 | button.full-width, 193 | input[type="submit"].full-width, 194 | input[type="reset"].full-width, 195 | input[type="button"].full-width { 196 | width: 100%; 197 | padding-left: 0 !important; 198 | padding-right: 0 !important; 199 | text-align: center; } 200 | 201 | /* Fix for odd Mozilla border & padding issues */ 202 | button::-moz-focus-inner, 203 | input::-moz-focus-inner { 204 | border: 0; 205 | padding: 0; 206 | } 207 | 208 | 209 | /* #Forms 210 | ================================================== */ 211 | 212 | form { 213 | margin-bottom: 20px; } 214 | fieldset { 215 | margin-bottom: 20px; } 216 | input[type="text"], 217 | input[type="password"], 218 | input[type="email"], 219 | input[type="number"], 220 | textarea, 221 | select { 222 | border: 1px solid #ccc; 223 | padding: 6px 4px; 224 | outline: none; 225 | -moz-border-radius: 2px; 226 | -webkit-border-radius: 2px; 227 | border-radius: 2px; 228 | font: 13px "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; 229 | color: #777; 230 | margin: 0; 231 | width: 210px; 232 | max-width: 100%; 233 | display: block; 234 | margin-bottom: 20px; 235 | background: #fff; } 236 | select { 237 | padding: 0; } 238 | input[type="text"]:focus, 239 | input[type="password"]:focus, 240 | input[type="email"]:focus, 241 | input[type="number"], 242 | textarea:focus { 243 | border: 1px solid #aaa; 244 | color: #444; 245 | -moz-box-shadow: 0 0 3px rgba(0,0,0,.2); 246 | -webkit-box-shadow: 0 0 3px rgba(0,0,0,.2); 247 | box-shadow: 0 0 3px rgba(0,0,0,.2); } 248 | textarea { 249 | min-height: 60px; } 250 | label, 251 | legend { 252 | display: block; 253 | font-weight: bold; 254 | font-size: 13px; } 255 | select { 256 | width: 220px; } 257 | input[type="checkbox"] { 258 | display: inline; } 259 | label span, 260 | legend span { 261 | font-weight: normal; 262 | font-size: 13px; 263 | color: #444; } 264 | 265 | /* #Misc 266 | ================================================== */ 267 | .remove-bottom { margin-bottom: 0 !important; } 268 | .half-bottom { margin-bottom: 10px !important; } 269 | .add-bottom { margin-bottom: 20px !important; } 270 | 271 | 272 | -------------------------------------------------------------------------------- /_site/assets/css/font-awesome.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | /* FONT PATH 6 | * -------------------------- */ 7 | @font-face { 8 | font-family: 'FontAwesome'; 9 | src: url('../fonts/fontawesome-webfont.eot?v=4.0.3'); 10 | src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); 11 | font-weight: normal; 12 | font-style: normal; 13 | } 14 | .fa { 15 | display: inline-block; 16 | font-family: FontAwesome; 17 | font-style: normal; 18 | font-weight: normal; 19 | line-height: 1; 20 | -webkit-font-smoothing: antialiased; 21 | -moz-osx-font-smoothing: grayscale; 22 | } 23 | /* makes the font 33% larger relative to the icon container */ 24 | .fa-lg { 25 | font-size: 1.3333333333333333em; 26 | line-height: 0.75em; 27 | vertical-align: -15%; 28 | } 29 | .fa-2x { 30 | font-size: 2em; 31 | } 32 | .fa-3x { 33 | font-size: 3em; 34 | } 35 | .fa-4x { 36 | font-size: 4em; 37 | } 38 | .fa-5x { 39 | font-size: 5em; 40 | } 41 | .fa-fw { 42 | width: 1.2857142857142858em; 43 | text-align: center; 44 | } 45 | .fa-ul { 46 | padding-left: 0; 47 | margin-left: 2.142857142857143em; 48 | list-style-type: none; 49 | } 50 | .fa-ul > li { 51 | position: relative; 52 | } 53 | .fa-li { 54 | position: absolute; 55 | left: -2.142857142857143em; 56 | width: 2.142857142857143em; 57 | top: 0.14285714285714285em; 58 | text-align: center; 59 | } 60 | .fa-li.fa-lg { 61 | left: -1.8571428571428572em; 62 | } 63 | .fa-border { 64 | padding: .2em .25em .15em; 65 | border: solid 0.08em #eeeeee; 66 | border-radius: .1em; 67 | } 68 | .pull-right { 69 | float: right; 70 | } 71 | .pull-left { 72 | float: left; 73 | } 74 | .fa.pull-left { 75 | margin-right: .3em; 76 | } 77 | .fa.pull-right { 78 | margin-left: .3em; 79 | } 80 | .fa-spin { 81 | -webkit-animation: spin 2s infinite linear; 82 | -moz-animation: spin 2s infinite linear; 83 | -o-animation: spin 2s infinite linear; 84 | animation: spin 2s infinite linear; 85 | } 86 | @-moz-keyframes spin { 87 | 0% { 88 | -moz-transform: rotate(0deg); 89 | } 90 | 100% { 91 | -moz-transform: rotate(359deg); 92 | } 93 | } 94 | @-webkit-keyframes spin { 95 | 0% { 96 | -webkit-transform: rotate(0deg); 97 | } 98 | 100% { 99 | -webkit-transform: rotate(359deg); 100 | } 101 | } 102 | @-o-keyframes spin { 103 | 0% { 104 | -o-transform: rotate(0deg); 105 | } 106 | 100% { 107 | -o-transform: rotate(359deg); 108 | } 109 | } 110 | @-ms-keyframes spin { 111 | 0% { 112 | -ms-transform: rotate(0deg); 113 | } 114 | 100% { 115 | -ms-transform: rotate(359deg); 116 | } 117 | } 118 | @keyframes spin { 119 | 0% { 120 | transform: rotate(0deg); 121 | } 122 | 100% { 123 | transform: rotate(359deg); 124 | } 125 | } 126 | .fa-rotate-90 { 127 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); 128 | -webkit-transform: rotate(90deg); 129 | -moz-transform: rotate(90deg); 130 | -ms-transform: rotate(90deg); 131 | -o-transform: rotate(90deg); 132 | transform: rotate(90deg); 133 | } 134 | .fa-rotate-180 { 135 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); 136 | -webkit-transform: rotate(180deg); 137 | -moz-transform: rotate(180deg); 138 | -ms-transform: rotate(180deg); 139 | -o-transform: rotate(180deg); 140 | transform: rotate(180deg); 141 | } 142 | .fa-rotate-270 { 143 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); 144 | -webkit-transform: rotate(270deg); 145 | -moz-transform: rotate(270deg); 146 | -ms-transform: rotate(270deg); 147 | -o-transform: rotate(270deg); 148 | transform: rotate(270deg); 149 | } 150 | .fa-flip-horizontal { 151 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); 152 | -webkit-transform: scale(-1, 1); 153 | -moz-transform: scale(-1, 1); 154 | -ms-transform: scale(-1, 1); 155 | -o-transform: scale(-1, 1); 156 | transform: scale(-1, 1); 157 | } 158 | .fa-flip-vertical { 159 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); 160 | -webkit-transform: scale(1, -1); 161 | -moz-transform: scale(1, -1); 162 | -ms-transform: scale(1, -1); 163 | -o-transform: scale(1, -1); 164 | transform: scale(1, -1); 165 | } 166 | .fa-stack { 167 | position: relative; 168 | display: inline-block; 169 | width: 2em; 170 | height: 2em; 171 | line-height: 2em; 172 | vertical-align: middle; 173 | } 174 | .fa-stack-1x, 175 | .fa-stack-2x { 176 | position: absolute; 177 | left: 0; 178 | width: 100%; 179 | text-align: center; 180 | } 181 | .fa-stack-1x { 182 | line-height: inherit; 183 | } 184 | .fa-stack-2x { 185 | font-size: 2em; 186 | } 187 | .fa-inverse { 188 | color: #ffffff; 189 | } 190 | /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen 191 | readers do not read off random characters that represent icons */ 192 | .fa-glass:before { 193 | content: "\f000"; 194 | } 195 | .fa-music:before { 196 | content: "\f001"; 197 | } 198 | .fa-search:before { 199 | content: "\f002"; 200 | } 201 | .fa-envelope-o:before { 202 | content: "\f003"; 203 | } 204 | .fa-heart:before { 205 | content: "\f004"; 206 | } 207 | .fa-star:before { 208 | content: "\f005"; 209 | } 210 | .fa-star-o:before { 211 | content: "\f006"; 212 | } 213 | .fa-user:before { 214 | content: "\f007"; 215 | } 216 | .fa-film:before { 217 | content: "\f008"; 218 | } 219 | .fa-th-large:before { 220 | content: "\f009"; 221 | } 222 | .fa-th:before { 223 | content: "\f00a"; 224 | } 225 | .fa-th-list:before { 226 | content: "\f00b"; 227 | } 228 | .fa-check:before { 229 | content: "\f00c"; 230 | } 231 | .fa-times:before { 232 | content: "\f00d"; 233 | } 234 | .fa-search-plus:before { 235 | content: "\f00e"; 236 | } 237 | .fa-search-minus:before { 238 | content: "\f010"; 239 | } 240 | .fa-power-off:before { 241 | content: "\f011"; 242 | } 243 | .fa-signal:before { 244 | content: "\f012"; 245 | } 246 | .fa-gear:before, 247 | .fa-cog:before { 248 | content: "\f013"; 249 | } 250 | .fa-trash-o:before { 251 | content: "\f014"; 252 | } 253 | .fa-home:before { 254 | content: "\f015"; 255 | } 256 | .fa-file-o:before { 257 | content: "\f016"; 258 | } 259 | .fa-clock-o:before { 260 | content: "\f017"; 261 | } 262 | .fa-road:before { 263 | content: "\f018"; 264 | } 265 | .fa-download:before { 266 | content: "\f019"; 267 | } 268 | .fa-arrow-circle-o-down:before { 269 | content: "\f01a"; 270 | } 271 | .fa-arrow-circle-o-up:before { 272 | content: "\f01b"; 273 | } 274 | .fa-inbox:before { 275 | content: "\f01c"; 276 | } 277 | .fa-play-circle-o:before { 278 | content: "\f01d"; 279 | } 280 | .fa-rotate-right:before, 281 | .fa-repeat:before { 282 | content: "\f01e"; 283 | } 284 | .fa-refresh:before { 285 | content: "\f021"; 286 | } 287 | .fa-list-alt:before { 288 | content: "\f022"; 289 | } 290 | .fa-lock:before { 291 | content: "\f023"; 292 | } 293 | .fa-flag:before { 294 | content: "\f024"; 295 | } 296 | .fa-headphones:before { 297 | content: "\f025"; 298 | } 299 | .fa-volume-off:before { 300 | content: "\f026"; 301 | } 302 | .fa-volume-down:before { 303 | content: "\f027"; 304 | } 305 | .fa-volume-up:before { 306 | content: "\f028"; 307 | } 308 | .fa-qrcode:before { 309 | content: "\f029"; 310 | } 311 | .fa-barcode:before { 312 | content: "\f02a"; 313 | } 314 | .fa-tag:before { 315 | content: "\f02b"; 316 | } 317 | .fa-tags:before { 318 | content: "\f02c"; 319 | } 320 | .fa-book:before { 321 | content: "\f02d"; 322 | } 323 | .fa-bookmark:before { 324 | content: "\f02e"; 325 | } 326 | .fa-print:before { 327 | content: "\f02f"; 328 | } 329 | .fa-camera:before { 330 | content: "\f030"; 331 | } 332 | .fa-font:before { 333 | content: "\f031"; 334 | } 335 | .fa-bold:before { 336 | content: "\f032"; 337 | } 338 | .fa-italic:before { 339 | content: "\f033"; 340 | } 341 | .fa-text-height:before { 342 | content: "\f034"; 343 | } 344 | .fa-text-width:before { 345 | content: "\f035"; 346 | } 347 | .fa-align-left:before { 348 | content: "\f036"; 349 | } 350 | .fa-align-center:before { 351 | content: "\f037"; 352 | } 353 | .fa-align-right:before { 354 | content: "\f038"; 355 | } 356 | .fa-align-justify:before { 357 | content: "\f039"; 358 | } 359 | .fa-list:before { 360 | content: "\f03a"; 361 | } 362 | .fa-dedent:before, 363 | .fa-outdent:before { 364 | content: "\f03b"; 365 | } 366 | .fa-indent:before { 367 | content: "\f03c"; 368 | } 369 | .fa-video-camera:before { 370 | content: "\f03d"; 371 | } 372 | .fa-picture-o:before { 373 | content: "\f03e"; 374 | } 375 | .fa-pencil:before { 376 | content: "\f040"; 377 | } 378 | .fa-map-marker:before { 379 | content: "\f041"; 380 | } 381 | .fa-adjust:before { 382 | content: "\f042"; 383 | } 384 | .fa-tint:before { 385 | content: "\f043"; 386 | } 387 | .fa-edit:before, 388 | .fa-pencil-square-o:before { 389 | content: "\f044"; 390 | } 391 | .fa-share-square-o:before { 392 | content: "\f045"; 393 | } 394 | .fa-check-square-o:before { 395 | content: "\f046"; 396 | } 397 | .fa-arrows:before { 398 | content: "\f047"; 399 | } 400 | .fa-step-backward:before { 401 | content: "\f048"; 402 | } 403 | .fa-fast-backward:before { 404 | content: "\f049"; 405 | } 406 | .fa-backward:before { 407 | content: "\f04a"; 408 | } 409 | .fa-play:before { 410 | content: "\f04b"; 411 | } 412 | .fa-pause:before { 413 | content: "\f04c"; 414 | } 415 | .fa-stop:before { 416 | content: "\f04d"; 417 | } 418 | .fa-forward:before { 419 | content: "\f04e"; 420 | } 421 | .fa-fast-forward:before { 422 | content: "\f050"; 423 | } 424 | .fa-step-forward:before { 425 | content: "\f051"; 426 | } 427 | .fa-eject:before { 428 | content: "\f052"; 429 | } 430 | .fa-chevron-left:before { 431 | content: "\f053"; 432 | } 433 | .fa-chevron-right:before { 434 | content: "\f054"; 435 | } 436 | .fa-plus-circle:before { 437 | content: "\f055"; 438 | } 439 | .fa-minus-circle:before { 440 | content: "\f056"; 441 | } 442 | .fa-times-circle:before { 443 | content: "\f057"; 444 | } 445 | .fa-check-circle:before { 446 | content: "\f058"; 447 | } 448 | .fa-question-circle:before { 449 | content: "\f059"; 450 | } 451 | .fa-info-circle:before { 452 | content: "\f05a"; 453 | } 454 | .fa-crosshairs:before { 455 | content: "\f05b"; 456 | } 457 | .fa-times-circle-o:before { 458 | content: "\f05c"; 459 | } 460 | .fa-check-circle-o:before { 461 | content: "\f05d"; 462 | } 463 | .fa-ban:before { 464 | content: "\f05e"; 465 | } 466 | .fa-arrow-left:before { 467 | content: "\f060"; 468 | } 469 | .fa-arrow-right:before { 470 | content: "\f061"; 471 | } 472 | .fa-arrow-up:before { 473 | content: "\f062"; 474 | } 475 | .fa-arrow-down:before { 476 | content: "\f063"; 477 | } 478 | .fa-mail-forward:before, 479 | .fa-share:before { 480 | content: "\f064"; 481 | } 482 | .fa-expand:before { 483 | content: "\f065"; 484 | } 485 | .fa-compress:before { 486 | content: "\f066"; 487 | } 488 | .fa-plus:before { 489 | content: "\f067"; 490 | } 491 | .fa-minus:before { 492 | content: "\f068"; 493 | } 494 | .fa-asterisk:before { 495 | content: "\f069"; 496 | } 497 | .fa-exclamation-circle:before { 498 | content: "\f06a"; 499 | } 500 | .fa-gift:before { 501 | content: "\f06b"; 502 | } 503 | .fa-leaf:before { 504 | content: "\f06c"; 505 | } 506 | .fa-fire:before { 507 | content: "\f06d"; 508 | } 509 | .fa-eye:before { 510 | content: "\f06e"; 511 | } 512 | .fa-eye-slash:before { 513 | content: "\f070"; 514 | } 515 | .fa-warning:before, 516 | .fa-exclamation-triangle:before { 517 | content: "\f071"; 518 | } 519 | .fa-plane:before { 520 | content: "\f072"; 521 | } 522 | .fa-calendar:before { 523 | content: "\f073"; 524 | } 525 | .fa-random:before { 526 | content: "\f074"; 527 | } 528 | .fa-comment:before { 529 | content: "\f075"; 530 | } 531 | .fa-magnet:before { 532 | content: "\f076"; 533 | } 534 | .fa-chevron-up:before { 535 | content: "\f077"; 536 | } 537 | .fa-chevron-down:before { 538 | content: "\f078"; 539 | } 540 | .fa-retweet:before { 541 | content: "\f079"; 542 | } 543 | .fa-shopping-cart:before { 544 | content: "\f07a"; 545 | } 546 | .fa-folder:before { 547 | content: "\f07b"; 548 | } 549 | .fa-folder-open:before { 550 | content: "\f07c"; 551 | } 552 | .fa-arrows-v:before { 553 | content: "\f07d"; 554 | } 555 | .fa-arrows-h:before { 556 | content: "\f07e"; 557 | } 558 | .fa-bar-chart-o:before { 559 | content: "\f080"; 560 | } 561 | .fa-twitter-square:before { 562 | content: "\f081"; 563 | } 564 | .fa-facebook-square:before { 565 | content: "\f082"; 566 | } 567 | .fa-camera-retro:before { 568 | content: "\f083"; 569 | } 570 | .fa-key:before { 571 | content: "\f084"; 572 | } 573 | .fa-gears:before, 574 | .fa-cogs:before { 575 | content: "\f085"; 576 | } 577 | .fa-comments:before { 578 | content: "\f086"; 579 | } 580 | .fa-thumbs-o-up:before { 581 | content: "\f087"; 582 | } 583 | .fa-thumbs-o-down:before { 584 | content: "\f088"; 585 | } 586 | .fa-star-half:before { 587 | content: "\f089"; 588 | } 589 | .fa-heart-o:before { 590 | content: "\f08a"; 591 | } 592 | .fa-sign-out:before { 593 | content: "\f08b"; 594 | } 595 | .fa-linkedin-square:before { 596 | content: "\f08c"; 597 | } 598 | .fa-thumb-tack:before { 599 | content: "\f08d"; 600 | } 601 | .fa-external-link:before { 602 | content: "\f08e"; 603 | } 604 | .fa-sign-in:before { 605 | content: "\f090"; 606 | } 607 | .fa-trophy:before { 608 | content: "\f091"; 609 | } 610 | .fa-github-square:before { 611 | content: "\f092"; 612 | } 613 | .fa-upload:before { 614 | content: "\f093"; 615 | } 616 | .fa-lemon-o:before { 617 | content: "\f094"; 618 | } 619 | .fa-phone:before { 620 | content: "\f095"; 621 | } 622 | .fa-square-o:before { 623 | content: "\f096"; 624 | } 625 | .fa-bookmark-o:before { 626 | content: "\f097"; 627 | } 628 | .fa-phone-square:before { 629 | content: "\f098"; 630 | } 631 | .fa-twitter:before { 632 | content: "\f099"; 633 | } 634 | .fa-facebook:before { 635 | content: "\f09a"; 636 | } 637 | .fa-github:before { 638 | content: "\f09b"; 639 | } 640 | .fa-unlock:before { 641 | content: "\f09c"; 642 | } 643 | .fa-credit-card:before { 644 | content: "\f09d"; 645 | } 646 | .fa-rss:before { 647 | content: "\f09e"; 648 | } 649 | .fa-hdd-o:before { 650 | content: "\f0a0"; 651 | } 652 | .fa-bullhorn:before { 653 | content: "\f0a1"; 654 | } 655 | .fa-bell:before { 656 | content: "\f0f3"; 657 | } 658 | .fa-certificate:before { 659 | content: "\f0a3"; 660 | } 661 | .fa-hand-o-right:before { 662 | content: "\f0a4"; 663 | } 664 | .fa-hand-o-left:before { 665 | content: "\f0a5"; 666 | } 667 | .fa-hand-o-up:before { 668 | content: "\f0a6"; 669 | } 670 | .fa-hand-o-down:before { 671 | content: "\f0a7"; 672 | } 673 | .fa-arrow-circle-left:before { 674 | content: "\f0a8"; 675 | } 676 | .fa-arrow-circle-right:before { 677 | content: "\f0a9"; 678 | } 679 | .fa-arrow-circle-up:before { 680 | content: "\f0aa"; 681 | } 682 | .fa-arrow-circle-down:before { 683 | content: "\f0ab"; 684 | } 685 | .fa-globe:before { 686 | content: "\f0ac"; 687 | } 688 | .fa-wrench:before { 689 | content: "\f0ad"; 690 | } 691 | .fa-tasks:before { 692 | content: "\f0ae"; 693 | } 694 | .fa-filter:before { 695 | content: "\f0b0"; 696 | } 697 | .fa-briefcase:before { 698 | content: "\f0b1"; 699 | } 700 | .fa-arrows-alt:before { 701 | content: "\f0b2"; 702 | } 703 | .fa-group:before, 704 | .fa-users:before { 705 | content: "\f0c0"; 706 | } 707 | .fa-chain:before, 708 | .fa-link:before { 709 | content: "\f0c1"; 710 | } 711 | .fa-cloud:before { 712 | content: "\f0c2"; 713 | } 714 | .fa-flask:before { 715 | content: "\f0c3"; 716 | } 717 | .fa-cut:before, 718 | .fa-scissors:before { 719 | content: "\f0c4"; 720 | } 721 | .fa-copy:before, 722 | .fa-files-o:before { 723 | content: "\f0c5"; 724 | } 725 | .fa-paperclip:before { 726 | content: "\f0c6"; 727 | } 728 | .fa-save:before, 729 | .fa-floppy-o:before { 730 | content: "\f0c7"; 731 | } 732 | .fa-square:before { 733 | content: "\f0c8"; 734 | } 735 | .fa-bars:before { 736 | content: "\f0c9"; 737 | } 738 | .fa-list-ul:before { 739 | content: "\f0ca"; 740 | } 741 | .fa-list-ol:before { 742 | content: "\f0cb"; 743 | } 744 | .fa-strikethrough:before { 745 | content: "\f0cc"; 746 | } 747 | .fa-underline:before { 748 | content: "\f0cd"; 749 | } 750 | .fa-table:before { 751 | content: "\f0ce"; 752 | } 753 | .fa-magic:before { 754 | content: "\f0d0"; 755 | } 756 | .fa-truck:before { 757 | content: "\f0d1"; 758 | } 759 | .fa-pinterest:before { 760 | content: "\f0d2"; 761 | } 762 | .fa-pinterest-square:before { 763 | content: "\f0d3"; 764 | } 765 | .fa-google-plus-square:before { 766 | content: "\f0d4"; 767 | } 768 | .fa-google-plus:before { 769 | content: "\f0d5"; 770 | } 771 | .fa-money:before { 772 | content: "\f0d6"; 773 | } 774 | .fa-caret-down:before { 775 | content: "\f0d7"; 776 | } 777 | .fa-caret-up:before { 778 | content: "\f0d8"; 779 | } 780 | .fa-caret-left:before { 781 | content: "\f0d9"; 782 | } 783 | .fa-caret-right:before { 784 | content: "\f0da"; 785 | } 786 | .fa-columns:before { 787 | content: "\f0db"; 788 | } 789 | .fa-unsorted:before, 790 | .fa-sort:before { 791 | content: "\f0dc"; 792 | } 793 | .fa-sort-down:before, 794 | .fa-sort-asc:before { 795 | content: "\f0dd"; 796 | } 797 | .fa-sort-up:before, 798 | .fa-sort-desc:before { 799 | content: "\f0de"; 800 | } 801 | .fa-envelope:before { 802 | content: "\f0e0"; 803 | } 804 | .fa-linkedin:before { 805 | content: "\f0e1"; 806 | } 807 | .fa-rotate-left:before, 808 | .fa-undo:before { 809 | content: "\f0e2"; 810 | } 811 | .fa-legal:before, 812 | .fa-gavel:before { 813 | content: "\f0e3"; 814 | } 815 | .fa-dashboard:before, 816 | .fa-tachometer:before { 817 | content: "\f0e4"; 818 | } 819 | .fa-comment-o:before { 820 | content: "\f0e5"; 821 | } 822 | .fa-comments-o:before { 823 | content: "\f0e6"; 824 | } 825 | .fa-flash:before, 826 | .fa-bolt:before { 827 | content: "\f0e7"; 828 | } 829 | .fa-sitemap:before { 830 | content: "\f0e8"; 831 | } 832 | .fa-umbrella:before { 833 | content: "\f0e9"; 834 | } 835 | .fa-paste:before, 836 | .fa-clipboard:before { 837 | content: "\f0ea"; 838 | } 839 | .fa-lightbulb-o:before { 840 | content: "\f0eb"; 841 | } 842 | .fa-exchange:before { 843 | content: "\f0ec"; 844 | } 845 | .fa-cloud-download:before { 846 | content: "\f0ed"; 847 | } 848 | .fa-cloud-upload:before { 849 | content: "\f0ee"; 850 | } 851 | .fa-user-md:before { 852 | content: "\f0f0"; 853 | } 854 | .fa-stethoscope:before { 855 | content: "\f0f1"; 856 | } 857 | .fa-suitcase:before { 858 | content: "\f0f2"; 859 | } 860 | .fa-bell-o:before { 861 | content: "\f0a2"; 862 | } 863 | .fa-coffee:before { 864 | content: "\f0f4"; 865 | } 866 | .fa-cutlery:before { 867 | content: "\f0f5"; 868 | } 869 | .fa-file-text-o:before { 870 | content: "\f0f6"; 871 | } 872 | .fa-building-o:before { 873 | content: "\f0f7"; 874 | } 875 | .fa-hospital-o:before { 876 | content: "\f0f8"; 877 | } 878 | .fa-ambulance:before { 879 | content: "\f0f9"; 880 | } 881 | .fa-medkit:before { 882 | content: "\f0fa"; 883 | } 884 | .fa-fighter-jet:before { 885 | content: "\f0fb"; 886 | } 887 | .fa-beer:before { 888 | content: "\f0fc"; 889 | } 890 | .fa-h-square:before { 891 | content: "\f0fd"; 892 | } 893 | .fa-plus-square:before { 894 | content: "\f0fe"; 895 | } 896 | .fa-angle-double-left:before { 897 | content: "\f100"; 898 | } 899 | .fa-angle-double-right:before { 900 | content: "\f101"; 901 | } 902 | .fa-angle-double-up:before { 903 | content: "\f102"; 904 | } 905 | .fa-angle-double-down:before { 906 | content: "\f103"; 907 | } 908 | .fa-angle-left:before { 909 | content: "\f104"; 910 | } 911 | .fa-angle-right:before { 912 | content: "\f105"; 913 | } 914 | .fa-angle-up:before { 915 | content: "\f106"; 916 | } 917 | .fa-angle-down:before { 918 | content: "\f107"; 919 | } 920 | .fa-desktop:before { 921 | content: "\f108"; 922 | } 923 | .fa-laptop:before { 924 | content: "\f109"; 925 | } 926 | .fa-tablet:before { 927 | content: "\f10a"; 928 | } 929 | .fa-mobile-phone:before, 930 | .fa-mobile:before { 931 | content: "\f10b"; 932 | } 933 | .fa-circle-o:before { 934 | content: "\f10c"; 935 | } 936 | .fa-quote-left:before { 937 | content: "\f10d"; 938 | } 939 | .fa-quote-right:before { 940 | content: "\f10e"; 941 | } 942 | .fa-spinner:before { 943 | content: "\f110"; 944 | } 945 | .fa-circle:before { 946 | content: "\f111"; 947 | } 948 | .fa-mail-reply:before, 949 | .fa-reply:before { 950 | content: "\f112"; 951 | } 952 | .fa-github-alt:before { 953 | content: "\f113"; 954 | } 955 | .fa-folder-o:before { 956 | content: "\f114"; 957 | } 958 | .fa-folder-open-o:before { 959 | content: "\f115"; 960 | } 961 | .fa-smile-o:before { 962 | content: "\f118"; 963 | } 964 | .fa-frown-o:before { 965 | content: "\f119"; 966 | } 967 | .fa-meh-o:before { 968 | content: "\f11a"; 969 | } 970 | .fa-gamepad:before { 971 | content: "\f11b"; 972 | } 973 | .fa-keyboard-o:before { 974 | content: "\f11c"; 975 | } 976 | .fa-flag-o:before { 977 | content: "\f11d"; 978 | } 979 | .fa-flag-checkered:before { 980 | content: "\f11e"; 981 | } 982 | .fa-terminal:before { 983 | content: "\f120"; 984 | } 985 | .fa-code:before { 986 | content: "\f121"; 987 | } 988 | .fa-reply-all:before { 989 | content: "\f122"; 990 | } 991 | .fa-mail-reply-all:before { 992 | content: "\f122"; 993 | } 994 | .fa-star-half-empty:before, 995 | .fa-star-half-full:before, 996 | .fa-star-half-o:before { 997 | content: "\f123"; 998 | } 999 | .fa-location-arrow:before { 1000 | content: "\f124"; 1001 | } 1002 | .fa-crop:before { 1003 | content: "\f125"; 1004 | } 1005 | .fa-code-fork:before { 1006 | content: "\f126"; 1007 | } 1008 | .fa-unlink:before, 1009 | .fa-chain-broken:before { 1010 | content: "\f127"; 1011 | } 1012 | .fa-question:before { 1013 | content: "\f128"; 1014 | } 1015 | .fa-info:before { 1016 | content: "\f129"; 1017 | } 1018 | .fa-exclamation:before { 1019 | content: "\f12a"; 1020 | } 1021 | .fa-superscript:before { 1022 | content: "\f12b"; 1023 | } 1024 | .fa-subscript:before { 1025 | content: "\f12c"; 1026 | } 1027 | .fa-eraser:before { 1028 | content: "\f12d"; 1029 | } 1030 | .fa-puzzle-piece:before { 1031 | content: "\f12e"; 1032 | } 1033 | .fa-microphone:before { 1034 | content: "\f130"; 1035 | } 1036 | .fa-microphone-slash:before { 1037 | content: "\f131"; 1038 | } 1039 | .fa-shield:before { 1040 | content: "\f132"; 1041 | } 1042 | .fa-calendar-o:before { 1043 | content: "\f133"; 1044 | } 1045 | .fa-fire-extinguisher:before { 1046 | content: "\f134"; 1047 | } 1048 | .fa-rocket:before { 1049 | content: "\f135"; 1050 | } 1051 | .fa-maxcdn:before { 1052 | content: "\f136"; 1053 | } 1054 | .fa-chevron-circle-left:before { 1055 | content: "\f137"; 1056 | } 1057 | .fa-chevron-circle-right:before { 1058 | content: "\f138"; 1059 | } 1060 | .fa-chevron-circle-up:before { 1061 | content: "\f139"; 1062 | } 1063 | .fa-chevron-circle-down:before { 1064 | content: "\f13a"; 1065 | } 1066 | .fa-html5:before { 1067 | content: "\f13b"; 1068 | } 1069 | .fa-css3:before { 1070 | content: "\f13c"; 1071 | } 1072 | .fa-anchor:before { 1073 | content: "\f13d"; 1074 | } 1075 | .fa-unlock-alt:before { 1076 | content: "\f13e"; 1077 | } 1078 | .fa-bullseye:before { 1079 | content: "\f140"; 1080 | } 1081 | .fa-ellipsis-h:before { 1082 | content: "\f141"; 1083 | } 1084 | .fa-ellipsis-v:before { 1085 | content: "\f142"; 1086 | } 1087 | .fa-rss-square:before { 1088 | content: "\f143"; 1089 | } 1090 | .fa-play-circle:before { 1091 | content: "\f144"; 1092 | } 1093 | .fa-ticket:before { 1094 | content: "\f145"; 1095 | } 1096 | .fa-minus-square:before { 1097 | content: "\f146"; 1098 | } 1099 | .fa-minus-square-o:before { 1100 | content: "\f147"; 1101 | } 1102 | .fa-level-up:before { 1103 | content: "\f148"; 1104 | } 1105 | .fa-level-down:before { 1106 | content: "\f149"; 1107 | } 1108 | .fa-check-square:before { 1109 | content: "\f14a"; 1110 | } 1111 | .fa-pencil-square:before { 1112 | content: "\f14b"; 1113 | } 1114 | .fa-external-link-square:before { 1115 | content: "\f14c"; 1116 | } 1117 | .fa-share-square:before { 1118 | content: "\f14d"; 1119 | } 1120 | .fa-compass:before { 1121 | content: "\f14e"; 1122 | } 1123 | .fa-toggle-down:before, 1124 | .fa-caret-square-o-down:before { 1125 | content: "\f150"; 1126 | } 1127 | .fa-toggle-up:before, 1128 | .fa-caret-square-o-up:before { 1129 | content: "\f151"; 1130 | } 1131 | .fa-toggle-right:before, 1132 | .fa-caret-square-o-right:before { 1133 | content: "\f152"; 1134 | } 1135 | .fa-euro:before, 1136 | .fa-eur:before { 1137 | content: "\f153"; 1138 | } 1139 | .fa-gbp:before { 1140 | content: "\f154"; 1141 | } 1142 | .fa-dollar:before, 1143 | .fa-usd:before { 1144 | content: "\f155"; 1145 | } 1146 | .fa-rupee:before, 1147 | .fa-inr:before { 1148 | content: "\f156"; 1149 | } 1150 | .fa-cny:before, 1151 | .fa-rmb:before, 1152 | .fa-yen:before, 1153 | .fa-jpy:before { 1154 | content: "\f157"; 1155 | } 1156 | .fa-ruble:before, 1157 | .fa-rouble:before, 1158 | .fa-rub:before { 1159 | content: "\f158"; 1160 | } 1161 | .fa-won:before, 1162 | .fa-krw:before { 1163 | content: "\f159"; 1164 | } 1165 | .fa-bitcoin:before, 1166 | .fa-btc:before { 1167 | content: "\f15a"; 1168 | } 1169 | .fa-file:before { 1170 | content: "\f15b"; 1171 | } 1172 | .fa-file-text:before { 1173 | content: "\f15c"; 1174 | } 1175 | .fa-sort-alpha-asc:before { 1176 | content: "\f15d"; 1177 | } 1178 | .fa-sort-alpha-desc:before { 1179 | content: "\f15e"; 1180 | } 1181 | .fa-sort-amount-asc:before { 1182 | content: "\f160"; 1183 | } 1184 | .fa-sort-amount-desc:before { 1185 | content: "\f161"; 1186 | } 1187 | .fa-sort-numeric-asc:before { 1188 | content: "\f162"; 1189 | } 1190 | .fa-sort-numeric-desc:before { 1191 | content: "\f163"; 1192 | } 1193 | .fa-thumbs-up:before { 1194 | content: "\f164"; 1195 | } 1196 | .fa-thumbs-down:before { 1197 | content: "\f165"; 1198 | } 1199 | .fa-youtube-square:before { 1200 | content: "\f166"; 1201 | } 1202 | .fa-youtube:before { 1203 | content: "\f167"; 1204 | } 1205 | .fa-xing:before { 1206 | content: "\f168"; 1207 | } 1208 | .fa-xing-square:before { 1209 | content: "\f169"; 1210 | } 1211 | .fa-youtube-play:before { 1212 | content: "\f16a"; 1213 | } 1214 | .fa-dropbox:before { 1215 | content: "\f16b"; 1216 | } 1217 | .fa-stack-overflow:before { 1218 | content: "\f16c"; 1219 | } 1220 | .fa-instagram:before { 1221 | content: "\f16d"; 1222 | } 1223 | .fa-flickr:before { 1224 | content: "\f16e"; 1225 | } 1226 | .fa-adn:before { 1227 | content: "\f170"; 1228 | } 1229 | .fa-bitbucket:before { 1230 | content: "\f171"; 1231 | } 1232 | .fa-bitbucket-square:before { 1233 | content: "\f172"; 1234 | } 1235 | .fa-tumblr:before { 1236 | content: "\f173"; 1237 | } 1238 | .fa-tumblr-square:before { 1239 | content: "\f174"; 1240 | } 1241 | .fa-long-arrow-down:before { 1242 | content: "\f175"; 1243 | } 1244 | .fa-long-arrow-up:before { 1245 | content: "\f176"; 1246 | } 1247 | .fa-long-arrow-left:before { 1248 | content: "\f177"; 1249 | } 1250 | .fa-long-arrow-right:before { 1251 | content: "\f178"; 1252 | } 1253 | .fa-apple:before { 1254 | content: "\f179"; 1255 | } 1256 | .fa-windows:before { 1257 | content: "\f17a"; 1258 | } 1259 | .fa-android:before { 1260 | content: "\f17b"; 1261 | } 1262 | .fa-linux:before { 1263 | content: "\f17c"; 1264 | } 1265 | .fa-dribbble:before { 1266 | content: "\f17d"; 1267 | } 1268 | .fa-skype:before { 1269 | content: "\f17e"; 1270 | } 1271 | .fa-foursquare:before { 1272 | content: "\f180"; 1273 | } 1274 | .fa-trello:before { 1275 | content: "\f181"; 1276 | } 1277 | .fa-female:before { 1278 | content: "\f182"; 1279 | } 1280 | .fa-male:before { 1281 | content: "\f183"; 1282 | } 1283 | .fa-gittip:before { 1284 | content: "\f184"; 1285 | } 1286 | .fa-sun-o:before { 1287 | content: "\f185"; 1288 | } 1289 | .fa-moon-o:before { 1290 | content: "\f186"; 1291 | } 1292 | .fa-archive:before { 1293 | content: "\f187"; 1294 | } 1295 | .fa-bug:before { 1296 | content: "\f188"; 1297 | } 1298 | .fa-vk:before { 1299 | content: "\f189"; 1300 | } 1301 | .fa-weibo:before { 1302 | content: "\f18a"; 1303 | } 1304 | .fa-renren:before { 1305 | content: "\f18b"; 1306 | } 1307 | .fa-pagelines:before { 1308 | content: "\f18c"; 1309 | } 1310 | .fa-stack-exchange:before { 1311 | content: "\f18d"; 1312 | } 1313 | .fa-arrow-circle-o-right:before { 1314 | content: "\f18e"; 1315 | } 1316 | .fa-arrow-circle-o-left:before { 1317 | content: "\f190"; 1318 | } 1319 | .fa-toggle-left:before, 1320 | .fa-caret-square-o-left:before { 1321 | content: "\f191"; 1322 | } 1323 | .fa-dot-circle-o:before { 1324 | content: "\f192"; 1325 | } 1326 | .fa-wheelchair:before { 1327 | content: "\f193"; 1328 | } 1329 | .fa-vimeo-square:before { 1330 | content: "\f194"; 1331 | } 1332 | .fa-turkish-lira:before, 1333 | .fa-try:before { 1334 | content: "\f195"; 1335 | } 1336 | .fa-plus-square-o:before { 1337 | content: "\f196"; 1338 | } 1339 | -------------------------------------------------------------------------------- /_site/assets/css/jquery.powertip.min.css: -------------------------------------------------------------------------------- 1 | #powerTip{cursor:default;background-color:#333;background-color:rgba(0,0,0,.8);border-radius:6px;color:#fff;display:none;padding:10px;position:absolute;white-space:nowrap;z-index:2147483647}#powerTip:before{content:"";position:absolute}#powerTip.n:before,#powerTip.s:before{border-right:5px solid transparent;border-left:5px solid transparent;left:50%;margin-left:-5px}#powerTip.e:before,#powerTip.w:before{border-bottom:5px solid transparent;border-top:5px solid transparent;margin-top:-5px;top:50%}#powerTip.n:before{border-top:10px solid #333;border-top:10px solid rgba(0,0,0,.8);bottom:-10px}#powerTip.e:before{border-right:10px solid #333;border-right:10px solid rgba(0,0,0,.8);left:-10px}#powerTip.s:before{border-bottom:10px solid #333;border-bottom:10px solid rgba(0,0,0,.8);top:-10px}#powerTip.w:before{border-left:10px solid #333;border-left:10px solid rgba(0,0,0,.8);right:-10px}#powerTip.ne:before,#powerTip.se:before{border-right:10px solid transparent;border-left:0;left:10px}#powerTip.nw:before,#powerTip.sw:before{border-left:10px solid transparent;border-right:0;right:10px}#powerTip.ne:before,#powerTip.nw:before{border-top:10px solid #333;border-top:10px solid rgba(0,0,0,.8);bottom:-10px}#powerTip.se:before,#powerTip.sw:before{border-bottom:10px solid #333;border-bottom:10px solid rgba(0,0,0,.8);top:-10px}#powerTip.nw-alt:before,#powerTip.ne-alt:before,#powerTip.sw-alt:before,#powerTip.se-alt:before{border-top:10px solid #333;border-top:10px solid rgba(0,0,0,.8);bottom:-10px;border-left:5px solid transparent;border-right:5px solid transparent;left:10px}#powerTip.ne-alt:before{left:auto;right:10px}#powerTip.sw-alt:before,#powerTip.se-alt:before{border-top:0;border-bottom:10px solid #333;border-bottom:10px solid rgba(0,0,0,.8);bottom:auto;top:-10px}#powerTip.se-alt:before{left:auto;right:10px} -------------------------------------------------------------------------------- /_site/assets/css/layout.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Skeleton V1.2 3 | * Copyright 2011, Dave Gamache 4 | * www.getskeleton.com 5 | * Free to use under the MIT license. 6 | * http://www.opensource.org/licenses/mit-license.php 7 | * 6/20/2012 8 | */ 9 | 10 | /* Table of Content 11 | ================================================== 12 | #Site Styles 13 | #Page Styles 14 | #Media Queries 15 | #Font-Face */ 16 | 17 | /* #Site Styles 18 | ================================================== */ 19 | 20 | /* #Page Styles 21 | ================================================== */ 22 | 23 | /* #Media Queries 24 | ================================================== */ 25 | 26 | /* Smaller than standard 960 (devices and browsers) */ 27 | @media only screen and (max-width: 959px) {} 28 | 29 | /* Tablet Portrait size to standard 960 (devices and browsers) */ 30 | @media only screen and (min-width: 768px) and (max-width: 959px) {} 31 | 32 | /* All Mobile Sizes (devices and browser) */ 33 | @media only screen and (max-width: 767px) {} 34 | 35 | /* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ 36 | @media only screen and (min-width: 480px) and (max-width: 767px) {} 37 | 38 | /* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ 39 | @media only screen and (max-width: 479px) {} 40 | 41 | 42 | /* #Font-Face 43 | ================================================== */ 44 | /* This is the proper syntax for an @font-face file 45 | Just create a "fonts" folder at the root, 46 | copy your FontName into code below and remove 47 | comment brackets */ 48 | 49 | /* @font-face { 50 | font-family: 'FontName'; 51 | src: url('../fonts/FontName.eot'); 52 | src: url('../fonts/FontName.eot?iefix') format('eot'), 53 | url('../fonts/FontName.woff') format('woff'), 54 | url('../fonts/FontName.ttf') format('truetype'), 55 | url('../fonts/FontName.svg#webfontZam02nTh') format('svg'); 56 | font-weight: normal; 57 | font-style: normal; } 58 | */ -------------------------------------------------------------------------------- /_site/assets/css/skeleton.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Skeleton V1.2 3 | * Copyright 2011, Dave Gamache 4 | * www.getskeleton.com 5 | * Free to use under the MIT license. 6 | * http://www.opensource.org/licenses/mit-license.php 7 | * 6/20/2012 8 | */ 9 | 10 | 11 | /* Table of Contents 12 | ================================================== 13 | #Base 960 Grid 14 | #Tablet (Portrait) 15 | #Mobile (Portrait) 16 | #Mobile (Landscape) 17 | #Clearing */ 18 | 19 | 20 | 21 | /* #Base 960 Grid 22 | ================================================== */ 23 | 24 | .container { position: relative; width: 960px; margin: 0 auto; padding: 0; } 25 | .container .column, 26 | .container .columns { float: left; display: inline; margin-left: 10px; margin-right: 10px; } 27 | .row { margin-bottom: 20px; } 28 | 29 | /* Nested Column Classes */ 30 | .column.alpha, .columns.alpha { margin-left: 0; } 31 | .column.omega, .columns.omega { margin-right: 0; } 32 | 33 | /* Base Grid */ 34 | .container .one.column, 35 | .container .one.columns { width: 40px; } 36 | .container .two.columns { width: 100px; } 37 | .container .three.columns { width: 160px; } 38 | .container .four.columns { width: 220px; } 39 | .container .five.columns { width: 280px; } 40 | .container .six.columns { width: 340px; } 41 | .container .seven.columns { width: 400px; } 42 | .container .eight.columns { width: 460px; } 43 | .container .nine.columns { width: 520px; } 44 | .container .ten.columns { width: 580px; } 45 | .container .eleven.columns { width: 640px; } 46 | .container .twelve.columns { width: 700px; } 47 | .container .thirteen.columns { width: 760px; } 48 | .container .fourteen.columns { width: 820px; } 49 | .container .fifteen.columns { width: 880px; } 50 | .container .sixteen.columns { width: 940px; } 51 | 52 | .container .one-third.column { width: 300px; } 53 | .container .two-thirds.column { width: 620px; } 54 | 55 | /* Offsets */ 56 | .container .offset-by-one { padding-left: 60px; } 57 | .container .offset-by-two { padding-left: 120px; } 58 | .container .offset-by-three { padding-left: 180px; } 59 | .container .offset-by-four { padding-left: 240px; } 60 | .container .offset-by-five { padding-left: 300px; } 61 | .container .offset-by-six { padding-left: 360px; } 62 | .container .offset-by-seven { padding-left: 420px; } 63 | .container .offset-by-eight { padding-left: 480px; } 64 | .container .offset-by-nine { padding-left: 540px; } 65 | .container .offset-by-ten { padding-left: 600px; } 66 | .container .offset-by-eleven { padding-left: 660px; } 67 | .container .offset-by-twelve { padding-left: 720px; } 68 | .container .offset-by-thirteen { padding-left: 780px; } 69 | .container .offset-by-fourteen { padding-left: 840px; } 70 | .container .offset-by-fifteen { padding-left: 900px; } 71 | 72 | 73 | 74 | /* #Tablet (Portrait) 75 | ================================================== */ 76 | 77 | /* Note: Design for a width of 768px */ 78 | 79 | @media only screen and (min-width: 768px) and (max-width: 959px) { 80 | .container { width: 768px; } 81 | .container .column, 82 | .container .columns { margin-left: 10px; margin-right: 10px; } 83 | .column.alpha, .columns.alpha { margin-left: 0; margin-right: 10px; } 84 | .column.omega, .columns.omega { margin-right: 0; margin-left: 10px; } 85 | .alpha.omega { margin-left: 0; margin-right: 0; } 86 | 87 | .container .one.column, 88 | .container .one.columns { width: 28px; } 89 | .container .two.columns { width: 76px; } 90 | .container .three.columns { width: 124px; } 91 | .container .four.columns { width: 172px; } 92 | .container .five.columns { width: 220px; } 93 | .container .six.columns { width: 268px; } 94 | .container .seven.columns { width: 316px; } 95 | .container .eight.columns { width: 364px; } 96 | .container .nine.columns { width: 412px; } 97 | .container .ten.columns { width: 460px; } 98 | .container .eleven.columns { width: 508px; } 99 | .container .twelve.columns { width: 556px; } 100 | .container .thirteen.columns { width: 604px; } 101 | .container .fourteen.columns { width: 652px; } 102 | .container .fifteen.columns { width: 700px; } 103 | .container .sixteen.columns { width: 748px; } 104 | 105 | .container .one-third.column { width: 236px; } 106 | .container .two-thirds.column { width: 492px; } 107 | 108 | /* Offsets */ 109 | .container .offset-by-one { padding-left: 48px; } 110 | .container .offset-by-two { padding-left: 96px; } 111 | .container .offset-by-three { padding-left: 144px; } 112 | .container .offset-by-four { padding-left: 192px; } 113 | .container .offset-by-five { padding-left: 240px; } 114 | .container .offset-by-six { padding-left: 288px; } 115 | .container .offset-by-seven { padding-left: 336px; } 116 | .container .offset-by-eight { padding-left: 384px; } 117 | .container .offset-by-nine { padding-left: 432px; } 118 | .container .offset-by-ten { padding-left: 480px; } 119 | .container .offset-by-eleven { padding-left: 528px; } 120 | .container .offset-by-twelve { padding-left: 576px; } 121 | .container .offset-by-thirteen { padding-left: 624px; } 122 | .container .offset-by-fourteen { padding-left: 672px; } 123 | .container .offset-by-fifteen { padding-left: 720px; } 124 | } 125 | 126 | 127 | /* #Mobile (Portrait) 128 | ================================================== */ 129 | 130 | /* Note: Design for a width of 320px */ 131 | 132 | @media only screen and (max-width: 767px) { 133 | .container { width: 300px; } 134 | .container .columns, 135 | .container .column { margin: 0; } 136 | 137 | .container .one.column, 138 | .container .one.columns, 139 | .container .two.columns, 140 | .container .three.columns, 141 | .container .four.columns, 142 | .container .five.columns, 143 | .container .six.columns, 144 | .container .seven.columns, 145 | .container .eight.columns, 146 | .container .nine.columns, 147 | .container .ten.columns, 148 | .container .eleven.columns, 149 | .container .twelve.columns, 150 | .container .thirteen.columns, 151 | .container .fourteen.columns, 152 | .container .fifteen.columns, 153 | .container .sixteen.columns, 154 | .container .one-third.column, 155 | .container .two-thirds.column { width: 300px; } 156 | 157 | /* Offsets */ 158 | .container .offset-by-one, 159 | .container .offset-by-two, 160 | .container .offset-by-three, 161 | .container .offset-by-four, 162 | .container .offset-by-five, 163 | .container .offset-by-six, 164 | .container .offset-by-seven, 165 | .container .offset-by-eight, 166 | .container .offset-by-nine, 167 | .container .offset-by-ten, 168 | .container .offset-by-eleven, 169 | .container .offset-by-twelve, 170 | .container .offset-by-thirteen, 171 | .container .offset-by-fourteen, 172 | .container .offset-by-fifteen { padding-left: 0; } 173 | 174 | } 175 | 176 | 177 | /* #Mobile (Landscape) 178 | ================================================== */ 179 | 180 | /* Note: Design for a width of 480px */ 181 | 182 | @media only screen and (min-width: 480px) and (max-width: 767px) { 183 | .container { width: 420px; } 184 | .container .columns, 185 | .container .column { margin: 0; } 186 | 187 | .container .one.column, 188 | .container .one.columns, 189 | .container .two.columns, 190 | .container .three.columns, 191 | .container .four.columns, 192 | .container .five.columns, 193 | .container .six.columns, 194 | .container .seven.columns, 195 | .container .eight.columns, 196 | .container .nine.columns, 197 | .container .ten.columns, 198 | .container .eleven.columns, 199 | .container .twelve.columns, 200 | .container .thirteen.columns, 201 | .container .fourteen.columns, 202 | .container .fifteen.columns, 203 | .container .sixteen.columns, 204 | .container .one-third.column, 205 | .container .two-thirds.column { width: 420px; } 206 | } 207 | 208 | 209 | /* #Clearing 210 | ================================================== */ 211 | 212 | /* Self Clearing Goodness */ 213 | .container:after { content: "\0020"; display: block; height: 0; clear: both; visibility: hidden; } 214 | 215 | /* Use clearfix class on parent to clear nested columns, 216 | or wrap each row of columns in a
*/ 217 | .clearfix:before, 218 | .clearfix:after, 219 | .row:before, 220 | .row:after { 221 | content: '\0020'; 222 | display: block; 223 | overflow: hidden; 224 | visibility: hidden; 225 | width: 0; 226 | height: 0; } 227 | .row:after, 228 | .clearfix:after { 229 | clear: both; } 230 | .row, 231 | .clearfix { 232 | zoom: 1; } 233 | 234 | /* You can also use a
to clear columns */ 235 | .clear { 236 | clear: both; 237 | display: block; 238 | overflow: hidden; 239 | visibility: hidden; 240 | width: 0; 241 | height: 0; 242 | } 243 | -------------------------------------------------------------------------------- /_site/assets/css/table.css: -------------------------------------------------------------------------------- 1 | table { 2 | width: 100%; 3 | border-collapse: collapse; 4 | } 5 | 6 | table th, table td { 7 | padding: 10px 10px 9px; 8 | font-size: 13px; 9 | line-height: 18px; 10 | text-align: left; 11 | } 12 | 13 | table td { 14 | vertical-align: top; 15 | border-top: solid 1px #ddd; 16 | } 17 | 18 | table th { 19 | padding-top: 9px; 20 | font-weight: bold; 21 | vertical-align: middle; 22 | } 23 | 24 | table.condensed th, table.condensed td { 25 | padding: 5px 5px 4px; 26 | } 27 | 28 | table.bordered { 29 | border-collapse: separate; 30 | border: solid 1px #ddd; 31 | -webkit-border-radius: 2px; 32 | -moz-border-radius: 2px; 33 | border-radius: 2px; 34 | } 35 | 36 | table.bordered th + th, 37 | table.bordered th + td, 38 | table.bordered td + td { 39 | border-left: solid 1px #ddd; 40 | } 41 | 42 | .zebra-striped tbody tr:nth-child(odd) td, 43 | .zebra-striped tbody tr:nth-child(odd) th { 44 | background: #f5f5f5; 45 | } -------------------------------------------------------------------------------- /_site/assets/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xyu/elasticsearch-whatson/a856dddbafdebc4a685085c187f57632b96c2bd6/_site/assets/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /_site/assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xyu/elasticsearch-whatson/a856dddbafdebc4a685085c187f57632b96c2bd6/_site/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /_site/assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xyu/elasticsearch-whatson/a856dddbafdebc4a685085c187f57632b96c2bd6/_site/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /_site/assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xyu/elasticsearch-whatson/a856dddbafdebc4a685085c187f57632b96c2bd6/_site/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /_site/assets/icon/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xyu/elasticsearch-whatson/a856dddbafdebc4a685085c187f57632b96c2bd6/_site/assets/icon/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /_site/assets/icon/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xyu/elasticsearch-whatson/a856dddbafdebc4a685085c187f57632b96c2bd6/_site/assets/icon/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /_site/assets/icon/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xyu/elasticsearch-whatson/a856dddbafdebc4a685085c187f57632b96c2bd6/_site/assets/icon/apple-touch-icon.png -------------------------------------------------------------------------------- /_site/assets/icon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xyu/elasticsearch-whatson/a856dddbafdebc4a685085c187f57632b96c2bd6/_site/assets/icon/favicon.ico -------------------------------------------------------------------------------- /_site/assets/js/app.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | 3 | var cluster = { 4 | _info: { 5 | host: '', 6 | name: 'Not Connected', 7 | status: 'red', 8 | version: { 9 | major: null, 10 | minor: null, 11 | patch: null 12 | }, 13 | master_node: null 14 | }, 15 | _is_refreshing: false, 16 | _last_update: null, 17 | _refresh_interval: 5000, 18 | _interval_id: null, 19 | 20 | init: function() { 21 | var self = this; 22 | 23 | // Set default configs 24 | if ( '/_plugin/whatson' == window.location.pathname.substr(0,16) ) { 25 | // Running as ES site plugin 26 | self._info.host = window.location.protocol + '//' + window.location.host; 27 | } else if ( window.location.search.startsWith("?base_uri=") ) { 28 | // ES url passed as a parameter 29 | self._info.host = window.location.search.substr(10); 30 | } else { 31 | // Running elsewhere 32 | self._info.host = ''; 33 | } 34 | $( '#navbar-clusterconfig-host' ).val( self._info.host ); 35 | self._refresh_interval = 5000; 36 | $( '#navbar-clusterconfig-refresh' ).val( self._refresh_interval / 1000 ); 37 | 38 | self.render(); 39 | nodes.init(); 40 | indices.init(); 41 | segments.init(); 42 | 43 | // Get data 44 | self.refresh(); 45 | 46 | // Actions 47 | $( '#navbar-clustername-statusicon' ).on( 'click', function() { 48 | var element = $( this ); 49 | var config_panel = $( '#navbar-clusterconfig' ); 50 | 51 | if ( element.hasClass( 'configure' ) ) { 52 | config_panel.slideUp( 'fast' ); 53 | element.removeClass( 'configure' ); 54 | } else { 55 | config_panel.slideDown( 'fast', function() { 56 | $( '#navbar-clusterconfig-host' ).focus(); 57 | } ); 58 | element.addClass( 'configure' ); 59 | } 60 | } ); 61 | 62 | $( '#navbar-clusterconfig-update' ).on( 'submit', function(event) { 63 | event.preventDefault(); 64 | 65 | var need_refresh = false; 66 | var host = $( '#navbar-clusterconfig-host' ).val(); 67 | if ( '' != host ) { 68 | host = host.replace(/\/$/g, ""); 69 | if ( null == host.match(/^https?:\/\//) ) 70 | host = 'http://' + host; 71 | if ( null == host.match(/:[0-9]*$/) ) 72 | host += ':9200'; 73 | 74 | $( '#navbar-clusterconfig-host' ).val( host ); 75 | } 76 | if ( self._info.host != host ) { 77 | self._info.host = host; 78 | need_refresh = true; 79 | } 80 | 81 | var refresh = $( '#navbar-clusterconfig-refresh' ).val() * 1000; 82 | if ( self._refresh_interval != refresh ) { 83 | self._refresh_interval = refresh; 84 | need_refresh = true; 85 | } 86 | 87 | if ( need_refresh ) { 88 | self.refresh(); 89 | } 90 | 91 | $( '#navbar-clustername-statusicon' ).removeClass( 'configure' ); 92 | $( '#navbar-clusterconfig' ).slideUp( 'fast' ); 93 | } ); 94 | }, 95 | 96 | refresh: function() { 97 | var self = this; 98 | 99 | if ( null != self._interval_id ) { 100 | window.clearInterval( self._interval_id ); 101 | } 102 | 103 | nodes.reset(); 104 | indices.reset(); 105 | self._is_refreshing = false; 106 | 107 | if ( '' == self._info.host ) { 108 | self.set_info( { 109 | 'status': 'red', 110 | 'name': 'No Host Set' 111 | } ); 112 | self.render(); 113 | 114 | $( '#navbar-clustername-statusicon' ).addClass( 'configure' ); 115 | $( '#navbar-clusterconfig' ).slideDown( 'fast', function() { 116 | $( '#navbar-clusterconfig-host' ).focus(); 117 | } ); 118 | 119 | return; 120 | } 121 | 122 | self._interval_id = window.setInterval( function() { 123 | self.sync_data(); 124 | }, self._refresh_interval ); 125 | 126 | self.sync_data(); 127 | }, 128 | 129 | set_info: function( info ) { 130 | var self = this; 131 | self._info = _.defaults( info, self._info ); 132 | return self; 133 | }, 134 | 135 | get_info: function() { 136 | var self = this; 137 | return self._info; 138 | }, 139 | 140 | sync_data: function() { 141 | var self = this; 142 | 143 | if ( self._is_refreshing ) 144 | return; 145 | 146 | self._is_refreshing = true; 147 | 148 | $.when( 149 | $.getJSON( cluster.get_info().host + '/' ), 150 | $.getJSON( cluster.get_info().host + '/_cluster/health' ) 151 | ) 152 | .done(function( result_root, result_health ) { 153 | // Get version 154 | self._info.version = _.object( 155 | ['major','minor','patch'], 156 | result_root[0].version.number.split('.') 157 | ); 158 | 159 | switch( result_health[0].status ) { 160 | case 'green': 161 | self.set_info( { 162 | 'status': 'green', 163 | 'name': result_health[0].cluster_name 164 | } ); 165 | break; 166 | case 'yellow': 167 | self.set_info( { 168 | 'status': 'yellow', 169 | 'name': result_health[0].cluster_name 170 | } ); 171 | break; 172 | case 'red': 173 | self.set_info( { 174 | 'status': 'red', 175 | 'name': result_health[0].cluster_name 176 | } ); 177 | break; 178 | default: 179 | self.set_info( { 180 | 'status': 'red', 181 | 'name': 'Invalid Response' 182 | } ); 183 | break; 184 | } 185 | self._is_refreshing = false; 186 | self._last_update = new Date(); 187 | self.render(); 188 | 189 | nodes.sync_data(); 190 | indices.sync_data(); 191 | }) 192 | .fail(function() { 193 | self.set_info( { 194 | 'status': 'red', 195 | 'name': 'Not Connected' 196 | } ); 197 | self._is_refreshing = false; 198 | self.render(); 199 | }); 200 | }, 201 | 202 | render: function() { 203 | var self = this; 204 | 205 | if ( self._is_refreshing ) 206 | return; 207 | 208 | $( '#navbar-clustername-name' ) 209 | .text( self._info.name ); 210 | $( '#navbar-clustername' ) 211 | .removeClass( 'status-green status-yellow status-red' ) 212 | .addClass( 'status-' + self._info.status ) 213 | } 214 | }; 215 | 216 | var nodes = { 217 | _svg: null, 218 | _svg_padding_x: 40, 219 | _svg_padding_y: 20, 220 | _svg_width: 860, 221 | _svg_height: 260, 222 | _nodes: {}, 223 | _node_shards: {}, 224 | _relocating_shards: {}, 225 | _selected: null, 226 | _hover: null, 227 | _is_refreshing: false, 228 | _last_update: null, 229 | _pause: false, 230 | 231 | init: function() { 232 | var self = this; 233 | 234 | self._svg = d3 235 | .select( '#nodes-svg' ) 236 | .attr( 'width', self._svg_width + self._svg_padding_x * 2 ) 237 | .attr( 'height', self._svg_height + self._svg_padding_y * 2 ) 238 | .attr( 'viewBox', "0 0 " + (self._svg_width + self._svg_padding_x * 2) + " " + (self._svg_height + self._svg_padding_y * 2) ) 239 | .attr( 'preserveAspectRatio', "xMidYMid" ) 240 | .append( 'g' ); 241 | 242 | self.resize(); 243 | $(window).on("resize", function() { 244 | self.resize(); 245 | } ); 246 | 247 | $( '#nodes-filter' ).keyup( function() { 248 | self.render(); 249 | } ); 250 | 251 | // Set hover events 252 | $( document ).on( 'mouseover', '#nodes-svg .node', function() { 253 | var node = $( this ).data( 'node' ); 254 | self._hover = node.id; 255 | self._write_out_info_cells( 256 | node, 257 | $( '#nodes-info-footer tbody.inspect tr' ) 258 | ); 259 | } ); 260 | 261 | $( '#nodes-svg-container' ).on( 'mouseenter', function() { 262 | $( this ).addClass( 'hover' ); 263 | $( '#nodes' ).addClass( 'hover' ); 264 | } ); 265 | 266 | $( '#nodes-svg-container' ).on( 'mouseleave', function() { 267 | $( this ).removeClass( 'hover' ); 268 | $( '#nodes' ).removeClass( 'hover' ); 269 | } ); 270 | 271 | $( '#nodes-svg' ).on( 'mouseover', '.disk', function( event ) { 272 | var element = $( this ) 273 | 274 | self._pause = true; 275 | 276 | if ( !element.data( 'powertip-init' ) ) { 277 | element.powerTip( { 278 | manual: true, 279 | placement: 'e', 280 | smartPlacement: true 281 | } ); 282 | element.data( 'powertip-init', true ); 283 | } 284 | 285 | $.powerTip.show( this, event ); 286 | } ); 287 | $( '#nodes-svg' ).on( 'mouseleave', '.disk', function( event ) { 288 | $.powerTip.hide( this ); 289 | self._pause = false; 290 | } ); 291 | }, 292 | 293 | reset: function() { 294 | var self = this; 295 | self._selected = null; 296 | self._hover = null; 297 | self._is_refreshing = false; 298 | }, 299 | 300 | _write_out_info_cells: function( node, tr ) { 301 | if ( null == node ) 302 | return; 303 | 304 | tr.children( '.col-name' ).text( node.name ); 305 | tr.children( '.col-ver' ).text( node.version ); 306 | tr.children( '.col-total' ).text( d3.format( '.3s' )( node.size.disk ) + 'B' ); 307 | tr.children( '.col-free' ).text( d3.format( '.3s' )( node.size.free ) + 'B' ); 308 | tr.children( '.col-index' ).text( d3.format( '.3s' )( node.size.index ) + 'B' ); 309 | tr.children( '.col-docs' ).text( d3.format( '.3s' )( node.docs.count ) ); 310 | tr.children( '.col-ratio' ).text( d3.format( '.2f' )( node.docs.deleted_ratio * 100 ) + '%' ); 311 | }, 312 | 313 | get_node: function( node_id ) { 314 | var self = this; 315 | 316 | if ( undefined == self._nodes[ node_id ] ) 317 | return false; 318 | else 319 | return self._nodes[ node_id ] 320 | }, 321 | 322 | resize: function() { 323 | var self = this, 324 | aspect = (self._svg_width + self._svg_padding_x * 2) / (self._svg_height + self._svg_padding_y * 2), 325 | chart = $("#nodes-svg"), 326 | targetWidth = chart.parent().width(); 327 | chart.attr("width", targetWidth); 328 | chart.attr("height", targetWidth / aspect); 329 | }, 330 | 331 | sync_data: function() { 332 | var self = this; 333 | 334 | if ( self._is_refreshing || self._pause ) 335 | return; 336 | 337 | self._is_refreshing = true; 338 | 339 | var endpoints = [ 340 | cluster.get_info().host + '/_nodes/_all/attributes', 341 | cluster.get_info().host + '/_nodes/stats/indices,fs', 342 | cluster.get_info().host + '/_cluster/state/master_node' 343 | ]; 344 | 345 | if ( 0 == cluster.get_info().version.major ) { 346 | endpoints = [ 347 | cluster.get_info().host + '/_nodes', 348 | cluster.get_info().host + '/_nodes/stats?fs=true', 349 | cluster.get_info().host + '/_cluster/state?filter_blocks=true&filter_routing_table=true&filter_metadata=true' 350 | ]; 351 | } 352 | 353 | $.when( 354 | $.getJSON( endpoints[0] ), 355 | $.getJSON( endpoints[1] ), 356 | $.getJSON( endpoints[2] ) 357 | ) 358 | .done(function( result_nodes, result_nodes_stats, result_cluster_state ) { 359 | 360 | // Set Master Node ID 361 | cluster.set_info( { 362 | 'master_node': result_cluster_state[0].master_node 363 | } ); 364 | 365 | // Set data 366 | _.each( result_nodes[0].nodes, function( node, node_id ) { 367 | self._nodes[ node_id ] = _.defaults( node, self._nodes[ node_id ] ); 368 | } ); 369 | 370 | _.each( result_nodes_stats[0].nodes, function( node, node_id ) { 371 | var data = _.pick( 372 | node, 373 | [ 'name', 'transport_address', 'host', 'attributes' ] 374 | ); 375 | 376 | if ( 0 == cluster.get_info().version.major ) 377 | data.host = node.hostname; 378 | 379 | data.size = { 380 | 'disk': node.fs.total.total_in_bytes, 381 | 'free': node.fs.total.free_in_bytes, 382 | 'system': node.fs.total.total_in_bytes - node.fs.total.free_in_bytes - node.indices.store.size_in_bytes, 383 | 'index': node.indices.store.size_in_bytes 384 | }; 385 | 386 | data.docs = { 387 | 'count': node.indices.docs.count, 388 | 'deleted': node.indices.docs.deleted, 389 | 'deleted_ratio': get_deleted_ratio( node.indices.docs.count, node.indices.docs.deleted ) 390 | } 391 | 392 | // Set metadata 393 | data.id = node_id; 394 | data.sortkey = data.host.split('.').reverse().join('.') + ' ' + data.name; 395 | 396 | self._nodes[ node_id ] = _.defaults( data, self._nodes[ node_id ] ); 397 | } ); 398 | 399 | // Remove non-existant nodes 400 | var dead_nodes = _.difference( 401 | _.keys( self._nodes ), 402 | _.union( 403 | _.keys( result_nodes[0].nodes ), 404 | _.keys( result_nodes_stats[0].nodes ) 405 | ) 406 | ); 407 | self._nodes = _.omit( self._nodes, dead_nodes ); 408 | 409 | self._is_refreshing = false; 410 | self._last_update = new Date(); 411 | 412 | self.render(); 413 | }) 414 | .fail(function() { 415 | self._is_refreshing = false; 416 | }); 417 | }, 418 | 419 | set_shards: function( node_shards, relocating_shards ) { 420 | var self = this; 421 | self._node_shards = node_shards; 422 | self._relocating_shards = relocating_shards; 423 | self.render(); 424 | }, 425 | 426 | render: function() { 427 | var self = this; 428 | 429 | if ( self._is_refreshing || self._pause ) 430 | return; 431 | 432 | self._update_cluster_totals(); 433 | 434 | if ( null != self._selected ) { 435 | self._write_out_info_cells( 436 | self._nodes[ self._selected ], 437 | $( '#nodes-info-footer tbody.monitor tr' ) 438 | ); 439 | self._highlighted_shards_for_node( self._selected ); 440 | } 441 | 442 | if ( null != self._hover ) { 443 | self._write_out_info_cells( 444 | self._nodes[ self._hover ], 445 | $( '#nodes-info-footer tbody.inspect tr' ) 446 | ); 447 | } 448 | 449 | var filtered_nodes = self._get_filtered_nodes(), 450 | node_x = d3 451 | .scale 452 | .linear() 453 | .range( [ 0, self._svg_width ] ) 454 | .domain( [ 0, filtered_nodes.nodes.length ] ), 455 | node_h = d3 456 | .scale 457 | .linear() 458 | .range( [ self._svg_height, 0 ] ) 459 | .domain( [ 0, d3.max( filtered_nodes.nodes, function(d) { return d.size.disk; } ) ] ), 460 | node_axis = d3 461 | .svg 462 | .axis() 463 | .scale( node_h ) 464 | .orient( "left" ) 465 | .ticks( 5 ) 466 | .tickFormat( function(d) { return d3.format( '.2s' )( d ) + 'B' } ), 467 | ratio_y = d3 468 | .scale 469 | .linear() 470 | .range( [ self._svg_height, 0 ] ) 471 | .domain( [ 0, 0.5 ] ), 472 | ratio_line = d3 473 | .svg 474 | .line() 475 | .x( function(d, i) { return node_x( i + 0.5 ); } ) 476 | .y( function(d) { return ratio_y( d.docs.deleted_ratio ); } ), 477 | ratio_axis = d3 478 | .svg 479 | .axis() 480 | .scale( ratio_y ) 481 | .orient( "right" ) 482 | .ticks( 5 ) 483 | .tickFormat( function(d) { return Math.round( d * 100 ) + '%' } ), 484 | click_event = function( element, d ) { 485 | var e = d3.event, 486 | g = element.parentNode, 487 | isSelected = d3.select( g ).classed( "selected" ); 488 | 489 | // Unselect everything else 490 | d3.selectAll( 'g.selected' ).classed( "selected", false ); 491 | // Toggle select 492 | d3.select( g ).classed( "selected", !isSelected ); 493 | 494 | if ( !isSelected ) { 495 | $( '#nodes-svg-container' ).addClass( 'selected' ); 496 | $( '#nodes' ).addClass( 'selected' ); 497 | self._selected = d.id; 498 | self._write_out_info_cells( 499 | self._nodes[ d.id ], 500 | $( '#nodes-info-footer tbody.monitor tr' ) 501 | ); 502 | self._highlighted_shards_for_node( d.id ); 503 | } else { 504 | $( '#nodes-svg-container' ).removeClass( 'selected' ); 505 | $( '#nodes' ).removeClass( 'selected' ); 506 | self._selected = null; 507 | self._write_out_info_cells( 508 | null, 509 | $( '#nodes-info-footer tbody.monitor tr' ) 510 | ); 511 | 512 | self._highlighted_shards_for_node( null ); 513 | } 514 | }; 515 | 516 | 517 | $( '#nodes h2 small' ).text( 518 | '(' + 519 | filtered_nodes.counts.filtered + 520 | '/' + 521 | filtered_nodes.counts.data + 522 | ' Data, ' + 523 | filtered_nodes.counts.total + 524 | ' Total)' 525 | ); 526 | 527 | self._svg 528 | .selectAll( 'g' ) 529 | .remove(); 530 | 531 | var node_g = self._svg 532 | .selectAll( '.node' ) 533 | .data( filtered_nodes.nodes, function(d) { return d.id; } ) 534 | .enter() 535 | .append( 'g' ) 536 | .attr("transform", "translate("+self._svg_padding_x+","+self._svg_padding_y+")") 537 | .attr( 'data-node', function(d) { return JSON.stringify( d ); } ) 538 | .attr( 'class', function(d) { 539 | var class_names = 'node'; 540 | if ( undefined != self._node_shards[ d.id ] ) { 541 | if ( self._node_shards[ d.id ].UNASSIGNED.length ) 542 | class_names += ' shard-state-unassigned'; // unpossible 543 | if ( self._node_shards[ d.id ].INITIALIZING.length ) 544 | class_names += ' shard-state-initializing'; 545 | if ( self._node_shards[ d.id ].RELOCATING.length ) 546 | class_names += ' shard-state-relocating'; 547 | } 548 | if ( self._selected == d.id ) { 549 | class_names += ' selected'; 550 | } 551 | return class_names 552 | } ) 553 | .attr( 'id', function(d) { return 'node-' + d.id; } ); 554 | 555 | // Index size 556 | node_g 557 | .append( 'rect' ) 558 | .attr( "x", function( d, i ) { 559 | return node_x( i + 1/10 ); 560 | } ) 561 | .attr( "y", function( d ) { 562 | return node_h( d.size.index ); 563 | } ) 564 | .attr( "width", node_x( 1 - 2/10 ) ) 565 | .attr( "height", function( d ) { 566 | return self._svg_height - node_h( d.size.index ); 567 | } ) 568 | .classed( { 'index': true } ); 569 | 570 | // System size 571 | node_g 572 | .append( 'rect' ) 573 | .attr( "x", function( d, i ) { 574 | return node_x( i + 1/10 ); 575 | } ) 576 | .attr( "y", function( d ) { 577 | return node_h( d.size.index + d.size.system ); 578 | } ) 579 | .attr( "width", node_x( 1 - 2/10 ) ) 580 | .attr( "height", function( d ) { 581 | return self._svg_height - node_h( d.size.system ); 582 | } ) 583 | .classed( { 'system': true } ); 584 | 585 | // Free disk 586 | node_g 587 | .append( 'rect' ) 588 | .attr( "x", function( d, i ) { 589 | return node_x( i + 1/10 ); 590 | } ) 591 | .attr( "y", function( d ) { 592 | return node_h( d.size.index + d.size.system + d.size.free ); 593 | } ) 594 | .attr( "width", node_x( 1 - 2/10 ) ) 595 | .attr( "height", function( d ) { 596 | return self._svg_height - node_h( d.size.free ); 597 | } ) 598 | .classed( { 'free': true } ); 599 | 600 | // Disk size, a.k.a. overlay on the entire node column 601 | node_g 602 | .append( 'rect' ) 603 | .attr( "x", function( d, i ) { 604 | return node_x( i + 1/10 ); 605 | } ) 606 | .attr( "y", function( d ) { 607 | return node_h( d.size.disk ); 608 | } ) 609 | .attr( "width", node_x( 1 - 2/10 ) ) 610 | .attr( "height", function( d ) { 611 | return self._svg_height; 612 | } ) 613 | .attr( 'data-powertip', function(d) { 614 | var tooltip = '' + d.name + ''; 615 | tooltip += d3.format( '.3s' )( d.size.index ) + 'B Index'; 616 | tooltip += '
' + d3.format( '.2f' )( d.docs.deleted_ratio * 100 ) + '% Deleted'; 617 | 618 | if ( undefined != self._node_shards[ d.id ] ) { 619 | tooltip += '
' + self._node_shards[ d.id ].STARTED.length + ' Shards'; 620 | if ( self._node_shards[ d.id ].INITIALIZING.length > 0 ) { 621 | tooltip += ', ' + self._node_shards[ d.id ].INITIALIZING.length + ' Initializing'; 622 | } 623 | if ( self._relocating_shards[ d.id ] > 0 ) { 624 | tooltip += ', ' + self._relocating_shards[ d.id ] + ' Relocating In'; 625 | } 626 | if ( self._node_shards[ d.id ].RELOCATING.length > 0 ) { 627 | tooltip += ', ' + self._node_shards[ d.id ].RELOCATING.length + ' Relocating Out'; 628 | } 629 | } 630 | 631 | return tooltip; 632 | } ) 633 | .classed( { 'disk': true } ) 634 | .on( "click", function( d ) { 635 | click_event( this, d ); 636 | } ); 637 | 638 | self._svg 639 | .append("g") 640 | .attr("class", "y axis") 641 | .attr("transform", "translate("+self._svg_padding_x+","+self._svg_padding_y+")") 642 | .call(node_axis) 643 | .selectAll("text") 644 | .attr("dy", "1em") 645 | .attr("transform", "rotate(45)"); 646 | 647 | // Delete ratio 648 | var ratio_g = self._svg 649 | .append( 'g' ) 650 | .attr( 'class', 'node_ratio' ) 651 | .attr("transform", "translate("+self._svg_padding_x+","+self._svg_padding_y+")"); 652 | 653 | ratio_g 654 | .append("path") 655 | .datum(filtered_nodes.nodes) 656 | .attr("class", "line") 657 | .attr("d", ratio_line); 658 | 659 | ratio_g 660 | .selectAll('circle') 661 | .data(filtered_nodes.nodes) 662 | .enter() 663 | .append('circle') 664 | .attr("cx", function(d, i) { return node_x( i + 0.5 ); } ) 665 | .attr("cy", function(d) { return ratio_y( d.docs.deleted_ratio ); } ) 666 | .attr("r", 1.5) 667 | .attr("class", "line-point"); 668 | 669 | self._svg 670 | .append("g") 671 | .attr("class", "y axis ratio") 672 | .attr("transform", "translate("+(self._svg_width+self._svg_padding_x)+","+self._svg_padding_y+")") 673 | .call(ratio_axis); 674 | }, 675 | 676 | _highlighted_shards_for_node: function( node_id ) { 677 | var self = this, 678 | node_shards = self._node_shards, 679 | highlight_shards = {}; 680 | 681 | if ( null == node_id || undefined == node_shards[ node_id ] ) { 682 | indices.set_highlight_shards( {} ); 683 | return; 684 | } 685 | 686 | _.each( 687 | _.union( 688 | node_shards[ node_id ].INITIALIZING, 689 | node_shards[ node_id ].RELOCATING, 690 | node_shards[ node_id ].STARTED 691 | ), 692 | function( shard_instance ) { 693 | if ( undefined == highlight_shards[ shard_instance.index ] ) { 694 | highlight_shards[ shard_instance.index ] = {}; 695 | } 696 | if ( undefined == highlight_shards[ shard_instance.index ][ shard_instance.shard ] ) { 697 | highlight_shards[ shard_instance.index ][ shard_instance.shard ] = 'R'; 698 | } 699 | if ( shard_instance.primary ) { 700 | highlight_shards[ shard_instance.index ][ shard_instance.shard ] = 'P'; 701 | } 702 | } 703 | ); 704 | 705 | indices.set_highlight_shards( highlight_shards ); 706 | }, 707 | 708 | _get_filtered_nodes: function() { 709 | var self = this; 710 | var counts = { 711 | 'total': _.keys( self._nodes ).length, 712 | 'data': 0, 713 | 'filtered': 0, 714 | }; 715 | 716 | // Get only data nodes 717 | var data_nodes = _.filter( self._nodes, function( node ) { 718 | if ( undefined == node.attributes ) 719 | return true; 720 | return ( "false" != node.attributes.data ); 721 | } ); 722 | counts.data = data_nodes.length; 723 | 724 | // Apply filter from UI 725 | var filter = $( '#nodes-filter' ).val(); 726 | if ( '' != filter ) { 727 | var regex = new RegExp( filter, 'i' ); 728 | data_nodes = _.filter( data_nodes, function( node ) { 729 | return null != JSON.stringify( node ).match( regex ); 730 | } ); 731 | } 732 | counts.filtered = data_nodes.length; 733 | 734 | // Sort nodes 735 | data_nodes.sort( function( a, b ) { 736 | return alphanum( a.sortkey, b.sortkey ); 737 | } ); 738 | 739 | return { 740 | 'counts': counts, 741 | 'nodes': data_nodes 742 | }; 743 | }, 744 | 745 | _update_cluster_totals: function() { 746 | var self = this, 747 | cluster_version = '', 748 | cluster_version_mixed = false, 749 | cluster_totals = { 750 | 'disk': 0, 751 | 'free': 0, 752 | 'index': 0, 753 | 'docs': 0, 754 | 'deleted': 0 755 | }; 756 | 757 | _.each( self._nodes, function( node ) { 758 | if ( '' == cluster_version ) 759 | cluster_version = node.version; 760 | if ( cluster_version != node.version ) 761 | cluster_version_mixed = true; 762 | 763 | cluster_totals.disk += node.size.disk; 764 | cluster_totals.free += node.size.free; 765 | cluster_totals.index += node.size.index; 766 | cluster_totals.docs += node.docs.count; 767 | cluster_totals.deleted += node.docs.deleted; 768 | } ); 769 | 770 | var tr = $( '#nodes-info-footer tbody.totals tr' ); 771 | tr.children( '.col-name' ).html( 772 | 'Cluster — ' + self._nodes[ cluster.get_info().master_node ].name + '' 773 | ); 774 | if ( cluster_version_mixed ) 775 | tr.children( '.col-ver' ).html( 'Mixed!' ); 776 | else 777 | tr.children( '.col-ver' ).text( cluster_version ); 778 | tr.children( '.col-total' ).text( d3.format( '.3s' )( cluster_totals.disk ) + 'B' ); 779 | tr.children( '.col-free' ).text( d3.format( '.3s' )( cluster_totals.free ) + 'B' ); 780 | tr.children( '.col-index' ).text( d3.format( '.3s' )( cluster_totals.index ) + 'B' ); 781 | tr.children( '.col-docs' ).text( d3.format( '.3s' )( cluster_totals.docs ) ); 782 | tr.children( '.col-ratio' ).text( d3.format( '.2f' )( get_deleted_ratio( cluster_totals.docs, cluster_totals.deleted ) * 100 ) + '%' ); 783 | } 784 | }; 785 | 786 | var indices = { 787 | _svg: null, 788 | _svg_padding_x: 40, 789 | _svg_padding_y: 20, 790 | _svg_width: 860, 791 | _svg_height: 260, 792 | _indices: {}, 793 | _is_refreshing: false, 794 | _last_update: null, 795 | _selected: { 796 | index: null, 797 | shard: null 798 | }, 799 | _hover: { 800 | index: null, 801 | shard: null 802 | }, 803 | _highlight_shards: {}, 804 | _pause: false, 805 | 806 | init: function() { 807 | var self = this; 808 | 809 | self._svg = d3 810 | .select( '#indices-svg' ) 811 | .attr( 'width', self._svg_width + self._svg_padding_x * 2 ) 812 | .attr( 'height', self._svg_height + self._svg_padding_y * 2 ) 813 | .attr( 'viewBox', "0 0 " + (self._svg_width + self._svg_padding_x * 2) + " " + (self._svg_height + self._svg_padding_y * 2) ) 814 | .attr( 'preserveAspectRatio', "xMidYMid" ) 815 | .append( 'g' ); 816 | 817 | self.resize(); 818 | $(window).on("resize", function() { 819 | self.resize(); 820 | } ); 821 | 822 | $( '#indices-filter' ).keyup( function() { 823 | self.render(); 824 | } ); 825 | 826 | // Set hover events 827 | $( document ).on( 'mouseover', '#indices-svg .index', function() { 828 | var index = $( this ).data( 'index' ); 829 | self._hover = { 830 | index: index.id, 831 | shard: null 832 | }; 833 | self._write_out_info_cells( 834 | index, 835 | null, 836 | $( '#indices-info-footer tbody.inspect tr.index' ), 837 | $( '#indices-info-footer tbody.inspect tr.shard' ) 838 | ); 839 | } ); 840 | 841 | $( document ).on( 'mouseover', '#indices-svg .shard', function() { 842 | var index = $( this ).data( 'index' ); 843 | var shard = $( this ).data( 'shard' ); 844 | self._hover = { 845 | index: index.id, 846 | shard: shard.shard_num 847 | }; 848 | self._write_out_info_cells( 849 | index, 850 | shard, 851 | $( '#indices-info-footer tbody.inspect tr.index' ), 852 | $( '#indices-info-footer tbody.inspect tr.shard' ) 853 | ); 854 | } ); 855 | 856 | $( document ).on( 'mouseleave', '#indices-svg .index, #indices-svg .shard', function() { 857 | self._hover = { 858 | index: null, 859 | shard: null 860 | }; 861 | } ); 862 | 863 | $( document ).on( 'click', '#indices-svg .index', function() { 864 | self._write_out_info_cells( 865 | $( this ).data( 'index' ), 866 | null, 867 | $( '#indices-info-footer tbody.monitor tr.index' ), 868 | $( '#indices-info-footer tbody.monitor tr.shard' ) 869 | ); 870 | } ); 871 | 872 | $( document ).on( 'click', '#indices-svg .shard', function() { 873 | self._write_out_info_cells( 874 | $( this ).data( 'index' ), 875 | $( this ).data( 'shard' ), 876 | $( '#indices-info-footer tbody.monitor tr.index' ), 877 | $( '#indices-info-footer tbody.monitor tr.shard' ) 878 | ); 879 | } ); 880 | 881 | $( '#indices-svg-container' ).on( 'mouseenter', function() { 882 | $( this ).addClass( 'hover' ); 883 | $( '#indices' ).addClass( 'hover' ); 884 | } ); 885 | 886 | $( '#indices-svg-container' ).on( 'mouseleave', function() { 887 | $( this ).removeClass( 'hover' ); 888 | $( '#indices' ).removeClass( 'hover' ); 889 | 890 | self._write_out_info_cells( 891 | null, 892 | null, 893 | $( '#indices-info-footer tbody.inspect tr.index' ), 894 | $( '#indices-info-footer tbody.inspect tr.shard' ) 895 | ); 896 | } ); 897 | 898 | $( '#indices-svg' ).on( 'mouseover', '.hover-target, .shard rect', function( event ) { 899 | var element = $( this ) 900 | 901 | self._pause = true; 902 | 903 | if ( !element.data( 'powertip-init' ) ) { 904 | var placement = ( 'hover-target' == element.attr( 'class' ) ? 's' : 'n' ); 905 | 906 | element.powerTip( { 907 | manual: true, 908 | placement: placement, 909 | smartPlacement: true 910 | } ); 911 | element.data( 'powertip-init', true ); 912 | } 913 | 914 | $.powerTip.show( this, event ); 915 | } ); 916 | $( '#indices-svg' ).on( 'mouseleave', '.hover-target, .shard rect', function( event ) { 917 | $.powerTip.hide( this ); 918 | self._pause = false; 919 | } ); 920 | }, 921 | 922 | reset: function() { 923 | var self = this; 924 | self._selected = { 925 | index: null, 926 | shard: null 927 | }; 928 | self._hover = { 929 | index: null, 930 | shard: null 931 | }; 932 | self._highlight_shards = {}; 933 | self._is_refreshing = false; 934 | }, 935 | 936 | _write_out_info_cells: function( index, shard, tr_index, tr_shard ) { 937 | 938 | if ( null == index ) { 939 | tr_index.children( '.col-name' ).html( 'Index: —' ); 940 | tr_index.children( '.col-status' ).html( '—' ); 941 | tr_index.children( '.col-size-primary' ).html( '—' ); 942 | tr_index.children( '.col-size-total' ).html( '—' ); 943 | tr_index.children( '.col-docs' ).html( '—' ); 944 | tr_index.children( '.col-ratio' ).html( '—' ); 945 | } else { 946 | tr_index.children( '.col-name' ).html( 'Index: ' + index.id ); 947 | tr_index.children( '.col-status' ).text( index.status ); 948 | tr_index.children( '.col-size-primary' ).text( d3.format( '.3s' )( index.size.primary ) + 'B' ); 949 | tr_index.children( '.col-size-total' ).text( d3.format( '.3s' )( index.size.total ) + 'B' ); 950 | tr_index.children( '.col-docs' ).text( d3.format( '.3s' )( index.docs.count ) ); 951 | tr_index.children( '.col-ratio' ).text( d3.format( '.2f' )( index.docs.deleted_ratio * 100 ) + '%' ); 952 | } 953 | 954 | if ( null == shard ) { 955 | tr_shard.children( '.col-name' ).html( 'Shard: —' ); 956 | tr_shard.children( '.col-status' ).html( '—' ); 957 | tr_shard.children( '.col-size-primary' ).html( '—' ); 958 | tr_shard.children( '.col-size-total' ).html( '—' ); 959 | tr_shard.children( '.col-docs' ).html( '—' ); 960 | tr_shard.children( '.col-ratio' ).html( '—' ); 961 | } else { 962 | var shard_status = shard.active_shards + ' active'; 963 | if ( !( 'green' == shard.status && 0 == shard.relocating_shards ) ) { 964 | var max_recovery_time = { 965 | 'in_millis': 0, 966 | 'string': '' 967 | }, 968 | shard_states = { 969 | 'UNASSIGNED': 0, 970 | 'INITIALIZING': 0, 971 | 'RELOCATING': 0, 972 | 'STARTED': 0 973 | }; 974 | 975 | _.each( shard.shards, function( shard ) { 976 | shard_states[ shard.state ]++; 977 | if ( undefined != shard.recovery_time && max_recovery_time.in_millis < shard.recovery_time.in_millis ) { 978 | max_recovery_time = shard.recovery_time; 979 | } 980 | } ); 981 | 982 | if ( shard_states[ 'UNASSIGNED' ] > 0 ) { 983 | shard_status = shard_states[ 'UNASSIGNED' ] + ' unassigned'; 984 | } else if ( shard_states[ 'INITIALIZING' ] > 0 ) { 985 | shard_status = shard_states[ 'INITIALIZING' ] + ' initializing'; 986 | } else if ( shard_states[ 'RELOCATING' ] > 0 ) { 987 | shard_status = shard_states[ 'RELOCATING' ] + ' relocating'; 988 | } else { 989 | shard_status = 'unknown error'; 990 | } 991 | 992 | if ( max_recovery_time.in_millis > 0 ) { 993 | shard_status += ' (' + max_recovery_time.string + ' elapsed)'; 994 | } 995 | } 996 | 997 | tr_shard.children( '.col-name' ).html( 'Shard: ' + shard.shard_num ); 998 | tr_shard.children( '.col-status' ).text( shard_status ); 999 | tr_shard.children( '.col-size-primary' ).text( d3.format( '.3s' )( shard.size.primary ) + 'B' ); 1000 | tr_shard.children( '.col-size-total' ).text( d3.format( '.3s' )( shard.size.total ) + 'B' ); 1001 | tr_shard.children( '.col-docs' ).text( d3.format( '.3s' )( shard.docs.count ) ); 1002 | tr_shard.children( '.col-ratio' ).text( d3.format( '.2f' )( shard.docs.deleted_ratio * 100 ) + '%' ); 1003 | } 1004 | }, 1005 | 1006 | resize: function() { 1007 | var self = this, 1008 | aspect = (self._svg_width + self._svg_padding_x * 2) / (self._svg_height + self._svg_padding_y * 2), 1009 | chart = $("#indices-svg"), 1010 | targetWidth = chart.parent().width(); 1011 | chart.attr("width", targetWidth); 1012 | chart.attr("height", targetWidth / aspect); 1013 | }, 1014 | 1015 | sync_data: function() { 1016 | var self = this; 1017 | 1018 | if ( self._is_refreshing || self._pause ) 1019 | return; 1020 | 1021 | self._is_refreshing = true; 1022 | 1023 | switch ( cluster.get_info().version.major ) { 1024 | case 0: 1025 | var endpoints = [ 1026 | cluster.get_info().host + '/_cluster/health?level=shards', 1027 | cluster.get_info().host + '/_cluster/state?filter_blocks=true&filter_nodes=true&filter_metadata=true', 1028 | cluster.get_info().host + '/_status?recovery=true' 1029 | ]; 1030 | break; 1031 | case 1: 1032 | var endpoints = [ 1033 | cluster.get_info().host + '/_cluster/health?level=shards', 1034 | cluster.get_info().host + '/_cluster/state/routing_table', 1035 | cluster.get_info().host + '/_status?recovery=true' 1036 | ]; 1037 | break; 1038 | case 2: 1039 | default: 1040 | var endpoints = [ 1041 | cluster.get_info().host + '/_cluster/health?level=shards', 1042 | cluster.get_info().host + '/_cluster/state/routing_table', 1043 | cluster.get_info().host + '/_stats?level=shards' 1044 | ]; 1045 | break; 1046 | } 1047 | 1048 | $.when( 1049 | $.getJSON( endpoints[0] ), 1050 | $.getJSON( endpoints[1] ), 1051 | $.getJSON( endpoints[2] ) 1052 | ) 1053 | .done(function( result_health, result_cluster_state, result_status ) { 1054 | 1055 | _.each( result_health[0].indices, function( index, index_name ) { 1056 | var data = index; 1057 | data.size = { 1058 | 'primary': 0, 1059 | 'total': 0 1060 | }; 1061 | data.docs = { 1062 | 'count': 0, 1063 | 'deleted': 0, 1064 | 'deleted_ratio': 0 1065 | }; 1066 | self._indices[ index_name ] = _.defaults( data, self._indices[ index_name ] ); 1067 | 1068 | // Set metadata 1069 | self._indices[ index_name ].id = index_name; 1070 | self._indices[ index_name ].sortkey = index_name; 1071 | } ); 1072 | 1073 | _.each( result_cluster_state[0].routing_table.indices, function( index, index_name ) { 1074 | _.each( index.shards, function( shards, shard_num ) { 1075 | self._indices[ index_name ][ 'shards' ][ shard_num ] = _.defaults( 1076 | { 1077 | 'shard_num': shard_num, 1078 | 'shards': shards, 1079 | 'size': { 1080 | 'primary': 0, 1081 | 'total': 0 1082 | }, 1083 | 'docs': { 1084 | 'count': 0, 1085 | 'deleted': 0, 1086 | 'deleted_ratio': 0 1087 | } 1088 | }, 1089 | self._indices[ index_name ][ 'shards' ][ shard_num ] 1090 | ); 1091 | } ); 1092 | } ); 1093 | 1094 | _.each( result_status[0].indices, function( index, index_name ) { 1095 | switch ( cluster.get_info().version.major ) { 1096 | case 0: 1097 | case 1: 1098 | var size_primary = index.index.primary_size_in_bytes, 1099 | size_total = index.index.size_in_bytes, 1100 | docs_count = index.docs.num_docs, 1101 | docs_deleted = index.docs.deleted_docs; 1102 | break; 1103 | case 2: 1104 | default: 1105 | var size_primary = index.primaries.store.size_in_bytes, 1106 | size_total = index.total.store.size_in_bytes, 1107 | docs_count = index.total.docs.count, 1108 | docs_deleted = index.total.docs.deleted; 1109 | break; 1110 | } 1111 | 1112 | self._indices[ index_name ] = _.defaults( 1113 | { 1114 | 'size': { 1115 | 'primary': size_primary, 1116 | 'total': size_total 1117 | }, 1118 | 'docs': { 1119 | 'count': docs_count, 1120 | 'deleted': docs_deleted, 1121 | 'deleted_ratio': get_deleted_ratio( docs_count, docs_deleted ) 1122 | } 1123 | }, 1124 | self._indices[ index_name ] 1125 | ); 1126 | 1127 | _.each( index.shards, function( shards, shard_num ) { 1128 | var data = { 1129 | 'shard_num': shard_num, 1130 | 'size': { 1131 | 'primary': 0, 1132 | 'total': 0 1133 | }, 1134 | 'docs': { 1135 | 'count': 0, 1136 | 'deleted': 0, 1137 | 'deleted_ratio': 0 1138 | } 1139 | }; 1140 | 1141 | _.each( shards, function( shard ) { 1142 | let shard_size_in_bytes = 0, 1143 | shard_num_docs = 0 1144 | shard_del_docs = 0; 1145 | switch ( cluster.get_info().version.major ) { 1146 | case 0: 1147 | case 1: 1148 | shard_size_in_bytes = shard.index.size_in_bytes; 1149 | shard_docs_count = shard.docs.num_docs; 1150 | shard_docs_deleted = shard.docs.deleted_docs; 1151 | break; 1152 | case 2: 1153 | default: 1154 | shard_size_in_bytes = shard.store.size_in_bytes; 1155 | shard_docs_count = shard.docs.count; 1156 | shard_docs_deleted = shard.docs.deleted; 1157 | break; 1158 | } 1159 | 1160 | data.size.total += shard_size_in_bytes; 1161 | 1162 | // Fill in shard info 1163 | if ( shard.routing.primary ) { 1164 | data.size.primary = shard_size_in_bytes; 1165 | data.docs = { 1166 | 'count': shard_docs_count, 1167 | 'deleted': shard_docs_deleted, 1168 | 'deleted_ratio': get_deleted_ratio( shard_docs_count, shard_docs_deleted ) 1169 | }; 1170 | } 1171 | 1172 | // Fill in recovery info if we are recovering 1173 | if ( "RECOVERING" == shard.state ) { 1174 | var found_shard_num = null; 1175 | _.each( self._indices[ index_name ][ 'shards' ][ shard_num ][ 'shards' ], function( test_shard, shard_num ) { 1176 | if ( test_shard.node == shard.routing.node ) 1177 | found_shard_num = shard_num; 1178 | } ); 1179 | 1180 | if ( null !== found_shard_num ) { 1181 | self._indices[ index_name ][ 'shards' ][ shard_num ][ 'shards' ][ found_shard_num ][ 'recovery_time' ] = { 1182 | 'in_millis': shard.peer_recovery.time_in_millis, 1183 | 'string': shard.peer_recovery.time 1184 | }; 1185 | } 1186 | } 1187 | } ); 1188 | 1189 | self._indices[ index_name ][ 'shards' ][ shard_num ] = _.defaults( 1190 | data, 1191 | self._indices[ index_name ][ 'shards' ][ shard_num ] 1192 | ); 1193 | } ); 1194 | } ); 1195 | 1196 | // Remove non-existant nodes 1197 | var dead_indices = _.difference( 1198 | _.keys( self._indices ), 1199 | _.keys( result_health[0].indices ) 1200 | ); 1201 | self._indices = _.omit( self._indices, dead_indices ); 1202 | 1203 | self._is_refreshing = false; 1204 | self._last_update = new Date(); 1205 | 1206 | self._notify_nodes_of_shards(); 1207 | self.render(); 1208 | }) 1209 | .fail(function() { 1210 | self._is_refreshing = false; 1211 | }); 1212 | }, 1213 | 1214 | render: function() { 1215 | var self = this; 1216 | 1217 | if ( self._is_refreshing || self._pause ) 1218 | return; 1219 | 1220 | if ( null != self._selected.index ) { 1221 | if ( null == self._selected.shard ) { 1222 | self._write_out_info_cells( 1223 | self._indices[ self._selected.index ], 1224 | null, 1225 | $( '#indices-info-footer tbody.monitor tr.index' ), 1226 | $( '#indices-info-footer tbody.monitor tr.shard' ) 1227 | ); 1228 | // Draw segments 1229 | segments.draw_segments_for( self._selected.index, null ); 1230 | } else { 1231 | self._write_out_info_cells( 1232 | self._indices[ self._selected.index ], 1233 | self._indices[ self._selected.index ][ 'shards' ][ self._selected.shard ], 1234 | $( '#indices-info-footer tbody.monitor tr.index' ), 1235 | $( '#indices-info-footer tbody.monitor tr.shard' ) 1236 | ); 1237 | // Draw segments 1238 | segments.draw_segments_for( self._selected.index, self._selected.shard ); 1239 | } 1240 | } else { 1241 | // Clear segments 1242 | segments.clear_segments(); 1243 | } 1244 | 1245 | if ( null != self._hover.index ) { 1246 | if ( null == self._hover.shard ) { 1247 | self._write_out_info_cells( 1248 | self._indices[ self._hover.index ], 1249 | null, 1250 | $( '#indices-info-footer tbody.inspect tr.index' ), 1251 | $( '#indices-info-footer tbody.inspect tr.shard' ) 1252 | ); 1253 | } else { 1254 | self._write_out_info_cells( 1255 | self._indices[ self._hover.index ], 1256 | self._indices[ self._hover.index ][ 'shards' ][ self._hover.shard ], 1257 | $( '#indices-info-footer tbody.inspect tr.index' ), 1258 | $( '#indices-info-footer tbody.inspect tr.shard' ) 1259 | ); 1260 | } 1261 | } 1262 | 1263 | // Set highlight state 1264 | if ( 0 == _.keys( self._highlight_shards ).length ) { 1265 | $( '#indices-svg-container' ).removeClass( 'highlight_shards' ); 1266 | } else { 1267 | $( '#indices-svg-container' ).addClass( 'highlight_shards' ); 1268 | } 1269 | 1270 | var indices = self._get_filtered_indices(), 1271 | svg_index_height = 100, 1272 | index_x = d3 1273 | .scale 1274 | .linear() 1275 | .range( [ 0, self._svg_width ] ) 1276 | .domain( [ 0, indices.indices.length ] ), 1277 | index_h = d3 1278 | .scale 1279 | .linear() 1280 | .range( [ svg_index_height, 0 ] ) 1281 | .domain( [ 0, d3.max( indices.indices, function(d) { return d.size.total; } ) ] ), 1282 | index_axis = d3 1283 | .svg 1284 | .axis() 1285 | .scale( index_h ) 1286 | .orient( "left" ) 1287 | .ticks( 1 ) 1288 | .tickFormat( function(d) { return d3.format( '.2s' )( d ) + 'B' } ), 1289 | shard_h = d3 1290 | .scale 1291 | .linear() 1292 | .range( [ 0, self._svg_height - svg_index_height ] ) 1293 | .domain( [ 0, d3.max( indices.indices, function(d) { return d.number_of_shards; } ) ] ), 1294 | shard_bytes = d3 1295 | .scale 1296 | .pow() 1297 | .exponent( 2 ) 1298 | .range( [ "#eeeeee", "#179fb0" ] ) 1299 | .domain( [ 1300 | 0, 1301 | d3.max( 1302 | indices.indices, 1303 | function(d) { 1304 | return d3.max( 1305 | _.values( d.shards ), 1306 | function(d) { return d.size.primary; } 1307 | ); 1308 | } 1309 | ) 1310 | ] ), 1311 | shard_axis = d3 1312 | .svg 1313 | .axis() 1314 | .scale( shard_h ) 1315 | .orient( "right" ) 1316 | .tickValues( [ d3.max( [ 1317 | 0, 1318 | d3.max( indices.indices, function(d) { return d.number_of_shards; } ) 1319 | ] ) ] ) 1320 | .tickFormat( function(d) { return Math.round( d ) } ), 1321 | ratio_y = d3 1322 | .scale 1323 | .linear() 1324 | .range( [ svg_index_height, 0 ] ) 1325 | .domain( [ 0, 0.5 ] ), 1326 | ratio_line = d3 1327 | .svg 1328 | .line() 1329 | .x( function(d, i) { return index_x( i + 0.5 ); } ) 1330 | .y( function(d) { return ratio_y( d.docs.deleted_ratio ); } ), 1331 | ratio_axis = d3 1332 | .svg 1333 | .axis() 1334 | .scale( ratio_y ) 1335 | .orient( "right" ) 1336 | .tickValues( [ 0, .25, .5 ] ) 1337 | .tickFormat( function(d) { return Math.round( d * 100 ) + '%' } ); 1338 | 1339 | $( '#indices h2 small' ).text( '(' + indices.counts.filtered + '/' + indices.counts.total + ' Indices)' ); 1340 | 1341 | self._svg 1342 | .selectAll( 'g' ) 1343 | .remove(); 1344 | 1345 | var index_g = self._svg 1346 | .selectAll( '.index' ) 1347 | .data( indices.indices, function(d) { return d.id; } ) 1348 | .enter() 1349 | .append( 'g' ) 1350 | .attr("transform", "translate("+self._svg_padding_x+","+self._svg_padding_y+")") 1351 | .attr( 'data-index', function(d) { return JSON.stringify( _.omit( d, 'shards' ) ); } ) 1352 | .attr( 'class', function(d) { 1353 | var classes = 'index status-' + d.status; 1354 | if ( self._selected.index == d.id && self._selected.shard == null ) 1355 | classes += ' selected'; 1356 | return classes; 1357 | } ) 1358 | .attr( 'id', function(d) { return 'index-' + d.id; } ) 1359 | .on( "click", function( d ) { 1360 | var e = d3.event, 1361 | isSelected = d3.select( this ).classed( "selected" ); 1362 | 1363 | // Unselect everything else 1364 | d3.selectAll( '#indices g.selected' ).classed( "selected", false ); 1365 | // Toggle select 1366 | d3.select( this ).classed( "selected", !isSelected ); 1367 | 1368 | if ( !isSelected ) { 1369 | $( '#indices-svg-container' ).addClass( 'selected' ); 1370 | $( '#indices' ).addClass( 'selected' ); 1371 | self._selected = { 1372 | index: d.id, 1373 | shard: null 1374 | }; 1375 | // Draw segments 1376 | segments.draw_segments_for( d.id, null ); 1377 | } else { 1378 | $( '#indices-svg-container' ).removeClass( 'selected' ); 1379 | $( '#indices' ).removeClass( 'selected' ); 1380 | self._selected = { 1381 | index: null, 1382 | shard: null 1383 | }; 1384 | } 1385 | } ); 1386 | 1387 | // Index primary size 1388 | index_g 1389 | .append( 'rect' ) 1390 | .attr( "x", function( d, i ) { 1391 | return index_x( i + 1/10 ); 1392 | } ) 1393 | .attr( "y", function( d ) { 1394 | return index_h( d.size.primary ); 1395 | } ) 1396 | .attr( "width", index_x( 1 - 2/10 ) ) 1397 | .attr( "height", function( d ) { 1398 | return svg_index_height - index_h( d.size.primary ); 1399 | } ) 1400 | .classed( { 'primary': true } ); 1401 | 1402 | // Index total size 1403 | index_g 1404 | .append( 'rect' ) 1405 | .attr( "x", function( d, i ) { 1406 | return index_x( i + 1/10 ); 1407 | } ) 1408 | .attr( "y", function( d ) { 1409 | return index_h( d.size.total ); 1410 | } ) 1411 | .attr( "width", index_x( 1 - 2/10 ) ) 1412 | .attr( "height", function( d ) { 1413 | return svg_index_height - index_h( d.size.total ); 1414 | } ) 1415 | .classed( { 'total': true } ); 1416 | 1417 | // Hover & click target 1418 | index_g 1419 | .append( 'rect' ) 1420 | .attr( "x", function( d, i ) { 1421 | return index_x( i ); 1422 | } ) 1423 | .attr( "y", 0 ) 1424 | .attr( "width", index_x( 1 ) ) 1425 | .attr( "height", svg_index_height ) 1426 | .attr( 'data-powertip', function(d) { 1427 | var tooltip = '' + d.id + ''; 1428 | tooltip += d3.format( '.3s' )( d.size.total ) + 'B Total'; 1429 | tooltip += '
' + d3.format( '.3s' )( d.size.primary ) + 'B Primary'; 1430 | tooltip += '
' + d3.format( '.2f' )( d.docs.deleted_ratio * 100 ) + '% Deleted'; 1431 | return tooltip; 1432 | } ) 1433 | .classed( { 'hover-target': true } ); 1434 | 1435 | self._svg 1436 | .append("g") 1437 | .attr("class", "y axis") 1438 | .attr("transform", "translate("+self._svg_padding_x+","+self._svg_padding_y+")") 1439 | .call(index_axis) 1440 | .selectAll("text") 1441 | .attr("dy", "1em") 1442 | .attr("transform", "rotate(45)"); 1443 | 1444 | _.each( indices.indices, function( index, count ) { 1445 | var shard_g = self._svg 1446 | .selectAll( '.shard-' + index.id ) 1447 | .data( _.values( index.shards ), function( d ) { return index.id + '-' + d.shard_num; } ) 1448 | .enter() 1449 | .append( 'g' ) 1450 | .attr("transform", "translate("+(self._svg_padding_x+index_x(count))+","+(self._svg_padding_y+svg_index_height)+")") 1451 | .attr( 'data-shard', function(d) { return JSON.stringify( d ); } ) 1452 | .attr( 'data-index', function(d) { return JSON.stringify( _.omit( index, 'shards' ) ); } ) 1453 | .attr( 'class', function(d) { 1454 | var classes = 'shard shard-' + index.id; 1455 | if ( self._selected.index == index.id && self._selected.shard == d.shard_num ) 1456 | classes += ' selected'; 1457 | 1458 | // Highlight selection 1459 | if ( undefined != self._highlight_shards[ index.id ] && undefined != self._highlight_shards[ index.id ][ d.shard_num ] ) { 1460 | if ( 'P' == self._highlight_shards[ index.id ][ d.shard_num ] ) { 1461 | classes += ' highlight highlight-primary'; 1462 | } else { 1463 | classes += ' highlight highlight-replica'; 1464 | } 1465 | } 1466 | 1467 | return classes; 1468 | } ) 1469 | .attr( 'id', function(d) { return 'shard-' + index.id + '-' + d.shard_num; } ); 1470 | 1471 | shard_g 1472 | .append( 'rect' ) 1473 | .attr( "x", function( d, i ) { 1474 | return index_x( 1/10 ); 1475 | } ) 1476 | .attr( "y", function( d, i ) { 1477 | return shard_h( d.shard_num ); 1478 | } ) 1479 | .attr( "width", index_x( 1 - 2/10 ) ) 1480 | .attr( "height", function( d ) { 1481 | return shard_h( 1 ); 1482 | } ) 1483 | .style( "fill", function( d ) { 1484 | // Heatmap! 1485 | if ( 'green' == d.status && 0 == d.relocating_shards ) { 1486 | return shard_bytes( d.size.primary ); 1487 | } 1488 | 1489 | // Highlight problems 1490 | var shard_states = { 1491 | 'UNASSIGNED': false, 1492 | 'INITIALIZING': false, 1493 | 'RELOCATING': false, 1494 | 'STARTED': false 1495 | }; 1496 | 1497 | _.each( d.shards, function( shard ) { 1498 | shard_states[ shard.state ] = true; 1499 | } ); 1500 | 1501 | if ( shard_states[ 'UNASSIGNED' ] ) 1502 | return '#d0363e'; // Red 1503 | else if ( shard_states[ 'INITIALIZING' ] ) 1504 | return '#ef6642'; // Orange 1505 | else if ( shard_states[ 'RELOCATING' ] ) 1506 | return '#f0c556'; // Yellow 1507 | else 1508 | return '#d0363e'; // Red 1509 | } ) 1510 | .attr( 'data-powertip', function(d) { 1511 | var tooltip = '' + index.id + ' — ' + d.shard_num + ''; 1512 | tooltip += d3.format( '.3s' )( d.size.primary ) + 'B Primary'; 1513 | 1514 | if ( !( 'green' == d.status && 0 == d.relocating_shards ) ) { 1515 | _.each( d.shards, function( shard_instance ) { 1516 | if ( 'STARTED' == shard_instance.state ) { 1517 | return; 1518 | } 1519 | 1520 | if ( 'INITIALIZING' == shard_instance.state ) { 1521 | tooltip += 'Initializing Onto→ ' + nodes.get_node( shard_instance.node ).name; 1522 | return; 1523 | } 1524 | 1525 | if ( 'RELOCATING' == shard_instance.state ) { 1526 | tooltip += 'Relocating From & To← ' + nodes.get_node( shard_instance.node ).name + '
→ ' + nodes.get_node( shard_instance.relocating_node ).name; 1527 | return; 1528 | } 1529 | } ); 1530 | } 1531 | 1532 | return tooltip; 1533 | } ) 1534 | .on( "click", function( d ) { 1535 | var e = d3.event, 1536 | g = this.parentNode, 1537 | isSelected = d3.select( g ).classed( "selected" ); 1538 | 1539 | // Unselect everything else 1540 | d3.selectAll( '#indices g.selected' ).classed( "selected", false ); 1541 | // Toggle select 1542 | d3.select( g ).classed( "selected", !isSelected ); 1543 | 1544 | if ( !isSelected ) { 1545 | $( '#indices-svg-container' ).addClass( 'selected' ); 1546 | $( '#indices' ).addClass( 'selected' ); 1547 | self._selected = { 1548 | index: index.id, 1549 | shard: d.shard_num 1550 | }; 1551 | // Draw segments 1552 | segments.draw_segments_for( index.id, d.shard_num ); 1553 | } else { 1554 | $( '#indices-svg-container' ).removeClass( 'selected' ); 1555 | $( '#indices' ).removeClass( 'selected' ); 1556 | self._selected = { 1557 | index: null, 1558 | shard: null 1559 | }; 1560 | } 1561 | } ); 1562 | } ); 1563 | 1564 | // Add a legend for number of shards 1565 | self._svg 1566 | .append("g") 1567 | .attr("class", "y axis") 1568 | .attr("transform", "translate("+(self._svg_width+self._svg_padding_x)+","+(self._svg_padding_y+svg_index_height)+")") 1569 | .call(shard_axis) 1570 | .selectAll("text"); 1571 | 1572 | // Add a legend for the color values 1573 | var shard_legend = self._svg 1574 | .selectAll( ".shard-legend" ) 1575 | .data( shard_bytes.ticks(6).slice(1).reverse() ) 1576 | .enter() 1577 | .append( "g" ) 1578 | .attr( "class", "shard-legend" ) 1579 | .attr( "transform", function( d, i ) { 1580 | return "translate(0," + ( self._svg_padding_y + svg_index_height + i * 16 + 16 ) + ")"; 1581 | } ); 1582 | 1583 | shard_legend 1584 | .append( "rect" ) 1585 | .attr( "width", 16 ) 1586 | .attr( "height", 16 ) 1587 | .style( "fill", shard_bytes ); 1588 | 1589 | shard_legend 1590 | .append( "text" ) 1591 | .attr( "x", 16 ) 1592 | .attr( "dy", "-.25em" ) 1593 | .attr( "dx", "0.5em" ) 1594 | .attr("transform", "rotate(45)") 1595 | .text( function( d ) { return d3.format( '.2s' )( d ) + 'B' } ); 1596 | 1597 | // Delete ratio 1598 | var ratio_g = self._svg 1599 | .append( 'g' ) 1600 | .attr( 'class', 'index_ratio' ) 1601 | .attr("transform", "translate("+self._svg_padding_x+","+self._svg_padding_y+")"); 1602 | 1603 | ratio_g 1604 | .append("path") 1605 | .datum(indices.indices) 1606 | .attr("class", "line") 1607 | .attr("d", ratio_line); 1608 | 1609 | ratio_g 1610 | .selectAll('circle') 1611 | .data(indices.indices) 1612 | .enter() 1613 | .append('circle') 1614 | .attr("cx", function(d, i) { return index_x( i + 0.5 ); } ) 1615 | .attr("cy", function(d) { return ratio_y( d.docs.deleted_ratio ); } ) 1616 | .attr("r", 1.5) 1617 | .attr("class", "line-point"); 1618 | 1619 | self._svg 1620 | .append("g") 1621 | .attr("class", "y axis") 1622 | .attr("transform", "translate("+(self._svg_width+self._svg_padding_x)+","+self._svg_padding_y+")") 1623 | .call(ratio_axis); 1624 | }, 1625 | 1626 | set_highlight_shards: function( highlight_shards ) { 1627 | var self = this; 1628 | self._highlight_shards = highlight_shards; 1629 | self.render(); 1630 | }, 1631 | 1632 | _get_filtered_indices: function() { 1633 | var self = this; 1634 | var counts = { 1635 | 'total': _.keys( self._indices ).length, 1636 | 'filtered': 0, 1637 | }; 1638 | 1639 | var filtered = _.values( self._indices ); 1640 | 1641 | // Apply filter from UI 1642 | var filter = $( '#indices-filter' ).val(); 1643 | if ( '' != filter ) { 1644 | var regex = new RegExp( filter, 'i' ); 1645 | filtered = _.filter( filtered, function( index ) { 1646 | return null != index.id.match( regex ); 1647 | } ); 1648 | } 1649 | counts.filtered = filtered.length; 1650 | 1651 | // Sort indices 1652 | filtered.sort( function( a, b ) { 1653 | return alphanum( a.sortkey, b.sortkey ); 1654 | } ); 1655 | 1656 | return { 1657 | 'counts': counts, 1658 | 'indices': filtered 1659 | }; 1660 | }, 1661 | 1662 | _notify_nodes_of_shards: function() { 1663 | var self = this; 1664 | 1665 | if ( self._is_refreshing ) 1666 | return; 1667 | 1668 | var node_shards = {}; 1669 | _.each( self._indices, function( index ) { 1670 | _.each( index.shards, function( shard ) { 1671 | _.each( shard.shards, function( shard_instance ) { 1672 | var template = {}; 1673 | template[ shard_instance.node ] = { 1674 | 'UNASSIGNED': [], 1675 | 'INITIALIZING': [], 1676 | 'RELOCATING': [], 1677 | 'STARTED': [] 1678 | }; 1679 | node_shards =_.defaults( node_shards, template ); 1680 | 1681 | node_shards[ shard_instance.node ][ shard_instance.state ].push( shard_instance ); 1682 | } ); 1683 | } ); 1684 | } ); 1685 | 1686 | var relocating_shards = {}; 1687 | _.each( node_shards, function( node ) { 1688 | _.each( node.RELOCATING, function( shard ) { 1689 | if ( relocating_shards[ shard.relocating_node ] ) 1690 | relocating_shards[ shard.relocating_node ] += 1; 1691 | else 1692 | relocating_shards[ shard.relocating_node ] = 1; 1693 | } ); 1694 | } ); 1695 | 1696 | nodes.set_shards( node_shards, relocating_shards ); 1697 | } 1698 | }; 1699 | 1700 | var segments = { 1701 | _svg_padding_x: 40, 1702 | _svg_padding_y: 20, 1703 | _svg_width: 390, 1704 | _svg_height: 150, 1705 | _segment_size: { 1706 | min: 0, 1707 | max: 0 1708 | }, 1709 | _rendered: { 1710 | index: null, 1711 | shard_num: null 1712 | }, 1713 | _resize: { 1714 | aspect_ratio: null, 1715 | width: null, 1716 | height: null 1717 | }, 1718 | _pause: false, 1719 | 1720 | init: function() { 1721 | var self = this; 1722 | 1723 | self._resize.aspect_ratio = ( self._svg_width + self._svg_padding_x * 2 ) / ( self._svg_height + self._svg_padding_y * 2 ); 1724 | self._resize.width = self._svg_width + self._svg_padding_x * 2, 1725 | self._resize.height = self._resize.width / self._resize.aspect_ratio; 1726 | 1727 | self.resize(); 1728 | $(window).on("resize", function() { 1729 | self.resize(); 1730 | } ); 1731 | 1732 | $( document ).on( 'mouseover', '#segments-rendered .segment', function( event ) { 1733 | var element = $( this ) 1734 | 1735 | self._pause = true; 1736 | 1737 | if ( !element.data( 'powertip-init' ) ) { 1738 | element.powerTip( { 1739 | manual: true, 1740 | placement: 's', 1741 | smartPlacement: true 1742 | } ); 1743 | element.data( 'powertip-init', true ); 1744 | } 1745 | 1746 | $.powerTip.show( this, event ); 1747 | } ); 1748 | $( document ).on( 'mouseleave', '#segments-rendered .segment', function( event ) { 1749 | $.powerTip.hide( this ); 1750 | self._pause = false; 1751 | } ); 1752 | }, 1753 | 1754 | resize: function() { 1755 | var self = this, 1756 | charts = $(".segments-svg"), 1757 | target = $('#segments-rendered'); 1758 | 1759 | self._resize.width = target.width() / 2, 1760 | self._resize.height = self._resize.width / self._resize.aspect_ratio; 1761 | 1762 | charts.attr("width", self._resize.width); 1763 | charts.attr("height", self._resize.height); 1764 | }, 1765 | 1766 | clear_segments: function() { 1767 | $( '#segments-rendered' ).html( '' ); 1768 | self._rendered = { 1769 | index: null, 1770 | shard_num: null 1771 | }; 1772 | }, 1773 | 1774 | draw_segments_for: function( index, shard_num ) { 1775 | var self = this; 1776 | 1777 | if ( self._pause ) 1778 | return; 1779 | 1780 | $.when( 1781 | $.getJSON( cluster.get_info().host + '/' + index + '/_segments' ) 1782 | ) 1783 | .done(function( results ) { 1784 | 1785 | if ( null == shard_num ) { 1786 | var shards = results.indices[ index ][ 'shards' ]; 1787 | } else { 1788 | var shards = _.pick( results.indices[ index ][ 'shards' ], shard_num ); 1789 | } 1790 | 1791 | var primary_shard_segments = {}; 1792 | _.each( shards, function( shard, shard_num ) { 1793 | _.each( shard, function( shard_instance, index ) { 1794 | var sortkey; 1795 | if ( shard_instance.routing.primary ) { 1796 | sortkey = 'P '; 1797 | } else { 1798 | sortkey = 'R ' 1799 | } 1800 | 1801 | var node = nodes.get_node( shard_instance.routing.node ); 1802 | if ( node ) 1803 | sortkey += node.sortkey; 1804 | 1805 | shards[ shard_num ][ index ][ 'sortkey' ] = sortkey; 1806 | shards[ shard_num ][ index ][ 'nodename' ] = node.name; 1807 | 1808 | if ( shard_instance.routing.primary ) { 1809 | primary_shard_segments[ shard_num ] = _.keys( shard_instance.segments ); 1810 | } 1811 | } ); 1812 | 1813 | shards[ shard_num ].sort( function( a, b ) { 1814 | return alphanum( a.sortkey, b.sortkey ); 1815 | } ); 1816 | } ); 1817 | 1818 | _.each( shards, function( shard, shard_num ) { 1819 | _.each( shard, function( shard_instance, index ) { 1820 | _.each( shard_instance.segments, function( segment, segment_id ) { 1821 | shards[ shard_num ][ index ][ 'segments' ][ segment_id ][ 'id' ] = segment_id; 1822 | shards[ shard_num ][ index ][ 'segments' ][ segment_id ][ 'on_primary' ] = ( _.indexOf( primary_shard_segments[ shard_num ], segment_id ) >= 0 ); 1823 | shards[ shard_num ][ index ][ 'segments' ][ segment_id ][ 'deleted_ratio' ] = get_deleted_ratio( segment.num_docs, segment.deleted_docs ); 1824 | } ); 1825 | } ); 1826 | } ); 1827 | 1828 | self._render( index, shard_num, shards ); 1829 | } ); 1830 | }, 1831 | 1832 | _render: function( index, shard_num, shards ) { 1833 | var self = this, 1834 | redraw = false; 1835 | 1836 | if ( self._pause ) 1837 | return; 1838 | 1839 | if ( self._rendered.index != index || self._rendered.shard_num != shard_num ) { 1840 | var html = ''; 1841 | _.each( shards, function( shard, shard_num ) { 1842 | html += '

Index:' + index + ' — Shard:' + shard_num + '

'; 1843 | _.each( shard, function( shard_instance, index ) { 1844 | html += ''; 1845 | } ); 1846 | } ); 1847 | $( '#segments-rendered' ).html( html ); 1848 | self._rendered = { 1849 | index: index, 1850 | shard_num: shard_num 1851 | }; 1852 | redraw = true; 1853 | } 1854 | 1855 | self._segment_size = { 1856 | min: null, 1857 | max: null 1858 | }; 1859 | self._max_num_segments = 0; 1860 | _.each( shards, function( shard, shard_num ) { 1861 | self._max_num_segments = Math.max( 1862 | self._max_num_segments, 1863 | d3.max( shard, function(d) { return _.keys( d.segments ).length; } ) 1864 | ); 1865 | _.each( shard, function( shard_instance, index ) { 1866 | if ( 0 == _.keys( shard_instance.segments ).length ) 1867 | return; 1868 | 1869 | if ( null == self._segment_size.min ) { 1870 | self._segment_size = { 1871 | min: d3.min( _.values( shard_instance.segments ), function(d) { return d.size_in_bytes; } ), 1872 | max: d3.max( _.values( shard_instance.segments ), function(d) { return d.size_in_bytes; } ) 1873 | }; 1874 | } else { 1875 | self._segment_size.min = Math.min( 1876 | self._segment_size.max, 1877 | d3.min( _.values( shard_instance.segments ), function(d) { return d.size_in_bytes; } ) 1878 | ); 1879 | self._segment_size.max = Math.max( 1880 | self._segment_size.max, 1881 | d3.max( _.values( shard_instance.segments ), function(d) { return d.size_in_bytes; } ) 1882 | ); 1883 | } 1884 | } ); 1885 | } ); 1886 | 1887 | if ( self._segment_size.min == self._segment_size.max ) 1888 | self._segment_size.min = 0; 1889 | 1890 | _.each( shards, function( shard, shard_num ) { 1891 | _.each( shard, function( shard_instance, index ) { 1892 | self._render_shard( index, shard_num, shard_instance ); 1893 | } ); 1894 | } ); 1895 | 1896 | if ( redraw ) 1897 | self.resize(); 1898 | }, 1899 | 1900 | _render_shard: function( index, shard_num, shard_instance ) { 1901 | var self = this, 1902 | segments = _.values( shard_instance.segments ), 1903 | segment_x = d3 1904 | .scale 1905 | .linear() 1906 | .range( [ 0, self._svg_width ] ) 1907 | .domain( [ 0, self._max_num_segments ] ), 1908 | segment_y = d3 1909 | .scale 1910 | .log() 1911 | .clamp( true ) 1912 | .nice() 1913 | .range( [ self._svg_height, 0 ] ) 1914 | .domain( [ self._segment_size.max/10000, self._segment_size.max ] ), 1915 | segment_axis = d3 1916 | .svg 1917 | .axis() 1918 | .scale( segment_y ) 1919 | .orient( "left" ) 1920 | .ticks( 1, function(d) { return d3.format( '.1s' )( d ) + 'B' } ), 1921 | ratio_y = d3 1922 | .scale 1923 | .linear() 1924 | .range( [ self._svg_height, 0 ] ) 1925 | .domain( [ 0, 0.5 ] ), 1926 | ratio_line = d3 1927 | .svg 1928 | .line() 1929 | .x( function(d, i) { return segment_x( i + 0.5 ); } ) 1930 | .y( function(d) { return ratio_y( d.deleted_ratio ); } ), 1931 | ratio_axis = d3 1932 | .svg 1933 | .axis() 1934 | .scale( ratio_y ) 1935 | .orient( "right" ) 1936 | .ticks( 5 ) 1937 | .tickFormat( function(d) { return Math.round( d * 100 ) + '%' } ) 1938 | svg = d3 1939 | .select( '#segments-rendered-' + index + '-' + shard_num + '-' + shard_instance.routing.node ); 1940 | 1941 | // Sort segments 1942 | segments.sort( function( a, b ) { 1943 | if ( b.size_in_bytes != a.size_in_bytes ) { 1944 | // Large -> Small size; small shards merge into larger ones 1945 | return b.size_in_bytes - a.size_in_bytes; 1946 | } else if ( b.deleted_ratio != a.deleted_ratio ) { 1947 | // Less -> More deleted; more deleted more likely to merge 1948 | return a.deleted_ratio - b.deleted_ratio; 1949 | } else { 1950 | // Older -> Newer gen; newer gen from new merges / created 1951 | return a.generation - b.generation 1952 | } 1953 | } ); 1954 | 1955 | if ( undefined == svg.attr( 'preserveAspectRatio' ) ) { 1956 | svg 1957 | .attr( 'width', self._svg_width + self._svg_padding_x * 2 ) 1958 | .attr( 'height', self._svg_height + self._svg_padding_y * 2 ) 1959 | .attr( 'viewBox', "0 0 " + ( self._svg_width + self._svg_padding_x * 2 ) + " " + ( self._svg_height + self._svg_padding_y * 2 ) ) 1960 | .attr( 'preserveAspectRatio', "xMidYMid" ); 1961 | } 1962 | 1963 | svg 1964 | .selectAll( 'g' ) 1965 | .remove(); 1966 | svg 1967 | .selectAll( 'text' ) 1968 | .remove(); 1969 | 1970 | var segment_g = svg 1971 | .selectAll( '.segment' ) 1972 | .data( segments, function(d) { 1973 | return index + '-' + shard_num + '-' + shard_instance.routing.node + '-' + d.id; 1974 | } ) 1975 | .enter() 1976 | .append( 'g' ) 1977 | .attr( "transform", "translate("+self._svg_padding_x+","+self._svg_padding_y+")" ) 1978 | .attr( 'data-segment', function(d) { return JSON.stringify( d ); } ) 1979 | .attr( 'data-powertip', function(d) { 1980 | var tooltip = '' + d.id + ''; 1981 | 1982 | if ( d.committed && d.search && d.on_primary ) { 1983 | tooltip += 'Synced (Primary)'; 1984 | } else if ( d.committed && d.search ) { 1985 | tooltip += 'Synced'; 1986 | } else if ( d.committed ) { 1987 | tooltip += 'Committed'; 1988 | } else { 1989 | tooltip += 'Uncommitted'; 1990 | } 1991 | 1992 | tooltip += '
' + d3.format( '.3s' )( d.size_in_bytes ) + 'B'; 1993 | tooltip += '
' + d3.format( '.3s' )( d.num_docs ) + ' Docs'; 1994 | tooltip += '
' + d3.format( '.2f' )( d.deleted_ratio * 100 ) + '% Deleted'; 1995 | return tooltip; 1996 | } ) 1997 | .attr( 'class', function(d) { 1998 | var class_names = 'segment'; 1999 | 2000 | if ( d.committed && d.search && d.on_primary ) { 2001 | class_names += ' synced-primary'; 2002 | } else if ( d.committed && d.search ) { 2003 | class_names += ' synced-local'; 2004 | } else if ( d.committed ) { 2005 | class_names += ' committed'; 2006 | } else { 2007 | class_names += ' uncommitted'; 2008 | } 2009 | return class_names 2010 | } ) 2011 | .attr( 'id', function(d) { return 'segment-' + index + '-' + shard_num + '-' + shard_instance.routing.node + '-' + d.id; } ); 2012 | 2013 | segment_g 2014 | .append( 'rect' ) 2015 | .attr( "x", function( d, i ) { 2016 | return segment_x( i ); 2017 | } ) 2018 | .attr( "y", 0 ) 2019 | .attr( "width", segment_x( 1 ) ) 2020 | .attr( "height", self._svg_height ) 2021 | .classed( { 'hover-target': true } ); 2022 | 2023 | segment_g 2024 | .append( 'rect' ) 2025 | .attr( "x", function( d, i ) { 2026 | return segment_x( i + 1/10 ); 2027 | } ) 2028 | .attr( "y", function( d ) { 2029 | return segment_y( d.size_in_bytes ); 2030 | } ) 2031 | .attr( "width", segment_x( 1 - 2/10 ) ) 2032 | .attr( "height", function( d ) { 2033 | return self._svg_height - segment_y( d.size_in_bytes ) + 1; 2034 | } ) 2035 | .classed( { 'size': true } ); 2036 | 2037 | svg 2038 | .append("g") 2039 | .attr("class", "y axis") 2040 | .attr("transform", "translate("+self._svg_padding_x+","+self._svg_padding_y+")") 2041 | .call(segment_axis) 2042 | .selectAll("text") 2043 | .attr("dy", "1em") 2044 | .attr("transform", "rotate(45)"); 2045 | 2046 | // Delete ratio 2047 | var ratio_g = svg 2048 | .append( 'g' ) 2049 | .attr( 'class', 'node_ratio' ) 2050 | .attr("transform", "translate("+self._svg_padding_x+","+self._svg_padding_y+")"); 2051 | 2052 | ratio_g 2053 | .append("path") 2054 | .datum(segments) 2055 | .attr("class", "line") 2056 | .attr("d", ratio_line); 2057 | 2058 | ratio_g 2059 | .selectAll('circle') 2060 | .data(segments) 2061 | .enter() 2062 | .append('circle') 2063 | .attr("cx", function(d, i) { return segment_x( i + 0.5 ); } ) 2064 | .attr("cy", function(d) { return ratio_y( d.deleted_ratio ); } ) 2065 | .attr("r", 1.5) 2066 | .attr("class", "line-point"); 2067 | 2068 | svg 2069 | .append("g") 2070 | .attr("class", "y axis ratio") 2071 | .attr("transform", "translate("+(self._svg_width+self._svg_padding_x)+","+self._svg_padding_y+")") 2072 | .call(ratio_axis); 2073 | 2074 | var label = shard_instance.nodename; 2075 | if ( shard_instance.routing.primary ) 2076 | label += ' (Primary)'; 2077 | else 2078 | label += ' (Replica)'; 2079 | svg 2080 | .append( "text" ) 2081 | .attr( "x", (self._svg_width / 2) + self._svg_padding_x ) 2082 | .attr( "y", self._svg_height + self._svg_padding_y * 1.75 ) 2083 | .attr( "text-anchor", "middle" ) 2084 | .text( label ); 2085 | 2086 | } 2087 | }; 2088 | 2089 | // Utils 2090 | 2091 | // Natual sort -- http://my.opera.com/GreyWyvern/blog/show.dml/1671288 2092 | var alphanum = function(a, b) { 2093 | function chunkify(t) { 2094 | var tz = [], x = 0, y = -1, n = 0, i, j; 2095 | 2096 | while (i = (j = t.charAt(x++)).charCodeAt(0)) { 2097 | var m = (i == 46 || (i >=48 && i <= 57)); 2098 | if (m !== n) { 2099 | tz[++y] = ""; 2100 | n = m; 2101 | } 2102 | tz[y] += j; 2103 | } 2104 | return tz; 2105 | } 2106 | 2107 | var aa = chunkify(a); 2108 | var bb = chunkify(b); 2109 | 2110 | for (x = 0; aa[x] && bb[x]; x++) { 2111 | if (aa[x] !== bb[x]) { 2112 | var c = Number(aa[x]), d = Number(bb[x]); 2113 | if (c == aa[x] && d == bb[x]) 2114 | return c - d; 2115 | else 2116 | return (aa[x] > bb[x]) ? 1 : -1; 2117 | } 2118 | } 2119 | return aa.length - bb.length; 2120 | } 2121 | 2122 | var get_deleted_ratio = function( docs, deleted ) { 2123 | if ( 0 == deleted ) 2124 | return 0; 2125 | else 2126 | return deleted / ( docs + deleted ); 2127 | } 2128 | 2129 | $( function() { 2130 | cluster.init(); 2131 | $.fn.powerTip.smartPlacementLists.e = ['e', 'w', 'ne', 'se', 'nw', 'sw', 'n', 's', 'e']; 2132 | } ); 2133 | })(jQuery); 2134 | -------------------------------------------------------------------------------- /_site/assets/js/jquery.powertip.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | PowerTip - v1.2.0 - 2013-04-03 3 | http://stevenbenner.github.com/jquery-powertip/ 4 | Copyright (c) 2013 Steven Benner (http://stevenbenner.com/). 5 | Released under MIT license. 6 | https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt 7 | */ 8 | (function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(){var t=this;t.top="auto",t.left="auto",t.right="auto",t.bottom="auto",t.set=function(o,n){e.isNumeric(n)&&(t[o]=Math.round(n))}}function o(e,t,o){function n(n,i){r(),e.data(v)||(n?(i&&e.data(m,!0),o.showTip(e)):(P.tipOpenImminent=!0,l=setTimeout(function(){l=null,s()},t.intentPollInterval)))}function i(n){r(),P.tipOpenImminent=!1,e.data(v)&&(e.data(m,!1),n?o.hideTip(e):(P.delayInProgress=!0,l=setTimeout(function(){l=null,o.hideTip(e),P.delayInProgress=!1},t.closeDelay)))}function s(){var i=Math.abs(P.previousX-P.currentX),s=Math.abs(P.previousY-P.currentY),r=i+s;t.intentSensitivity>r?o.showTip(e):(P.previousX=P.currentX,P.previousY=P.currentY,n())}function r(){l=clearTimeout(l),P.delayInProgress=!1}function a(){o.resetPosition(e)}var l=null;this.show=n,this.hide=i,this.cancel=r,this.resetPosition=a}function n(){function e(e,i,r,a,l){var p,c=i.split("-")[0],u=new t;switch(p=s(e)?n(e,c):o(e,c),i){case"n":u.set("left",p.left-r/2),u.set("bottom",P.windowHeight-p.top+l);break;case"e":u.set("left",p.left+l),u.set("top",p.top-a/2);break;case"s":u.set("left",p.left-r/2),u.set("top",p.top+l);break;case"w":u.set("top",p.top-a/2),u.set("right",P.windowWidth-p.left+l);break;case"nw":u.set("bottom",P.windowHeight-p.top+l),u.set("right",P.windowWidth-p.left-20);break;case"nw-alt":u.set("left",p.left),u.set("bottom",P.windowHeight-p.top+l);break;case"ne":u.set("left",p.left-20),u.set("bottom",P.windowHeight-p.top+l);break;case"ne-alt":u.set("bottom",P.windowHeight-p.top+l),u.set("right",P.windowWidth-p.left);break;case"sw":u.set("top",p.top+l),u.set("right",P.windowWidth-p.left-20);break;case"sw-alt":u.set("left",p.left),u.set("top",p.top+l);break;case"se":u.set("left",p.left-20),u.set("top",p.top+l);break;case"se-alt":u.set("top",p.top+l),u.set("right",P.windowWidth-p.left)}return u}function o(e,t){var o,n,i=e.offset(),s=e.outerWidth(),r=e.outerHeight();switch(t){case"n":o=i.left+s/2,n=i.top;break;case"e":o=i.left+s,n=i.top+r/2;break;case"s":o=i.left+s/2,n=i.top+r;break;case"w":o=i.left,n=i.top+r/2;break;case"nw":o=i.left,n=i.top;break;case"ne":o=i.left+s,n=i.top;break;case"sw":o=i.left,n=i.top+r;break;case"se":o=i.left+s,n=i.top+r}return{top:n,left:o}}function n(e,t){function o(){d.push(p.matrixTransform(u))}var n,i,s,r,a=e.closest("svg")[0],l=e[0],p=a.createSVGPoint(),c=l.getBBox(),u=l.getScreenCTM(),f=c.width/2,w=c.height/2,d=[],h=["nw","n","ne","e","se","s","sw","w"];if(p.x=c.x,p.y=c.y,o(),p.x+=f,o(),p.x+=f,o(),p.y+=w,o(),p.y+=w,o(),p.x-=f,o(),p.x-=f,o(),p.y-=w,o(),d[0].y!==d[1].y||d[0].x!==d[7].x)for(i=Math.atan2(u.b,u.a)*O,s=Math.ceil((i%360-22.5)/45),1>s&&(s+=8);s--;)h.push(h.shift());for(r=0;d.length>r;r++)if(h[r]===t){n=d[r];break}return{top:n.y+P.scrollTop,left:n.x+P.scrollLeft}}this.compute=e}function i(o){function i(e){e.data(v,!0),O.queue(function(t){s(e),t()})}function s(e){var t;if(e.data(v)){if(P.isTipOpen)return P.isClosing||r(P.activeHover),O.delay(100).queue(function(t){s(e),t()}),void 0;e.trigger("powerTipPreRender"),t=p(e),t&&(O.empty().append(t),e.trigger("powerTipRender"),P.activeHover=e,P.isTipOpen=!0,O.data(g,o.mouseOnToPopup),o.followMouse?a():(b(e),P.isFixedTipOpen=!0),O.fadeIn(o.fadeInTime,function(){P.desyncTimeout||(P.desyncTimeout=setInterval(H,500)),e.trigger("powerTipOpen")}))}}function r(e){P.isClosing=!0,P.activeHover=null,P.isTipOpen=!1,P.desyncTimeout=clearInterval(P.desyncTimeout),e.data(v,!1),e.data(m,!1),O.fadeOut(o.fadeOutTime,function(){var n=new t;P.isClosing=!1,P.isFixedTipOpen=!1,O.removeClass(),n.set("top",P.currentY+o.offset),n.set("left",P.currentX+o.offset),O.css(n),e.trigger("powerTipClose")})}function a(){if(!P.isFixedTipOpen&&(P.isTipOpen||P.tipOpenImminent&&O.data(T))){var e,n,i=O.outerWidth(),s=O.outerHeight(),r=new t;r.set("top",P.currentY+o.offset),r.set("left",P.currentX+o.offset),e=c(r,i,s),e!==I.none&&(n=u(e),1===n?e===I.right?r.set("left",P.windowWidth-i):e===I.bottom&&r.set("top",P.scrollTop+P.windowHeight-s):(r.set("left",P.currentX-i-o.offset),r.set("top",P.currentY-s-o.offset))),O.css(r)}}function b(t){var n,i;o.smartPlacement?(n=e.fn.powerTip.smartPlacementLists[o.placement],e.each(n,function(e,o){var n=c(y(t,o),O.outerWidth(),O.outerHeight());return i=o,n===I.none?!1:void 0})):(y(t,o.placement),i=o.placement),O.addClass(i)}function y(e,n){var i,s,r=0,a=new t;a.set("top",0),a.set("left",0),O.css(a);do i=O.outerWidth(),s=O.outerHeight(),a=k.compute(e,n,i,s,o.offset),O.css(a);while(5>=++r&&(i!==O.outerWidth()||s!==O.outerHeight()));return a}function H(){var e=!1;!P.isTipOpen||P.isClosing||P.delayInProgress||(P.activeHover.data(v)===!1||P.activeHover.is(":disabled")?e=!0:l(P.activeHover)||P.activeHover.is(":focus")||P.activeHover.data(m)||(O.data(g)?l(O)||(e=!0):e=!0),e&&r(P.activeHover))}var k=new n,O=e("#"+o.popupId);0===O.length&&(O=e("
",{id:o.popupId}),0===d.length&&(d=e("body")),d.append(O)),o.followMouse&&(O.data(T)||(f.on("mousemove",a),w.on("scroll",a),O.data(T,!0))),o.mouseOnToPopup&&O.on({mouseenter:function(){O.data(g)&&P.activeHover&&P.activeHover.data(h).cancel()},mouseleave:function(){P.activeHover&&P.activeHover.data(h).hide()}}),this.showTip=i,this.hideTip=r,this.resetPosition=b}function s(e){return window.SVGElement&&e[0]instanceof SVGElement}function r(){P.mouseTrackingActive||(P.mouseTrackingActive=!0,e(function(){P.scrollLeft=w.scrollLeft(),P.scrollTop=w.scrollTop(),P.windowWidth=w.width(),P.windowHeight=w.height()}),f.on("mousemove",a),w.on({resize:function(){P.windowWidth=w.width(),P.windowHeight=w.height()},scroll:function(){var e=w.scrollLeft(),t=w.scrollTop();e!==P.scrollLeft&&(P.currentX+=e-P.scrollLeft,P.scrollLeft=e),t!==P.scrollTop&&(P.currentY+=t-P.scrollTop,P.scrollTop=t)}}))}function a(e){P.currentX=e.pageX,P.currentY=e.pageY}function l(e){var t=e.offset(),o=e[0].getBoundingClientRect(),n=o.right-o.left,i=o.bottom-o.top;return P.currentX>=t.left&&P.currentX<=t.left+n&&P.currentY>=t.top&&P.currentY<=t.top+i}function p(t){var o,n,i=t.data(y),s=t.data(H),r=t.data(k);return i?(e.isFunction(i)&&(i=i.call(t[0])),n=i):s?(e.isFunction(s)&&(s=s.call(t[0])),s.length>0&&(n=s.clone(!0,!0))):r&&(o=e("#"+r),o.length>0&&(n=o.html())),n}function c(e,t,o){var n=P.scrollTop,i=P.scrollLeft,s=n+P.windowHeight,r=i+P.windowWidth,a=I.none;return(n>e.top||n>Math.abs(e.bottom-P.windowHeight)-o)&&(a|=I.top),(e.top+o>s||Math.abs(e.bottom-P.windowHeight)>s)&&(a|=I.bottom),(i>e.left||e.right+t>r)&&(a|=I.left),(e.left+t>r||i>e.right)&&(a|=I.right),a}function u(e){for(var t=0;e;)e&=e-1,t++;return t}var f=e(document),w=e(window),d=e("body"),h="displayController",v="hasActiveHover",m="forcedOpen",T="hasMouseMove",g="mouseOnToPopup",b="originalTitle",y="powertip",H="powertipjq",k="powertiptarget",O=180/Math.PI,P={isTipOpen:!1,isFixedTipOpen:!1,isClosing:!1,tipOpenImminent:!1,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,mouseTrackingActive:!1,delayInProgress:!1,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0},I={none:0,top:1,bottom:2,left:4,right:8};e.fn.powerTip=function(t,n){if(!this.length)return this;if("string"===e.type(t)&&e.powerTip[t])return e.powerTip[t].call(this,this,n);var s=e.extend({},e.fn.powerTip.defaults,t),a=new i(s);return r(),this.each(function(){var t,n=e(this),i=n.data(y),r=n.data(H),l=n.data(k);n.data(h)&&e.powerTip.destroy(n),t=n.attr("title"),i||l||r||!t||(n.data(y,t),n.data(b,t),n.removeAttr("title")),n.data(h,new o(n,s,a))}),s.manual||this.on({"mouseenter.powertip":function(t){e.powerTip.show(this,t)},"mouseleave.powertip":function(){e.powerTip.hide(this)},"focus.powertip":function(){e.powerTip.show(this)},"blur.powertip":function(){e.powerTip.hide(this,!0)},"keydown.powertip":function(t){27===t.keyCode&&e.powerTip.hide(this,!0)}}),this},e.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:!1,popupId:"powerTip",intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:!1,offset:10,mouseOnToPopup:!1,manual:!1},e.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]},e.powerTip={show:function(t,o){return o?(a(o),P.previousX=o.pageX,P.previousY=o.pageY,e(t).data(h).show()):e(t).first().data(h).show(!0,!0),t},reposition:function(t){return e(t).first().data(h).resetPosition(),t},hide:function(t,o){return t?e(t).first().data(h).hide(o):P.activeHover&&P.activeHover.data(h).hide(!0),t},destroy:function(t){return e(t).off(".powertip").each(function(){var t=e(this),o=[b,h,v,m];t.data(b)&&(t.attr("title",t.data(b)),o.push(y)),t.removeData(o)}),t}},e.powerTip.showTip=e.powerTip.show,e.powerTip.closeTip=e.powerTip.hide}); -------------------------------------------------------------------------------- /_site/assets/js/underscore-min.js: -------------------------------------------------------------------------------- 1 | // Underscore.js 1.5.2 2 | // http://underscorejs.org 3 | // (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors 4 | // Underscore may be freely distributed under the MIT license. 5 | (function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,w=Object.keys,_=i.bind,j=function(n){return n instanceof j?n:this instanceof j?(this._wrapped=n,void 0):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exports._=j):n._=j,j.VERSION="1.5.2";var A=j.each=j.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a=j.keys(n),u=0,i=a.length;i>u;u++)if(t.call(e,n[a[u]],a[u],n)===r)return};j.map=j.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e.push(t.call(r,n,u,i))}),e)};var E="Reduce of empty array with no initial value";j.reduce=j.foldl=j.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=j.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(E);return r},j.reduceRight=j.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=j.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=j.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(E);return r},j.find=j.detect=function(n,t,r){var e;return O(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},j.filter=j.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&e.push(n)}),e)},j.reject=function(n,t,r){return j.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},j.every=j.all=function(n,t,e){t||(t=j.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var O=j.some=j.any=function(n,t,e){t||(t=j.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};j.contains=j.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:O(n,function(n){return n===t})},j.invoke=function(n,t){var r=o.call(arguments,2),e=j.isFunction(t);return j.map(n,function(n){return(e?t:n[t]).apply(n,r)})},j.pluck=function(n,t){return j.map(n,function(n){return n[t]})},j.where=function(n,t,r){return j.isEmpty(t)?r?void 0:[]:j[r?"find":"filter"](n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},j.findWhere=function(n,t){return j.where(n,t,!0)},j.max=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.max.apply(Math,n);if(!t&&j.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>e.computed&&(e={value:n,computed:a})}),e.value},j.min=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.min.apply(Math,n);if(!t&&j.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;ae||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={},i=null==r?j.identity:k(r);return A(t,function(r,a){var o=i.call(e,r,a,t);n(u,o,r)}),u}};j.groupBy=F(function(n,t,r){(j.has(n,t)?n[t]:n[t]=[]).push(r)}),j.indexBy=F(function(n,t,r){n[t]=r}),j.countBy=F(function(n,t){j.has(n,t)?n[t]++:n[t]=1}),j.sortedIndex=function(n,t,r,e){r=null==r?j.identity:k(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;r.call(e,n[o])=0})})},j.difference=function(n){var t=c.apply(e,o.call(arguments,1));return j.filter(n,function(n){return!j.contains(t,n)})},j.zip=function(){for(var n=j.max(j.pluck(arguments,"length").concat(0)),t=new Array(n),r=0;n>r;r++)t[r]=j.pluck(arguments,""+r);return t},j.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},j.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=j.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},j.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},j.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=new Array(e);e>u;)i[u++]=n,n+=r;return i};var R=function(){};j.bind=function(n,t){var r,e;if(_&&n.bind===_)return _.apply(n,o.call(arguments,1));if(!j.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));R.prototype=n.prototype;var u=new R;R.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},j.partial=function(n){var t=o.call(arguments,1);return function(){return n.apply(this,t.concat(o.call(arguments)))}},j.bindAll=function(n){var t=o.call(arguments,1);if(0===t.length)throw new Error("bindAll must be passed function names");return A(t,function(t){n[t]=j.bind(n[t],n)}),n},j.memoize=function(n,t){var r={};return t||(t=j.identity),function(){var e=t.apply(this,arguments);return j.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},j.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},j.defer=function(n){return j.delay.apply(j,[n,1].concat(o.call(arguments,1)))},j.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var c=function(){o=r.leading===!1?0:new Date,a=null,i=n.apply(e,u)};return function(){var l=new Date;o||r.leading!==!1||(o=l);var f=t-(l-o);return e=this,u=arguments,0>=f?(clearTimeout(a),a=null,o=l,i=n.apply(e,u)):a||r.trailing===!1||(a=setTimeout(c,f)),i}},j.debounce=function(n,t,r){var e,u,i,a,o;return function(){i=this,u=arguments,a=new Date;var c=function(){var l=new Date-a;t>l?e=setTimeout(c,t-l):(e=null,r||(o=n.apply(i,u)))},l=r&&!e;return e||(e=setTimeout(c,t)),l&&(o=n.apply(i,u)),o}},j.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},j.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},j.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},j.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},j.keys=w||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)j.has(n,r)&&t.push(r);return t},j.values=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},j.pairs=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},j.invert=function(n){for(var t={},r=j.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},j.functions=j.methods=function(n){var t=[];for(var r in n)j.isFunction(n[r])&&t.push(r);return t.sort()},j.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},j.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},j.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)j.contains(r,u)||(t[u]=n[u]);return t},j.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]===void 0&&(n[r]=t[r])}),n},j.clone=function(n){return j.isObject(n)?j.isArray(n)?n.slice():j.extend({},n):n},j.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof j&&(n=n._wrapped),t instanceof j&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==String(t);case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;var a=n.constructor,o=t.constructor;if(a!==o&&!(j.isFunction(a)&&a instanceof a&&j.isFunction(o)&&o instanceof o))return!1;r.push(n),e.push(t);var c=0,f=!0;if("[object Array]"==u){if(c=n.length,f=c==t.length)for(;c--&&(f=S(n[c],t[c],r,e)););}else{for(var s in n)if(j.has(n,s)&&(c++,!(f=j.has(t,s)&&S(n[s],t[s],r,e))))break;if(f){for(s in t)if(j.has(t,s)&&!c--)break;f=!c}}return r.pop(),e.pop(),f};j.isEqual=function(n,t){return S(n,t,[],[])},j.isEmpty=function(n){if(null==n)return!0;if(j.isArray(n)||j.isString(n))return 0===n.length;for(var t in n)if(j.has(n,t))return!1;return!0},j.isElement=function(n){return!(!n||1!==n.nodeType)},j.isArray=x||function(n){return"[object Array]"==l.call(n)},j.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){j["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),j.isArguments(arguments)||(j.isArguments=function(n){return!(!n||!j.has(n,"callee"))}),"function"!=typeof/./&&(j.isFunction=function(n){return"function"==typeof n}),j.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},j.isNaN=function(n){return j.isNumber(n)&&n!=+n},j.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},j.isNull=function(n){return null===n},j.isUndefined=function(n){return n===void 0},j.has=function(n,t){return f.call(n,t)},j.noConflict=function(){return n._=t,this},j.identity=function(n){return n},j.times=function(n,t,r){for(var e=Array(Math.max(0,n)),u=0;n>u;u++)e[u]=t.call(r,u);return e},j.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))};var I={escape:{"&":"&","<":"<",">":">",'"':""","'":"'"}};I.unescape=j.invert(I.escape);var T={escape:new RegExp("["+j.keys(I.escape).join("")+"]","g"),unescape:new RegExp("("+j.keys(I.unescape).join("|")+")","g")};j.each(["escape","unescape"],function(n){j[n]=function(t){return null==t?"":(""+t).replace(T[n],function(t){return I[n][t]})}}),j.result=function(n,t){if(null==n)return void 0;var r=n[t];return j.isFunction(r)?r.call(n):r},j.mixin=function(n){A(j.functions(n),function(t){var r=j[t]=n[t];j.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(j,n))}})};var N=0;j.uniqueId=function(n){var t=++N+"";return n?n+t:t},j.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;j.template=function(n,t,r){var e;r=j.defaults({},r,j.templateSettings);var u=new RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(D,function(n){return"\\"+B[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=new Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,j);var c=function(n){return e.call(this,n,j)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},j.chain=function(n){return j(n).chain()};var z=function(n){return this._chain?j(n).chain():n};j.mixin(j),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];j.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];j.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),j.extend(j.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this); 6 | //# sourceMappingURL=underscore-min.map -------------------------------------------------------------------------------- /_site/assets/js/underscore-min.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"underscore-min.js","sources":["underscore.js"],"names":["root","this","previousUnderscore","_","breaker","ArrayProto","Array","prototype","ObjProto","Object","FuncProto","Function","push","slice","concat","toString","hasOwnProperty","nativeForEach","forEach","nativeMap","map","nativeReduce","reduce","nativeReduceRight","reduceRight","nativeFilter","filter","nativeEvery","every","nativeSome","some","nativeIndexOf","indexOf","nativeLastIndexOf","lastIndexOf","nativeIsArray","isArray","nativeKeys","keys","nativeBind","bind","obj","_wrapped","exports","module","VERSION","each","iterator","context","length","i","call","collect","results","value","index","list","reduceError","foldl","inject","memo","initial","arguments","TypeError","foldr","find","detect","result","any","select","reject","all","identity","contains","include","target","invoke","method","args","isFunc","isFunction","apply","pluck","key","where","attrs","first","isEmpty","findWhere","max","Math","Infinity","computed","min","shuffle","rand","shuffled","random","sample","n","guard","lookupIterator","sortBy","criteria","sort","left","right","a","b","group","behavior","groupBy","has","indexBy","countBy","sortedIndex","array","low","high","mid","toArray","values","size","head","take","last","rest","tail","drop","compact","flatten","input","shallow","output","isArguments","without","difference","uniq","unique","isSorted","seen","union","intersection","item","other","zip","object","from","hasIndex","range","start","stop","step","ceil","idx","ctor","func","bound","self","partial","bindAll","funcs","Error","f","memoize","hasher","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","Date","now","remaining","clearTimeout","trailing","debounce","immediate","timestamp","callNow","once","ran","wrap","wrapper","compose","after","times","pairs","invert","functions","methods","names","extend","source","prop","pick","copy","omit","defaults","clone","isObject","tap","interceptor","eq","aStack","bStack","className","String","global","multiline","ignoreCase","aCtor","constructor","bCtor","pop","isEqual","isString","isElement","nodeType","name","isFinite","isNaN","parseFloat","isNumber","isBoolean","isNull","isUndefined","noConflict","accum","floor","entityMap","escape","&","<",">","\"","'","unescape","entityRegexes","RegExp","join","string","replace","match","property","mixin","idCounter","uniqueId","prefix","id","templateSettings","evaluate","interpolate","noMatch","escapes","\\","\r","\n","\t","
","
","escaper","template","text","data","settings","render","matcher","offset","variable","e","chain","_chain"],"mappings":"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"} -------------------------------------------------------------------------------- /_site/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 10 | 11 | Whatson - Elasticsearch Consulting Detective 12 | 13 | 14 | 15 | 17 | 18 | 19 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | 33 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 45 | 46 | 67 | 68 |
69 |
70 |

Nodes

71 |
72 | 73 |
74 |
75 | 123 |
124 | 125 |
126 |

Indices & Shards

127 |
128 | 129 |
130 |
131 |
183 | 184 |
185 |

Segments (Select an Index or Shard Above)

186 |
187 |
188 | 189 | 192 | 193 |
194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 203 | 204 | -------------------------------------------------------------------------------- /plugin-descriptor.properties: -------------------------------------------------------------------------------- 1 | # Elasticsearch plugin descriptor file 2 | # This file must exist as 'plugin-descriptor.properties' at 3 | # the root directory of all plugins. 4 | # 5 | # A plugin can be 'site', 'jvm', or both. 6 | # 7 | ### example site plugin for "foo": 8 | # 9 | # foo.zip <-- zip file for the plugin, with this structure: 10 | # _site/ <-- the contents that will be served 11 | # plugin-descriptor.properties <-- example contents below: 12 | # 13 | # site=true 14 | # description=My cool plugin 15 | # version=1.0 16 | # 17 | ### example jvm plugin for "foo" 18 | # 19 | # foo.zip <-- zip file for the plugin, with this structure: 20 | # .jar <-- classes, resources, dependencies 21 | # .jar <-- any number of jars 22 | # plugin-descriptor.properties <-- example contents below: 23 | # 24 | # jvm=true 25 | # classname=foo.bar.BazPlugin 26 | # description=My cool plugin 27 | # version=2.0.0-rc1 28 | # elasticsearch.version=2.0 29 | # java.version=1.7 30 | # 31 | ### mandatory elements for all plugins: 32 | # 33 | # 'description': simple summary of the plugin 34 | description=Elasticsearch Whatson 35 | # 36 | # 'version': plugin's version 37 | version=0.1.3 38 | # 39 | # 'name': the plugin name 40 | name=whatson 41 | 42 | ### mandatory elements for site plugins: 43 | # 44 | # 'site': set to true to indicate contents of the _site/ 45 | # directory in the root of the plugin should be served. 46 | site=true 47 | # 48 | ### mandatory elements for jvm plugins : 49 | # 50 | # 'jvm': true if the 'classname' class should be loaded 51 | # from jar files in the root directory of the plugin. 52 | # Note that only jar files in the root directory are 53 | # added to the classpath for the plugin! If you need 54 | # other resources, package them into a resources jar. 55 | jvm=${elasticsearch.plugin.jvm} 56 | # 57 | # 'classname': the name of the class to load, fully-qualified. 58 | classname=${elasticsearch.plugin.classname} 59 | # 60 | # 'java.version' version of java the code is built against 61 | # use the system property java.specification.version 62 | # version string must be a sequence of nonnegative decimal integers 63 | # separated by "."'s and may have leading zeros 64 | java.version=${maven.compiler.target} 65 | # 66 | # 'elasticsearch.version' version of elasticsearch compiled against 67 | # You will have to release a new version of the plugin for each new 68 | # elasticsearch release. This version is checked when the plugin 69 | # is loaded so Elasticsearch will refuse to start in the presence of 70 | # plugins with the incorrect elasticsearch.version. 71 | elasticsearch.version=${elasticsearch.version} 72 | # 73 | ### deprecated elements for jvm plugins : 74 | # 75 | # 'isolated': true if the plugin should have its own classloader. 76 | # passing false is deprecated, and only intended to support plugins 77 | # that have hard dependencies against each other. If this is 78 | # not specified, then the plugin is isolated by default. 79 | isolated=${elasticsearch.plugin.isolated} 80 | # -------------------------------------------------------------------------------- /screenshot-init.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xyu/elasticsearch-whatson/a856dddbafdebc4a685085c187f57632b96c2bd6/screenshot-init.png -------------------------------------------------------------------------------- /screenshot-segments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xyu/elasticsearch-whatson/a856dddbafdebc4a685085c187f57632b96c2bd6/screenshot-segments.png --------------------------------------------------------------------------------