http://git-wip-us.apache.org/repos/asf/incubator-flink/blob/76d603c0/flink-runtime/src/main/resources/web-docs-infoserver/font-awesome/scss/_variables.scss ---------------------------------------------------------------------- diff --git a/flink-runtime/src/main/resources/web-docs-infoserver/font-awesome/scss/_variables.scss b/flink-runtime/src/main/resources/web-docs-infoserver/font-awesome/scss/_variables.scss new file mode 100755 index 0000000..2d6e076 --- /dev/null +++ b/flink-runtime/src/main/resources/web-docs-infoserver/font-awesome/scss/_variables.scss @@ -0,0 +1,381 @@ +// Variables +// -------------------------- + +$fa-font-path: "../fonts" !default; +//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.0.3/fonts" !default; // for referencing Bootstrap CDN font files directly +$fa-css-prefix: fa !default; +$fa-version: "4.0.3" !default; +$fa-border-color: #eee !default; +$fa-inverse: #fff !default; +$fa-li-width: (30em / 14) !default; + +$fa-var-glass: "\f000"; +$fa-var-music: "\f001"; +$fa-var-search: "\f002"; +$fa-var-envelope-o: "\f003"; +$fa-var-heart: "\f004"; +$fa-var-star: "\f005"; +$fa-var-star-o: "\f006"; +$fa-var-user: "\f007"; +$fa-var-film: "\f008"; +$fa-var-th-large: "\f009"; +$fa-var-th: "\f00a"; +$fa-var-th-list: "\f00b"; +$fa-var-check: "\f00c"; +$fa-var-times: "\f00d"; +$fa-var-search-plus: "\f00e"; +$fa-var-search-minus: "\f010"; +$fa-var-power-off: "\f011"; +$fa-var-signal: "\f012"; +$fa-var-cog: "\f013"; +$fa-var-trash-o: "\f014"; +$fa-var-home: "\f015"; +$fa-var-file-o: "\f016"; +$fa-var-clock-o: "\f017"; +$fa-var-road: "\f018"; +$fa-var-download: "\f019"; +$fa-var-arrow-circle-o-down: "\f01a"; +$fa-var-arrow-circle-o-up: "\f01b"; +$fa-var-inbox: "\f01c"; +$fa-var-play-circle-o: "\f01d"; +$fa-var-repeat: "\f01e"; +$fa-var-refresh: "\f021"; +$fa-var-list-alt: "\f022"; +$fa-var-lock: "\f023"; +$fa-var-flag: "\f024"; +$fa-var-headphones: "\f025"; +$fa-var-volume-off: "\f026"; +$fa-var-volume-down: "\f027"; +$fa-var-volume-up: "\f028"; +$fa-var-qrcode: "\f029"; +$fa-var-barcode: "\f02a"; +$fa-var-tag: "\f02b"; +$fa-var-tags: "\f02c"; +$fa-var-book: "\f02d"; +$fa-var-bookmark: "\f02e"; +$fa-var-print: "\f02f"; +$fa-var-camera: "\f030"; +$fa-var-font: "\f031"; +$fa-var-bold: "\f032"; +$fa-var-italic: "\f033"; +$fa-var-text-height: "\f034"; +$fa-var-text-width: "\f035"; +$fa-var-align-left: "\f036"; +$fa-var-align-center: "\f037"; +$fa-var-align-right: "\f038"; +$fa-var-align-justify: "\f039"; +$fa-var-list: "\f03a"; +$fa-var-outdent: "\f03b"; +$fa-var-indent: "\f03c"; +$fa-var-video-camera: "\f03d"; +$fa-var-picture-o: "\f03e"; +$fa-var-pencil: "\f040"; +$fa-var-map-marker: "\f041"; +$fa-var-adjust: "\f042"; +$fa-var-tint: "\f043"; +$fa-var-pencil-square-o: "\f044"; +$fa-var-share-square-o: "\f045"; +$fa-var-check-square-o: "\f046"; +$fa-var-arrows: "\f047"; +$fa-var-step-backward: "\f048"; +$fa-var-fast-backward: "\f049"; +$fa-var-backward: "\f04a"; +$fa-var-play: "\f04b"; +$fa-var-pause: "\f04c"; +$fa-var-stop: "\f04d"; +$fa-var-forward: "\f04e"; +$fa-var-fast-forward: "\f050"; +$fa-var-step-forward: "\f051"; +$fa-var-eject: "\f052"; +$fa-var-chevron-left: "\f053"; +$fa-var-chevron-right: "\f054"; +$fa-var-plus-circle: "\f055"; +$fa-var-minus-circle: "\f056"; +$fa-var-times-circle: "\f057"; +$fa-var-check-circle: "\f058"; +$fa-var-question-circle: "\f059"; +$fa-var-info-circle: "\f05a"; +$fa-var-crosshairs: "\f05b"; +$fa-var-times-circle-o: "\f05c"; +$fa-var-check-circle-o: "\f05d"; +$fa-var-ban: "\f05e"; +$fa-var-arrow-left: "\f060"; +$fa-var-arrow-right: "\f061"; +$fa-var-arrow-up: "\f062"; +$fa-var-arrow-down: "\f063"; +$fa-var-share: "\f064"; +$fa-var-expand: "\f065"; +$fa-var-compress: "\f066"; +$fa-var-plus: "\f067"; +$fa-var-minus: "\f068"; +$fa-var-asterisk: "\f069"; +$fa-var-exclamation-circle: "\f06a"; +$fa-var-gift: "\f06b"; +$fa-var-leaf: "\f06c"; +$fa-var-fire: "\f06d"; +$fa-var-eye: "\f06e"; +$fa-var-eye-slash: "\f070"; +$fa-var-exclamation-triangle: "\f071"; +$fa-var-plane: "\f072"; +$fa-var-calendar: "\f073"; +$fa-var-random: "\f074"; +$fa-var-comment: "\f075"; +$fa-var-magnet: "\f076"; +$fa-var-chevron-up: "\f077"; +$fa-var-chevron-down: "\f078"; +$fa-var-retweet: "\f079"; +$fa-var-shopping-cart: "\f07a"; +$fa-var-folder: "\f07b"; +$fa-var-folder-open: "\f07c"; +$fa-var-arrows-v: "\f07d"; +$fa-var-arrows-h: "\f07e"; +$fa-var-bar-chart-o: "\f080"; +$fa-var-twitter-square: "\f081"; +$fa-var-facebook-square: "\f082"; +$fa-var-camera-retro: "\f083"; +$fa-var-key: "\f084"; +$fa-var-cogs: "\f085"; +$fa-var-comments: "\f086"; +$fa-var-thumbs-o-up: "\f087"; +$fa-var-thumbs-o-down: "\f088"; +$fa-var-star-half: "\f089"; +$fa-var-heart-o: "\f08a"; +$fa-var-sign-out: "\f08b"; +$fa-var-linkedin-square: "\f08c"; +$fa-var-thumb-tack: "\f08d"; +$fa-var-external-link: "\f08e"; +$fa-var-sign-in: "\f090"; +$fa-var-trophy: "\f091"; +$fa-var-github-square: "\f092"; +$fa-var-upload: "\f093"; +$fa-var-lemon-o: "\f094"; +$fa-var-phone: "\f095"; +$fa-var-square-o: "\f096"; +$fa-var-bookmark-o: "\f097"; +$fa-var-phone-square: "\f098"; +$fa-var-twitter: "\f099"; +$fa-var-facebook: "\f09a"; +$fa-var-github: "\f09b"; +$fa-var-unlock: "\f09c"; +$fa-var-credit-card: "\f09d"; +$fa-var-rss: "\f09e"; +$fa-var-hdd-o: "\f0a0"; +$fa-var-bullhorn: "\f0a1"; +$fa-var-bell: "\f0f3"; +$fa-var-certificate: "\f0a3"; +$fa-var-hand-o-right: "\f0a4"; +$fa-var-hand-o-left: "\f0a5"; +$fa-var-hand-o-up: "\f0a6"; +$fa-var-hand-o-down: "\f0a7"; +$fa-var-arrow-circle-left: "\f0a8"; +$fa-var-arrow-circle-right: "\f0a9"; +$fa-var-arrow-circle-up: "\f0aa"; +$fa-var-arrow-circle-down: "\f0ab"; +$fa-var-globe: "\f0ac"; +$fa-var-wrench: "\f0ad"; +$fa-var-tasks: "\f0ae"; +$fa-var-filter: "\f0b0"; +$fa-var-briefcase: "\f0b1"; +$fa-var-arrows-alt: "\f0b2"; +$fa-var-users: "\f0c0"; +$fa-var-link: "\f0c1"; +$fa-var-cloud: "\f0c2"; +$fa-var-flask: "\f0c3"; +$fa-var-scissors: "\f0c4"; +$fa-var-files-o: "\f0c5"; +$fa-var-paperclip: "\f0c6"; +$fa-var-floppy-o: "\f0c7"; +$fa-var-square: "\f0c8"; +$fa-var-bars: "\f0c9"; +$fa-var-list-ul: "\f0ca"; +$fa-var-list-ol: "\f0cb"; +$fa-var-strikethrough: "\f0cc"; +$fa-var-underline: "\f0cd"; +$fa-var-table: "\f0ce"; +$fa-var-magic: "\f0d0"; +$fa-var-truck: "\f0d1"; +$fa-var-pinterest: "\f0d2"; +$fa-var-pinterest-square: "\f0d3"; +$fa-var-google-plus-square: "\f0d4"; +$fa-var-google-plus: "\f0d5"; +$fa-var-money: "\f0d6"; +$fa-var-caret-down: "\f0d7"; +$fa-var-caret-up: "\f0d8"; +$fa-var-caret-left: "\f0d9"; +$fa-var-caret-right: "\f0da"; +$fa-var-columns: "\f0db"; +$fa-var-sort: "\f0dc"; +$fa-var-sort-asc: "\f0dd"; +$fa-var-sort-desc: "\f0de"; +$fa-var-envelope: "\f0e0"; +$fa-var-linkedin: "\f0e1"; +$fa-var-undo: "\f0e2"; +$fa-var-gavel: "\f0e3"; +$fa-var-tachometer: "\f0e4"; +$fa-var-comment-o: "\f0e5"; +$fa-var-comments-o: "\f0e6"; +$fa-var-bolt: "\f0e7"; +$fa-var-sitemap: "\f0e8"; +$fa-var-umbrella: "\f0e9"; +$fa-var-clipboard: "\f0ea"; +$fa-var-lightbulb-o: "\f0eb"; +$fa-var-exchange: "\f0ec"; +$fa-var-cloud-download: "\f0ed"; +$fa-var-cloud-upload: "\f0ee"; +$fa-var-user-md: "\f0f0"; +$fa-var-stethoscope: "\f0f1"; +$fa-var-suitcase: "\f0f2"; +$fa-var-bell-o: "\f0a2"; +$fa-var-coffee: "\f0f4"; +$fa-var-cutlery: "\f0f5"; +$fa-var-file-text-o: "\f0f6"; +$fa-var-building-o: "\f0f7"; +$fa-var-hospital-o: "\f0f8"; +$fa-var-ambulance: "\f0f9"; +$fa-var-medkit: "\f0fa"; +$fa-var-fighter-jet: "\f0fb"; +$fa-var-beer: "\f0fc"; +$fa-var-h-square: "\f0fd"; +$fa-var-plus-square: "\f0fe"; +$fa-var-angle-double-left: "\f100"; +$fa-var-angle-double-right: "\f101"; +$fa-var-angle-double-up: "\f102"; +$fa-var-angle-double-down: "\f103"; +$fa-var-angle-left: "\f104"; +$fa-var-angle-right: "\f105"; +$fa-var-angle-up: "\f106"; +$fa-var-angle-down: "\f107"; +$fa-var-desktop: "\f108"; +$fa-var-laptop: "\f109"; +$fa-var-tablet: "\f10a"; +$fa-var-mobile: "\f10b"; +$fa-var-circle-o: "\f10c"; +$fa-var-quote-left: "\f10d"; +$fa-var-quote-right: "\f10e"; +$fa-var-spinner: "\f110"; +$fa-var-circle: "\f111"; +$fa-var-reply: "\f112"; +$fa-var-github-alt: "\f113"; +$fa-var-folder-o: "\f114"; +$fa-var-folder-open-o: "\f115"; +$fa-var-smile-o: "\f118"; +$fa-var-frown-o: "\f119"; +$fa-var-meh-o: "\f11a"; +$fa-var-gamepad: "\f11b"; +$fa-var-keyboard-o: "\f11c"; +$fa-var-flag-o: "\f11d"; +$fa-var-flag-checkered: "\f11e"; +$fa-var-terminal: "\f120"; +$fa-var-code: "\f121"; +$fa-var-reply-all: "\f122"; +$fa-var-mail-reply-all: "\f122"; +$fa-var-star-half-o: "\f123"; +$fa-var-location-arrow: "\f124"; +$fa-var-crop: "\f125"; +$fa-var-code-fork: "\f126"; +$fa-var-chain-broken: "\f127"; +$fa-var-question: "\f128"; +$fa-var-info: "\f129"; +$fa-var-exclamation: "\f12a"; +$fa-var-superscript: "\f12b"; +$fa-var-subscript: "\f12c"; +$fa-var-eraser: "\f12d"; +$fa-var-puzzle-piece: "\f12e"; +$fa-var-microphone: "\f130"; +$fa-var-microphone-slash: "\f131"; +$fa-var-shield: "\f132"; +$fa-var-calendar-o: "\f133"; +$fa-var-fire-extinguisher: "\f134"; +$fa-var-rocket: "\f135"; +$fa-var-maxcdn: "\f136"; +$fa-var-chevron-circle-left: "\f137"; +$fa-var-chevron-circle-right: "\f138"; +$fa-var-chevron-circle-up: "\f139"; +$fa-var-chevron-circle-down: "\f13a"; +$fa-var-html5: "\f13b"; +$fa-var-css3: "\f13c"; +$fa-var-anchor: "\f13d"; +$fa-var-unlock-alt: "\f13e"; +$fa-var-bullseye: "\f140"; +$fa-var-ellipsis-h: "\f141"; +$fa-var-ellipsis-v: "\f142"; +$fa-var-rss-square: "\f143"; +$fa-var-play-circle: "\f144"; +$fa-var-ticket: "\f145"; +$fa-var-minus-square: "\f146"; +$fa-var-minus-square-o: "\f147"; +$fa-var-level-up: "\f148"; +$fa-var-level-down: "\f149"; +$fa-var-check-square: "\f14a"; +$fa-var-pencil-square: "\f14b"; +$fa-var-external-link-square: "\f14c"; +$fa-var-share-square: "\f14d"; +$fa-var-compass: "\f14e"; +$fa-var-caret-square-o-down: "\f150"; +$fa-var-caret-square-o-up: "\f151"; +$fa-var-caret-square-o-right: "\f152"; +$fa-var-eur: "\f153"; +$fa-var-gbp: "\f154"; +$fa-var-usd: "\f155"; +$fa-var-inr: "\f156"; +$fa-var-jpy: "\f157"; +$fa-var-rub: "\f158"; +$fa-var-krw: "\f159"; +$fa-var-btc: "\f15a"; +$fa-var-file: "\f15b"; +$fa-var-file-text: "\f15c"; +$fa-var-sort-alpha-asc: "\f15d"; +$fa-var-sort-alpha-desc: "\f15e"; +$fa-var-sort-amount-asc: "\f160"; +$fa-var-sort-amount-desc: "\f161"; +$fa-var-sort-numeric-asc: "\f162"; +$fa-var-sort-numeric-desc: "\f163"; +$fa-var-thumbs-up: "\f164"; +$fa-var-thumbs-down: "\f165"; +$fa-var-youtube-square: "\f166"; +$fa-var-youtube: "\f167"; +$fa-var-xing: "\f168"; +$fa-var-xing-square: "\f169"; +$fa-var-youtube-play: "\f16a"; +$fa-var-dropbox: "\f16b"; +$fa-var-stack-overflow: "\f16c"; +$fa-var-instagram: "\f16d"; +$fa-var-flickr: "\f16e"; +$fa-var-adn: "\f170"; +$fa-var-bitbucket: "\f171"; +$fa-var-bitbucket-square: "\f172"; +$fa-var-tumblr: "\f173"; +$fa-var-tumblr-square: "\f174"; +$fa-var-long-arrow-down: "\f175"; +$fa-var-long-arrow-up: "\f176"; +$fa-var-long-arrow-left: "\f177"; +$fa-var-long-arrow-right: "\f178"; +$fa-var-apple: "\f179"; +$fa-var-windows: "\f17a"; +$fa-var-android: "\f17b"; +$fa-var-linux: "\f17c"; +$fa-var-dribbble: "\f17d"; +$fa-var-skype: "\f17e"; +$fa-var-foursquare: "\f180"; +$fa-var-trello: "\f181"; +$fa-var-female: "\f182"; +$fa-var-male: "\f183"; +$fa-var-gittip: "\f184"; +$fa-var-sun-o: "\f185"; +$fa-var-moon-o: "\f186"; +$fa-var-archive: "\f187"; +$fa-var-bug: "\f188"; +$fa-var-vk: "\f189"; +$fa-var-weibo: "\f18a"; +$fa-var-renren: "\f18b"; +$fa-var-pagelines: "\f18c"; +$fa-var-stack-exchange: "\f18d"; +$fa-var-arrow-circle-o-right: "\f18e"; +$fa-var-arrow-circle-o-left: "\f190"; +$fa-var-caret-square-o-left: "\f191"; +$fa-var-dot-circle-o: "\f192"; +$fa-var-wheelchair: "\f193"; +$fa-var-vimeo-square: "\f194"; +$fa-var-try: "\f195"; +$fa-var-plus-square-o: "\f196"; +
http://git-wip-us.apache.org/repos/asf/incubator-flink/blob/76d603c0/flink-runtime/src/main/resources/web-docs-infoserver/font-awesome/scss/font-awesome.scss ---------------------------------------------------------------------- diff --git a/flink-runtime/src/main/resources/web-docs-infoserver/font-awesome/scss/font-awesome.scss b/flink-runtime/src/main/resources/web-docs-infoserver/font-awesome/scss/font-awesome.scss new file mode 100755 index 0000000..96d2f22 --- /dev/null +++ b/flink-runtime/src/main/resources/web-docs-infoserver/font-awesome/scss/font-awesome.scss @@ -0,0 +1,17 @@ +/*! + * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables"; +@import "mixins"; +@import "path"; +@import "core"; +@import "larger"; +@import "fixed-width"; +@import "list"; +@import "bordered-pulled"; +@import "spinning"; +@import "rotated-flipped"; +@import "stacked"; +@import "icons"; http://git-wip-us.apache.org/repos/asf/incubator-flink/blob/76d603c0/flink-runtime/src/main/resources/web-docs-infoserver/history.html ---------------------------------------------------------------------- diff --git a/flink-runtime/src/main/resources/web-docs-infoserver/history.html b/flink-runtime/src/main/resources/web-docs-infoserver/history.html new file mode 100644 index 0000000..57b98e8 --- /dev/null +++ b/flink-runtime/src/main/resources/web-docs-infoserver/history.html @@ -0,0 +1,127 @@ +<!DOCTYPE html> +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<html lang="en"> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta name="description" content=""> + <meta name="author" content=""> + + <title>Dashboard - Apache Flink</title> + + <!-- Bootstrap core CSS --> + <link href="css/bootstrap.css" rel="stylesheet"> + + <!-- Add custom CSS here --> + <link href="css/sb-admin.css" rel="stylesheet"> + <link rel="stylesheet" href="font-awesome/css/font-awesome.min.css"> + + <!-- Page Specific CSS --> + <link rel="stylesheet" type="text/css" href="css/nephelefrontend.css" /> + + <!-- Scripts from Bootstrap --> + <script src="js/jquery-2.1.0.js"></script> + <script src="js/bootstrap.js"></script> + + <!-- Scripts from Flink --> + <script type="text/javascript" src="js/jquery.flot.min.js"></script> + <script type="text/javascript" src="js/helpers.js"></script> + <script type="text/javascript" src="js/jobmanagerFrontend.js"></script> + <script type="text/javascript" src="js/jcanvas.min.js"></script> + + <!-- Load Menu --> + <script type="text/javascript"> + $(document).ready(function() { + $.ajax({ url : "menu?get=history", type : "GET", cache: false, success : function(html) { + $("#side-menu").empty(); + $("#side-menu").append(html); + }, dataType : "html", + }); + }); + </script> + </head> + + <body> + + <div id="wrapper"> + + <!-- Sidebar --> + <nav class='navbar navbar-inverse navbar-fixed-top' role='navigation'> + <!-- Brand and toggle get grouped for better mobile display --> + <div class="navbar-header"> + <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <table> + <tr> + <td><img src="img/flink-logo.png" alt="Flink Logo" style="margin-left:15px; margin-top:5px; width:40px;height:40px";></td> + <td style="vertical-align:top"><a class="navbar-brand" href="index.html">Apache Flink</a></td> + </tr> + </table> + </div> + + <!-- Collect the nav links, forms, and other content for toggling --> + <div class="collapse navbar-collapse navbar-ex1-collapse"> + <ul id="side-menu" class="nav navbar-nav side-nav"> + <!-- Filled via script --> + </ul> + <ul class="nav navbar-nav navbar-right navbar-user"> + <li class="dropdown user-dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-archive"></i> Log Files<b class="caret"></b></a> + <ul class="dropdown-menu"> + <li><a href="logInfo"><i class="fa fa-keyboard-o"></i> Log Info</a></li> + <li><a href="logInfo?get=stdout"><i class="fa fa-keyboard-o"></i> Stdout</a></li> + </ul> + </li> + </ul> + </div><!-- /.navbar-collapse --> + </nav> + + <div id="page-wrapper"> + + <div class="row"> + <div class="col-lg-12"> + <h1>History <small>Overview over recent jobs</small></h1> + <ol class="breadcrumb"> + <li><a href="index.html"><i class="icon-dashboard"></i> Dashboard</a></li> + <li class="active"><i class="fa fa-bar-chart-o"></i> History</li> + </ol> + </div> + <div class="col-lg-12"> + <div class="contentbox"> + <h3 class="contentbox-header"> + <span>Job History</span> + </h3> + <div class="contentbox-wrapper"> + <ul id="jobsArchive"></ul> + </div> + </div> + </div> + </div><!-- /.row --> + + </div><!-- /#page-wrapper --> + + </div><!-- /#wrapper --> + + </body> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-flink/blob/76d603c0/flink-runtime/src/main/resources/web-docs-infoserver/index.html ---------------------------------------------------------------------- diff --git a/flink-runtime/src/main/resources/web-docs-infoserver/index.html b/flink-runtime/src/main/resources/web-docs-infoserver/index.html new file mode 100644 index 0000000..43f4289 --- /dev/null +++ b/flink-runtime/src/main/resources/web-docs-infoserver/index.html @@ -0,0 +1,224 @@ +<!DOCTYPE html> +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> +<html lang="en"> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta name="description" content=""> + <meta name="author" content=""> + + <title>Dashboard - Apache Flink</title> + + <!-- Bootstrap core CSS --> + <link href="css/bootstrap.css" rel="stylesheet"> + + <!-- Add custom CSS here --> + <link href="css/sb-admin.css" rel="stylesheet"> + <link rel="stylesheet" href="font-awesome/css/font-awesome.min.css"> + <link rel="stylesheet" type="text/css" href="css/nephelefrontend.css" /> + + <!-- Scripts from Bootstrap --> + <script src="js/jquery-2.1.0.js"></script> + <script src="js/bootstrap.js"></script> + + <!-- Scripts from Flink --> + <script type="text/javascript" src="js/jquery.flot.min.js"></script> + <script type="text/javascript" src="js/helpers.js"></script> + <script type="text/javascript" src="js/jobmanagerFrontend.js"></script> + <script type="text/javascript" src="js/jcanvas.min.js"></script> + + <!-- Insert Version --> + <script type="text/javascript"> + $(document).ready(function() { + $.ajax({ url : "jobsInfo?get=version", type : "GET", cache: false, success : function(json) { + $("#version").empty(); + if (json.version.indexOf("SNAPSHOT") > -1) { + $("#version").append(" " + json.version + " - " + json.revision); + } else { + $("#version").append(" " + json.version); + } + }, dataType : "json", + }); + }); + </script> + + <!-- Load Menu --> + <script type="text/javascript"> + $(document).ready(function() { + $.ajax({ url : "menu?get=index", type : "GET", cache: false, success : function(html) { + $("#side-menu").empty(); + $("#side-menu").append(html); + }, dataType : "html", + }); + }); + </script> + </head> + + <body> + + <div id="wrapper"> + + <!-- Sidebar --> + <nav class='navbar navbar-inverse navbar-fixed-top' role='navigation'> + <!-- Brand and toggle get grouped for better mobile display --> + <div class="navbar-header"> + <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse"> + <span class="sr-only">Toggle navigation</span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <table> + <tr> + <td><img src="img/flink-logo.png" alt="Flink Logo" style="margin-left:15px; margin-top:5px; width:40px;height:40px";></td> + <td style="vertical-align:top"><a class="navbar-brand" href="index.html">Apache Flink</a></td> + </tr> + </table> + </div> + + <!-- Collect the nav links, forms, and other content for toggling --> + <div class="collapse navbar-collapse navbar-ex1-collapse"> + <ul id="side-menu" class="nav navbar-nav side-nav"> + <!-- Filled via script --> + </ul> + <ul class="nav navbar-nav navbar-right navbar-user"> + <li class="dropdown user-dropdown"> + <a href="#" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-archive"></i> Log Files<b class="caret"></b></a> + <ul class="dropdown-menu"> + <li><a href="logInfo"><i class="fa fa-keyboard-o"></i> Log Info</a></li> + <li><a href="logInfo?get=stdout"><i class="fa fa-keyboard-o"></i> Stdout</a></li> + </ul> + </li> + </ul> + </div><!-- /.navbar-collapse --> + </nav> + + <div id="page-wrapper"> + + <div class="row"> + <div class="col-lg-12"> + <h1>Apache Flink Dashboard<small id="version"></small></h1> + <ol class="breadcrumb"> + <li class="active"><i class="fa fa-dashboard"></i> Dashboard</li> + </ol> + </div> + </div><!-- /.row --> + + <div class="row"> + <div class="col-lg-2"> + <div class="panel panel-info"> + <div class="panel-heading"> + <div class="row"> + <div class="col-xs-6"> + <i class="fa fa-info fa-5x"></i> + </div> + <div class="col-xs-6 text-right"> + <p class="announcement-heading"><span id="stat-taskmanagers" class="stats"></span></p> + <p class="announcement-text">Task Manager</p> + </div> + </div> + </div> + </div> + </div> + <div class="col-lg-2"> + <div class="panel panel-primary"> + <div class="panel-heading"> + <div class="row"> + <div class="col-xs-6"> + <i class="fa fa-list-ol fa-5x"></i> + </div> + <div class="col-xs-6 text-right"> + <p class="announcement-heading"><span id="stat-slots" class="stats"></span></p> + <p class="announcement-text">Processing Slots</p> + </div> + </div> + </div> + </div> + </div> + <div class="col-lg-2"> + <div class="panel panel-success"> + <div class="panel-heading"> + <div class="row"> + <div class="col-xs-6"> + <i class="fa fa-check fa-5x"></i> + </div> + <div class="col-xs-6 text-right"> + <p class="announcement-heading"><span id="jobs-finished" class="stats"></span></p> + <p class="announcement-text">Jobs Finished</p> + </div> + </div> + </div> + </div> + </div> + <div class="col-lg-2"> + <div class="panel panel-warning"> + <div class="panel-heading"> + <div class="row"> + <div class="col-xs-6"> + <i class="fa fa-eraser fa-5x"></i> + </div> + <div class="col-xs-6 text-right"> + <p class="announcement-heading"><span id="jobs-canceled" class="stats"></span></p> + <p class="announcement-text">Jobs Canceled</p> + </div> + </div> + </div> + </div> + </div> + <div class="col-lg-2"> + <div class="panel panel-danger"> + <div class="panel-heading"> + <div class="row"> + <div class="col-xs-6"> + <i class="fa fa-flash fa-5x"></i> + </div> + <div class="col-xs-6 text-right"> + <p class="announcement-heading"><span id="jobs-failed" class="stats"></span></p> + <p class="announcement-text">Jobs Failed</p> + </div> + </div> + </div> + </div> + </div> + <div class="col-lg-2"> + <!-- empty --> + </div> + </div><!-- /.row --> + + <div class="row"> + <div class="col-lg-12"> + <div class="panel panel-primary"> + <div class="panel-heading"> + <h3 class="panel-title"><i class="fa fa-play"></i> Running Jobs</h3> + </div> + <div class="panel-body"> + <p id="rJpH">There are currently no running jobs, but you can analyze your old jobs in the history.<p> + <div id="jobs" class="contentbox-wrapper"></div> + </div> + </div> + </div> + </div><!-- /.row --> + + </div><!-- /#page-wrapper --> + + </div><!-- /#wrapper --> + </body> + +</html> http://git-wip-us.apache.org/repos/asf/incubator-flink/blob/76d603c0/flink-runtime/src/main/resources/web-docs-infoserver/js/analyzer.js ---------------------------------------------------------------------- diff --git a/flink-runtime/src/main/resources/web-docs-infoserver/js/analyzer.js b/flink-runtime/src/main/resources/web-docs-infoserver/js/analyzer.js new file mode 100644 index 0000000..f93db1c --- /dev/null +++ b/flink-runtime/src/main/resources/web-docs-infoserver/js/analyzer.js @@ -0,0 +1,306 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +var jsonGlobal; +var widthProgressbar = 120; + +google.load("visualization", "1"); + +google.setOnLoadCallback(pollArchive); + +HTTP_GET_VARS=new Array(); + +strGET = document.location.search.substr(1, document.location.search.length); + +if (strGET != '') { + gArr = strGET.split('&'); + for (i = 0; i < gArr.length; ++i) { + v = ''; + vArr = gArr[i].split('='); + if (vArr.length > 1) { + v = vArr[1]; + } + HTTP_GET_VARS[unescape(vArr[0])] = unescape(v); + } +} + +function GET(v) { + if (!HTTP_GET_VARS[v]) { + return 'undefined'; + } + return HTTP_GET_VARS[v]; +} + +function pollArchive() { + $.ajax({ + url : "jobsInfo?get=job&job=" + + GET("job"), type : "GET", + success : function(json) { + jsonGlobal = json + // Fill Table + analyzeTime(json, false) + }, dataType : "json", + //complete: setTimeout(function() {poll()}, 5000), + //timeout: 2000 + }); +}; + +$(document).on("click", "#stack", function() { + analyzeTime(jsonGlobal, true); +}); + +$(document).on("click", "#flow", function() { + analyzeTime(jsonGlobal, false); +}); + +function analyzeTime(json, stacked) { + $.each(json, function(i, job) { + $("#job_timeline").html(""); + $("#time").html(formattedTimeFromTimestamp(job.SCHEDULED)); + $("#run").html(convertTime(job[job.status] - job.SCHEDULED)); + $("#status").html(job.status); + $("#jobtitle").html(job.jobname); + + //create failed table + if (job.status == "FAILED") { + failed = ""; + $.each(job.failednodes, function(j, failednode) { + failed += "<li>" + failednode.node + "<br/>Error: " + failednode.message + "</li>"; + }); + $("#page-wrapper").append("<div class=\"panel panel-primary\"><div class=\"panel-heading\"><h3 class=\"panel-title\">Failed Nodes" + + "</h3></div><div id=\"failednodes\" class=\"panel-body\">" + + failed + + "</div></div>"); + + } + // create accumulators table + if($.isArray(job.accumulators) && job.accumulators.length > 0) { + accuTable = "<div class=\"table-responsive\">" + + "<table class=\"table table-bordered table-hover table-striped\">" + + "<tr><td><b>Name</b></td><td><b>Value</b></td></tr>"; + $.each(job.accumulators, function(i, accu) { + accuTable += "<tr><td>"+accu.name+"</td><td>"+accu.value+"</td></tr>"; + }); + accuTable += "</table></div>"; + $("#accumulators").html(accuTable); + } + + var data = new google.visualization.DataTable(); + data.addColumn('datetime', 'start'); + data.addColumn('datetime', 'end'); + data.addColumn('string', 'content'); + if (stacked) + data.addColumn('string', 'group'); + data.addColumn('string', 'className'); + data.addColumn('string', 'groupvertexid'); + var flotdata = []; + + if (stacked) + data.addRows([ + [ + new Date(job.SCHEDULED), + , + "SCHEDULED", + "9999", + "scheduled", + undefined ], + [ + new Date(job[job.status]), + , + job.status, + "9999", + "finished", + undefined ] + ]); + else + data.addRows([ + [ + new Date(job.SCHEDULED), + , + "SCHEDULED", + "scheduled", + undefined ], + [ + new Date(job[job.status]), + , + job.status, + "finished", + undefined ] + ]); + + var i = job.groupvertices.length; + + $.each(job.groupvertices, function(j, groupvertex) { + // check for reasonable starting time + if (job.groupverticetimes[groupvertex.groupvertexid].STARTED < 8888888888888) { + if (stacked) { + data.addRows([ + [ + new Date(job.groupverticetimes[groupvertex.groupvertexid].STARTED), + new Date(job.groupverticetimes[groupvertex.groupvertexid].ENDED), + groupvertex.groupvertexname, + ""+ i, + "running", + groupvertex.groupvertexid + ] + ]); + } else + data.addRows([ + [ + new Date(job.groupverticetimes[groupvertex.groupvertexid].STARTED), + new Date(job.groupverticetimes[groupvertex.groupvertexid].ENDED), + groupvertex.groupvertexname, + "running", + groupvertex.groupvertexid + ] + ]); + i--; + } + }); + + // Instantiate our timeline object. + var timeline = new links.Timeline(document.getElementById('job_timeline')); + + var onselect = function(event) { + var row = getSelectedRow(timeline); + if (row != undefined) { + if (stacked) + loadGroupvertex(data.getValue(row, 5)); + else + loadGroupvertex(data .getValue( row, 4)); + } else { + //alert("fail"); + } + }; + + // Add event listeners + google.visualization.events.addListener(timeline, 'select', onselect); + + // Draw our timeline with the created data and options + timeline.draw(data, {}); + + }); +} + +function loadGroupvertex(groupvertexid) { + $.ajax({ + url : "jobsInfo?get=groupvertex&job=" + + GET("job") + "&groupvertex=" + + groupvertexid, type : "GET", + success : function(json) { + //jsonGlobal = json + // Fill Table + analyzeGroupvertexTime(json) + }, dataType : "json", + //complete: setTimeout(function() {poll()}, 5000), + //timeout: 2000 + }); +} + +function analyzeGroupvertexTime(json) { + $("#vertices").html(""); + var groupvertex = json.groupvertex; + $("#vertices").append( + '<h2>'+ groupvertex.groupvertexname + + '</h2><br /><div id="pl_'+groupvertex.groupvertexid+'"></div>'); + + var data = new google.visualization.DataTable(); + data.addColumn('datetime', 'start'); + data.addColumn('datetime', 'end'); + data.addColumn('string', 'content'); + data.addColumn('string', 'group'); + data.addColumn('string', 'className'); + var cnt = 0; + $.each(groupvertex.groupmembers, function(k, vertex) { + + data.addRows([ + [ + new Date(json.verticetimes[vertex.vertexid].SCHEDULED), + new Date(json.verticetimes[vertex.vertexid].DEPLOYING), + "scheduled", + vertex.vertexinstancename+ "_" + cnt, + "scheduled" + ], + [ + new Date(json.verticetimes[vertex.vertexid].DEPLOYING), + new Date(json.verticetimes[vertex.vertexid].RUNNING), + "deploying", + vertex.vertexinstancename+ "_"+ cnt, + "deploying" + ] + ]); + + if (vertex.vertexstatus == "FINISHED") + data.addRows([ + [ + new Date(json.verticetimes[vertex.vertexid].RUNNING), + new Date(json.verticetimes[vertex.vertexid].FINISHED), + "running", + vertex.vertexinstancename + "_" + cnt, + "running" + ] + ]); + + if (vertex.vertexstatus == "CANCELED") + data.addRows([ + [ + new Date(json.verticetimes[vertex.vertexid].RUNNING), + new Date(json.verticetimes[vertex.vertexid].CANCELING), + "running", + vertex.vertexinstancename + "_" + cnt, + "running" ], + [ + new Date(json.verticetimes[vertex.vertexid].CANCELING), + new Date( json.verticetimes[vertex.vertexid].CANCELED), + "canceling", + vertex.vertexinstancename + "_" + cnt, + "canceling" + ] + ]); + + if (vertex.vertexstatus == "FAILED") + data.addRows([ + [ + new Date(json.verticetimes[vertex.vertexid].RUNNING), + new Date(json.verticetimes[vertex.vertexid].FAILED), + "running - FAILED", + vertex.vertexinstancename + "_"+ cnt, + "failed" + ] + ]); + cnt++; + }); + + // Instantiate our timeline object. + var timeline = new links.Timeline(document.getElementById('pl_' + groupvertex.groupvertexid)); + + // Draw our timeline with the created data and options + timeline.draw(data, {}); + +} + +function getSelectedRow(timeline) { + var row = undefined; + var sel = timeline.getSelection(); + if (sel.length) { + if (sel[0].row != undefined) { + row = sel[0].row; + } + } + return row; +} \ No newline at end of file
