├── 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 | 
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 | 
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;a
e||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 |
47 |
48 |
49 |
Whatson
50 | Elasticsearch Consulting Detective
51 |
52 |
56 |
65 |
66 |
67 |
68 |
69 |
124 |
125 |
126 | Indices & Shards
127 |
128 |
129 |
130 |
131 |
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
--------------------------------------------------------------------------------