| {{! |
| * 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. |
| }} |
| |
| <div class="row"> |
| <div class="col-md-12"> |
| <div class="panel panel-default"> |
| <div class="panel-heading"> |
| Logs {{collapsible-panel targetId="logFilesCollapsablePanel"}} |
| </div> |
| <div class="panel-body" id="logFilesCollapsablePanel"> |
| <label>Log aggregation status:</label> |
| <span class={{model.app.logAggregationStatusStyle}}> |
| {{model.app.logAggregationStatus}} |
| </span> |
| {{#if _isLoadingTopPanel}} |
| <div class="text-center" style="z-index: 100; position: absolute; left: 46%; top: 45px;"> |
| <img src="assets/images/spinner.gif" alt="Loading..."> |
| </div> |
| {{/if}} |
| {{#if areJHSandATSUnhealthy}} |
| <div class="row"> |
| <div class="col-md-8 col-md-offset-2 alert alert-warning text-center"> |
| <span class="glyphicon glyphicon-warning-sign" style="padding-right: 10px"></span> |
| <span>Logs are unavailable because Application Timeline Service seems unhealthy and could not connect to the JobHistory server.</span> |
| </div> |
| </div> |
| {{else}} |
| {{#if attemptList}} |
| <div class="row"> |
| <div class="col-md-6"> |
| <label>Choose attempt to fetch containers</label> |
| <div> |
| <select class="js-fetch-attempt-containers" onchange={{action "showContainersForAttemptId" value="target.value"}} style="max-width:350px;"> |
| <option value="" selected={{eq selectedAttemptId ''}}>None</option> |
| {{#each attemptList as |attempt|}} |
| <option value="{{attempt.id}}" selected={{eq selectedAttemptId attempt.id}}>{{attempt.id}}</option> |
| {{/each}} |
| </select> |
| </div> |
| </div> |
| {{#if attemptContainerList}} |
| <div class="col-md-6"> |
| <label>Choose container to fetch logs</label> |
| <div> |
| <select class="js-fetch-logs-containers" onchange={{action "showLogFilesForContainerId" value="target.value"}} style="max-width:350px"> |
| <option value="" selected={{eq selectedContainerId ''}}>None</option> |
| {{#each attemptContainerList as |container|}} |
| <option value="{{container.id}}" selected={{eq selectedContainerId container.id}}>{{container.id}}</option> |
| {{/each}} |
| </select> |
| </div> |
| </div> |
| {{else}} |
| {{#if (and selectedAttemptId (not _isLoadingTopPanel))}} |
| <div class="col-md-4"> |
| <h4 class="text-center" style="margin-top:25px;">No container data available!</h4> |
| </div> |
| {{/if}} |
| {{/if}} |
| </div> |
| {{else}} |
| <div class="col-md-12"> |
| <h4 class="text-center">No data available!</h4> |
| </div> |
| {{/if}} |
| {{/if}} |
| </div> |
| </div> |
| </div> |
| </div> |
| {{#if selectedContainerId}} |
| <div class="row"> |
| <div class="col-md-12"> |
| <div class="panel panel-default" style="min-height:150px;"> |
| <div class="panel-heading"> |
| Log: {{selectedLogFileName}} [ {{selectedContainerId}} & {{selectedAttemptId}} ] |
| {{collapsible-panel targetId="logContentCollapsablePanel"}} |
| </div> |
| <div class="panel-body" id="logContentCollapsablePanel"> |
| {{#if _isLoadingBottomPanel}} |
| <div class="text-center" style="z-index: 100; position: absolute; left: 46%;"> |
| <img src="assets/images/spinner.gif" alt="Loading..."> |
| </div> |
| {{/if}} |
| {{#if containerLogFiles}} |
| <div class="row"> |
| <div class="col-md-6" style="margin-bottom:20px;"> |
| <label>Choose log for {{selectedContainerId}}</label> |
| <div> |
| <select class="js-fetch-log-for-container" onchange={{action "showContentForLogFile" value="target.value"}} style="max-width:350px"> |
| <option value="" selected={{eq selectedLogFileName ''}}>None</option> |
| {{#each containerLogFiles as |file|}} |
| <option value="{{file.fileName}}" selected={{eq selectedLogFileName file.fileName}}>{{file.fileName}} - {{file.fileSize}} bytes</option> |
| {{/each}} |
| </select> |
| </div> |
| </div> |
| {{#if selectedLogFileName}} |
| <div class="col-md-6"> |
| <label>Find in log</label> |
| <div class="input-group" style="max-width:350px;"> |
| {{input |
| class="form-control" |
| value="" |
| enter="searchTextInLogContent" |
| id="logSeachInput98765" |
| }} |
| <span class="input-group-btn"> |
| <button class="btn btn-default" {{action "findNextTextInLogContent"}}>Find</button> |
| </span> |
| </div> |
| </div> |
| {{/if}} |
| </div> |
| <div> |
| {{#if selectedLogFileContent}} |
| {{#unless showFullLog}} |
| <div> |
| <strong>Showing last 10 lines of log. Click <a href="#" {{action "showFullLogFileContent"}}>here</a> for full log.</strong> |
| </div> |
| {{/unless}} |
| <pre id="logContentTextArea1234554321" class="log-content-area">{{showLastFewLinesOfLogContent}}</pre> |
| {{/if}} |
| </div> |
| {{else}} |
| {{#unless _isLoadingBottomPanel}} |
| <div class="col-md-12" style="margin-top:20px;"> |
| <h4 class="text-center">Logs are not available!</h4> |
| {{#if isLogAggregationNotSucceeded}} |
| <h4 class="text-center">Log aggregation may not be complete, check back later!</h4> |
| {{/if}} |
| </div> |
| {{/unless}} |
| {{/if}} |
| </div> |
| </div> |
| </div> |
| </div> |
| {{/if}} |